用python写了个数据迁移脚本,主要是利用从库将大的静态表导出表空间,载导入到目标实例中。
#!/usr/bin/env python3
#-*- coding:utf8 -*-
#author:zhanbin.liu
#!!!!!DB必须同版本
#python3环境 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('目标库存在将要迁移的表:',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')
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“python制作mysql数据迁移脚本”评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新动态
2025年11月08日
2025年11月08日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]