仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 669|回复: 7
打印 上一主题 下一主题

[CentOS(社区)] Linux教程之python主动创立mysql的从库剧本

[复制链接]
变相怪杰 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 21:05:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
小知识:Linux在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。
本剧本重要用于创立mysql主从的从库,而且主库曾经设置装备摆设好相干的主从参数,主库下面有须要同步的数据库备份,在从库上履行此剧本,经由过程内网获得主库的设置装备摆设文件、数据库备份、主库的权限库等用于从库的创立,主动取得须要同步主库的bin-log地位及pos点(本剧本的备份是早晨0点备份,此剧本曾经在我公司多个游戏数据库上运用,还不错,人人可以看看!
  1. #!/usr/bin/envpython#-*-coding:utf-8-*-###############################################################################@Author:wangwei#@E-mail:wangwei03@gyyx.cn#@CreateDate:2012-10-23#@Version:V6##############################################################################importparamiko,os,sys,datetime,time,MySQLdbdeflog_w(text):logfile="/home/create_slave.log"now=time.strftime("%Y-%m-%d%H:%M:%S")tt=str(now)+"        "+str(text)+"
  2. "f=open(logfile,a+)f.write(tt)f.close()classDatabase:def__init__(self,host):self.user=rootself.password=123456self.port=22self.today=datetime.date.today().strftime(%Y%m%d)self.bindir=/data1/mysql_logself.host=hostifnotos.path.isdir(self.bindir):os.makedirs(self.bindir)os.popen("ln-s/data1/mysql_log/mysql_log")ifnotos.path.isdir(/data1/mysql_log/binlog):os.makedirs(/data1/mysql_log/binlog)ifnotos.path.isdir(/data1/mysql_log/relaylog):os.makedirs(/data1/mysql_log/relaylog)os.popen("chown-Rmysql.mysql/data1/mysql_log/")defcheck_mysql(self):#检讨从库nysql数据库办事能否运转,如在运转则pkill失落,然后跳过权限表启动,为导入数据做预备text="Checkmysqlnow,Pleasewait...."log_w(text)print"\033[1;32;40m%s\033[0m"%textos.popen("rm-rf/mysql_log/binlog/*&&rm-rf/mysql_log/relaylog/*")ifnotos.path.isdir("/usr/local/mysql"):text="Mysqlnotinstall,Pleaseinstallmysql!"log_w(text)print"\033[1;31;40m%s\033[0m"%textsys.exit()ifos.popen("netstat-ntlp|grep3306|wc-l").read().strip()!=0:os.popen("pkillmysqld")while1:ifos.popen("netstat-ntlp|grep3306|wc-l").read().strip()==0:forfinos.listdir("/home/mysql/data"):#清空此目次中除mysql目次以外的一切文件和目次iff!=mysql:os.popen("rm-rf/home/mysql/data/%s"%f)conm="/usr/local/mysql/bin/mysqld_safe--defaults-file=/usr/local/mysql/etc/innodb.cnf--datadir=/home/mysql/data--user=mysql--skip-grant-tables&"os.popen(conm)breakelse:text="Mysqlnotstop,pleasewait..."log_w(text)printtexttime.sleep(5)time.sleep(20)ifos.popen("netstat-ntlp|grep3306|wc-l").read().strip()==0:text="MysqlnotRunning,pleasestartwith--skip-grant-tables!"log_w(text)print"\033[1;31;40m%s\033[0m"%textsys.exit()defexport_table(self):#导出以后主库的表构造print"\033[1;32;40m%s\033[0m"%"Exportmastertableandbackmysql,Pleasewait...."try:s=paramiko.SSHClient()s.set_missing_host_key_policy(paramiko.AutoAddPolicy())s.connect(self.host,self.port,self.user,self.password)conm="/usr/local/mysql/bin/mysqldump--add-drop-table-udump-p123456-d-A|bzip2-2>/data/script/db_back/table_%s.bz2&&cp-f/usr/local/mysql/etc/innodb.cnf/data/script/db_back/&&echo$?"%self.todaystdin,stdout,stderr=s.exec_command(conm)result=stdout.readlines()[-1].strip()s.close()ifresult==0:text="Export_tablesuccess!"log_w(text)printtextelse:text="Export_tableError!"log_w(text)print"\033[1;31;40m%s\033[0m"%textsys.exit()exceptException,e:text="SSHconnectError!"log_w(text)print"\033[1;31;40m%s\033[0m"%textsys.exit()defdown_back(self):#拷贝主库当天的数据库备份和表构造local_dir=/data1/remote_dir=/data/script/db_back/try:t=paramiko.Transport((self.host,self.port))t.connect(username=self.user,password=self.password)sftp=paramiko.SFTPClient.from_transport(t)files=sftp.listdir(remote_dir)text="Downloadbackfile,Pleasewait...."log_w(text)print"\033[1;32;40m%s\033[0m"%texttext=Beginningtodownloadfilefrom%s%s%(self.host,datetime.datetime.now())log_w(text)printtextforfinfiles:iff.find(self.today)!=-1orf==innodb.cnf:text="Downloadingfile:%s:%s"%(self.host,os.path.join(remote_dir,f))log_w(text)printtextsftp.get(os.path.join(remote_dir,f),os.path.join(local_dir,f))#sftp.put(os.path.join(local_dir,f),os.path.join(remote_dir,f))t.close()text=DownloadAllbackfilesuccess%s%datetime.datetime.now()log_w(text)printtextexceptException,e:text="SFTPconnectError!"log_w(text)print"\033[1;31;40m%s\033[0m"%textsys.exit()defunbz2(self):#解压拷贝的数据库备份和表构造bz2包text="Decompressionfile,Pleasewait...."log_w(text)print"\033[1;32;40m%s\033[0m"%texttext=BeginningtoDecompressionfilefrom%s%datetime.datetime.now()log_w(text)printtextconm=bzip2-dfk/data1/*%s*.bz2&&echo$?%self.todaybz=os.popen(conm).read().strip()ifbz==0:text=Decompressionfilesuccess%s%datetime.datetime.now()log_w(text)printtextelse:text="DecompressionError!"log_w(text)print"\033[1;31;40m%s\033[0m"%textsys.exit()defrestart_mysql(self):text="RestartmysqlNow,Pleasewait...."log_w(text)print"\033[1;32;40m%s\033[0m"%textos.popen("rm-rf/usr/local/mysql/etc/innodb.cnf&&cp-f/data1/innodb.cnf/usr/local/mysql/etc/innodb.cnf")old_id=os.popen("cat/usr/local/mysql/etc/innodb.cnf|grep^server-id|awk{print$3}").read().strip()new_id=int(old_id)+1os.popen("sed-is/server-id=%s/server-id=%s//usr/local/mysql/etc/innodb.cnf"%(old_id,new_id))os.popen("/usr/local/mysql/bin/mysqladminshutdown")os.popen("rm-rf/home/mysql/data/*.info&&rm-rf/home/mysql/data/ib_logfile*")os.popen("/usr/local/mysql/bin/mysqld_safe--defaults-file=/usr/local/mysql/etc/innodb.cnf--datadir=/home/mysql/data--user=mysql&")time.sleep(20)ifos.popen("netstat-ntlp|grep3306|wc-l").read().strip()==0:text="MysqlrestartError,pleasecheck!"log_w(text)print"\033[1;31;40m%s\033[0m"%textsys.exit()defimport_date(self):#导入表构造和备份数据库text="Slaveimportmasterdate,Pleasewait...."log_w(text)print"\033[1;32;40m%s\033[0m"%text#导入表构造dir=/data1/table=table_%s%self.todayconm="/usr/local/mysql/bin/mysql<%s%s&&echo$?"%(dir,table)result=os.popen(conm).read().strip()ifresult==0:text="Import%ssuccess!"%tablelog_w(text)printtextelse:text="ImportTablestructureError!"log_w(text)print"\033[1;31;40m%s\033[0m"%textsys.exit()forfinos.listdir(dir):#导入数据库ifos.path.isfile(os.path.join(dir,f))and(f.find(bz2)==-1)and(f.find(table)==-1):iff.find(wd)!=-1andf.find(self.today)!=-1:conm="/usr/local/mysql/bin/mysql<%s&&echo$?"%os.path.join(dir,f)result=os.popen(conm).read().strip()ifresult==0:text="Import%ssuccess!"%flog_w(text)printtextelse:text="ImportDatabaseadbError!"log_w(text)print"\033[1;31;40m%s\033[0m"%textsys.exit()defslave_start(self):#启动salvetext="SettingsSlave,Pleasewait...."log_w(text)print"\033[1;32;40m%s\033[0m"%textbinlog,log_pos=self.bin_pos()sql="changemastertomaster_host=%s,master_user=repl,master_password=123456,master_port=3306,master_log_file=%s,master_log_pos=%s;"%(self.host,binlog,log_pos)try:conn=MySQLdb.connect(host=127.0.0.1,user=repl_monitor,passwd=123456,connect_timeout=5)cursor=conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)#cursor.execute("slavestop;")cursor.execute(sql)cursor.execute("slavestart;")cursor.execute("showslavestatus;")alldata=cursor.fetchall()[0]ifalldata["Slave_IO_Running"]=="Yes"andalldata["Slave_SQL_Running"]=="Yes":text="SettingsSlavesuccess!"log_w(text)print"\033[1;32;40m%s\033[0m"%textforkeyinalldata:print"%21s:"%key+        +str(alldata[key])time.sleep(5)printprint"******************************************"printcursor.execute("showslavestatus;")alldata=cursor.fetchall()[0]forkeyinalldata:print"%21s:"%key+        +str(alldata[key])else:text="SettingsSlaveError,Pleasecheckit!"log_w(text)print"\033[1;31;40m%s\033[0m"%textcursor.close()conn.close()exceptMySQLdb.Error,e:log_w(e)printesys.exit()defbin_pos(self):#获得主库备份前的一个bin-log文件和它的第一个pos地位dir=/data1/forfinos.listdir(dir):ifos.path.isfile(os.path.join(dir,f))and(f.find(bz2)==-1)and(f.find(table)==-1):iff.find(wd)!=-1andf.find(self.today)!=-1:binlog=f.split(_)[3]log_pos=f.split(_)[4]returnbinlog,log_posdeffind_ip():#走中间运用确认本办事器能否用于从库text="正在从中间运用确认本办事器能否用于从库,稍等......".decode("utf-8").encode("GBK")log_w(text)print"\033[1;32;40m%s\033[0m"%textip=os.popen("cat/etc/sysconfig/network-scripts/ifcfg-eth0|grepIPADDR|awk-F={print$2}").read().strip()try:conn=MySQLdb.connect(host=192.168.1.110,user=root,passwd=1q2w3e4r,connect_timeout=5)cursor=conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)sql="SELECTc.dist_id,c.ip,c.app_nameFROMcenter_app.main_categorya,center_app.sub_categoryb,center_app.app_infocWHEREa.id=b.main_idANDb.dist_id=c.dist_idANDb.main_id=c.main_idANDb.main_id=2ANDc.app_nameIN(ldb,adb,slave)ANDc.flag=1ANDc.del_info!=0ANDc.dist_idNOTIN(0,1,-100,-1,222)ANDc.ip=%s"%ipcursor.execute(sql)alldata=cursor.fetchall()[0]ifalldata["app_name"]=="slave":text="Thisserverisslaveserver,serverOK!!"log_w(text)print"\033[1;32;40m%s\033[0m"%textelse:text="Thisserverisnotusedslaveserver,serverError,pleasecheckit!!"log_w(text)print"\033[1;31;40m%s\033[0m"%textsys.exitcursor.close()conn.close()exceptMySQLdb.Error,e:log_w(e)printesys.exit()if__name__=="__main__":print"\033[1;31;40m%s\033[0m"%留意事项:1、确认主库曾经依照请求修正设置装备摆设文件翻开了bin-log,设置了相干参数2、确认从库曾经装置和主库一样版本的mysql3、确认从库的设置装备摆设文件正文失落了log-bin,不然从库导入数据库时会失足4、剧本运转过程当中会消除从库/home/mysql/data/目次上面除mysql目次以外的一切目次和文件,有需要的话请做好备份5、运转以后删除/data1/目次下的紧缩包6、运转格局:pythoncreate_slave.py依据提醒输出主库的内网地址7、从库创立完成而且数据与主库追齐以后要用剧本验证数据的分歧性,数据分歧后全部创立从库进程完成8、在履行check_mysql时,会涌现Brokenpipe的毛病,这个是因为python挪用体系敕令封闭和翻开mysql时显示的信息没有准确的显示在终端酿成的,没有影响,临时没有找到不让显示此类信息的办法,亟待处理.decode("utf-8").encode("GBK")find_ip()master_ip=raw_input(Enter:Mater_eth1_ip:)boss=Database(master_ip)boss.check_mysql()boss.export_table()boss.down_back()boss.unbz2()boss.import_date()boss.restart_mysql()boss.slave_start()
复制代码

小知识:CentOS是企业Linux发行版领头羊RedHatEnterpriseLinux(以下称之为RHEL)的源代码再编译版本。
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-16 21:16:24 | 只看该作者

Linux教程之python主动创立mysql的从库剧本

在学习linux的工程中,linux学习方法有很多种,这里是小编的学习心得,给大家拿出来分享一下。
再现理想 该用户已被删除
板凳
发表于 2015-1-19 07:58:48 | 只看该作者
我学习Linux的心得体会 ,希望对大家的学习有所帮助,由于水平有限,本文难免有所欠缺,望请指正。
乐观 该用户已被删除
地板
发表于 2015-1-28 05:48:42 | 只看该作者
甚至目前许多应用软件都是基于它的。可是没有哪一个系统是十分完美的。
若天明 该用户已被删除
5#
发表于 2015-2-5 18:34:21 | 只看该作者
我们自学,就这个循环的过程中,我们学习了基本操作,用vi,shell,模拟内存的分配过程等一些OS管理。
分手快乐 该用户已被删除
6#
发表于 2015-3-3 17:14:38 | 只看该作者
随着实验课程的结束,理论课也该结束了,说实话教OS的这两位老师是我们遇到过的不错的老师(这话放这可能不太恰当).
第二个灵魂 该用户已被删除
7#
发表于 2015-3-11 13:14:13 | 只看该作者
这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。
老尸 该用户已被删除
8#
发表于 2015-3-26 19:10:24 | 只看该作者
对Linux命令熟悉后,你可以开始搭建一个小的Linux网络,这是最好的实践方法。Linux是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web服务器、DNS服务器等都非常完善。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-14 20:58

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表