一、mysql主从复制原理
1、主从复制原理
从上层来看,复制分成三步:
- Master主库在事务提交时,会把数据变更作为时间Events记录在二进制日志文件 Binlog 中。
- 主库推送二进制日志文件 Binlog中的日志事件到从库的中继日志Relay Log 。
- slave重做(重新执行)中继日志中的事件,将改变反映它自己的数据。
二、主从数据库
docker pull mysql:5.7
mysql版本问题:
mysql:5.7:可能登录会麻烦
mysql:8+:要弄驱动,还要改密码校验方式
综合来说是5.7
注:
本文认为你已经会了docker,linux和mysql基本操作
1、主库搭建(master)
1.1、创建主库容器
docker run -p 3301:3306 --name mysql1908 -e MYSQL_ROOT_PASSWORD=密码 -d mysql:5.7
-p:端口映射
-e MYSQL_ROOT_PASSWORD:密码(必须)
具体参考docker hub官方描述mysql Tags | Docker Hub
1.2、测试本地连接
工具随意(navicat、DBeaver等)
如果是服务器记得开端口
1.3、修改配置
1.3.1、进入容器
docker exec -it mysql1908 /bin/bash //mysql-master为容器名称
docker exec -it 123456 /bin/bash //123456为容器ID
1.3.2、修改my.cnf
1)进入my.cnf
可以使用finalshell直接进容器文件修改;参考mycat文章
vim /etc/mysql/my.cnf
如果找不到命令,简单;安装命令等就好了
安装vim
apt-get update
apt-get install vim
vim插入部分(不会的自行查阅Linux书籍)
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键);启用binlog日志
log-bin=mysql1908-bin
binlog-format=ROW // 二级制日志格式,有三种 row,statement,mixed
binlog-do-db=数据库名 //同步的数据库名称,如果不配置,表示同步所有的库
配置完成后,需要重启mysql服务使其修改的配置文件生效,使用如下命令使mysql进行重启
service mysql restart
重启后这个docker容器会停止,启动即可
docker start mysql-master
2)创建数据库同步账户
再次进入主库容器
docker exec -it mysql1908 /bin/bash //mysql-master为容器名称
登录数据库
a.登录异常
远程连接mysql 提示 Access denied for user 'root'@'192.168.1.148' (using password: YES)
是因为没有正确的开放mysql远程权限
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysql1234' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
登录
mysql -uroot -p #回车,然后敲密码
在主库创建数据同步用户slave,授权该用户REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。登录到mysql客户端
开始创建用户slave
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
到此,主库配置完成
2、从库搭建(slave)
2.1、创建主库容器
docker run -p 3302:3306 --name mysql1907 -e MYSQL_ROOT_PASSWORD=密码 -d mysql:5.7
-p:端口映射
-e MYSQL_ROOT_PASSWORD:密码(必须设置)
具体参考docker hub官方描述mysql Tags | Docker Hub
2.2、测试本地连接
工具随意(navicat、DBeaver等)
如果是服务器记得开端口
2.3、修改配置
2.3.1、进入容器
docker exec -it mysql1908 /bin/bash //mysql-master为容器名称
docker exec -it 123456 /bin/bash //123456为容器ID
2.3.2、修改my.cnf
2)进入my.cnf
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
#启用binlog日志
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=mysql-relay-bin
read_only=1 ## 设置为只读,该项如果不设置,表示slave可读可写
其余操作可以参考Master
3、Master-Slave主从复制
3.1、记录master状态并创建同步用户
进入mysql客户端输入,查看Master状态
show master status;
记住File和Position,后面需要用到。此时一定不要操作Master库,否则将会引起Master状态的变化,File和Position字段也将会进行变化。
3.1.1、创建同步用户
在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据
CREATE USER 'slave'@'%' IDENTIFIED BY 'mysql1234';
3.1.2、给同步用户权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
3.2、建立连接
docker inspect -format='{{.NetworkSettings.IPAddress}}' 容器名称 | 容器id查询容器的IP
进行查询:
3.2.1、执行命令
以下均在Slave 中的mysql终端
change master to master_host='172.17.0.6', master_user='slave', master_password='mysql1234', master_port=1908, master_log_file='master1908-bin.000001', master_log_pos=617, master_connect_retry=30;
命令说明:
-
master_host :Master库的地址
-
注意master_host有歧义
-
[(84条消息) 使用Docker搭建MySQL主从复制(一主一从)_欧阳啸天的博客-CSDN博客_docker mysql主从](https://blog.csdn.net/abcde123_123/article/details/106244181?ops_request_misc=%7B%22request%5Fid%22%3A%22164950906816780271911912%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fall.%22%7D&request_id=164950906816780271911912&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~hot_rank-8-106244181.142v7pc_search_result_control_group,157v4control&utm_term=mysql主从搭建docker ++++++++++++++++++++++++++&spm=1018.2226.3001.4187)这个博主说是容器的独立ip,但是我试了没用
-
[(84条消息) docker搭建mysql主从复制_时光_1024的博客-CSDN博客_docker搭建mysql主从复制](https://blog.csdn.net/qq_48469418/article/details/121009196?ops_request_misc=%7B%22request%5Fid%22%3A%22164950906816780271911912%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fall.%22%7D&request_id=164950906816780271911912&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~hot_rank-9-121009196.142v7pc_search_result_control_group,157v4control&utm_term=mysql主从搭建docker ++++++++++++++++++++++++++&spm=1018.2226.3001.4187)这个博主又说是服务器ip,我试了可以成功了
-
所以根据自身情况尝试成功
-
-
master_port:Master的端口号,指的是容器的端口号
-
master_user:用于数据同步的用户
-
master_password:用于同步的用户的密码
-
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
-
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
-
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
3.3、开启主从复制
3.3.1、默认情况
show slave status \G;
用于查看主从同步状态。
Slave_IO_Running 和 Slave_SQL_Running是查看主从是否运行的关键字段,默认为NO,表示没有进行主从复制。
执行如下命令开启主从复制过程,然后再次查询主从同步状态
show slave status \G;
start slave;
3.3.2、失败启动
使用start slave
开启主从复制过程后,如果SlaveIORunning
一直是Connecting
,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error
提示予以排除。
1)错误排查建立连接:
1、网络不通:检查ip,端口
2、密码不对:检查是否创建用于同步的用户和用户密码是否正确
3、Position不对:检查Master的 Position
4、file不对:检查file的Position
3.3.3、正常启动
Slave_IO_Running
和 Slave_SQL_Running
都是Yes
,说明主从复制已经开启。此时可以测试数据同步是否成功。
3.3.4、主从复制测试
1、在Master中创建一个新库
2、从库查看
3.4、关闭主从复制
stop slave;
3.5、重新配置主从
stop slave;
reset master;
结束!!!!