You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux环境下跨服务器复制MySQL 5.1数据库的可行方法咨询

嘿,针对你这种两台MySQL 5.1服务器之间迁移单个数据库的需求,结合两台机器能通过scp传输文件的条件,我整理了几个实用的方法,你可以根据自己的场景来选:

方法1:mysqldump备份 + scp传输 + 导入(最通用)

这是最经典的迁移方式,几乎适用于所有存储引擎,操作也简单:

  • 源服务器上导出目标数据库:
    # 交互式输入密码更安全,去掉-p后的密码即可
    mysqldump -u [源数据库用户名] -p --databases [要迁移的数据库名] > db_backup.sql
    
    如果数据库较大,建议压缩备份节省传输带宽:
    mysqldump -u [源数据库用户名] -p --databases [要迁移的数据库名] | gzip > db_backup.sql.gz
    
    额外优化:如果是InnoDB表,加上--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;
    
    记下结果中的FilePosition值,这是后续增量同步的起点。
  • 用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

火山引擎 最新活动