千家信息网

Mysql数据迁徙方法工具的示例分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家分享的是有关Mysql数据迁徙方法工具的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。数据迁徙是每个后端都会遇到的工作之一,本文介绍了一些常见的数据迁
千家信息网最后更新 2026年11月01日Mysql数据迁徙方法工具的示例分析

这篇文章给大家分享的是有关Mysql数据迁徙方法工具的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

数据迁徙是每个后端都会遇到的工作之一,本文介绍了一些常见的数据迁徙方法与工具

mysqldump:数据结构不变的数据迁徙

导出数据

mysqldump -u root -p DATABASE_NAME table_name > dump.sql

恢复数据

mysql -u root -p DATABESE_NAME < dump.sql

或者连接mysql客户端

mysql> source dump.sql

使用pymysql连接数据库

可以直接用用户名密码连接的数据库

class GeneralConnector:  def __init__(self, config, return_dic=False):    self.return_dic = return_dic    self.config = config  def __enter__(self):    self.conn = pymysql.connect(**self.config, port=3306)    if self.return_dic:      # 一行数据会变成一个字典      self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)    else:      self.cursor = self.conn.cursor()    return self.cursor  def __exit__(self, *args):    self.cursor.close()    self.conn.commit()    self.conn.close()

使用:

# local_db = {#   'user': 'root',#   'passwd': '',#   'host': '127.0.0.1',#   'db': 'local_db'#   }with GeneralConnector(const.local_db, return_dic=True) as cursor:  cursor.execute('SELECT `col1`, `col2` FROM test;')  return cursor.fetchall()

连接处于需要SSH连接的服务器的数据库

class SSHConnector:  def __init__(self, server, config, return_dic=False):    self.return_dic=return_dic    self.server = server    self.config = config  def __enter__(self):    self.conn = pymysql.connect(**self.config, port=self.server.local_bind_port)    if self.return_dic:      # 一行数据会变成一个字典      self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)    else:      self.cursor = self.conn.cursor()    return self.cursor  def __exit__(self, *args):    self.cursor.close()    self.conn.commit()    self.conn.close()

使用:

# SERVER = SSHTunnelForwarder(#     (remote_host, ssh_port),#     ssh_username=USERNAME,#     ssh_pkey=SSH_KEY,#     ssh_private_key_password=SSH_KEY_PASSWD,#     remote_bind_address=('127.0.0.1', 3306) # mysql服务位置#   )# server_db = {#   'user': 'root',#   'passwd': '',#   'host': '127.0.0.1',#   'db': 'server_db'#   }# 创建一个隧道将服务端的mysql绑定到本地3306端口with const.SERVER as server:  with SSHConnector(server, const.server_db) as cursor:    cursor.execute('show tables;')    data = cursor.fetchall()    print(data)

cursor的各种操作

1.cursor.execute(sql_statement)

执行一条sql语句

2.cursor.fetchall()

获取cursor的所有结果,常跟在select语句后使用

3.cursor.fetchone()

获取cursor的第一条结果

4.cursor.lastrowid

最后一条数据的id

5.cursor.executemany(insert_statement, data_list)

批量插入一批数据,如

with const.SERVER as server:  with connector.Connector(server, const.db_1) as cursor:    cursor.execute('select * from preference')    preferences = cursor.fetchall()  with connector.Connector(server, const.db_2) as cursor:    cursor.executemany('insert into preference (`id`,`theme`,`user_id`) values (%s,%s,%s)',preferences)

从cursor获取list类型的结果

cursor.execute('SELECT `name` FROM user;')

直接使用fetchall(),只能得到tuple包裹的数据

cursor.fetchall()# (('Jack',), ('Ben'))

现在希望得到一个list结果集,做到像Django中flat=True那样的效果

有两种方法

列表解析式(list comprehension)

name_list = [x[0] for x in cursor.fetchall()]

这个方法的缺点在于会先使用fetchall()将结果集读到内存,再做列表转换,并不高效。

itertools工具

name_list = list(itertools.chain.from_iterable(cursor))

推荐使用这个方式,第一它不会将所有结果fetch到内存中,第二使用itertools生成列表比列表解析式要快

如何在数据迁徙中使用Django的model

  • 需要拷贝Django的settings文件,删掉不需要的配置,并设置好迁徙目标数据库

  • 需要拷贝用到此model的文件

  • 需要在settings.INSTALLED_APPS中引入models.py文件所在的目录

  • 在迁徙脚本头部启动Django

import osimport djangoimport syssys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))os.environ.setdefault("DJANGO_SETTINGS_MODULE", "translate.settings")django.setup()

通过SSH隧道的本地转发实现Django连接远程数据库

创建一个ssh隧道,将远程数据库映射到本地端口

ssh -L local_port:localhost: @

ssh连接进行时,可以通过访问本地端口来访问远程数据库

在Django的settings中配置数据库

DATABASES = {  'default': {    'ENGINE': 'django.db.backends.mysql',    'NAME': db_name,    'USER': remote_mysql_user, # 远程数据库账号密码    'PASSWORD': remote_mysql_password,    'HOST': "localhost",    'PORT': local_port, # 远程数据库映射到本地的端口    'OPTIONS': {'init_command': 'SET default_storage_engine=INNODB;'}    }}

至此,在使用Django的model时,将通过ssh隧道访问远程数据库

注意事项

  • 事先了解迁徙数据量,并且取5%~10%的数据测试迁徙速度

  • 由测试数据预估总迁徙用时,如果总迁徙用时大于一小时,一定要把迁徙脚本放到服务器运行,这样迁徙过程不易中断,且服务器性能远比个人电脑更优

  • 尽量使用批量插入减少写数据库的次数,使用cursor.executemany或者Django的bulk_create

  • 迁徙过程要写好log,这样能够知道数据迁徙到了哪一步,如意外终端也能找到断点继续运行

  • 创建时间字段加上auto_add_now会自动记录数据的创建时间,在插入数据的时候对这个字段赋值无效

感谢各位的阅读!关于"Mysql数据迁徙方法工具的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

数据 数据库 结果 方法 服务 工具 端口 隧道 文件 服务器 示例 分析 一行 内存 内容 字典 字段 密码 拷贝 时间 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 天津市摩尔互联网科技 河南云网互联网络科技有限公司 中国互联网科技工作委员会毛军 厦门中拓互联网络科技有限公司 互联网科技深圳 互联网巨头科技公司 腾讯阿里互联网科技 互联网科技公司怎么样 浩特互联网科技 善班互联网科技有限公司 互联网科技的未来发展 丰台科技园 互联网公司 成都仁贤领冠互联网科技有限公司 温州喔噻互联网科技有限公司 互联网公司科技股 黑云互联网科技有限公司 杭州披云加互联网科技有限公司 产业互联网科技服务公司 福建互联网展示科技馆设计 平安好医生打造互联网科技医疗 科技和互联网公司 互联网科技的 互联网科技与金融科技 中国互联网金融科技基金 互联网巨头投资的硬核科技 蓝色互联网科技 江阴互联网智能科技产品进口 深圳互联网科技的发展 易企秀互联网科技是做什么的 科技互联网行业投资研究
0