MySQL数据库主从切换脚本自动化
MySQL数据库主从切换脚本自动化
本文转载自:https://blog.csdn.net/weixin_36135773/article/details/79514507
在一些实际环境中,如何实现主从的快速切换,在没有MHA等工具的辅助下,如何避免影响线上的业务,一般都会在在业务低峰期进行主从切换,本脚本主要利用MySQL自带的命令行工具(FLUSH TABLES WITH READ LOCK
)进行锁全库,且由用户自行输入判断多少秒内从库BINLOG数据不在同步后,认为主从数据已达一致性可以进行主从切换(在一些资料上说也可以用READ-ONLY来锁库,但需要注意如果写入用户具有Admin权限是不受限制),主从切换完成5秒后进行检查主从是否同步问题.
连接数据库使用TCP/IP方式,需要相应的操作数据库权限。
目前判断使用show master status 来判断,可以show slave status返回的值来判断,自行修改。
- yum install MySQL-python
脚本:switch_master_slave.py
- #!/usr/bin/env python
- # -*- coding: utf- -*-
- import MySQLdb
- import time
- import sys
- class m_s:
- def __init__(self,host,user,password,port):
- self.host=host
- self.user=user
- self.passowrd=password
- self.port=port
- def getConn(self,db="mysql"):
- try:
- conn=MySQLdb.connect(host=self.host, user=self.user, passwd=self.passowrd, db=db, port=self.port, charset="utf8")
- cur = conn.cursor()
- return cur
- except Exception as e:
- return e
- def execSQLlock(self,*args):
- flush_sql="FLUSH TABLES WITH READ LOCK"
- cur.execute(flush_sql)
- def execIo(self,cur,command):
- cur.execute(command)
- db_pos = cur.fetchall()
- for value in db_pos:
- value=value
- return value
- def exeStop(self,cur,command):
- cur.execute(command)
- db_pos = cur.fetchall()
- return db_pos
- def execSQLstatus(self,*args):
- n=
- self.execSQLlock(cur)
- flush_m = "flush logs"
- cur.execute(flush_m)
- while True:
- data=[]
- slave_pos=[]
- n=n+
- exe_sql = "select Command,State,Info,Id from information_schema.processlist"
- cur.execute(exe_sql)
- plist = cur.fetchall()
- for li in range(len(plist)):
- if plist[li][] == "Query" and plist[li][] == "Waiting for global read lock":
- lock_id = "kill " + str(plist[li][])
- print plist[li][]
- cur.execute(lock_id)
- slave_pos.append(self.execIo(cur1, "show master status")[])
- data.append(self.execIo(cur1,"show slave status")[]) ##从库的游标
- time.sleep()
- slave_pos.append(self.execIo(cur1, "show master status")[])
- data.append(self.execIo(cur,"show master status")[])##从库的游标
- print ".......",data,slave_pos
- if data[]==data[] and slave_pos[]==slave_pos[]:
- try:
- print "第%s次判断数据已经同步....."%n
- if n==c_time:
- print "开始主从切换工作........"
- self.exeStop(cur1,"stop slave") ##停止从库同步
- new_pos=self.exeStop(cur1,"show master status")#获取新主库的FILE和POS的值,游标为还没切换前的从库
- #print "获取新主库的FILE和POS的值,游标为还没切换前的从库",new_pos
- self.exeStop(cur,"reset master;")##主库释放从库主从信息......
- ##在从库执行new_change 指向新的主库
- self.exeStop(cur1,"reset slave all")
- new_change="change master to master_host='"+str(args[])+"'"+",master_user='"+args[]+"'"+",master_password='"+args[]+"',master_port="+str(args[])+",MASTER_LOG_FILE='"+str(new_pos[][])+"'"+",MASTER_LOG_POS="+str(new_pos[][])
- print new_change
- self.exeStop(cur,new_change)##在原来主库上执行change master to.....
- #print "在原来主库上执行change master to...."
- self.exeStop(cur,"start slave") ##在原来主库上执行change master to.....
- time.sleep()
- s_pos=self.exeStop(cur,"show slave status;")
- #print s_pos[][],s_pos[][]
- if s_pos[][]=="Yes" and s_pos[][]=="Yes":
- self.exeStop(cur1,"reset slave all")
- print "主从切换成功!"
- print "\n"
- while True:
- print "等待其他操作完成,即将unlock tables主库......"
- try:
- stop = raw_input("输入终止命令q即完成此次操作:\n")
- if stop == "q":
- sys.exit()
- # break
- except Exception as e:
- print "good bye"
- else:
- print s_pos[][]
- break
- except Exception as e:
- return e
- else:
- print "主从数据未达到一致性..........",n
- n=
- data=[]
- if __name__ =="__main__":
- c_time=int(raw_input("多少秒后进行主从切换..>>"))
- print "****************************************************\n"
- print "请根据提示输入指定信息:"
- m_host = raw_input("目前主库的地址:")
- m_user = raw_input("目前主库的登陆用户名:")
- m_password = raw_input("目前主库的密码:")
- m_port = int(raw_input("目前主库的端口:"))
- print "****************************************************\n"
- s_host = raw_input("目前从库的地址:")
- s_user = raw_input("目前从库的登陆用户名:")
- s_password = raw_input("目前从库的密码:")
- s_port = int(raw_input("目前从库的端口:"))
- M = m_s(m_host, m_user, m_password, m_port)
- S = m_s(s_host,s_user,s_password,s_port)
- cur = M.getConn() ##获取主库游标
- cur1 = S.getConn() ##获取从库游标
- print "*****************************************************\n"
- print "主从同步用户信息.........\n"
- s_user1 = raw_input("输入主从同步的用户>>:")
- s_password1 = raw_input("输入主从同步的密码:")
- s_port1 = int(raw_input("输入主从同步的端口:"))
- M.execSQLstatus(cur,s_host,s_user1,s_password1,s_port1)
- # python switch_master_slave.py
- 多少秒后进行主从切换..>>
- ****************************************************
- 请根据提示输入指定信息:
- 目前主库的地址:192.168.56.100
- 目前主库的登陆用户名:wanbin
- 目前主库的密码:mysql
- 目前主库的端口:
- ****************************************************
- 目前从库的地址:192.168.56.200
- 目前从库的登陆用户名:wanbin
- 目前从库的密码:mysql
- 目前从库的端口:
- *****************************************************
- 主从同步用户信息.........
- 输入主从同步的用户>>:repl
- 输入主从同步的密码:wanbin
- 输入主从同步的端口:
- ....... [234L, 234L] [250L, 250L]
- 第1次判断数据已经同步.....
- ....... [234L, 234L] [250L, 250L]
- 第2次判断数据已经同步.....
- ....... [234L, 234L] [250L, 250L]
- 第3次判断数据已经同步.....
- ....... [234L, 234L] [250L, 250L]
- 第4次判断数据已经同步.....
- ....... [234L, 234L] [250L, 250L]
- 第5次判断数据已经同步.....
- 开始主从切换工作........
- change master to master_host='192.168.56.200',master_user='repl',master_password='wanbin',master_port=,MASTER_LOG_FILE='my3306_binlog.000018',MASTER_LOG_POS=
- switch_master_slave.py:: Warning: Sending passwords in plain text without SSL/TLS is extremely insecure.
- cur.execute(command)
- switch_master_slave.py:: Warning: Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
- cur.execute(command)
- 主从切换成功!
- 等待其他操作完成,即将unlock tables主库......
- 输入终止命令q即完成此次操作:
- 等待其他操作完成,即将unlock tables主库......
- 输入终止命令q即完成此次操作:
- q
- 等待其他操作完成,即将unlock tables主库......
- 输入终止命令q即完成此次操作:
- q
MySQL数据库主从切换脚本自动化的更多相关文章
- Spring AOP实现Mysql数据库主从切换(一主多从)
设置数据库主从切换的原因:数据库中经常发生的是“读多写少”,这样读操作对数据库压力比较大,通过采用数据库集群方案, 一个数据库是主库,负责写:其他为从库,负责读,从而实现读写分离增大数据库的容错率. ...
- mysql+keepalived主从切换脚本 转
Keepalived MySQL故障自动切换脚本 MySQL架构为master-slave(主从),master故障自动切换到slave上.当然也可以设置为双master,但这里有个弊端:就是当主 ...
- (转)Mysql数据库主从心得整理
Mysql数据库主从心得整理 原文:http://blog.sae.sina.com.cn/archives/4666 管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本 ...
- Linux下定时备份MySQL数据库的Shell脚本
Linux下定时备份MySQL数据库的Shell脚本 对任何一个已经上线的网站站点来说,数据备份都是必须的.无论版本更新还是服务器迁移,备份数据的重要性不言而喻.人工备份数据的方式不单耗费大量时间 ...
- MySQL数据库主从同步实战过程
Linux系统MySQL数据库主从同步实战过程 安装环境说明 系统环境: [root@~]# cat /etc/redhat-release CentOS release 6.5 (Final) ...
- mysql数据库主从同步
环境: Mater: CentOS7.1 5.5.52-MariaDB 192.168.108.133 Slave: CentOS7.1 5.5.52-MariaDB 192.168. ...
- mysql数据库主从同步读写分离(一)主从同步
1.mysql数据库主从同步读写分离 1.1.主要解决的生产问题 1.2.原理 a.为什么需要读写分离? 一台服务器满足不了访问需要.数据的访问基本都是2-8原则. b.怎么做? 不往从服务器去写了 ...
- MySQL数据库主从同步延迟分析及解决方案
一.MySQL的数据库主从复制原理 MySQL主从复制实际上基于二进制日志,原理可以用一张图来表示: 分为四步走: 1. 主库对所有DDL和DML产生的日志写进binlog: 2. 主库生成一个 lo ...
- mysql数据库分库备份脚本
mysql数据库分库备份脚本 版本1 for dbname in `mysql -uroot -poldboy123 -e "show databases;" |grep -Evi ...
随机推荐
- jQuery EasyUI/TopJUI创建日期时间输入框
jQuery EasyUI/TopJUI创建日期时间输入框 日期时间输入框组件 HTML 和日期输入框类似,日期时间输入框允许用户选择日期和指定的时间并按照指定的输出格式显示.相比日期输入框,它在下拉 ...
- js异步加载和按需加载
function loadScript(url,callback){ var script = document.creatElement("script"); script.ty ...
- Java NIO 必知必会(Example)
管道流: Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. package base.nio.t ...
- Mysql和oracle字段类型与java对象类型对应表收藏
https://blog.csdn.net/michaelzhou224/article/details/16827029 Mysql Oracle Java BIGINT NUMBER(19,0) ...
- 066 Plus One
给定一个非负整数组成的非空数组,给整数加一.可以假设整数不包含任何前导零,除了数字0本身.最高位数字存放在列表的首位.详见:https://leetcode.com/problems/plus-one ...
- 浮点数据与IEE754
在计算机系统(包括单片机)中,浮点数(单精度float和双精度的double)对采用IEE-754标准.该标准为 32 位浮点和 64 位双精度浮点二进制小数定义了二进制标准. IEEE 754 用科 ...
- javascript 关于hashtable
javascript 实现HashTable(哈希表) 一.javascript哈希表简介 javascript里面是没有哈希表的,一直在java,C#中有时候用到了这一种数据结构,javascrip ...
- 洛谷P1057 传球游戏
f[i][j]表示第i轮j拿到球的方案数 转移:f[i][j]=f[i-1][j+1] +f[i-1][j+-1].注意: 边界f[0][1]=1; 还有当j=1或N时 #include<ios ...
- VS2013使用EF6通过ADO.NET 连接mySql成功步骤
VS2013使用EF6通过ADO.NET 连接mySql成功步骤 1.安装mysql-for-visualstudio-1.2.6(我用的目前最新版,这个一般安装VS2013就已经有了,没有的话下载一 ...
- 用TextWriterTraceListener实现建议log文件记录
log4net之类3方组件确实很方便,但是想写个小小的demo之类的程序,有点用不起啊. 微软自带的TraceListener要实现一个简易的日志帮助类还是很简单的,直接上代码,自己备用,也希望对同样 ...