python制作mysql數(shù)據(jù)遷移腳本
用python寫了個(gè)數(shù)據(jù)遷移腳本,主要是利用從庫將大的靜態(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 paramiko
import os
#from pathlib import Path
import sys
import pymysql
import 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,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("正在校驗(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')
- mysql8.0.11數(shù)據(jù)目錄遷移的實(shí)現(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ù)庫遷移到另一個(gè)機(jī)器上的方法詳解
- MySQL數(shù)據(jù)庫遷移快速導(dǎo)出導(dǎo)入大量數(shù)據(jù)
- MySQL數(shù)據(jù)遷移相關(guān)總結(jié)
相關(guān)文章
python實(shí)現(xiàn)ftp文件傳輸系統(tǒng)(案例分析)
最近做了一個(gè)簡單的文件傳輸系統(tǒng),基于ftp協(xié)議,使用python語言開發(fā),雖然python里面已經(jīng)有ftplib模塊,可以很容易的實(shí)現(xiàn)ftp服務(wù)器,這篇文章主要介紹了python實(shí)現(xiàn)ftp文件傳輸系統(tǒng)的案例分析,需要的朋友可以參考下2020-03-03
python3.0 模擬用戶登錄,三次錯(cuò)誤鎖定的實(shí)例
下面小編就為大家?guī)硪黄猵ython3.0 模擬用戶登錄,三次錯(cuò)誤鎖定的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
Python中創(chuàng)建對象列表的實(shí)現(xiàn)示例
本文主要介紹了Python中創(chuàng)建對象列表的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
jupyter使用自動(dòng)補(bǔ)全和切換默認(rèn)瀏覽器的方法
這篇文章主要介紹了jupyter使用自動(dòng)補(bǔ)全和切換默認(rèn)瀏覽器的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
python實(shí)現(xiàn)局域網(wǎng)內(nèi)實(shí)時(shí)通信代碼
今天小編就為大家分享一篇python實(shí)現(xiàn)局域網(wǎng)內(nèi)實(shí)時(shí)通信代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
基于PyQt5實(shí)現(xiàn)圖轉(zhuǎn)文功能(示例代碼)
PyQt提供了一個(gè)設(shè)計(jì)良好的窗口控件集合,具有更方便的操作性。學(xué)過VB的同學(xué)會知道,相比與VB的使用,在界面設(shè)計(jì)上元素更豐富,這篇文章主要介紹了基于PyQt5完成的圖轉(zhuǎn)文功能,需要的朋友可以參考下2022-06-06
在DigitalOcean的服務(wù)器上部署flaskblog應(yīng)用
這篇文章主要介紹了在DigitalOcean的服務(wù)器上部署flaskblog的方法,flaskblog是用Python的Flask開發(fā)的一個(gè)博客程序,而DigitalOcean則是大受歡迎的SSD主機(jī)提供商,需要的朋友可以參考下2015-12-12

