腾讯云服务器搭建MySQL主从复制的步骤是什么?

在腾讯云服务器上搭建 MySQL 主从复制(Master-Slave Replication)可以实现数据的高可用、读写分离和备份。以下是详细的步骤:


一、环境准备

假设你有两台腾讯云 CVM 实例:

  • 主服务器(Master):IP 10.0.0.10
  • 从服务器(Slave):IP 10.0.0.11

操作系统:Ubuntu/CentOS(以 Ubuntu 20.04 为例)
MySQL 版本:建议使用相同版本(如 MySQL 8.0)


二、安装 MySQL

在 Master 和 Slave 上都安装 MySQL:

# 更新包管理器
sudo apt update

# 安装 MySQL 服务器
sudo apt install mysql-server -y

# 启动并设置开机自启
sudo systemctl start mysql
sudo systemctl enable mysql

注意:首次安装后建议运行 sudo mysql_secure_installation 设置 root 密码和安全选项。


三、配置主服务器(Master)

1. 编辑 MySQL 配置文件

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

添加或修改以下内容:

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
expire_logs_days = 7
max_binlog_size = 100M
  • server-id:唯一标识,主为 1,从为 2。
  • log-bin:启用二进制日志(必须)。
  • binlog-format:推荐 ROW 模式,兼容性好。

2. 重启 MySQL

sudo systemctl restart mysql

3. 创建用于复制的用户

登录 MySQL:

mysql -u root -p

执行 SQL:

-- 创建复制用户(允许从 Slave 连接)
CREATE USER 'repl'@'10.0.0.11' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.11';

-- 刷新权限
FLUSH PRIVILEGES;

替换 'your_password' 为强密码,并确保网络可通。

4. 锁定数据库并获取二进制日志位置

-- 锁定所有表,防止写入
FLUSH TABLES WITH READ LOCK;

-- 查看当前 binlog 状态
SHOW MASTER STATUS;

记录输出中的:

  • File: 如 mysql-bin.000001
  • Position: 如 156

示例输出:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      156 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

⚠️ 此时不要退出 MySQL,保持锁状态,直到从服务器配置完成。


四、配置从服务器(Slave)

1. 编辑 MySQL 配置文件

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

添加:

[mysqld]
server-id = 2
relay-log = mysql-relay-bin
log-slave-updates = 1
read-only = 1
  • server-id 必须与主不同。
  • read-only = 1 表示从库只读(防止误写)。

2. 重启 MySQL

sudo systemctl restart mysql

3. 登录 MySQL 并配置复制

mysql -u root -p

执行:

CHANGE MASTER TO
  MASTER_HOST='10.0.0.10',
  MASTER_USER='repl',
  MASTER_PASSWORD='your_password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=156;

-- 启动复制
START SLAVE;

-- 查看复制状态
SHOW SLAVE STATUSG

注意:

  • MASTER_HOST 是主服务器内网 IP(建议用内网通信)。
  • MASTER_LOG_FILEMASTER_LOG_POS 填写主服务器 SHOW MASTER STATUS 的结果。

五、解锁主服务器

回到主服务器的 MySQL 终端,执行:

UNLOCK TABLES;

解锁后主服务器恢复写操作。


六、验证主从复制

1. 检查从服务器状态

在从服务器执行:

SHOW SLAVE STATUSG

确认以下两个字段为 Yes

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

如果有错误,检查错误信息(Last_Error)进行排查。

2. 测试数据同步

在主服务器创建数据库和表:

CREATE DATABASE testdb;
USE testdb;
CREATE TABLE t1 (id INT);
INSERT INTO t1 VALUES (1);

在从服务器查询:

USE testdb;
SELECT * FROM t1;

如果能看到 (1),说明同步成功。


七、注意事项

  1. 网络互通:确保主从服务器在同一个 VPC 内,通过内网通信,开放 3306 端口(安全组设置)。

  2. 时间同步:建议开启 NTP 时间同步。

  3. 防火墙:关闭防火墙或放行 3306 端口。

  4. 初始数据一致性:如果主库已有数据,建议使用 mysqldump 导出导入保证一致性:

    # 在主库导出
    mysqldump -u root -p --all-databases --master-data=2 > backup.sql
    
    # 将 backup.sql 传到从库并导入
    mysql -u root -p < backup.sql

    导入后 CHANGE MASTER TO 可自动获取正确的 binlog 位置。


八、常见问题排查

  • Slave_IO_Running: No:网络不通、用户权限不足、防火墙拦截。

  • Slave_SQL_Running: No:数据冲突、SQL 执行错误,可尝试跳过错误(谨慎):

    SET GLOBAL sql_slave_skip_counter = 1;
    START SLAVE;

✅ 完成以上步骤后,你的腾讯云 MySQL 主从复制就搭建成功了!

如需进一步实现读写分离,可结合中间件如 MyCat、ProxySQL 或应用层控制。