This commit is contained in:
Mr Chen
2023-12-22 22:20:03 +08:00
parent 69de62f8c3
commit 5a5c2f3e33
4 changed files with 158 additions and 10 deletions
+52
View File
@@ -2303,6 +2303,56 @@ def getSlaveList(version=''):
data['data'] = dlist
return mw.getJson(data)
def trySlaveSyncBugfix(version=''):
if status(version) == 'stop':
return mw.returnJson(False, 'MySQL未启动', [])
mode_file = getSyncModeFile()
if not os.path.exists(mode_file):
return mw.returnJson(False, '需要先设置同步配置')
mode = mw.readFile(mode_file)
if mode != 'sync-user':
return mw.returnJson(False, '仅支持【同步账户】模式')
conn = pSqliteDb('slave_sync_user')
slave_sync_data = conn.field('ip,port,user,pass,mode,cmd').select()
if len(slave_sync_data) < 1:
return mw.returnJson(False, '需要先添加【同步用户】配置!')
# print(slave_sync_data)
# 本地从库
sdb = pMysqlDb()
gtid_purged = ''
for i in range(len(slave_sync_data)):
port = slave_sync_data[i]['port']
password = slave_sync_data[i]['pass']
host = slave_sync_data[i]['ip']
user = slave_sync_data[i]['user']
# print(port, password, host)
mdb = mw.getMyORM()
mdb.setHost(host)
mdb.setPort(port)
mdb.setUser(user)
mdb.setPwd(password)
mdb.setSocket('')
var_gtid = mdb.query('show VARIABLES like "%gtid_purged%"')
if len(var_gtid) > 0:
gtid_purged += var_gtid[0]['Value'] + ','
gtid_purged = gtid_purged.strip(',')
sql = "set @@global.gtid_purged='" + gtid_purged + "'"
sdb.query('stop slave')
# print(sql)
sdb.query(sql)
sdb.query('start slave')
return mw.returnJson(True, '修复成功!')
def getSlaveSyncCmd(version=''):
@@ -2982,6 +3032,8 @@ if __name__ == "__main__":
print(getMasterRepSlaveUserCmd(version))
elif func == 'get_slave_list':
print(getSlaveList(version))
elif func == 'try_slave_sync_bugfix':
print(trySlaveSyncBugfix(version))
elif func == 'get_slave_sync_cmd':
print(getSlaveSyncCmd(version))
elif func == 'get_slave_ssh_list':
+27 -5
View File
@@ -2568,11 +2568,15 @@ function masterOrSlaveConf(version=''){
<td>"+(info['Slave_SQL_Running_State'] == '' ? '无':info['Slave_SQL_Running_State']) +"</td>\
</tr>";
var btn_list = ['复制错误',"取消"];
if (info['Last_IO_Error'].search(/1236/i)>0){
btn_list = ['复制错误',"取消","尝试修复"];
}
layer.open({
type: 1,
title: '同步异常信息',
area: ['600px','300px'],
btn:['复制错误',"取消"],
btn:btn_list,
content:"<form class='bt-form pd15'>\
<div class='divtable mtb10'>\
<div class='tablescroll'>\
@@ -2587,10 +2591,20 @@ function masterOrSlaveConf(version=''){
</div>\
</form>",
success:function(){
// copyText(v['Error']);
// $('.class-copy-db-err').click(function(){
// copyText(v['Error']);
// });
if (info['Last_IO_Error'] != ''){
copyText(info['Last_IO_Error']);
return;
}
if (info['Last_SQL_Error'] != ''){
copyText(info['Last_SQL_Error']);
return;
}
if (info['Slave_SQL_Running_State'] != ''){
copyText(info['Slave_SQL_Running_State']);
return;
}
},
yes:function(){
if (info['Last_IO_Error'] != ''){
@@ -2607,6 +2621,14 @@ function masterOrSlaveConf(version=''){
copyText(info['Slave_SQL_Running_State']);
return;
}
},
btn3:function(){
myPost('try_slave_sync_bugfix', {}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg, function(){
masterOrSlaveConf();
},{ icon: rdata.status ? 1 : 5 },2000);
});
}
});
});
+52
View File
@@ -2335,6 +2335,56 @@ def getSlaveList(version=''):
data['data'] = dlist
return mw.getJson(data)
def trySlaveSyncBugfix(version=''):
if status(version) == 'stop':
return mw.returnJson(False, 'MySQL未启动', [])
mode_file = getSyncModeFile()
if not os.path.exists(mode_file):
return mw.returnJson(False, '需要先设置同步配置')
mode = mw.readFile(mode_file)
if mode != 'sync-user':
return mw.returnJson(False, '仅支持【同步账户】模式')
conn = pSqliteDb('slave_sync_user')
slave_sync_data = conn.field('ip,port,user,pass,mode,cmd').select()
if len(slave_sync_data) < 1:
return mw.returnJson(False, '需要先添加【同步用户】配置!')
# print(slave_sync_data)
# 本地从库
sdb = pMysqlDb()
gtid_purged = ''
for i in range(len(slave_sync_data)):
port = slave_sync_data[i]['port']
password = slave_sync_data[i]['pass']
host = slave_sync_data[i]['ip']
user = slave_sync_data[i]['user']
# print(port, password, host)
mdb = mw.getMyORM()
mdb.setHost(host)
mdb.setPort(port)
mdb.setUser(user)
mdb.setPwd(password)
mdb.setSocket('')
var_gtid = mdb.query('show VARIABLES like "%gtid_purged%"')
if len(var_gtid) > 0:
gtid_purged += var_gtid[0]['Value'] + ','
gtid_purged = gtid_purged.strip(',')
sql = "set @@global.gtid_purged='" + gtid_purged + "'"
sdb.query('stop slave')
# print(sql)
sdb.query(sql)
sdb.query('start slave')
return mw.returnJson(True, '修复成功!')
def getSlaveSyncCmd(version=''):
@@ -3009,6 +3059,8 @@ if __name__ == "__main__":
print(getMasterRepSlaveUserCmd(version))
elif func == 'get_slave_list':
print(getSlaveList(version))
elif func == 'try_slave_sync_bugfix':
print(trySlaveSyncBugfix(version))
elif func == 'get_slave_sync_cmd':
print(getSlaveSyncCmd(version))
elif func == 'get_slave_ssh_list':
+27 -5
View File
@@ -2569,11 +2569,15 @@ function masterOrSlaveConf(version=''){
<td>"+(info['Slave_SQL_Running_State'] == '' ? '无':info['Slave_SQL_Running_State']) +"</td>\
</tr>";
var btn_list = ['复制错误',"取消"];
if (info['Last_IO_Error'].search(/1236/i)>0){
btn_list = ['复制错误',"取消","尝试修复"];
}
layer.open({
type: 1,
title: '同步异常信息',
area: ['600px','300px'],
btn:['复制错误',"取消"],
btn:btn_list,
content:"<form class='bt-form pd15'>\
<div class='divtable mtb10'>\
<div class='tablescroll'>\
@@ -2588,10 +2592,20 @@ function masterOrSlaveConf(version=''){
</div>\
</form>",
success:function(){
// copyText(v['Error']);
// $('.class-copy-db-err').click(function(){
// copyText(v['Error']);
// });
if (info['Last_IO_Error'] != ''){
copyText(info['Last_IO_Error']);
return;
}
if (info['Last_SQL_Error'] != ''){
copyText(info['Last_SQL_Error']);
return;
}
if (info['Slave_SQL_Running_State'] != ''){
copyText(info['Slave_SQL_Running_State']);
return;
}
},
yes:function(){
if (info['Last_IO_Error'] != ''){
@@ -2608,6 +2622,14 @@ function masterOrSlaveConf(version=''){
copyText(info['Slave_SQL_Running_State']);
return;
}
},
btn3:function(){
myPost('try_slave_sync_bugfix', {}, function(data){
var rdata = $.parseJSON(data.data);
showMsg(rdata.msg, function(){
masterOrSlaveConf();
},{ icon: rdata.status ? 1 : 5 },2000);
});
}
});
});