python制作mysql數(shù)據(jù)遷移腳本
更新時間:2019年01月01日 09:37:56 作者:浮生鳳年
這篇文章主要為大家詳細(xì)介紹的是使用python寫的mysql數(shù)據(jù)遷移的腳本,具有一定的參考價值,感興趣的小伙伴們可以參考一下
用python寫了個數(shù)據(jù)遷移腳本,主要是利用從庫將大的靜態(tài)表導(dǎo)出表空間,載導(dǎo)入到目標(biāo)實例中。
#!/usr/bin/env python3 #-*- coding:utf8 -*- #author:zhanbin.liu #!!!!!DB必須同版本 #python3環(huán)境 pip3 install pymysql paramiko import os #from pathlib import Path import sys import pymysql import paramiko #每次只能遷移一個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,c tableList = 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 = 3306 client = 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,' 請檢查') s=1 if desTables != []: print('目標(biāo)庫存在將要遷移的表:',desIp,desDbName,desTables,' 請移除') 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("正在校驗表:", 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')
您可能感興趣的文章:
- mysql8.0.11數(shù)據(jù)目錄遷移的實現(xiàn)
- mysql8.0.20數(shù)據(jù)目錄遷移的方法
- 從云數(shù)據(jù)遷移服務(wù)看MySQL大表抽取模式的原理解析
- 如何把本地mysql遷移到服務(wù)器數(shù)據(jù)庫
- mysql事件之修改事件(ALTER EVENT)、禁用事件(DISABLE)、啟用事件(ENABLE)、事件重命名及數(shù)據(jù)庫事件遷移操作詳解
- Docker版的MySQL5.7升級到MySQL8.0.13,數(shù)據(jù)遷移
- Mysql的數(shù)據(jù)庫遷移到另一個機器上的方法詳解
- MySQL數(shù)據(jù)庫遷移快速導(dǎo)出導(dǎo)入大量數(shù)據(jù)
- MySQL數(shù)據(jù)遷移相關(guān)總結(jié)
相關(guān)文章
python使用IP歸屬地查詢API追蹤網(wǎng)絡(luò)活動
這篇文章主要為大家介紹了python使用IP歸屬地查詢API追蹤網(wǎng)絡(luò)活動實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Scrapy框架爬取Boss直聘網(wǎng)Python職位信息的源碼
今天小編就為大家分享一篇關(guān)于Scrapy框架爬取Boss直聘網(wǎng)Python職位信息的源碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02Python內(nèi)置函數(shù)delattr的具體用法
本篇文章主要介紹了Python內(nèi)置函數(shù)delattr的具體用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11Python使用pymssql連接SQL?SEVER數(shù)據(jù)庫全流程
SQL Server是微軟推出的重量級的數(shù)據(jù)庫,目前有多個版本,如2000、2008、2012等,下面這篇文章主要給大家介紹了關(guān)于Python使用pymssql連接SQL?SEVER數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-12-12