MySQL主从复制python安装
import os
import sys
import configparser
import subprocess
import logging
import multiprocessing
import time
import re
from .mysql_single_install import MySQL_Single_Install,full_single_install
from .ssh_client import MySshClient
from . import xtrabackup_master
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
class MySQL_Multi_Install(object):
def __init__(self,source_ip,target_ip,db_port,mbd):
self.source_ip=source_ip
self.target_ip=target_ip
self.db_port=db_port
self.mbd=mbd
self.msi=MySQL_Single_Install(self.target_ip,self.db_port)
def copy_backup2sla(self):
xtrabackup_master.create_backup_base(self.source_ip)
managerbackupdir=self.mbd
cmd='scp -r %s %s:/tmp/'%(managerbackupdir,self.target_ip)
os.system(cmd)
logger.info('xtrabackup has transport from manager machine to slave machine')
return '/tmp/'+managerbackupdir.split('/')[-1]
def xtra_apply(self):
my_ssh_client = MySshClient()
self.msi.check_datadir()
targetdir=self.copy_backup2sla()
cmd='xtrabackup --defaults-file=/etc/my%s.cnf -udbadmin --prepare --target-dir=%s'%(self.db_port,targetdir)
my_ssh_client.ssh_interactive(self.target_ip,cmd)
cmd='xtrabackup --defaults-file=/etc/my%s.cnf -udbadmin --copy-back --target-dir=%s'%(self.db_port,targetdir)
my_ssh_client.ssh_interactive(self.target_ip, cmd)
self.msi.dir_chown()
self.msi.start_mysql()
return targetdir
def config_slave(self):
targetdir=self.xtra_apply()
cmd="ssh %s cat %s/xtrabackup_info |grep binlog_pos|awk -F 'filename' '{print $2}'|awk -F ', position' '{ print $1,$2}'|sed 's/'\"'\"/'''/g'|awk '{print $1,$2}'"%(self.target_ip,targetdir)
(status,res)=subprocess.getstatusoutput(cmd)
print(status,res)
(binlog,pos)=res.split(' ')
logger.info('slave has get primary pos and binlog')
self.msi.check_installtempfile()
my_ssh_client = MySshClient()
cmd="/usr/local/mysql/bin/mysql -udbadmin -p'dbadmin' -h %s -P %s -e\"CHANGE MASTER TO master_host='%s', master_port=%s, master_user='repl',master_password='repl2data', master_log_file='%s', master_log_pos=%s;start replica;\">/tmp/mysqlinstalltemp.txt 2>&1"%(self.target_ip,self.db_port,self.source_ip,self.db_port,binlog,pos)
my_ssh_client.ssh_interactive(self.target_ip,cmd)
res = my_ssh_client.ssh_interactive(self.target_ip, 'cat /tmp/mysqlinstalltemp.txt |grep ERROR|wc -l')
count = 0
while True:
if int(res) > 0 and count <= 5:
logger.info('again start slave')
time.sleep(10)
my_ssh_client.ssh_interactive(self.target_ip, cmd)
res = my_ssh_client.ssh_interactive(self.target_ip, 'cat /tmp/mysqlinstalltemp.txt |grep ERROR|wc -l')
count += 1
elif count>5 and int(res) > 0:
logger.error('start slave failed')
break
else:
my_ssh_client.ssh_interactive(self.target_ip, 'rm -rf /tmp/mysqlinstalltemp.txt')
logger.info('start slave success')
break
def full_multil_install(source_ip,target_ip_list,db_port):
full_single_install(source_ip,db_port)
managerbackupdir = xtrabackup_master.copy_backup2manger(source_ip, db_port)
try:
for sla_ip in target_ip_list:
print(target_ip_list)
print("slave ip is %s"%sla_ip)
msi=MySQL_Single_Install(sla_ip,db_port)
msi.check_mysqlbasedir_exists()
msi.check_mysql_user()
msi.conf_defined()
mmi = MySQL_Multi_Install(source_ip, sla_ip, db_port, managerbackupdir)
mmi.config_slave()
msi.set_osenv()
return '200'
except Exception as e:
print(e)
sys.exit()
if __name__=='__main__':
pass