千家信息网

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

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章给大家分享的是有关Mysql数据迁徙方法工具的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。数据迁徙是每个后端都会遇到的工作之一,本文介绍了一些常见的数据迁
千家信息网最后更新 2025年11月08日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安全错误 数据库的锁怎样保障安全 软件开发苹果app注册 手机软件开发工程师招聘北京 java 服务器 数据库 我的世界手机版有哪些起床服务器 怎么用c登录数据库 齐齐哈尔建华区网络安全宣传周 不动产网络安全制度 花都网络安全建设联系方式 中央频道教育与网络安全 江西塔式服务器经销商云空间 南京家满恵网络技术有限公司 学网络安全的应该读什么书 总显示微信连接不到服务器 hcie网络安全工程师 网络安全原则严密性 数据库有哪几种恢复吗 软件开发集成费 静态页面建数据库 网络技术对电商 知网查重数据库范围 软件开发概要设计的任务界面设计 银行网络安全监管部门 网络安全法律法规知识 数据库管理工程师薪酬 斗罗大陆的服务器合区 幼儿园国家网络安全手抄报 怎么判断数据库创建成功了 微软亚洲研究院软件开发面试 网络技术和软件开发各指什么 cago进入任意官方服务器失败
0