1.环境准备
1.1.安装Docker
1.2.Docker环境下,拉取MySQL镜像
1.3.在/usr/local/路径下,创建mysql-conf目录,在目录下创建my.cnf文件
cd /usr/local/
mkdir mysql-conf
vi my.cnf
2.创建MySQL容器
2.1.创建并开启MySQL
docker run -p 5566:3306 --name master-mysql -v /usr/local/mysql-conf/:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
2.2.检查是否创建成功
#命令
docker ps -a
#创建成功
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64543b19b6e1 mysql:5.7 "docker-entrypoint..." About a minute ago Up About a minute 33060/tcp, 0.0.0.0:5566->3306/tcp master-mysql
2.3.进入MySQL容器
#命令
docker exec -it 容器id /bin/bash
#进入成功
root@64543b19b6e1:/#
2.4.编写主(master)服务器my.cnf文件
[mysqld]
skip-name-resolve
#id值需要保证唯一
server-id=1
log-bin=mysql-bin
binlog-do-db=jieyi
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
保存my.cnf文件后,一定要重启MySQL容器
docker restart 容器id
2.5.在主(master)服务器,授予从(slave)服务器权限(授权远程访问)
首先使用navicat登录主服务器MySQL,然后输入以下命令授权
grant replication slave,replication client on *.* to slave@'从服务器ip地址' identified by "数据库密码";
刷新MySQL系统权限
flush privileges;
查看主(master)数据库状态
#命令
show master status;
#状态
+------------------+----------+--------------+--------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000001 | 926 | jieyi | mysql,information_schema | |
+------------------+----------+--------------+--------------------------+-------------------+
2.6.编写从(slave)服务器my.cnf文件
skip-name-resolve
#id值需要保证唯一
server-id=2
log-bin=mysql-bin
replicate-do-db=jieyi
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
创建并开启从(slave)服务器MySQL容器
docker run -p 5577:3306 --name slave-mysql-01 -v /usr/local/mysql-conf/:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
2.7.在从(slave)服务器上创建用户并授权
#创建用户
create user 'slave'@'%' identified by '数据库密码';
#授权
grant replication slave, replication client on *.* to 'slave'@'%';
#刷新权限
flush privileges;
#停止用户
stop slave;
2.8.在从(slave)服务器绑定主(master)服务器
change master to master_host='主服务器ip地址', master_user='用户', master_password='密码',master_port=端口, master_log_file='mysql-bin.000001', master_log_pos=926, master_connect_retry=30;
2.9.测试主从是否连接成功
#开启刚才停用的用户
start slave;
进入从服务器MySQL容器中,登录MySQL数据库查看连接状态
#进入容器
docker exec -it 容器id /bin/bash
#登录数据库
mysql -uroot -p
#查看连接状态
show slave status \G;
#状态
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.171.101
Master_User: slave
Master_Port: 5566
Connect_Retry: 30
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 926
Relay_Log_File: fc44c250f92e-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
#两者皆为yes,证明连接成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: jieyi
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 926
Relay_Log_Space: 534
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
3.问题分析
3.1.主节点或者从节点重启,是否需要重新执行change master to和start slave命令?
从节点重启会自动执行change master to和start slave,所以不需要重新执行。
主节点每一次重启就会生成一个新的binlog文件,并且使用这个新的binlog文件。
那么是不是从节点要重新执行change master to来定位到主节点这个新的binlog文件呢?也不用,主节点重启时,主从节点的连接断开,查看show slave status;
Slave_IO_Running: Connecting
表示从节点正在连接主节点,当主节点重启完成,从节点会重新指向主节点的新的binlog文件和其Position。