mariadb 二进制查看
This commit is contained in:
parent
90539a5049
commit
56ed68b888
|
|
@ -12,6 +12,7 @@
|
|||
<p onclick="myPerfOpt();">性能优化</p>
|
||||
<p onclick="myLogs();">日志</p>
|
||||
<p onclick="pluginLogs('mariadb',$('.plugin_version').attr('version'),'show_log');">慢日志</p>
|
||||
<p onclick="myBinLogs();">BINLOG</p>
|
||||
<p onclick="dbList()">管理列表</p>
|
||||
<p onclick="masterOrSlaveConf($('.plugin_version').attr('version'))">主从配置</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,186 @@
|
|||
# coding:utf-8
|
||||
|
||||
import sys
|
||||
import io
|
||||
import os
|
||||
import time
|
||||
import subprocess
|
||||
import re
|
||||
import json
|
||||
|
||||
sys.path.append(os.getcwd() + "/class/core")
|
||||
import mw
|
||||
|
||||
|
||||
if mw.isAppleSystem():
|
||||
cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\''
|
||||
info = mw.execShell(cmd)
|
||||
p = "/usr/local/lib/" + info[0].strip() + "/site-packages"
|
||||
sys.path.append(p)
|
||||
|
||||
|
||||
app_debug = False
|
||||
if mw.isAppleSystem():
|
||||
app_debug = True
|
||||
|
||||
|
||||
def getPluginName():
|
||||
return 'mariadb'
|
||||
|
||||
|
||||
def getPluginDir():
|
||||
return mw.getPluginDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getSPluginDir():
|
||||
return '/www/server/mdserver-web/plugins/' + getPluginName()
|
||||
|
||||
|
||||
def getServerDir():
|
||||
return mw.getServerDir() + '/' + getPluginName()
|
||||
|
||||
|
||||
def getConf():
|
||||
path = getServerDir() + '/etc/my.cnf'
|
||||
return path
|
||||
|
||||
|
||||
def getDataDir():
|
||||
file = getConf()
|
||||
content = mw.readFile(file)
|
||||
rep = 'datadir\s*=\s*(.*)'
|
||||
tmp = re.search(rep, content)
|
||||
return tmp.groups()[0].strip()
|
||||
|
||||
|
||||
def getRelayLogName():
|
||||
file = getConf()
|
||||
content = mw.readFile(file)
|
||||
rep = 'relay-log\s*=\s*(.*)'
|
||||
tmp = re.search(rep, content)
|
||||
return tmp.groups()[0].strip()
|
||||
|
||||
|
||||
def getLogBinName():
|
||||
file = getConf()
|
||||
content = mw.readFile(file)
|
||||
rep = 'log-bin\s*=\s*(.*)'
|
||||
tmp = re.search(rep, content)
|
||||
return tmp.groups()[0].strip()
|
||||
|
||||
|
||||
def binLogListLook(args):
|
||||
|
||||
file = args['file']
|
||||
line = args['line']
|
||||
|
||||
data_dir = getDataDir()
|
||||
my_bin = getServerDir() + '/bin'
|
||||
my_binlog_cmd = my_bin + '/mysqlbinlog'
|
||||
|
||||
cmd = my_binlog_cmd + ' --no-defaults ' + \
|
||||
data_dir + '/' + file + '|tail -' + str(line)
|
||||
|
||||
data = mw.execShell(cmd)
|
||||
|
||||
rdata = {}
|
||||
rdata['cmd'] = cmd
|
||||
rdata['data'] = data[0]
|
||||
|
||||
return rdata
|
||||
|
||||
|
||||
def binLogListLookDecode(args):
|
||||
|
||||
file = args['file']
|
||||
line = args['line']
|
||||
|
||||
data_dir = getDataDir()
|
||||
my_bin = getServerDir() + '/bin'
|
||||
my_binlog_cmd = my_bin + '/mysqlbinlog'
|
||||
|
||||
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
|
||||
data_dir + '/' + file + '|tail -' + str(line)
|
||||
|
||||
data = mw.execShell(cmd)
|
||||
|
||||
rdata = {}
|
||||
rdata['cmd'] = cmd
|
||||
rdata['data'] = data[0]
|
||||
|
||||
return rdata
|
||||
|
||||
|
||||
def binLogListTraceRelay(args):
|
||||
rdata = {}
|
||||
file = args['file']
|
||||
line = args['line']
|
||||
|
||||
relay_name = getRelayLogName()
|
||||
data_dir = getDataDir()
|
||||
alist = os.listdir(data_dir)
|
||||
relay_list = []
|
||||
for x in range(len(alist)):
|
||||
f = alist[x]
|
||||
t = {}
|
||||
if f.startswith(relay_name) and not f.endswith('.index'):
|
||||
relay_list.append(f)
|
||||
|
||||
relay_list = sorted(relay_list, reverse=True)
|
||||
if len(relay_list) == 0:
|
||||
rdata['cmd'] = ''
|
||||
rdata['data'] = '无Relay日志'
|
||||
return rdata
|
||||
|
||||
file = relay_list[0]
|
||||
|
||||
my_bin = getServerDir() + '/bin'
|
||||
my_binlog_cmd = my_bin + '/mysqlbinlog'
|
||||
|
||||
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
|
||||
data_dir + '/' + file + '|tail -' + str(line)
|
||||
|
||||
data = mw.execShell(cmd)
|
||||
|
||||
rdata['cmd'] = cmd
|
||||
rdata['data'] = data[0]
|
||||
|
||||
return rdata
|
||||
|
||||
|
||||
def binLogListTraceBinLog(args):
|
||||
rdata = {}
|
||||
file = args['file']
|
||||
line = args['line']
|
||||
|
||||
data_dir = getDataDir()
|
||||
log_bin_name = getLogBinName()
|
||||
|
||||
alist = os.listdir(data_dir)
|
||||
log_bin_l = []
|
||||
for x in range(len(alist)):
|
||||
f = alist[x]
|
||||
t = {}
|
||||
if f.startswith(log_bin_name) and not f.endswith('.index'):
|
||||
log_bin_l.append(f)
|
||||
|
||||
if len(log_bin_l) == 0:
|
||||
rdata['cmd'] = ''
|
||||
rdata['data'] = '无BINLOG'
|
||||
return rdata
|
||||
|
||||
log_bin_l = sorted(log_bin_l, reverse=True)
|
||||
file = log_bin_l[0]
|
||||
|
||||
my_bin = getServerDir() + '/bin'
|
||||
my_binlog_cmd = my_bin + '/mysqlbinlog'
|
||||
|
||||
cmd = my_binlog_cmd + ' --no-defaults --base64-output=decode-rows -vvvv ' + \
|
||||
data_dir + '/' + file + '|tail -' + str(line)
|
||||
|
||||
data = mw.execShell(cmd)
|
||||
|
||||
rdata['cmd'] = cmd
|
||||
rdata['data'] = data[0]
|
||||
|
||||
return rdata
|
||||
|
|
@ -58,6 +58,62 @@ function myAsyncPost(method,args){
|
|||
return syncPost('/plugins/run', {name:'mysql', func:method, args:_args});
|
||||
}
|
||||
|
||||
function myPostCallbak(method, version, args,callback){
|
||||
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
|
||||
|
||||
var req_data = {};
|
||||
req_data['name'] = 'mariadb';
|
||||
req_data['func'] = method;
|
||||
req_data['script']='index_mariadb';
|
||||
args['version'] = version;
|
||||
|
||||
|
||||
if (typeof(args) == 'string' && args == ''){
|
||||
req_data['args'] = JSON.stringify(toArrayObject(args));
|
||||
} else {
|
||||
req_data['args'] = JSON.stringify(args);
|
||||
}
|
||||
|
||||
$.post('/plugins/callback', req_data, function(data) {
|
||||
layer.close(loadT);
|
||||
if (!data.status){
|
||||
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(data);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
function myPostCallbakN(method, version, args,callback){
|
||||
|
||||
var req_data = {};
|
||||
req_data['name'] = 'mariadb';
|
||||
req_data['func'] = method;
|
||||
req_data['script']='index_mariadb';
|
||||
args['version'] = version;
|
||||
|
||||
|
||||
if (typeof(args) == 'string' && args == ''){
|
||||
req_data['args'] = JSON.stringify(toArrayObject(args));
|
||||
} else {
|
||||
req_data['args'] = JSON.stringify(args);
|
||||
}
|
||||
|
||||
$.post('/plugins/callback', req_data, function(data) {
|
||||
if (!data.status){
|
||||
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
|
||||
return;
|
||||
}
|
||||
|
||||
if(typeof(callback) == 'function'){
|
||||
callback(data);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
|
||||
function runInfo(){
|
||||
myPost('run_info','',function(data){
|
||||
|
||||
|
|
@ -1191,6 +1247,146 @@ function dbList(page, search){
|
|||
});
|
||||
}
|
||||
|
||||
function myBinRollingLogs(_name, func, _args, line){
|
||||
|
||||
var file_line = 100;
|
||||
if ( typeof(line) != 'undefined' ){
|
||||
file_line = line;
|
||||
}
|
||||
|
||||
var reqTimer = null;
|
||||
|
||||
function requestLogs(func,file,line){
|
||||
myPostCallbakN(func,'',{'file':file,"line":line}, function(rdata){
|
||||
var data = rdata.data.data;
|
||||
var cmd = rdata.data.cmd;
|
||||
if(data == '') {
|
||||
data = '当前没有日志!';
|
||||
}
|
||||
|
||||
$('#my_rolling_cmd').html(cmd);
|
||||
|
||||
$('#my_rolling_copy').click(function(){
|
||||
copyText(cmd);
|
||||
});
|
||||
|
||||
var ebody = '<textarea readonly="readonly" style="margin: 0px;width: 100%;height: 570px;background-color: #333;color:#fff; padding:0 5px" id="roll_info_log">'+data+'</textarea>';
|
||||
$("#my_rolling_logs").html(ebody);
|
||||
var ob = document.getElementById('roll_info_log');
|
||||
ob.scrollTop = ob.scrollHeight;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: _name + '日志',
|
||||
area: ['800px','700px'],
|
||||
end: function(){
|
||||
if (reqTimer){
|
||||
clearInterval(reqTimer);
|
||||
}
|
||||
},
|
||||
content:'<div class="change-default" style="padding:0px 20px 0px;">\
|
||||
<div class="divtable mtb10">\
|
||||
<table class="table table-hover"><tr>\
|
||||
<td id="my_rolling_cmd">cmd</td>\
|
||||
<td id="my_rolling_copy" style="width:35px;"><span class="ico-copy cursor btcopy" title="复制密码"></span></td>\
|
||||
<tr>\
|
||||
</table>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="change-default" style="padding:0px 20px 0px;" id="my_rolling_logs">\
|
||||
<textarea readonly="readonly" style="margin: 0px;width: 100%;height: 570px;background-color: #333;color:#fff; padding:0 5px" id="roll_info_log"></textarea>\
|
||||
</div>',
|
||||
success:function(){
|
||||
var fileName = _args['file'];
|
||||
requestLogs(func,fileName,file_line);
|
||||
reqTimer = setInterval(function(){
|
||||
requestLogs(func,fileName,file_line);
|
||||
},1000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function myBinLogsRender(page){
|
||||
var _data = {};
|
||||
if (typeof(page) =='undefined'){
|
||||
var page = 1;
|
||||
}
|
||||
|
||||
_data['page'] = page;
|
||||
_data['page_size'] = 10;
|
||||
_data['tojs'] = 'myBinLogsRender';
|
||||
myPost('binlog_list', _data, function(data){
|
||||
var rdata = $.parseJSON(data.data);
|
||||
// console.log(rdata);
|
||||
var list = '';
|
||||
for(i in rdata.data){
|
||||
list += '<tr>';
|
||||
|
||||
list += '<td>' + rdata.data[i]['name'] +'</td>';
|
||||
list += '<td>' + toSize(rdata.data[i]['size'])+'</td>';
|
||||
list += '<td>' + rdata.data[i]['time'] +'</td>';
|
||||
|
||||
|
||||
list += '<td style="text-align:right">';
|
||||
list += '<a href="javascript:;" data-index="'+i+'" class="btlink look" class="btlink">查看</a> | ';
|
||||
list += '<a href="javascript:;" data-index="'+i+'" class="btlink look_decode" class="btlink">解码查看</a>';
|
||||
list += '</td></tr>';
|
||||
}
|
||||
|
||||
if (rdata.data.length ==0){
|
||||
list = '<tr><td colspan="4">无数据</td</tr>';
|
||||
}
|
||||
|
||||
$("#binlog_list tbody").html(list);
|
||||
$('#binlog_page').html(rdata.page);
|
||||
|
||||
|
||||
$('#binlog_list .look').click(function(){
|
||||
var i = $(this).data('index');
|
||||
var file = rdata.data[i]['name'];
|
||||
myBinRollingLogs('查看BINLOG','binLogListLook',{'file':file },100);
|
||||
});
|
||||
|
||||
$('#binlog_list .look_decode').click(function(){
|
||||
var i = $(this).data('index');
|
||||
var file = rdata.data[i]['name'];
|
||||
myBinRollingLogs('查看解码BINLOG','binLogListLookDecode',{'file':file },100);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function myBinLogs(){
|
||||
var con = '<div class="safe bgw">\
|
||||
<button class="btn btn-success btn-sm relay_trace" type="button" style="margin-right: 5px;">中继日志跟踪</button>\
|
||||
<button class="btn btn-default btn-sm binlog_trace" type="button" style="margin-right: 5px;">最新BINLOG日志跟踪</button>\
|
||||
<div id="binlog_list" class="divtable mtb10">\
|
||||
<div class="tablescroll">\
|
||||
<table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
|
||||
<thead><tr>\
|
||||
<th>文件名称</th>\
|
||||
<th>大小</th>\
|
||||
<th>时间</th>\
|
||||
<th style="text-align:right;">操作</th>\
|
||||
</tr></thead>\
|
||||
<tbody></tbody></table>\
|
||||
</div>\
|
||||
<div id="binlog_page" class="dataTables_paginate paging_bootstrap page"></div>\
|
||||
</div>\
|
||||
</div>';
|
||||
$(".soft-man-con").html(con);
|
||||
myBinLogsRender(1);
|
||||
|
||||
$('.soft-man-con .relay_trace').click(function(){
|
||||
myBinRollingLogs('中继日志跟踪','binLogListTraceRelay',{'file':''},100);
|
||||
});
|
||||
|
||||
$('.soft-man-con .binlog_trace').click(function(){
|
||||
myBinRollingLogs('最新BINLOG日志跟踪','binLogListTraceBinLog',{'file':''},100);
|
||||
});
|
||||
}
|
||||
|
||||
function myLogs(){
|
||||
|
||||
|
|
|
|||
|
|
@ -1308,6 +1308,7 @@ function myBinRollingLogs(_name, func, _args, line){
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
function myBinLogsRender(page){
|
||||
var _data = {};
|
||||
if (typeof(page) =='undefined'){
|
||||
|
|
|
|||
Loading…
Reference in New Issue