此脚本主要用于mysql数据库主从在正常情况下,因某种原因需要切换IP的情况下使用,主要就是切换IP,主要是通过内网切换公网IP,脚本代码如下:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- #script used in Slave Server for change server ip
- import os,sys,time,socket,paramiko,MySQLdb
-
- def mysql_connect(ip,sql):#数据库连接
- try:
- conn = MySQLdb.connect(host = ip,user = "repl",passwd = "VQrtetr8",connect_timeout=5)
- cursor = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
- cursor.execute(sql)
- alldata = cursor.fetchall()
- return alldata
- except MySQLdb.Error,e:
- return e.args[0]
-
- def ssh_conm(conm):#连接主库服务器并执行命令
- host = mysql_connect("127.0.0.1","show slave status")[0]["Master_Host"]
- #stat = mysql_chcek(host)
- username="root"
- password = "3141315"
- port = 63008
- s=paramiko.SSHClient()
- s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- s.connect(host,port,username,password)
- stdin,stdout,stderr=s.exec_command(conm)
- result = stdout.read()
- s.close()
- return result
-
- def log_pos():#获取当前主从的同步位置
- result = mysql_connect("127.0.0.1","show slave status")
- host = result[0]["Master_Host"]
- s_log = result[0]["Relay_Master_Log_File"].split(".")[1]
- s_pos = result[0]["Exec_master_log_pos"]
- result = mysql_connect(host,"show master status")
- if result == 2003:#这里是应对mysql数据库无法连接,可以选择据继续和终止脚本
- choose = raw_input("Can not connect Master,Do you go on ? (y or n) :")
- if choose == "y":
- return 0,0,0,0
- else:
- sys.exit(1)
- m_log = result[0]["File"].split(".")[1]
- m_pos = result[0]["Position"]
- return s_log,m_log,s_pos,m_pos
-
- def show():#循环5次判断主从同步是否一致
- print "Check Master-Slave now..."
- for i in range(5):
- s_log,m_log,s_pos,m_pos = log_pos()
- if s_log == m_log and s_pos == m_pos:
- print "Slave and Master is OK."
- break
- else:
- print "Slave and Master not OK,please wait moment."
- if i == 4:
- #print "Must be show Replcation Error,Quit this script now !"
- choose = raw_input("Master-slave not synchronous,Do you go on ? (y or n) :")
- if choose == "y":
- break
- else:
- sys.exit(1)
- i = i + 1
- time.sleep(5)
-
- def replace():
- #显示当前主从的IP,并检测主从3306是否存在
- print "Before switching IP:"
- s_ip = os.popen("cat /etc/sysconfig/network-scripts/ifcfg-eth0|grep IPADDR|awk -F "=" "{print $2}"").read().split()[:1][0]
- print "s_ip: " + s_ip
- conm = "cat /etc/sysconfig/network-scripts/ifcfg-eth0|grep IPADDR|awk -F "=" "{print $2}""
- m_ip = ssh_conm(conm).split()[:1][0]
- print "m_ip: " + m_ip
- print
- #1:停用主的网卡
- conm = "ifdown eth0"
- ssh_conm(conm)
- #2: 判断主从同步是否一致,如果一致则切换,不一致则手动查看问题所在(不一致的情况重复检测5次,间隔5s,检测五次依然不同步可以选择停止脚本的执行或继续执行)
- show()
- #3:修改从IP为主的IP
- os.popen("sed -i "s/%s/%s/" /etc/sysconfig/network-scripts/ifcfg-eth0" % (s_ip,m_ip))
- print "Slave change IP is OK"
- #4:修改主IP为从的IP
- conm = "sed -i "s/%s/%s/" /etc/sysconfig/network-scripts/ifcfg-eth0" % (m_ip,s_ip)
- ssh_conm(conm)
- print "Master change IP is OK"
- #5: 显示替换之后主从的IP
- print
- print "After switching IP:"
- s_ip = os.popen("cat /etc/sysconfig/network-scripts/ifcfg-eth0|grep IPADDR|awk -F "=" "{print $2}"").read().split()[:1][0]
- print "s_ip: " + s_ip
- conm = "cat /etc/sysconfig/network-scripts/ifcfg-eth0|grep IPADDR|awk -F "=" "{print $2}""
- m_ip = ssh_conm(conm).split()[:1][0]
- print "m_ip: " + m_ip
- #6: 停止主从同步
- mysql_connect("127.0.0.1","slave stop")
- print "Slave stop OK"
- #7: 重启用主从的网卡
- print
- print "Network service restart now,please wait ......"
- conm = "ifup eth0"
- ssh_conm(conm)
- os.system("ifdown eth0")
- os.system("ifup eth0")
- print "Network reatrt OK !"
-
- if __name__ == "__main__":
- replace()
Oracle RMAN 备份命令超详细解释Oracle参数文件的本质相关资讯 MySQL 主从数据库 MySQL 主从切换 MySQL 切换数据库 本文评论 查看全部评论 (1)
评论声明- 尊重网上道德,遵守中华人民共和国的各项有关法律法规
- 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
- 本站管理人员有权保留或删除其管辖留言中的任意内容
- 本站有权在网站内转载或引用您的评论
- 参与本评论即表明您已经阅读并接受上述条款
|
|