MySQL数据迁移相关总结


Posted in MySQL onApril 29, 2021

前言:

在平时工作中,经常会遇到数据迁移的需求,比如要迁移某个表、某个库或某个实例。根据不同的需求可能要采取不同的迁移方案,数据迁移过程中也可能会遇到各种大小问题。本篇文章,我们一起来看下 MySQL 数据迁移那些事儿,希望能帮助到各位。

  1.关于数据迁移

首先引用下维基百科中对数据迁移的解释:

数据迁移(data migration)是指选择、准备、提取和转换数据,并将数据从一个计算机存储系统永久地传输到另一个计算机存储系统的过程。此外,验证迁移数据的完整性和退役原来旧的数据存储,也被认为是整个数据迁移过程的一部分。

数据迁移是任何系统实现、升级或集成的关键考虑因素,通常以尽可能自动化的方式执行,从而将人力资源从繁琐的任务中解放出来。

数据迁移有多种原因,包括服务器或存储设备更换、维护或升级、应用程序迁移、网站集成、灾难恢复和数据中心迁移。

对于 MySQL 数据库,也会经常碰到数据迁移的需求,比如说从测试库迁到开发库,或者从一台机器迁移到另一台机器,可能只是迁移一张表,也可能需要迁移整个数据库实例。对于不同的需求可能要采取不同的迁移方案,但总体来讲,MySQL 数据迁移方案大致可以分为物理迁移和逻辑迁移两类。

  2.迁移方案及注意点

物理迁移适用于大数据量下的整体迁移。物理迁移包括拷贝数据文件和使用 XtraBackup 备份工具两种。不同服务器之间可以采用物理迁移,我们可以在新的服务器上安装好同版本的数据库软件,创建好相同目录,建议配置文件也要和原数据库相同,然后从原数据库方拷贝来数据文件及日志文件,配置好文件组权限,之后在新服务器这边使用 mysqld 命令启动数据库。

使用物理迁移方案的优点是比较快速,但需要停机迁移并且要求 MySQL 版本及配置必须和原服务器相同,也可能引起未知问题。

相比来说,逻辑迁移适用范围更广,无论是部分迁移还是全量迁移,都可以使用逻辑迁移。逻辑迁移中使用最多的就是通过 mysqldump 等备份工具导出再导入了。

mysqldump 同样适用于不同版本不同配置之间的迁移,不过全量迁移时,笔者不建议使用 -A 参数备份全部数据库,特别是对于不同版本之间迁移,可能某些系统库稍有不同,迁移后容易出现未知问题。若使用 mysqldump 进行全量迁移,可以按照下面步骤操作:

# 原库执行 得到的创建数据库语句在新库执行 (排除系统库)
SELECT
  CONCAT( 'CREATE DATABASE IF NOT EXISTS ', '`', SCHEMA_NAME, '`', ' DEFAULT CHARACTER SET ', DEFAULT_CHARACTER_SET_NAME, ';' ) AS CreateDatabaseQuery 
FROM
  information_schema.SCHEMATA 
WHERE
  SCHEMA_NAME NOT IN ( 'information_schema', 'performance_schema', 'mysql', 'sys' );
  
 # 原库执行 得到的创建用户语句在新库执行 (排除系统用户)
 SELECT
  CONCAT( 'create user \'', USER, '\'@\'', HOST, '\'' ' IDENTIFIED BY PASSWORD \'', authentication_string, '\';' ) AS CreateUserQuery 
FROM
  mysql.`user` 
WHERE
  `User` NOT IN ( 'root', 'mysql.session', 'mysql.sys' );
  
# 原库执行 show grants 得到用户权限 然后逐一在新库执行 (也可以复制那几张权限表到新库)
show grants for 'testuser'@'%';

# 至此 新环境已经存在要迁移的库和用户 只是没有数据
# 原环境使用mysqldump备份除系统库外的所有库 
mysqldump  -uroot -pxxxx -R -E --single-transaction --databases db1 db2 > db.sql

# 然后导入新环境
mysql -uroot -pxxxx < db.sql

对于迁移部分库和部分表,也可以采用上方类似方案,只是备份时要按需备份,下面列举出几种常见的 mysqldump 备份场景:

# 备份单个库
mysqldump -uroot -pxxxxx -R -E --single-transactio --databases db1 > db1.sql

# 备份部分表
mysqldump -uroot -pxxxxx --single-transaction db1 tb1 tb2 > tb12.sql

# 排查某些表
mysqldump -uroot -pxxxxx db1 --ignore-table=db1.tb1 --ignore-table=db1.tb2 > db1.sql

# 只备份结构或数据
mysqldump -uroot -pxxxxx testdb --no-data > testdb_jiegou.sql
mysqldump -uroot -pxxxxx testdb --no-create-info > testdb_data.sql

总得来说,使用 mysqldump 方案更加灵活,为了快速迁移,我们应该尽量减少备份内容,比如说排除无用的日志表。对于一些大表,我们也可以采用单独迁移的方案,比方说,db1 中的 tb1 表特别大,我们可以在备份时先排除 tb1,对于大表 tb1 ,可以使用 LOAD DATA 方式或舍弃再导入表空间的方式来迁移。

数据迁移过程中,可能会遇到各种错误,一步步去解决即可。建议在新库创建好用户并授予好权限后再迁移,这样可以避免出现视图及函数导入错误,因为视图及函数有个定义者的概念。新环境执行导入时,最好使用 root 等具有 SUPER 权限的管理员用户,也可以避免一些因权限产生的问题。

迁移完成后,对于新环境,我们还应该再次进行检查,比如表的个数是否相同,随机抽查几张表,数据是否相同、是否有乱码等。只有确定无误才大功告成。

总结:

本篇文章介绍了 MySQL 数据库数据迁移相关方案及注意点,总结如下思维导图:

MySQL数据迁移相关总结

以上就是MySQL数据迁移相关总结的详细内容,更多关于MySQL数据迁移的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
新手必备之MySQL msi版本下载安装图文详细教程
May 21 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
Mysql中存储引擎的区别及比较
Jun 04 MySQL
MySQL 时间类型的选择
Jun 05 MySQL
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
Jun 21 MySQL
MySQL中存储时间的最佳实践指南
Jul 01 MySQL
Mysql binlog日志文件过大的解决
Oct 05 MySQL
SQL语法CONSTRAINT约束操作详情
Jan 18 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 MySQL
MySQL慢查询的坑
解决MySQL存储时间出现不一致的问题
Apr 28 #MySQL
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 #MySQL
MySQL安装后默认自带数据库的作用详解
Apr 27 #MySQL
MySQL Router的安装部署
MySQL Shell的介绍以及安装
MySQL InnoDB ReplicaSet(副本集)简单介绍
Apr 24 #MySQL
You might like
第十三节 对象串行化 [13]
2006/10/09 PHP
PHP生成UTF8文件的方法
2010/05/15 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
用Python输出一个杨辉三角的例子
2014/06/13 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
Python玩转Excel的读写改实例
2019/02/22 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
职业生涯规划书基本格式
2014/01/06 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
保护母亲河倡议书
2014/04/14 职场文书
环保建议书300字
2014/05/14 职场文书
网站推广策划方案
2014/06/04 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
2014年信用社工作总结
2014/11/25 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
python获取对象信息的实例详解
2021/07/07 Python
python中对列表的删除和添加方法详解
2022/02/24 Python