--- title: 记录一次生产环境数据库迁移 categories: - 数据库 tags: - mysql - MySQL - 数据迁移 abbrlink: 73848ed5 date: 2023-09-01 04:03:38 --- ## 迁移要求 不要清理目标数据 迁移是老环境迁移到新环境, 新环境之前有过使用记录了, 要求不删除现有的数据, 将老数据导入。有以下几个问题: 1. 导出的sql里面不能带drop语句,所以在mysqldump的时候需要加上`--skip-add-drop-table`参数 2. 主键或唯一键重复的问题(mysqldump默认会在一个insert语句中插入多条数据,如果insert失败, 那么整条语句执行失败, 就会导致正常的数据插不进,需要增加参数 `--skip-extended-insert`, 让一条insert只插入一条数据) 3. sql执行失败了需要继续, 因为现有数据可能和老环境冲突, 所以插入失败不能影响其他数据的插入, 这里选择在mysql控制台执行source命令。 ## 备份源数据库 ```bash mysqldump -h192.168.21.26 -P3306 -uroot -p --skip-add-drop-table --skip-extended-insert --databases idk_base > hezhong_idk_base.sql ``` > --skip-add-drop-table 这个参数为了不在sql文件里面增加drop语句,不加的话,执行这个sql会先将表删掉,再重新创建。 > --skip-extended-insert 导出的sql一个insert对应一条数据。 ## 如何将备份的sql发送到目标机器 数据量较大,又受限于网络情况, 所以直接在服务器上导出后,使用tar压缩, 然后通过nginx将文件暴露出来,在目标机器上使用wget下载。 ## 遇到的一些问题 ### 库名不一致如何修改 两个环境库名不一致, 需要修改sql里面的库名, sql文件又太大, 选择使用sed命令来修改 ```bash sed -e 's/USE `idk_base`;/USE `db_idk_base`;/g;' -i hezhong_idk_base.sql ``` ### 下载上传太慢的问题 选择服务器使用公网直接传输,不再通过自己的电脑中转。 ### 跳板机超时被关闭的问题 在mysql命令行界面执行source命令, 如果窗口被关闭,那么执行就停止了, 使用nohup又无法做到交互式执行, 于是选择screen 使用screen -L来创建一个新的虚拟窗口(-L 参数可以将控制台的所有输出记录到当前目录下的一个文件内), 在里面执行mysql命令source命令后,按下ctrl +a d 就可以放到后台执行, 执行screen -r恢复连接之前的screen界面。 screen 详细使用教程可以查看 [Linux终端复用器Screen和tmux](/posts/lm9yw00q)