如何同步本地 SQL 文件至服务器?

103 阅读3分钟

要将本地MySQL数据库中某个日期之后新增的数据导出为SQL文件,并同步到远程服务器,可以按照以下步骤操作:


⬇️ 一、导出本地数据库新增数据

1. ​使用 mysqldump 筛选数据

通过 mysqldump 的 --where 参数指定日期条件导出数据:

mysqldump -u [本地用户名] -p[密码] [数据库名] [表名] \
--where="created_at > '2025-07-01'" > new_data.sql
  • 参数说明​:

    • -u:本地MySQL用户名(如 root)。
    • -p:密码(注意无空格,如 -p123456)。
    • --where:指定条件(created_at 为日期字段,格式需与数据库存储一致)。
    • > new_data.sql:导出到SQL文件6,8

2. ​常用导出选项

参数作用示例
--skip-add-drop-table避免覆盖服务器表结构适合仅追加数据
--no-create-info不生成 CREATE TABLE 语句仅导出数据,避免表结构冲突
--replace使用 REPLACE INTO 替代 INSERT避免主键冲突6

示例完整命令:

mysqldump -u root -p123456 mydb orders \
--no-create-info --replace --where="created_at >= '2025-07-01'" > orders_new.sql

📤 二、将SQL文件传输到服务器

  • 方法1:SCP命令

    scp new_data.sql user@remote_server:/path/to/directory/
    
  • 方法2:SFTP工具
    使用FileZilla等工具可视化上传。


⬆️ 三、在服务器导入数据

1. ​登录服务器MySQL

mysql -u [服务器用户名] -p[密码] [目标数据库名] < new_data.sql

2. ​验证数据一致性

-- 检查新增数据量
SELECT COUNT(*) FROM [表名] WHERE created_at > '2025-07-01';

⚠️ 四、注意事项

  1. 日期字段格式

    • 确保 WHERE 条件中的日期格式与数据库存储格式一致(通常为 YYYY-MM-DD HH:MM:SS1,5
  2. 避免覆盖现有数据

    • 使用 --replace 或 INSERT IGNORE 避免主键冲突6
  3. 字符集与时区

    • 若本地与服务器环境不同,添加 --default-character-set=utf8mb4 指定字符集5
  4. 权限问题

    • 确保本地导出和服务器导入时均有数据库读写权限。
  5. 增量同步优化

    • 对频繁同步的场景,建议使用 ​Binlog 复制​ 或 ​第三方工具(如 Canal/Debezium)​7

💡 五、完整操作示例

# 1. 本地导出7月1日后的数据(不包含表结构)
mysqldump -u root -p123456 mydb orders \
--no-create-info --replace --where="created_at >= '2025-07-01'" > orders_new.sql

# 2. 传输到服务器
scp orders_new.sql user@server_ip:/home/user/

# 3. 服务器导入
mysql -u remote_user -p789012 mydb_prod < /home/user/orders_new.sql

# 4. 验证
mysql -u remote_user -p789012 -e "SELECT MAX(created_at) FROM mydb_prod.orders;"

常见问题解决

  • 导出失败​:检查日期字段名是否拼写错误,或尝试用反引号包裹字段名(如 `created_at`)。
  • 导入报错​:确认SQL文件路径正确,且服务器MySQL版本兼容导出文件的语法6,8

通过以上步骤,可高效同步本地新增数据到服务器,同时避免全量覆盖的风险。如需自动化,可编写Shell脚本结合cron定时任务执行。