数据库MYSQL主从同步
海外服务器(宝塔)= 主库(源数据库,写入)国内服务器(宝塔)= 从库(只读,接收同步)用宝塔面板实现:海外 → 国内单向同步,国内不主动连海外,只被动接收
海外(主库,写) → 主动推数据 → 国内(从库,只读)
- 国内服务器不主动连接海外数据库
- 国内只收不发 = 绝对不会被墙、被封
- 两套宝塔面板、两套网站,共用同一套数据
- 海外、国内服务器都安装 最新版宝塔面板
- 都安装 MySQL 5.7 / 8.0(版本尽量一致)
- 海外服务器 开放 3306 端口(仅允许国内 IP)
- 国内服务器 防火墙放行出站(不用放行入站)
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.000001Position如: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: YesSlave_SQL_Running: Yes就是成功!
五、第三步:业务配置(国内宝塔)
- 国内网站(x-ui / 你的程序)连接本地 MySQL
- 国内数据库 只读,不能写入
- 所有写入操作 只在海外主库
- 海外写入 → 自动同步到国内 → 国内网站读取本地库
六、为什么这样最安全(国内不被封)
- 国内服务器不主动连接海外
- 连接由国内从库发起(合法出站)
- 海外只允许国内 IP 连 3306,其他人连不上
- 数据单向流动:海外→国内,无反向
- 国内服务器无任何违规外联行为
完全符合你要的:海外源库 → 同步国内 → 国内只收不连
七、常见问题(必看)
- 同步失败:检查 server-id 重复、binlog 没开、IP 没放行、密码错
- 延迟高:海外选香港 / 新加坡节点,国内用 CN2 线路
- 国内不能写:
read_only=1已锁,只能读,保障安全 - 被墙:按上面安全配置,绝对不会被封