mysql 主从可配置化end

pull/109/head
midoks 4 years ago
parent 25b22d7f16
commit 6e1ef59403
  1. 70
      plugins/mysql/index.py
  2. 82
      plugins/mysql/js/mysql.js

@ -1252,7 +1252,13 @@ def getMasterStatus(version=''):
master_status = True master_status = True
data = {} data = {}
data['status'] = master_status data['status'] = master_status
return mw.returnJson(master_status, '设置成功')
db = pMysqlDb()
dlist = db.query('show slave status')
if len(dlist) > 0 and dlist[0][10] == 'Yes' and dlist[0][11] == 'Yes':
data['slave_status'] = True
return mw.returnJson(master_status, '设置成功', data)
def setMasterStatus(version=''): def setMasterStatus(version=''):
@ -1272,6 +1278,7 @@ def setMasterStatus(version=''):
con = con.replace('binlog-ignore-db', '#binlog-ignore-db') con = con.replace('binlog-ignore-db', '#binlog-ignore-db')
restart(version) restart(version)
mw.writeFile(conf, con) mw.writeFile(conf, con)
time.sleep(4)
return mw.returnJson(True, '设置成功') return mw.returnJson(True, '设置成功')
@ -1363,15 +1370,23 @@ def addMasterRepSlaveUser(version=''):
def getMasterRepSlaveUserCmd(version): def getMasterRepSlaveUserCmd(version):
args = getArgs() args = getArgs()
data = checkArgs(args, ['username']) data = checkArgs(args, ['username', 'db'])
if not data[0]: if not data[0]:
return data[1] return data[1]
psdb = pSqliteDb('master_replication_user') psdb = pSqliteDb('master_replication_user')
f = 'username,password' f = 'username,password'
clist = psdb.field(f).where("username=?", (args['username'],)).limit( if args['username'] == '':
'1').order('id desc').select()
# print(clist[0]) count = psdb.count()
if count == 0:
return mw.returnJson(False, '请添加同步账户!')
clist = psdb.field(f).limit('1').order('id desc').select()
else:
clist = psdb.field(f).where("username=?", (args['username'],)).limit(
'1').order('id desc').select()
ip = mw.getLocalIp() ip = mw.getLocalIp()
port = getMyPort() port = getMyPort()
@ -1383,8 +1398,12 @@ def getMasterRepSlaveUserCmd(version):
args['username'] + "', MASTER_PASSWORD='" + \ args['username'] + "', MASTER_PASSWORD='" + \
clist[0]['password'] + \ clist[0]['password'] + \
"', MASTER_LOG_FILE='" + tmp[0][0] + \ "', MASTER_LOG_FILE='" + tmp[0][0] + \
"',MASTER_LOG_POS=" + str(tmp[0][1]) + ";" "',MASTER_LOG_POS=" + str(tmp[0][1]) + ""
return mw.returnJson(True, '添加成功!', sql)
# if args['db'] != '':
# replicate-do-table
return mw.returnJson(True, 'OK!', sql)
def delMasterRepSlaveUser(version=''): def delMasterRepSlaveUser(version=''):
@ -1419,6 +1438,39 @@ def updateMasterRepSlaveUser(version=''):
return mw.returnJson(True, '更新成功!') return mw.returnJson(True, '更新成功!')
def getSlaveList(version=''):
db = pMysqlDb()
dlist = db.query('show slave status')
# print(dlist)
ret = []
for x in xrange(0, len(dlist)):
tmp = {}
tmp['Master_User'] = dlist[x][2]
tmp['Master_Host'] = dlist[x][1]
tmp['Master_Port'] = dlist[x][3]
tmp['Master_Log_File'] = dlist[x][5]
tmp['Slave_IO_Running'] = dlist[x][10]
tmp['Slave_SQL_Running'] = dlist[x][11]
ret.append(tmp)
data = {}
data['data'] = ret
return mw.getJson(data)
def setSlaveStatus(version=''):
db = pMysqlDb()
dlist = db.query('show slave status')
if len(dlist) > 0 and dlist[0][10] == 'Yes' and dlist[0][11] == 'Yes':
db.query('stop slave')
else:
db.query('start slave')
return mw.returnJson(True, '设置成功!')
if __name__ == "__main__": if __name__ == "__main__":
func = sys.argv[1] func = sys.argv[1]
version = sys.argv[2] version = sys.argv[2]
@ -1510,5 +1562,9 @@ if __name__ == "__main__":
print(updateMasterRepSlaveUser(version)) print(updateMasterRepSlaveUser(version))
elif func == 'get_master_rep_slave_user_cmd': elif func == 'get_master_rep_slave_user_cmd':
print(getMasterRepSlaveUserCmd(version)) print(getMasterRepSlaveUserCmd(version))
elif func == 'get_slave_list':
print(getSlaveList(version))
elif func == 'set_slave_status':
print(setSlaveStatus(version))
else: else:
print('error') print('error')

