MySQL主从复制(Master-Slave Replication)是一种将数据从一个MySQL服务器(主服务器)复制到另一个MySQL服务器(从服务器)的机制。通过这种复制,可以实现数据库的负载均衡、数据备份和容错等功能。下面是MySQL主从复制的完整教程。

1. 前提条件

  • 两台机器:一台作为主服务器,一台作为从服务器。
  • 两台服务器都安装了MySQL,且版本一致。

2. 配置主服务器(Master)

  1. 编辑 MySQL 配置文件
    打开主服务器的MySQL配置文件(通常是/etc/my.cnf/etc/mysql/my.cnf,视操作系统而定)。

    sudo vim /etc/my.cnf
    

    2.设置必要的配置项
    [mysqld] 部分添加以下配置:

    [mysqld]
    server-id = 1               # 唯一的服务器ID
    log_bin = /var/log/mysql/mysql-bin.log  # 启用二进制日志(用于复制)
    binlog-do-db = your_db_name  # 可选:指定要复制的数据库(如果需要复制所有数据库,则不指定)
    
    1. server-id:每个MySQL服务器都必须有唯一的ID。
    2. log_bin:启用二进制日志,这是主从复制的基础。
    3. binlog-do-db:指定需要复制的数据库,如果你希望复制所有数据库,可以省略此项。

 3.重启 MySQL 服务

        配置修改完成后,重启 MySQL 服务以使配置生效:

sudo systemctl restart mysql

 4.创建复制账户

        在主服务器上创建一个用于复制的MySQL账户:

CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
  • 'replica_user':复制账户的用户名。
  • password:复制账户的密码。
  • 你可以根据需求限制账户的访问权限。

5.获取主服务器的二进制日志位置

为了让从服务器能够正确同步数据,主服务器需要知道当前的二进制日志文件和位置。执行以下命令来获取:

SHOW MASTER STATUS;

结果会显示类似如下:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 1234     | your_db_name |                  |
+------------------+----------+--------------+------------------+
  • File:当前二进制日志文件。
  • Position:当前日志文件中的位置。
  • 记录下FilePosition的值,稍后需要在从服务器上配置。

3. 配置从服务器(Slave)

        1.编辑 MySQL 配置文件

        打开从服务器的MySQL配置文件(通常是/etc/my.cnf/etc/mysql/my.cnf)。

sudo vim /etc/my.cnf


       2. 设置必要的配置项
        在 [mysqld] 部分添加以下配置

[mysqld]
server-id = 2               # 唯一的服务器ID,不能与主服务器相同
relay-log = /var/log/mysql/mysql-relay.log  # 启用中继日志(用于复制)
log_slave_updates = 1       # 启用从服务器日志记录
read-only = 1               # 可选:设置从服务器为只读(避免数据被修改)
  • server-id:从服务器的唯一ID,必须与主服务器不同。
  • relay-log:启用中继日志,这是从服务器的复制机制。

        3.重启 MySQL 服务

        配置修改完成后,重启 MySQL 服务以使配置生效:

sudo systemctl restart mysql

        4.配置从服务器连接到主服务器
        在从服务器上执行以下命令来配置连接主服务器:

CHANGE MASTER TO
  MASTER_HOST='master_ip',           # 主服务器的IP地址
  MASTER_USER='replica_user',        # 复制账户名
  MASTER_PASSWORD='password',       # 复制账户的密码
  MASTER_LOG_FILE='mysql-bin.000001',  # 主服务器的二进制日志文件
  MASTER_LOG_POS=1234;              # 主服务器的二进制日志位置
  • MASTER_HOST:主服务器的IP地址或主机名。
  • MASTER_USER:复制账户的用户名。
  • MASTER_PASSWORD:复制账户的密码。
  • MASTER_LOG_FILE:主服务器的二进制日志文件。
  • MASTER_LOG_POS:主服务器的二进制日志位置。

        5.启动复制进程
        启动从服务器的复制进程:

START SLAVE;

        6.检查复制状态

        查看从服务器的复制状态,以确保复制成功:

SHOW SLAVE STATUS\G

你应该看到类似如下的输出:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
  • Slave_IO_Running:表示I/O线程是否正在运行。
  • Slave_SQL_Running:表示SQL线程是否正在运行。
  • 如果这两个值都为Yes,则表示主从复制配置成功。

4. 验证主从复制

  1. 在主服务器上创建数据
    在主服务器上创建一个测试数据库或表:

    CREATE DATABASE test_db;
    USE test_db;
    CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));
    INSERT INTO test_table (id, name) VALUES (1, 'test_name');
    

    2.检查从服务器的数据同步
    登录到从服务器,检查是否已经同步了主服务器上的数据:

    SHOW DATABASES;
    USE test_db;
    SELECT * FROM test_table;
    

    如果从服务器上也能看到test_db数据库和test_table表,且数据一致,则表示复制正常工作。

5. 常见问题排查

  • Slave_IO_RunningSlave_SQL_RunningNo

    • 检查复制账户的权限是否正确。
    • 确保主服务器的二进制日志文件和位置正确。
    • 查看错误日志(SHOW SLAVE STATUS)中的Last_Error字段,排查复制过程中出现的错误。
  • 数据不一致
    如果复制过程中出现数据不一致,可以考虑使用pt-table-checksumpt-table-sync工具进行修复。

6. 其他高级配置

  • 多主复制(Master-Master Replication)
    MySQL也支持多主复制,两个MySQL实例都作为主服务器和从服务器,这需要额外的配置。

  • GTID复制
    GTID(全局事务标识符)复制是MySQL的另一个复制方式,相比于基于二进制日志的复制方式,它可以简化主从切换和故障恢复过程。

Logo

2万人民币佣金等你来拿,中德社区发起者X.Lab,联合德国优秀企业对接开发项目,领取项目得佣金!!!

更多推荐