国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python制作mysql數(shù)據(jù)遷移腳本

2020-01-04 13:39:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

用python寫了個(gè)數(shù)據(jù)遷移腳本,主要是利用從庫(kù)將大的靜態(tài)表導(dǎo)出表空間,載導(dǎo)入到目標(biāo)實(shí)例中。

#!/usr/bin/env python3#-*- coding:utf8 -*-#author:zhanbin.liu#!!!!!DB必須同版本#python3環(huán)境  pip3 install pymysql paramikoimport os#from pathlib import Pathimport sysimport pymysqlimport paramiko#每次只能遷移一個(gè)DB下的表,到指定DB#GRANT SELECT, CREATE, RELOAD, ALTER, LOCK TABLES ON *.* TO 'data_migration'@'192.168.%' IDENTIFIED BY 'data_migration@123';tables='sqlauto_cluster,sqlauto_user'    #以,分割的字符串,如a,b,ctableList = tables.split(',')sourceIp = '192.168.1.101'sourceDataBase = '/data/mysql/3306/data'sourceDbName = 'inception_web'sourceDataDir = os.path.join(sourceDataBase,sourceDbName)desIp = '192.168.1.102'desDataBase = '/data/mysql/3306/data'desDbName = 'inception_web'desDataDir = os.path.join(desDataBase,desDbName)# for table in tableList:#   desFile = Path("%s/%s.ibd" %(desDataDir,table))#   print(desFile)#   if desFile.is_file():#     print("ok")#   else:#     print("no")comUser = 'data_migration'comPwd = 'data_migration@123'comPort = 3306client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())def table_judge():  print("table_judge")  sourceTableExist = pymysql.connect(sourceIp,comUser,comPwd,sourceDbName,comPort,charset='utf8')  desTableExist = pymysql.connect(desIp,comUser,comPwd,desDbName,comPort,charset='utf8')  sourceTables = []  desTables = []  cursor_source = sourceTableExist.cursor()  cursor_des = desTableExist.cursor()  for table in tableList:    #print(table)    cursor_source.execute("select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='%s' and TABLE_NAME='%s';" % (sourceDbName,table))    sourceTable_tmp = cursor_source.fetchall()    cursor_des.execute("select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='%s' and TABLE_NAME='%s';" % (desDbName,table))    desTable_tmp = cursor_des.fetchall()    #print(desTable_tmp)    if sourceTable_tmp is ():      sourceTables.append(table)    if desTable_tmp is not ():      desTables.append(desTable_tmp[0][0])  sourceTableExist.close()  desTableExist.close()  s=d=0  if sourceTables != []:    print('遷移源不存在將要遷移的表:',sourceIp,sourceDbName, sourceTables,' 請(qǐng)檢查')    s=1  if desTables != []:    print('目標(biāo)庫(kù)存在將要遷移的表:',desIp,desDbName,desTables,' 請(qǐng)移除')    d=1  if s == 1 or d == 1:    sys.exit()def data_sync():  print('data_sync')  db_source = pymysql.connect(sourceIp,comUser,comPwd,sourceDbName,comPort,charset='utf8')  db_des = pymysql.connect(desIp,comUser,comPwd,desDbName,comPort,charset='utf8')  cursor_db_source = db_source.cursor()  cursor_db_des = db_des.cursor()  for table in tableList:    print("正在同步表:",table)    cursor_db_source.execute("show create table %s;" % (table))    createTableSQL = cursor_db_source.fetchall()[0][1]    print(createTableSQL)    try:      cursor_db_des.execute(createTableSQL)    except Exception as error:      print(error)    cursor_db_source.execute("flush table %s with read lock;" % (table))    cursor_db_des.execute("alter table %s discard tablespace;" % (table))    client.connect(sourceIp, 22, 'root')    stdin1, stdout1, stderr1 = client.exec_command("scp %s %s:%s " % (sourceDataDir+"/"+table+".ibd", desIp, desDataDir))    stdin2, stdout2, stderr2 = client.exec_command("scp %s %s:%s " % (sourceDataDir+"/"+table+".cfg", desIp, desDataDir))    a_e_1 = stderr1.readlines()    a_e_2 = stderr2.readlines()    if a_e_1 != [] or a_e_2 != []:      print(a_e_1,a_e_2)      sys.exit()    client.close()    client.connect(desIp, 22, 'root')    stdin3, stdout3, stderr3 = client.exec_command("chown -R mysql.mysql %s*" % (desDataDir+"/"+table))    a_e_3 = stderr3.readlines()    if a_e_3 != []:      print(a_e_1, a_e_2)      sys.exit()    client.close()    #cursor_db_source.execute("select sleep(10);")    cursor_db_source.execute("unlock tables;")    cursor_db_des.execute("alter table %s import tablespace;" % (table))    print("同步完成")  cursor_db_source.close()  cursor_db_des.close()def data_checksum():  print('data_checksum')  db_source = pymysql.connect(sourceIp,comUser,comPwd,sourceDbName,comPort,charset='utf8')  db_des = pymysql.connect(desIp,comUser,comPwd,desDbName,comPort,charset='utf8')  cursor_db_source = db_source.cursor()  cursor_db_des = db_des.cursor()  for table in tableList:    print("正在校驗(yàn)表:", table)    cursor_db_source.execute("checksum table %s;" % (table))    ck_s = cursor_db_source.fetchall()[0][1]    cursor_db_des.execute("checksum table %s;" % (table))    ck_d = cursor_db_des.fetchall()[0][1]    if ck_s != ck_d:      print("表不一致:",table)    else:      print("表一致:",table)  cursor_db_source.close()  cursor_db_des.close()if __name__ == "__main__":  table_judge()  data_sync()  data_checksum()  print('haha')
 


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到python教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 楚雄市| 通渭县| 新兴县| 靖州| 西畴县| 伊金霍洛旗| 花莲县| 大新县| 民丰县| 清水县| 巴马| 清水县| 宕昌县| 香港| 梧州市| 嘉善县| 绥滨县| 安平县| 呈贡县| 同心县| 长顺县| 鄂温| 焦作市| 乳山市| 灵宝市| 保定市| 连云港市| 宝坻区| 兴文县| 北安市| 甘泉县| 临猗县| 岱山县| 汝南县| 汾西县| 荔浦县| 清远市| 湖南省| 博兴县| 阳信县| 碌曲县|