mysql查看主库状态_批量查看mysql多从状态和修改多从主库指向

该脚本用于批量查看和修改多个MySQL从库的状态,包括检查主库信息、停止/启动同步、执行change master命令。适用于主库故障或高可用场景下VIP未正确漂移的问题。通过日志记录操作结果,支持多线程处理多个主机。
摘要由CSDN通过智能技术生成

本脚本主要解决批量查看mysql多从状态和修改多从主库指向,并打印出执行结果。适用于主库没有做高可用或是做高可用但是V-IP没有漂移到新的主库上的问题。代码如下:#!/usr/bin/env python

# -*- coding: utf-8 -*-

import MySQLdb,sys,os,threading,time

user = 'root'

passwd = '1q2w3e4r'

#mysql执行change master命令的用户名和密码

def log_w(text):#写日志

logfile = "slave_res.txt"

f = open(logfile,'a+')

f.write(text)

f.close()

def db_conn(host,res,flag):

text = "###################_____%s_____###################\n\n" % host

try:

conn = MySQLdb.connect(host = host,port = 6006,user = user,passwd = passwd,charset="utf8",connect_timeout = 5)

cursor = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)

sql = '''show slave status'''

cursor.execute(sql)#查看当前同步信息

alldata = cursor.fetchall()

if len(alldata) != 0:#如果没有同步信息则抛错,退出

if alldata[0]['Master_Log_File']==alldata[0]['Relay_Master_Log_File'] and alldata[0]['Read_Master_Log_Pos']==alldata[0]['Exec_Master_Log_Pos']:

text = text + "OK" + '\t' + 'Master_Host:' + str(alldata[0]['Master_Host']) + ' ' + str(alldata[0]['Master_Log_File']) + ' ' + str(alldata[0]['Relay_Master_Log_File']) + ' ' + str(alldata[0]['Read_Master_Log_Pos']) + ' ' + str(alldata[0]['Exec_Master_Log_Pos']) + ' ' + str(alldata[0]['Seconds_Behind_Master'])+'\n'

if flag == '1':

try:

sql = "stop slave;"

cursor.execute(sql)#停止从库同步

except Exception, e:

pass

sql = '''change master to master_host='192.10.100.100',master_user='rep_slave',master_password='rEeMAKEreplication6210',master_port=6006,master_log_file='mysql-bin.000100',master_log_pos=300;'''

cursor.execute(sql)#执行change master语句

sql = "start slave;"

cursor.execute(sql)#开启同步

sql = 'show slave status'

cursor.execute(sql)#查看最新的同步信息

alldata = cursor.fetchall()

if (alldata[0]['Slave_IO_Running'] == 'Yes') and (alldata[0]['Slave_SQL_Running'] == 'Yes'):

text = text + "OK" + '\t' + 'Master_Host:' + str(alldata[0]['Master_Host']) + ' ' + str(alldata[0]['Master_Log_File']) + ' ' + str(alldata[0]['Relay_Master_Log_File']) + ' ' + str(alldata[0]['Read_Master_Log_Pos']) + ' ' + str(alldata[0]['Exec_Master_Log_Pos']) + ' ' + str(alldata[0]['Seconds_Behind_Master'])+'\n'

else:

text = text + "Start Slave Error" + '\t' + 'Master_Host:' + str(alldata[0]['Master_Host']) + '\t' + 'Slave_IO_Running: '+str(alldata[0]['Slave_IO_Running']) + '\t' + 'Slave_SQL_Running:' + str(alldata[0]['Slave_SQL_Running']) + '\n'

else:

text = text + "Slave Error" + ' ' + 'Master_Host:' + str(alldata[0]['Master_Host']) + ' ' + str(alldata[0]['Master_Log_File']) + ' ' + str(alldata[0]['Relay_Master_Log_File']) + ' ' + str(alldata[0]['Read_Master_Log_Pos']) + ' ' + str(alldata[0]['Exec_Master_Log_Pos']) + str(alldata[0]['Seconds_Behind_Master'])+'\n'

else:

text = text + "Error,This host not set slave information"

cursor.close()

conn.close()

except Exception, e:

text = text + "Error" + '\t' + str(e)

res.append(text)

def start(flag):

threads = []

res = []

host_list = ['192.168.1.114','192.168.1.120']

for host in host_list:

t = threading.Thread(target=db_conn,args=(host,res,flag))

t.setDaemon(True)

threads.append(t)

for i in range(len(threads)):

threads[i].start()

time.sleep(0.1)

for i in range(len(threads)):

threads[i].join()

for i in res:

if "Error" in i:

print "\033[1;31;40m%s\033[0m" % i

else:

print i

log_w(i)

if flag == '1':

text = "\nChange master finished"

print text

log_w(text)

else:

text = "\nSHOW SLAVE STATUS complete"

print text

log_w(text)

text = "\n\n################### %s ###################\n\n" % time.strftime("%Y-%m-%d %H:%M:%S")

print text

log_w(text)

def main():

print

print "请选择操作类型:\n\n0:查看所有从库的同步状态\n1:改变所有从库的主库指向\n"#.decode("utf-8").encode("GBK")

for i in range(3):

choose = raw_input('Your choose : ')

if choose == '0' or choose == '1':

start(choose)

break

else:

print "Error,please Enter right noumber again ."

print

if __name__=='__main__':

main()

bc70b286c69e83fc9e0da95146ec95d1.png

1f71d4d5b87f9edc2678b1821168ca3c.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值