如何高效迁移Ubuntu中MySQL数据,轻松实现数据库无缝迁移?
- 内容介绍
- 文章标签
- 相关推荐
为什么MySQL迁移总让人头疼?
在Ubuntu环境下公司和开发者常面临以下痛点:
- 数据丢失风险:迁移过程中若未做好备份,一旦出错可能导致业务中断。
- 长时间停机:传统的全库导出/导入往往需要数小时影响使用者体验。
- 权限与AppArmor冲突:不当的文件权限或安全策略会导致MySQL启动失败。
- 版本不兼容:源服务器与目标服务器MySQL版本差异大时迁移可能出现语法错误。
迁移前的准备工作
1️⃣ 确认MySQL版本
使用mysql --version检查两台机器的版本,尽量保持一致或在目标机上先升级到相同或更高版本。
2️⃣ 完整备份
无论采用哪种迁移方式。都必须先做一次物理备份:
# 停止MySQL服务
sudo systemctl stop mysql
# 打包数据目录
sudo tar -czvf /tmp/mysql_backup_$.tar.gz /var/lib/mysql
将备份文件复制到安全位置,例如外部硬盘或云存储,以防万一。
3️⃣ 检查硬盘空间
目标服务器的硬盘空间至少要比源服务器使用量多30%,避免因空间不足导致迁移中断。
方法一的观点是,使用 mysqldump/mysql
步骤概览
- 导出数据库
- 传输SQL文件至目标机
- 在目标机创建对应数据库并导入
- 验证数据完整性
详细操作
a) 导出单库或全库:
# 导出单个数据库
mysqldump -u root -p --single-transaction mydb> mydb.sql
# 导出全部数据库
mysqldump -u root -p --all-databases --routines --triggers> all_databases.sql
b) 高效传输:
# 使用压缩流直接传输
mysqldump -u root -p mydb | gzip | ssh user@target "cat> /tmp/mydb.sql.gz"
# 或者使用 rsync
rsync -avz mydb.sql user@target:/tmp/
c) 在目标机恢复:
# 创建新库
mysql -u root -p -e "CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 导入
gunzip -c /tmp/mydb.sql.gz | mysql -u root -p mydb
# 或者直接:
mysql -u root -p mydb
*技巧*:加上 --single-transaction 可在 InnoDB 表上实现无锁导出,极大降低业务停机时间。
方法二的观点是,直接搬迁数据目录
适用场景 & 痛点缓解
- Pain Point: 导入/导出耗时长 → 通过拷贝物理文件实现秒级切换。不过,
- Pain Point: 权限错误导致服务无法启动 → 步骤中统一设置正确权限。
步骤详解
# 假设新挂载点为 /mnt/data_mysql
sudo mkdir -p /mnt/data_mysql
sudo rsync -av /var/lib/mysql/ /mnt/data_mysql/
# 或者使用 tar 流式复制
sudo tar cf - /var/lib/mysql |
# 编辑 /etc/mysql/mysql.conf.d/mysqld.cnf
# 找到 datadir 项并改为:
datadir = /mnt/data_mysql
# 如果有 socket 方法也相应修改
socket = /var/run/mysqld/mysqld.sock
# 打开 AppArmor 配置文件
sudo nano /etc/apparmor.d/usr.sbin.mysqld
# 添加新方法:
/mnt/data_mysql/ r。/mnt/data_mysql/** rwk,# 保存后重新加载:
sudo systemctl reload apparmor
If MySQL fails to start,check日志 /var/log/mysql/error.log.
说到方法三,使用 Mysqlpump
Mysqlpump 是 MySQL 5.7+ 自带的并行导出工具,可明显提高大库导出的速度。
# 并行导出所有数据库,使用4个线程:
mysqlpump -u root -p --exclude-databases=information_schema,performance_schema \
--default-parallelism=4> full_backup.sql
# 一样通过 ssh 或 scp 传输后在目标机恢复:
mysql -u root -p
远程访问配置
A. 为root使用者开放远程登录:
B. 防火墙放通3306端口:
C. 检查 MySQL bind-address 是否限制本地:
常见问题 & 排查教程
| Pain Point方法/排查步骤 | 参考命令/方法 | ||||
|---|---|---|---|---|---|
No permission error /var/lib/mysql。
/mnt/...
|
一步到位的迁移流程概览
-
备份&安全性检查——永不跳过!**
-
tar打包原始 data 目录。 -
mysqldump或mysqlpump双保险式逻辑备份。
-
-
systemctl stop mysql再rsync或tar拷贝至新磁盘。 -
chmod/chown正确设置权限,防止“Error 13”。
/etc/mysql/mysql.conf.d/mysqld.cnf 与 /etc/apparmor.d/usr.sbin.mysqld确保新方法被程序信任。重启 systemctl restart apparmor && systemctl restart mysql。
.
.sql 文件传输至目标机,用 mysql 导入;如需加速,加 --single-transaction 与 --parallelism 参数。验证 SELECT COUNT FROM …,
.
实战小贴士 & 常用命令速查表
-
mysqldump推荐参数:-–single-transaction ––quick ––lock-tables=false ––routines ––triggers ––events ––default-character-set=utf8mb4 -
rsync高效同步示例:rsync ‑avzP --delete /var/lib/mysql/ user@target:/mnt/datamysql/ -
AppArmor快速添加方法脚本:echo "/mnt/datamysql/ r。" | sudo tee ‑a /etc/apparmor.d/local/usr.sbin.mysqld echo "/mnt/datamysql/** rwk," | sudo tee ‑a ... && sudo apparmorparser ‑r /etc/apparmor.d/usr.sbin.mysqld
systemd 常用控制命令:
<\/ul>
祝您搬家顺利,业务零中断!如果还有问题,欢迎通过 QQ 与作者交流。其实,
为什么MySQL迁移总让人头疼?
在Ubuntu环境下公司和开发者常面临以下痛点:
- 数据丢失风险:迁移过程中若未做好备份,一旦出错可能导致业务中断。
- 长时间停机:传统的全库导出/导入往往需要数小时影响使用者体验。
- 权限与AppArmor冲突:不当的文件权限或安全策略会导致MySQL启动失败。
- 版本不兼容:源服务器与目标服务器MySQL版本差异大时迁移可能出现语法错误。
迁移前的准备工作
1️⃣ 确认MySQL版本
使用mysql --version检查两台机器的版本,尽量保持一致或在目标机上先升级到相同或更高版本。
2️⃣ 完整备份
无论采用哪种迁移方式。都必须先做一次物理备份:
# 停止MySQL服务
sudo systemctl stop mysql
# 打包数据目录
sudo tar -czvf /tmp/mysql_backup_$.tar.gz /var/lib/mysql
将备份文件复制到安全位置,例如外部硬盘或云存储,以防万一。
3️⃣ 检查硬盘空间
目标服务器的硬盘空间至少要比源服务器使用量多30%,避免因空间不足导致迁移中断。
方法一的观点是,使用 mysqldump/mysql
步骤概览
- 导出数据库
- 传输SQL文件至目标机
- 在目标机创建对应数据库并导入
- 验证数据完整性
详细操作
a) 导出单库或全库:
# 导出单个数据库
mysqldump -u root -p --single-transaction mydb> mydb.sql
# 导出全部数据库
mysqldump -u root -p --all-databases --routines --triggers> all_databases.sql
b) 高效传输:
# 使用压缩流直接传输
mysqldump -u root -p mydb | gzip | ssh user@target "cat> /tmp/mydb.sql.gz"
# 或者使用 rsync
rsync -avz mydb.sql user@target:/tmp/
c) 在目标机恢复:
# 创建新库
mysql -u root -p -e "CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 导入
gunzip -c /tmp/mydb.sql.gz | mysql -u root -p mydb
# 或者直接:
mysql -u root -p mydb
*技巧*:加上 --single-transaction 可在 InnoDB 表上实现无锁导出,极大降低业务停机时间。
方法二的观点是,直接搬迁数据目录
适用场景 & 痛点缓解
- Pain Point: 导入/导出耗时长 → 通过拷贝物理文件实现秒级切换。不过,
- Pain Point: 权限错误导致服务无法启动 → 步骤中统一设置正确权限。
步骤详解
# 假设新挂载点为 /mnt/data_mysql
sudo mkdir -p /mnt/data_mysql
sudo rsync -av /var/lib/mysql/ /mnt/data_mysql/
# 或者使用 tar 流式复制
sudo tar cf - /var/lib/mysql |
# 编辑 /etc/mysql/mysql.conf.d/mysqld.cnf
# 找到 datadir 项并改为:
datadir = /mnt/data_mysql
# 如果有 socket 方法也相应修改
socket = /var/run/mysqld/mysqld.sock
# 打开 AppArmor 配置文件
sudo nano /etc/apparmor.d/usr.sbin.mysqld
# 添加新方法:
/mnt/data_mysql/ r。/mnt/data_mysql/** rwk,# 保存后重新加载:
sudo systemctl reload apparmor
If MySQL fails to start,check日志 /var/log/mysql/error.log.
说到方法三,使用 Mysqlpump
Mysqlpump 是 MySQL 5.7+ 自带的并行导出工具,可明显提高大库导出的速度。
# 并行导出所有数据库,使用4个线程:
mysqlpump -u root -p --exclude-databases=information_schema,performance_schema \
--default-parallelism=4> full_backup.sql
# 一样通过 ssh 或 scp 传输后在目标机恢复:
mysql -u root -p
远程访问配置
A. 为root使用者开放远程登录:
B. 防火墙放通3306端口:
C. 检查 MySQL bind-address 是否限制本地:
常见问题 & 排查教程
| Pain Point方法/排查步骤 | 参考命令/方法 | ||||
|---|---|---|---|---|---|
No permission error /var/lib/mysql。
/mnt/...
|
一步到位的迁移流程概览
-
备份&安全性检查——永不跳过!**
-
tar打包原始 data 目录。 -
mysqldump或mysqlpump双保险式逻辑备份。
-
-
systemctl stop mysql再rsync或tar拷贝至新磁盘。 -
chmod/chown正确设置权限,防止“Error 13”。
/etc/mysql/mysql.conf.d/mysqld.cnf 与 /etc/apparmor.d/usr.sbin.mysqld确保新方法被程序信任。重启 systemctl restart apparmor && systemctl restart mysql。
.
.sql 文件传输至目标机,用 mysql 导入;如需加速,加 --single-transaction 与 --parallelism 参数。验证 SELECT COUNT FROM …,
.
实战小贴士 & 常用命令速查表
-
mysqldump推荐参数:-–single-transaction ––quick ––lock-tables=false ––routines ––triggers ––events ––default-character-set=utf8mb4 -
rsync高效同步示例:rsync ‑avzP --delete /var/lib/mysql/ user@target:/mnt/datamysql/ -
AppArmor快速添加方法脚本:echo "/mnt/datamysql/ r。" | sudo tee ‑a /etc/apparmor.d/local/usr.sbin.mysqld echo "/mnt/datamysql/** rwk," | sudo tee ‑a ... && sudo apparmorparser ‑r /etc/apparmor.d/usr.sbin.mysqld
systemd 常用控制命令:
<\/ul>
祝您搬家顺利,业务零中断!如果还有问题,欢迎通过 QQ 与作者交流。其实,

