在MySQL数据库运维和迁移场景中,经常会遇到只需要同步两个数据库中特定表的需求,比如仅同步业务核心的用户表、订单表,不需要处理全库数据。结合rsync工具和数据导出导入的方式,可以高效完成这类定向同步任务,既减少不必要的资源消耗,也能降低全库同步带来的风险。

核心原理说明
这种同步方式的核心逻辑分为三步:首先使用mysqldump工具从源数据库导出指定表的结构和数据,生成sql文件;然后通过rsync工具将导出的sql文件传输到目标数据库所在的服务器,rsync支持增量传输,比普通scp更高效;最后在目标服务器上执行sql文件,将数据导入到目标数据库的对应表中。
前置准备
- 源数据库和目标数据库都正常运行,且具备对应表的读写权限
- 源服务器和目标服务器都安装rsync工具,没有的话可以通过包管理器安装,比如yum install rsync或者apt install rsync
- 确认两个数据库的字符集一致,避免导入后出现乱码问题
- 提前在目标数据库创建好对应的数据库,表结构可以后续通过导入文件自动创建,也可以提前手动创建
具体操作步骤
1. 从源数据库导出指定表
使用mysqldump命令导出需要同步的特定表,假设源数据库名为source_db,需要同步的表为user_info和order_record,导出文件保存为sync_tables.sql。
# 导出指定表的结构和数据 mysqldump -u root -p source_db user_info order_record > /tmp/sync_tables.sql # 输入数据库密码后执行,导出完成后可以检查文件是否存在 ls -lh /tmp/sync_tables.sql
如果需要仅导出表结构不导出数据,可以添加--no-data参数;如果仅导出数据不导出结构,可以添加--no-create-info参数。
2. 使用rsync传输导出文件
假设目标服务器的IP为192.168.0.100,目标目录为/tmp/,使用rsync传输文件,rsync会校验文件差异,仅传输变更部分,适合大文件传输场景。
# 将源服务器的导出文件传输到目标服务器 rsync -avz /tmp/sync_tables.sql root@192.168.0.100:/tmp/ # 输入目标服务器root用户密码后开始传输
如果两台服务器配置了ssh免密登录,可以省略密码输入步骤,更适合自动化同步场景。
3. 在目标数据库导入数据
登录到目标服务器,执行导出的sql文件,将数据导入到目标数据库target_db中。
# 登录目标MySQL数据库 mysql -u root -p # 选择目标数据库 use target_db; # 导入sql文件 source /tmp/sync_tables.sql; # 导入完成后可以查询表数据验证 select count(*) from user_info;
注意事项
- 同步前建议对目标表的原有数据做备份,避免导入操作覆盖重要数据
- 如果同步的表存在外键约束,导出时需要注意表的顺序,先导入主表再导入从表,避免出现约束错误
- 大表导出导入时可能会占用较多数据库资源,建议在业务低峰期操作
- rsync传输时如果文件较大,可以添加--progress参数查看传输进度
场景适配建议
这种方式适合离线同步、非实时同步的场景,如果需要实时同步特定表,建议选择MySQL主从复制配合replicate-do-table参数,或者第三方同步工具。如果表数据量较小,也可以直接使用mysqldump导出后手动传输导入,不需要依赖rsync工具。
操作过程中如果遇到权限问题,需要检查数据库用户是否有对应的导出导入权限,以及服务器用户是否有文件的读写和传输权限。