侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python制作mysql数据迁移脚本

Python  /  管理员 发布于 7年前   192

用python写了个数据迁移脚本,主要是利用从库将大的静态表导出表空间,载导入到目标实例中。

#!/usr/bin/env python3#-*- coding:utf8 -*-#author:zhanbin.liu#!!!!!DB必须同版本#python3环境  pip3 install pymysql paramikoimport os#from pathlib import Pathimport sysimport pymysqlimport 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,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,' 请检查')    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')


  • 上一条:
    python配置grpc环境
    下一条:
    在python中将字符串转为json对象并取值的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客