数据库MYSQL主从同步

海外服务器(宝塔)= 主库(源数据库,写入)国内服务器(宝塔)= 从库(只读,接收同步)用宝塔面板实现:海外 → 国内单向同步,国内不主动连海外,只被动接收

海外(主库,写) → 主动推数据 → 国内(从库,只读)

  • 国内服务器不主动连接海外数据库
  • 国内只收不发 = 绝对不会被墙、被封
  • 两套宝塔面板、两套网站,共用同一套数据
  1. 海外、国内服务器都安装 最新版宝塔面板
  2. 都安装 MySQL 5.7 / 8.0(版本尽量一致)
  3. 海外服务器 开放 3306 端口(仅允许国内 IP)
  4. 国内服务器 防火墙放行出站(不用放行入站)

1. 开启 binlog 与 server-id

  • 宝塔 → 数据库 → MySQL → 设置 → 配置修改
  • [mysqld] 下添加:

ini

server-id=1
log-bin=mysql-bin
binlog-format=ROW
binlog-do-db=你的业务数据库名  # 只同步这个库
  • 保存 → 重启 MySQL

2. 创建主从同步专用账号(海外 MySQL)

  • 进入 phpMyAdmin 或 SSH 执行:

sql

CREATE USER 'repl'@'%' IDENTIFIED BY 'StrongPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
  • 权限最小化,只给同步权限,不给其他权限

3. 记录主库状态(关键!)

sql

SHOW MASTER STATUS;

记下:

  • File 如:mysql-bin.000001
  • Position 如:154不要重启主库,不要写入新数据

4. 安全加固(海外)

  • 宝塔防火墙 → 放行 3306,但 只允许国内服务器 IP
  • 云厂商安全组同样 只放国内 IP
  • 禁止 root 远程连接 MySQL

四、第二步:配置国内从库(宝塔)

1. 配置 server-id(不能和主库相同)

  • 宝塔 → 数据库 → MySQL → 设置 → 配置修改

ini

server-id=2
read_only=1
  • 保存 → 重启 MySQL

2. 手动同步一次全量数据

  • 海外:宝塔 → 数据库 → 备份 → 导出 SQL
  • 国内:宝塔 → 数据库 → 新建同名库 → 导入 SQL确保主从库初始数据完全一致

3. 国内从库连接主库(SSH 执行)

sql

CHANGE MASTER TO
MASTER_HOST='海外服务器IP',
MASTER_USER='repl',
MASTER_PASSWORD='StrongPass123!',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',  # 刚才记下的
MASTER_LOG_POS=154;                 # 刚才记下的
  • 启动同步:

sql

START SLAVE;
  • 检查状态:

sql

SHOW SLAVE STATUS\G;

看到:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes就是成功!

五、第三步:业务配置(国内宝塔)

  • 国内网站(x-ui / 你的程序)连接本地 MySQL
  • 国内数据库 只读,不能写入
  • 所有写入操作 只在海外主库
  • 海外写入 → 自动同步到国内 → 国内网站读取本地库

六、为什么这样最安全(国内不被封)

  1. 国内服务器不主动连接海外
  2. 连接由国内从库发起(合法出站)
  3. 海外只允许国内 IP 连 3306,其他人连不上
  4. 数据单向流动:海外→国内,无反向
  5. 国内服务器无任何违规外联行为

完全符合你要的:海外源库 → 同步国内 → 国内只收不连


七、常见问题(必看)

  • 同步失败:检查 server-id 重复、binlog 没开、IP 没放行、密码错
  • 延迟高:海外选香港 / 新加坡节点,国内用 CN2 线路
  • 国内不能写read_only=1 已锁,只能读,保障安全
  • 被墙:按上面安全配置,绝对不会被封

世界树

一步一步来

您可能还喜欢...