这篇文章主要介绍了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 os

import django

import sys

sys.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数据库迁徙_Mysql数据迁徙方法工具解析相关推荐

  1. mysql数据库迁徙_mysql数据迁徙详解

    数据迁徙是每个后端都会遇到的工作之一,本文介绍了一些常见的数据迁徙方法与工具 mysqldump:数据结构不变的数据迁徙 导出数据 mysqldump -u root -p DATABASE_NAME ...

  2. mysql数据库安全审计_MySQL数据库安全日志审计工具

    说明 由于MySQL社区版没有自带的审计功能或插件,对于等级保护当中对数据库管理的要求的就存在一定的不满足情况的,抛开条条框框不说数据库的日志是值得研究的,通过收集数据库的日志到企业SOC平台便于安全 ...

  3. php 查看mysql连接数据库_php基础之连接mysql数据库和查询数据

    php基础之连接mysql数据库和查询数据 文章主要介绍了php连接mysql数据库和查询数据的方法和示例,需要的朋友可以参考下,就跟随百分网小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕 ...

  4. mysql source导入_读取MySQL数据库中的数据【Python数据分析百例连载】

    当所需的数据存贮在MySQL数据库中时,那么数据分析首要任务就是要通过Pandas读取MySQL数据.例如,某网站注册用户信息保存在MySQL数据库中,如图所示(部分数据),下面将使用Pandas的r ...

  5. 写底层 jdbc 实现mysql数据库增删改的 合并方法 的类 继承ConnectionFactory 实现DaoMessage接口: 并批量添加数据

    接口: public interface DaoMessage<T> {int ERROR = 0x400;int SUCCESS = 0x200; //接口参数默认finalint ge ...

  6. MySQL数据库- 几种数据迁移的方法详解都在这了!看完必懂

    数据迁移的几种方式 - MySQL数据库 本文关键字:MySQL.数据库.数据迁移.导入.导出 文章目录 数据迁移的几种方式 - MySQL数据库 一.数据迁移 1. 数据的生命周期 2. 数据迁移的 ...

  7. 修改mysql数据库默认字符集_MySQL数据库之修改mysql默认字符集的两种方法详细解析...

    本文主要向大家介绍了MySQL数据库之修改mysql默认字符集的两种方法详细解析 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. (1) 最简单的修改方法,就是修改mysql的m ...

  8. pycharm连接mysql1193错误_pycharm连接mysql数据库提示错误的解决方法_数据库

    忘记phpmyadmin密码怎么重置_数据库 重置phpmyadmin密码的方法是:1.停止mysql服务:2.跳过验证启动mysql:3.重新设置密码:4.更新权限:5.重新启动mysql,如[ki ...

  9. mysql数据库的在线数据备份与数据恢复

    MySQL是一种常用的关系型数据库管理系统,它支持在线备份和恢复数据.在线备份指的是在MySQL数据库运行时备份数据,而不会中断或影响现有的数据库服务.在本文中,我们将介绍MySQL数据库的在线数据备 ...

最新文章

  1. case when完成不同条件的显示
  2. c# 如何设置透明画刷
  3. 面试题08(C++)
  4. c语言时钟报告,C语言图形时钟课程设计实验报告
  5. JAVA设置jscrollbar大小_JScrollBar垂直/水平设置问题 – Java Swing
  6. 华为鸿蒙系统小米,继华为鸿蒙之后,又一国产系统在悄悄崛起:小米MIOS全面曝光...
  7. linux 取出本机IP
  8. MapReduce 规划 系列十 采用HashPartitioner调整Reducer计算负荷
  9. 190623每日一句
  10. 摸鱼必备游戏(上班族专用斗地主)
  11. 解密QQ的MsgEx.db消息文件格式
  12. 硬件的驱动和sdk的理解与应用
  13. 淘宝无线端一键直达微博自助生成工具
  14. c语言判断一个数是否为素数思路,C语言判断一个数是否为素数方法解析
  15. office图标异常处理
  16. C语言实现乘法原理,伽罗华乘法原理与C语言实现
  17. css3彩色3D文字上下漂浮动画js特效
  18. 转手动档汽车的换挡技巧
  19. 安卓中图片占用内存大小分析
  20. mysql数据库安装最详解

热门文章

  1. java串口编程程序_想成为程序员,学编程,Python、Go、Java、C++,你选什么?
  2. Kali Linux 从入门到精通(三)-入侵系统定制
  3. mysql中credit,CREDIT项目:我国类风湿关节炎数据库建设开启
  4. java导入日期处理,java实现Excel表格的导入日期变成数字的问题
  5. 20181225 基于TCP/IP和基于UDP/IP的套接字编程
  6. webpack整体了解
  7. lincode 题目记录6
  8. 边工作边刷题:70天一遍leetcode: day 67-1
  9. powerdesigner12.5入门教程
  10. jbpm 5 安装教程