文章目录
本篇基于Mac(m1)验证
准备 master 实例
1. Docker创建并启动MySQL master实例
docker run -d \
-p 3306:3306 \
-v /Users/111/aurora/mysql/master/conf:/etc/mysql/conf.d \
-v /Users/111/aurora/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name aurora-mysql-master \
mysql:8.0.29
2. 创建MySQL master实例配置文件
vim /Users/111/aurora/mysql/master/conf/my.cnf
====== 配置内容如下 ======
# 服务器唯一id,默认值1
server-id=1
# 设置日志格式,默认值ROW
binlog_format=STATEMENT
# 二进制日志名,默认binlog
log-bin=binlog
# 设置需要复制的数据库,默认复制全部数据库
binlog-do-db=db_user
# 设置不需要复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=infomation_schema
binlog-ignore-db=sys
binlog-ignore-db=performance_schema
====== 重启MySQL容器 ======
docker restart aurora-mysql-master
binlog格式说明:
- binlog_format=STATEMENT:日志记录的是主机数据库的
写指令
,性能高,但是now()之类的函数以及获取系统参数的操作会出现主从数据不同步的问题。 - binlog_format=ROW(默认):日志记录的是主机数据库的
写后的数据
,批量操作时性能较差,解决now()或者 user()或者 @@hostname 等操作在主从机器上不一致的问题。 - binlog_format=MIXED:是以上两种level的混合使用,有函数用ROW,没函数用STATEMENT,但是无法识别系统变量。
3. 命令行登录MySQL master实例
#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it aurora-mysql-master env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p123456
#如果客户端版本过低,可以通过修改默认密码校验方式来解决,笔者使用DataGrip没有此问题。
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
4. master中创建slave用户
#创建slave用户
CREATE USER 'aurora_slave'@'%';
#设置密码
ALTER USER 'aurora_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
#授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'aurora_slave'@'%';
#刷新权限
FLUSH PRIVILEGES;
5. 检查master状态
执行完此步骤后不要再操作主服务器MYSQL
,防止主服务器状态值变化
show master status;
准备 slave 实例
想要配置多个slave,重复此步骤。
1. Docker创建并启动MySQL slave实例
docker run -d \
-p 3307:3306 \
-v /Users/111/aurora/mysql/slave1/conf:/etc/mysql/conf.d \
-v /Users/111/aurora/mysql/slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name aurora-mysql-slave1 \
mysql:8.0.29
2. 创建MySQL slave实例配置文件
vim /Users/111/aurora/mysql/slave1/conf/my.cnf
====== 配置内容如下 ======
# 服务器唯一id,每台服务器的id必须不同。
server-id=2
# 中继日志名,默认xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin
====== 重启MySQL容器 ======
docker restart aurora-mysql-slave1
3. 登录从库实例配置主从关系
#进入容器:
docker exec -it aurora-mysql-slave1 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p123456
#执行如下命令,MASTER_USER是创建master时设置的slave名称,
#MASTER_LOG_FILE,MASTER_LOG_POS分别对应「检查master状态」,结果截图中的File,Position
CHANGE MASTER TO MASTER_HOST='192.168.3.29',
MASTER_USER='aurora_slave',MASTER_PASSWORD='123456', MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000005',MASTER_LOG_POS=157;
主从同步相关指令
启动 slave 的复制功能
start slave;
-- 查看状态(不需要分号)
show slave status\G
两个关键进程,下面两个参数都是Yes,则说明主从配置成功!笔者这个失败了,接下来查原因。
失败原因如下:
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids;
these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave
but this does not always make sense; please check the manual before using it).
-- 查看下server_id
show variables like 'server_id';
上一小节配置的slave的server-id=2
貌似没生效,下面手动设置sever_id。设置完再次查看sever_id,已变为2,接下来启动slave并查看状态,两个Yes,至此配置成功。
-- 和配置文件里的server_id一致
set global server_id=2;
停止和重置 slave 的复制功能
-- 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。
stop slave;
-- 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。
reset slave;
-- 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;
reset master;
数据验证
在主机中执行以下SQL,在从机中查看数据库、表和数据是否已经被同步。
CREATE DATABASE aurora;
USE aurora;
CREATE TABLE elephant (
id BIGINT AUTO_INCREMENT,
uname VARCHAR(30),
PRIMARY KEY (id)
);
INSERT INTO elephant(uname) VALUES('xiaobai');