本文主要汇总了几种Mysql数据迁移方案…
数据迁移方案
目前调研到的 Mysql 数据迁移方案有三个: mysqldump , select…into/load data 和 mysql的主从复制,读写分离.
方案一: mysqldump
官网链接: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
原理:
mysqldump是mysql自带工具,无需第三方插件.
备份原理是将表结构及数据导出建表语句和insert语句的形式到指定的文件, 数据恢复时执行该备份文件,重新建表和写入数据即可。
这里需要注意的是建表语句包含两步: drop 和 create.
官网关于mysqldump性能的说明,原文如下:
1 | Performance and Scalability Considerations |
大概意思是说如果对于大量数据的迁移备份,对于InnoDB或InnoDB和MyISAM混合存储的表, 官网建议使用 MySQL Enterprise Backup 产品提供的mysqlbackup命令.(后面再调研下)
初步分析, 只能是静态的数据备份, 对于迁移期间和后续的增量数据, 这种方案不可行. 所以,不适于不停服的对用户完全透明的迁移.
用法
1 | shell> mysqldump -help |
数据恢复命令
恢复比较简单,直接用source即可
修改字符集
如果对备份数据扫描字符集 latin1 , 只存在于建表语句中, 数据中不包含时, 可以考虑修改字符集.
**方案: ** 批量替换备份文件中的字符集 latin1 为 utf8 (utf和8之间没有杠’-‘), 然后再恢复数据到新的库. 因为恢复数据时是新建表, 然后重新写入数据的, 所以不会出现乱码的情况.
风险: 用户数据存在字符串 latin1 时, 存在很大的风险.
所以, 该方案还是存在很大风险和可操作性的.
可以通过下面的命令查看字符集有没有在数据中存在
grep “latin1”
方案二: select…into/load data
select…into 官网链接:https://dev.mysql.com/doc/refman/5.7/en/select-into.html
load data官网链接:https://dev.mysql.com/doc/refman/5.7/en/load-data.html
测试发现是不可行的, 报错如下:
1 | MySQL [hive]> select * into outfile '/home/hadoop/xpj/mysqlbak/09-test.tbl' from db.test; |
查看官方文档发现, 该方式导出的文件是存放在mysql服务器上的, 需要有mysql服务器上写文件的权限才行. 官网最后提供了客户端方案
1 | The SELECT ... INTO OUTFILE 'file_name' form of SELECT writes the selected rows to a file. The file is created on the server host, so you must have the FILE privilege to use this syntax. file_name cannot be an existing file, which among other things prevents files such as /etc/passwd and database tables from being modified. The character_set_filesystem system variable controls the interpretation of the file name. |
客户端方案:
1 | mysql -hxxx -uxxx -p -e "select * from db.test;" > '/home/hadoop/xpj/mysqlbak/test.tbl' |
修改字符集
该方案只涉及到数据的备份, 恢复数据是 insert 过程, 所以只要新库建表时字符集修改为utf8即可.
缺点是无法解决增量数据同步的问题.
方案三: mysql 主从复制, 读写分离
整体思路:
新增从库, 将数据同步到从库上, 该从库给预发环境提供只读;
然后升级该从库(不考虑修改字符集), 灰度观察. 待服务正常无误后, 切换主从.
本文链接: https://stefanxiepj.github.io/archives/aee37d78.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
![知识共享许可协议](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)