MySQL单机主从
概述
MySQL主从复制(Master-Slave Replication)是一种常见的数据库分布式架构解决方案,它能够实现数据的异步复制,将主数据库(Master)的数据复制到一个或多个从数据库(Slave)。主从复制不仅能够提高数据库的容错性和可用性,还可以分担主数据库的压力,提高系统的并发处理能力。
本文将介绍如何在MySQL中配置主从复制,以及如何验证主从复制的正确性。
环境准备
在开始配置主从复制之前,我们需要准备一台MySQL服务器作为主数据库,以及一台或多台MySQL服务器作为从数据库。本文示例中我们使用Docker容器创建两个MySQL服务器,一个作为主数据库,一个作为从数据库。以下是准备环境的步骤:
- 安装Docker和Docker Compose
- 创建一个目录,用于存放配置文件和数据文件
- 在创建的目录中创建一个名为
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
- 在创建的目录中创建一个名为
master.cnf
的文件,内容如下所示:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=test
- 在创建的目录中创建一个名为
slave.cnf
的文件,内容如下所示:
[mysqld]
server-id=2
- 执行以下命令启动MySQL容器:
docker-compose up -d
- 进入主数据库容器中,创建一个名为
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;
记录File
和Position
的值,后续会在从数据库中使用。
启动主从复制
进入从数据库容器中,执行以下SQL语句配置从数据库连接主数据库:
CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='replication',
MASTER_PASSWORD='password',