Linux环境下跨服务器复制MySQL 5.1数据库的可行方法咨询
嘿,针对你这种两台MySQL 5.1服务器之间迁移单个数据库的需求,结合两台机器能通过scp传输文件的条件,我整理了几个实用的方法,你可以根据自己的场景来选:
方法1:mysqldump备份 + scp传输 + 导入(最通用)
这是最经典的迁移方式,几乎适用于所有存储引擎,操作也简单:
- 在源服务器上导出目标数据库:
如果数据库较大,建议压缩备份节省传输带宽:# 交互式输入密码更安全,去掉-p后的密码即可 mysqldump -u [源数据库用户名] -p --databases [要迁移的数据库名] > db_backup.sql
额外优化:如果是InnoDB表,加上mysqldump -u [源数据库用户名] -p --databases [要迁移的数据库名] | gzip > db_backup.sql.gz--single-transaction参数可以保证备份一致性且不锁表;如果是MyISAM表,用--lock-tables=1来锁表防止写入。 - 用scp把备份文件传到目标服务器:
# 传输普通备份文件 scp db_backup.sql [目标服务器用户名]@[目标服务器IP]:/tmp/ # 传输压缩备份文件 scp db_backup.sql.gz [目标服务器用户名]@[目标服务器IP]:/tmp/ - 在目标服务器导入备份:
# 普通备份文件导入 mysql -u [目标数据库用户名] -p < /tmp/db_backup.sql # 压缩备份文件直接导入(无需解压) gunzip < /tmp/db_backup.sql.gz | mysql -u [目标数据库用户名] -p
方法2:管道直接传输(无中间备份文件)
如果不想在服务器上生成备份文件,可以直接通过ssh管道把导出的数据实时传到目标服务器导入,步骤更简洁:
- 先在目标服务器提前创建好空数据库:
CREATE DATABASE [新数据库名]; - 在源服务器执行以下命令(一次性完成导出+传输+导入):
提示:同样建议交互式输入密码,不要把密码明文写在命令里,避免安全风险。mysqldump -u [源用户名] -p [要迁移的数据库名] | ssh [目标服务器用户名]@[目标服务器IP] "mysql -u [目标用户名] -p [新数据库名]"
方法3:物理文件迁移(适合MyISAM为主的数据库)
MySQL 5.1中MyISAM表的所有数据都以文件形式存储在数据目录下,所以可以直接复制物理文件,但这个方法对InnoDB表兼容性差(除非开启了独立表空间):
- 在源服务器先锁定表或停掉MySQL服务,防止备份过程中有数据写入:
# 临时锁表(无需停服务) mysql -u [源用户名] -p -e "FLUSH TABLES WITH READ LOCK;" # 或者直接停服务(更彻底) service mysql stop - 找到目标数据库的物理文件路径,默认是
/var/lib/mysql/[数据库名]/,里面包含.frm(表结构)、.MYD(数据)、.MYI(索引)文件 - 用scp复制整个数据库目录到目标服务器的MySQL数据目录:
scp -r /var/lib/mysql/[数据库名]/ [目标服务器用户名]@[目标服务器IP]:/var/lib/mysql/ - 在目标服务器调整目录权限,让MySQL用户能访问:
chown -R mysql:mysql /var/lib/mysql/[数据库名]/ - 重启目标服务器的MySQL服务,或者在源服务器解锁表:
# 目标服务器重启服务 service mysql restart # 源服务器解锁表(如果之前用的是锁表而非停服务) mysql -u [源用户名] -p -e "UNLOCK TABLES;"
注意:如果数据库里有大量InnoDB表,不建议用这个方法,容易出现数据不一致或无法启动服务的问题。
方法4:临时主从复制(适合大数据库增量迁移)
如果要迁移的数据库非常大,全量备份耗时久,可以临时搭建主从复制,先全量迁移再增量同步,保证数据一致性:
- 在源服务器锁表并记录二进制日志位置:
记下结果中的-- 登录MySQL执行 FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;File和Position值,这是后续增量同步的起点。 - 用mysqldump导出全量数据(和方法1一样),导出完成后解锁表:
UNLOCK TABLES; - scp备份文件到目标服务器并导入,然后在目标服务器配置主从复制:
-- 登录MySQL执行 CHANGE MASTER TO MASTER_HOST='[源服务器IP]', MASTER_USER='[复制专用用户名]', -- 需要在源服务器提前创建这个用户并授权 MASTER_PASSWORD='[复制密码]', MASTER_LOG_FILE='[刚才记录的File值]', MASTER_LOG_POS=[刚才记录的Position值]; - 启动从库同步,等待同步完成后停止复制:
START SLAVE; -- 检查同步状态,直到Slave_IO_Running和Slave_SQL_Running都为Yes SHOW SLAVE STATUS\G; -- 同步完成后停止从库 STOP SLAVE;
这个方法适合数据量大、对停机时间要求高的场景,但步骤相对复杂,需要提前配置复制用户。
一些通用注意事项
- 迁移前最好在测试环境验证一遍,避免影响生产环境
- 两台服务器都是MySQL 5.1,版本一致不会有兼容性问题,如果版本不同需要额外注意语法差异
- 尽量不要在命令行明文输入密码,用交互式输入更安全
- 大数据库迁移时,压缩备份或用管道传输能有效节省时间和带宽
内容的提问来源于stack exchange,提问作者sabarish