@ -1231,8 +1231,8 @@ function updateMasterRepSlaveUser(username){
}); });
} }
function getMasterRepSlaveUserCmd(username){ function getMasterRepSlaveUserCmd(username, db=''){
myPost('get_master_rep_slave_user_cmd', {username:username}, function(data){ myPost('get_master_rep_slave_user_cmd', {username:username,db:db}, function(data){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(data.data);
var loadOpen = layer.open({ var loadOpen = layer.open({
type: 1, type: 1,
@ -1325,7 +1325,7 @@ function getMasterRepSlaveList(){
function masterOrSlaveConf(version=''){ function masterOrSlaveConf(version=''){
function getDbList(){ function getMasterDbList(){
var _data = {}; var _data = {};
if (typeof(page) =='undefined'){ if (typeof(page) =='undefined'){
var page = 1; var page = 1;
@ -1345,7 +1345,8 @@ function masterOrSlaveConf(version=''){
list += '<td>' + rdata.data[i]['name'] +'</td>'; list += '<td>' + rdata.data[i]['name'] +'</td>';
list += '<td>' + (rdata.data[i]['master']?'是':'否') +'</td>'; list += '<td>' + (rdata.data[i]['master']?'是':'否') +'</td>';
list += '<td style="text-align:right">' + list += '<td style="text-align:right">' +
'<a href="javascript:;" class="btlink" onclick="setDbMaster(\''+rdata.data[i]['name']+'\')" title="设置数据库权限">'+(rdata.data[i]['master']?'退出':'加入')+'</a>' + '<a href="javascript:;" class="btlink" onclick="setDbMaster(\''+rdata.data[i]['name']+'\')" title="加入或退出">'+(rdata.data[i]['master']?'退出':'加入')+'</a> | ' +
'<a href="javascript:;" class="btlink" onclick="getMasterRepSlaveUserCmd(\'\',\''+rdata.data[i]['name']+'\')" title="同步命令">同步命令</a>' +
'</td>'; '</td>';
list += '</tr>'; list += '</tr>';
} }
@ -1371,28 +1372,80 @@ function masterOrSlaveConf(version=''){
$('#databasePage').html(rdata.page); $('#databasePage').html(rdata.page);
}); });
} }
function getAsyncMasterDbList(){
var _data = {};
if (typeof(page) =='undefined'){
var page = 1;
}
_data['page'] = page;
_data['page_size'] = 10;
myPost('get_slave_list', _data, function(data){
var rdata = $.parseJSON(data.data);
var list = '';
for(i in rdata.data){
list += '<tr>';
list += '<td>' + rdata.data[i]['Master_Host'] +'</td>';
list += '<td>' + rdata.data[i]['Master_Port'] +'</td>';
list += '<td>' + rdata.data[i]['Master_User'] +'</td>';
list += '<td>' + rdata.data[i]['Master_Log_File'] +'</td>';
list += '<td>' + rdata.data[i]['Slave_IO_Running'] +'</td>';
list += '<td>' + rdata.data[i]['Slave_SQL_Running'] +'</td>';
// list += '<td style="text-align:right">' +
// '<a href="javascript:;" class="btlink" onclick="" title="待定">待定</a>' +
// '</td>';
list += '</tr>';
}
// <th style="text-align:right;">操作</th></tr></thead>\
var con = '<div class="divtable mtb10">\
<div class="tablescroll">\
<table id="DataBody" 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>日志</th>\
<th>IO</th>\
<th>SQL</th></thead>\
<tbody>\
'+ list +'\
</tbody></table>\
</div>\
</div>';
// <div id="databasePage_slave" class="dataTables_paginate paging_bootstrap page"></div>\
// <div class="table_toolbar">\
// <span class="sync btn btn-default btn-sm" onclick="getMasterRepSlaveList()" title="">添加</span>\
// </div>\
$(".table_slave_list").html(con);
$('#databasePage_slave').html(rdata.page);
});
}
function getMasterStatus(){ function getMasterStatus(){
myPost('get_master_status', '', function(data){ myPost('get_master_status', '', function(data){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(data.data);
var limitCon = '<p class="conf_p">\ var limitCon = '<p class="conf_p">\
<span class="f14 c6 mr20">Master[]配置</span><span class="f14 c6 mr20"></span>\ <span class="f14 c6 mr20">Master[]配置</span><span class="f14 c6 mr20"></span>\
<button class="btn btn-success btn-xs btn-master va0">'+(!rdata.status ? '未开启' : '已开启') +'</button><hr/>\ <button class="btn '+(!rdata.status ? 'btn-danger' : 'btn-success')+' btn-xs btn-master va0">'+(!rdata.status ? '未开启' : '已开启') +'</button><hr/>\
</p>\ </p>\
<!-- master list -->\ <!-- master list -->\
<div class="safe bgw table_master_list"></div>\ <div class="safe bgw table_master_list"></div>\
<hr/>\ <hr/>\
<p class="conf_p">\ <p class="conf_p">\
<span class="f14 c6 mr20">Slave[]配置</span><span class="f14 c6 mr20"></span>\ <span class="f14 c6 mr20">Slave[]配置</span><span class="f14 c6 mr20"></span>\
<button class="btn btn-success btn-xs btn-slave va0">'+(!rdata.status ? '未开启' : '已开启') +'</button><hr/>\ <button class="btn '+(!rdata.data.slave_status ? 'btn-danger' : 'btn-success')+' btn-xs btn-slave va0">'+(!rdata.data.slave_status ? '未启' : '已启') +'</button><hr/>\
</p>\ </p>\
<!-- slave list -->\ <!-- slave list -->\
<div class="safe bgw table_slave_list"></div>\
'; ';
$(".soft-man-con").html(limitCon); $(".soft-man-con").html(limitCon);
//设置主服务器配置 //设置主服务器配置
$(".btn-master").click(function () { $(".btn-master").click(function () {
// console.log('.....');
myPost('set_master_status', 'close=change', function(data){ myPost('set_master_status', 'close=change', function(data){
var rdata = $.parseJSON(data.data); var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 5 }); layer.msg(rdata.msg, { icon: rdata.status ? 1 : 5 });
@ -1401,7 +1454,18 @@ function masterOrSlaveConf(version=''){
}, 2000); }, 2000);
}); });
}); });
getDbList();
$(".btn-slave").click(function () {
myPost('set_slave_status', 'close=change', function(data){
var rdata = $.parseJSON(data.data);
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 5 });
setTimeout(function(){
getMasterStatus();
}, 2000);
});
});
getMasterDbList();
getAsyncMasterDbList();
}); });
} }
getMasterStatus(); getMasterStatus();

Loading…
Cancel
Save