开发者社区> IT觅语> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Python实现跨服务器数据库迁移

简介: Python实现跨服务器数据库迁移
+关注继续查看

注意:

  • 本文是基于Pyhon3.6的实现方式
  • 以每100000一查询一提交进行,可根据实际情况修改
  • 程序中,如传输某表时发现目标数据库中存在此表,认为该数据表是完整存在的,可优化
  • 数据库连接时注意编码方式,本文为 charset='latin1',可根据实际情况修改为utf8或其他方式
  • 如服务器中有多个数据库,通过修改cur_db和cur_local_db变量切换数据库
  • 本人使用后愚见,本程序迁移速度相比Navicat中的数据传输功能较慢一点,但Navicat中有时存在漏传(虽情况出现次数极少)

程序代码如下:

import pymysql
import warnings

warnings.filterwarnings("ignore")


class ConnectMysql(object):
    def __init__(self):
        #     这里设置分页查询, 每页查询多少数据
        self.page_size = 100000


    def getTable(self):
        #需迁移的数据库
        cur_db='****'
        #目标数据库
        cur_local_db='****'
        #需迁移服务器
        conn = pymysql.connect(
            host="***.***.***.***",
            user="*****",
            passwd="*****",
            db=cur_db,
            charset='latin1'
        )
        #目标服务器
        conn_local = pymysql.connect(
            host="***.***.***.***",
            user="*****",
            passwd="*****",
            db=cur_local_db,
            charset='latin1'
        )
        cur = conn.cursor()
        cur_local = conn_local.cursor()
        cur.execute('show tables')
        tables = cur.fetchall()

        for table in tables:
            # 需要迁移的数据库查询表的列数
            cur.execute(
                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='"+cur_db+"' AND table_name='" + table[
                    0] + "'")
            table_col_count = cur.fetchone()
            # print("需要迁移数据列数",table_col_count)
            # print table_col_count[0]
            # 需要迁移的数据库查询表的结构
            cur.execute('show create table ' + table[0])
            result = cur.fetchall()
            create_sql = result[0][1]
            # 查询需要迁移的数据库表的数据条数
            cur.execute('select count(*) from ' + table[0])
            total = cur.fetchone()
            # print("迁移数据条数",total)
            page = total[0] / self.page_size
            page1 = total[0] % self.page_size
            if page1 != 0:
                page = page + 1

            # 数据库创建表
            cur_local.execute(
                "SELECT table_name FROM information_schema.`TABLES` WHERE TABLE_SCHEMA='"+cur_local_db+"' AND table_name='" + str(
                    table[0]) + "'")
            table_name = cur_local.fetchone()
            if table_name is None:
                cur_local.execute(create_sql)
                page = int(page)
                for p in range(0, page):
                    while True:
                        try:
                            print('开始', table[0], '的第', p + 1, '页查询')
                            if p == 0:
                                limit_param = ' limit ' + str(p * self.page_size) + ',' + str(self.page_size)
                            else:
                                limit_param = ' limit ' + str(p * self.page_size + 1) + ',' + str(self.page_size)
                            cur.execute('select * from ' + table[0] + limit_param)
                            inserts = cur.fetchall()
                            #print(inserts)
                            # print('查询成功')
                            param = ''
                            for i in range(0, table_col_count[0]):
                                param = param + '%s,'
                                # print(param)
                            # print('开始插入')
                            cur_local.executemany('replace into ' + table[0] + ' values (' + param[0:-1] + ')', inserts)
                          
                            conn_local.commit()
                            break
                        except Exception as e:
                            print(e)
                            # time.sleep(1)
                            cur = conn.cursor()
                            cur_local = conn_local.cursor()
                    print(table[0], ' 插入完成')
                 
            else:
                print(str(table[0]),"已存在")

        cur_local.close()
        conn_local.close()
        cur.close()
        conn.close()


if __name__ == '__main__':
    conn_mysql = ConnectMysql()
    conn_mysql.getTable()

最后希望本文对大家有所帮助,也希望大家多多指教!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Git:Python代码开发到服务器上测试实践
Git:Python代码开发到服务器上测试实践
0 0
Linux 服务器查找Python包的路径
Linux 服务器查找Python包的路径
0 0
服务器 Linux环境上查看Python site-package 包所在位置
服务器 Linux环境上查看Python site-package 包所在位置
0 0
socket库:Python实现UDP客户和服务器通信
socket库:Python实现UDP客户和服务器通信
0 0
socket库:Python实现TCP/IP客户和服务器通信
socket库:Python实现TCP/IP客户和服务器通信
0 0
Git:Python代码开发到服务器上测试实践
Git:Python代码开发到服务器上测试实践
0 0
Python编程:fabric实现SSH远程管理服务器
Python编程:fabric实现SSH远程管理服务器
0 0
Python编程:将Flask项目部署到免费服务器Heroku
Python编程:将Flask项目部署到免费服务器Heroku
0 0
Python编程:WSGI服务器的参考实现wsgiref模块
Python编程:WSGI服务器的参考实现wsgiref模块
0 0
修改Linux服务器时间的命令
修改Linux服务器时间的命令
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
网站/服务器取证 实践与挑战
立即下载
固守服务器的第一道防线——美联集团堡垒机的前世今生
立即下载
机器学习在大规模服务器治理复杂场景的实践
立即下载