MySQL单机主从

概述

MySQL主从复制(Master-Slave Replication)是一种常见的数据库分布式架构解决方案,它能够实现数据的异步复制,将主数据库(Master)的数据复制到一个或多个从数据库(Slave)。主从复制不仅能够提高数据库的容错性和可用性,还可以分担主数据库的压力,提高系统的并发处理能力。

本文将介绍如何在MySQL中配置主从复制,以及如何验证主从复制的正确性。

环境准备

在开始配置主从复制之前,我们需要准备一台MySQL服务器作为主数据库,以及一台或多台MySQL服务器作为从数据库。本文示例中我们使用Docker容器创建两个MySQL服务器,一个作为主数据库,一个作为从数据库。以下是准备环境的步骤:

  1. 安装Docker和Docker Compose
  2. 创建一个目录,用于存放配置文件和数据文件
  3. 在创建的目录中创建一个名为docker-compose.yml的文件,内容如下所示:
version: "3"
services:
  master:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - ./master:/var/lib/mysql
      - ./master.cnf:/etc/mysql/conf.d/master.cnf
  slave:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - ./slave:/var/lib/mysql
      - ./slave.cnf:/etc/mysql/conf.d/slave.cnf
  1. 在创建的目录中创建一个名为master.cnf的文件,内容如下所示:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=test
  1. 在创建的目录中创建一个名为slave.cnf的文件,内容如下所示:
[mysqld]
server-id=2
  1. 执行以下命令启动MySQL容器:
docker-compose up -d
  1. 进入主数据库容器中,创建一个名为test的数据库,并插入一些测试数据:
docker-compose exec master mysql -uroot -ppassword -e "CREATE DATABASE test;"
docker-compose exec master mysql -uroot -ppassword -e "CREATE TABLE test.users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100));"
docker-compose exec master mysql -uroot -ppassword -e "INSERT INTO test.users (name) VALUES ('Alice'), ('Bob'), ('Charlie');"

至此,我们已经完成了环境的准备工作。

配置主从复制

主数据库配置

首先,我们需要在主数据库上配置复制相关的参数。编辑master.cnf文件,添加以下配置:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=test

上述配置中,server-id用于标识服务器的唯一ID,log-bin用于开启二进制日志文件记录,binlog-do-db用于指定需要复制的数据库。

重启主数据库容器,使配置生效:

docker-compose restart master

从数据库配置

接下来,我们需要在从数据库上配置复制相关的参数。编辑slave.cnf文件,添加以下配置:

[mysqld]
server-id=2

上述配置中,server-id用于标识服务器的唯一ID。

重启从数据库容器,使配置生效:

docker-compose restart slave

配置主从复制连接信息

在主数据库中创建一个用于从数据库连接的用户,并授予复制相关的权限。执行以下SQL语句:

CREATE USER 'replication'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
FLUSH PRIVILEGES;

获取主数据库的二进制日志文件名和位置,执行以下SQL语句:

SHOW MASTER STATUS;

记录FilePosition的值,后续会在从数据库中使用。

启动主从复制

进入从数据库容器中,执行以下SQL语句配置从数据库连接主数据库:

CHANGE MASTER TO
  MASTER_HOST='master',
  MASTER_USER='replication',
  MASTER_PASSWORD='password',