Mysql8.0主从配置
一、环境准备
主从配置需要运行两个mysql服务,这里选择docker,可以很方便的在本地启动多个mysql服务。
1. 启动mysql服务
为了更方便管理,我选择docker-compose进行编排,创建mysql.yml,文件内容如下:
version: '3.1'
services:
mysql_master:
container_name: mysql_master
image: mysql:8.0.29
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- /users/path/mysql/data:/var/lib/mysql
- /users/path/mysql/conf.d:/etc/mysql/conf.d
- /users/path/mysql/sql:/mysql/sql
ports:
- 3306:3306
mysql_slave:
container_name: mysql_slave
image: mysql:8.0.29
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- /users/path/mysql/slave/data:/var/lib/mysql
- /users/path/mysql/slave/conf.d:/etc/mysql/conf.d
- /users/path/mysql/sql:/mysql/sql
ports:
- 3305:3306
注意将/users/path
替换为真实路径,mysql_master作为主库,mysql_slave为从库。主库端口号为3306,从库端口号3305。
2. 配置文件
- 创建主库配置文件
/users/path/mysql/conf.d/my.conf
,内容如下:
[mysqld]
server-id=1
# 从mysql8.0开始bin-log为默认开启状态,这里无需配置
- 创建从库配置文件
/users/path/mysql/slave/conf.d/my.conf
,内容如下:
[mysqld]
server-id=2
然后,运行如下命令:
docker-compose -f mysql.yml up -d
这样,就启动了两个mysql服务,接下来就是主从设置了。
二、主从设置
1. 主库(数据源)设置
1.1 将主库数据快照导入从库(如果不需要导入,则跳过此过程)
当主库已经存在数据库和数据表,需要先导入从库,可以进行如下操作:
进入主库容器,导出快照:
# 这里--all-databases表示到处所有数据库,也可以换成--databases 来指定要导出的数据库
> mysqldump -uroot -p123456 --all-databases --master-data > /mysql/sql/masterdump.db
进入从库容器,导入快照:
> mysql -h source < /mysql/sql/masterdump.db
1.2 进入主库,创建复制用户,并授权(用于从库连接主库,并需要拥有复制权限)
> CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
1.3 获取主库binary log坐标(如果进行了1.1步骤,则可以跳过此步骤)
首先,进入主库,在当前回话,运行:
-- 此语句的作用是:刷新所有的表,然后阻塞所有写语句,以便binary log坐标不会发生变动
> FLUSH TABLES WITH READ LOCK;
-- 此语句是查看主库状态,可以看到binary log的当前坐标
> SHOW MASTER STATUS;
2. 设置从库
- 需要先获取主库容器的ip,在docker容器宿主机上运行如下命令获取容器IP:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql_master
例如:
- 接下来设置从库数据源,启动复制线程,进入从库会话,运行:
-- 设置数据源
> CHANGE REPLICATION SOURCE TO SOURCE_HOST='172.18.0.2', SOURCE_USER='repl', SOURCE_PASSWORD='123456', SOURCE_LOG_FILE='binlog.000011', SOURCE_LOG_POS=1093;
-- 启动,从mysql8.0.22,用下面的语句代替START SLAVE;
> START REPLICA;
-- 查看状态
> SHOW REPLICA STATUS\G;
- 如果主库运行了
FLUSH TABLES WITH READ LOCK
,需要释放锁:
> UNLOCK TABLES;
数据库主从就配置完了,可以在主库进行增删改查,看是否同步到了从库。