实践本文的前提是已经准备好了两个mysql数据库(安装于物理机或docker image)分别作为master和slave的数据库。
1. 连接master的数据库,创建用于主从复制的user,即创建拥有slave权限的user.
create user 'slaveusr'@'%' identified by 'password_123'; grant replication slave on *.* to 'slaveusr'@'%';
执行show grants for 'slaveusr'@'%'; 可查看成功创建的slave权限的用户
2. 修改master数据库的my.cnf文件(如果mysql是docker镜像,可参考*标识中内容)
# 在宿主机上修改mysqld.cnf,修改如下 [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql server-id = 100 log-bin = mysql-bin # server-id 是唯一的服务器id,非0整数即可,但不能重复 # log-bin 使用binary logging, mysql-bin是log的文件名称前缀
*如果mysql是docker的镜像,则可将镜像里的my.cnf文件拷贝到物理机,修改后再拷贝回到docker镜像里,命令如下:
# 从镜像拷贝到本机 docker cp mysql-test:/etc/mysql/my.cnf D:\ #从本机拷贝到镜像 docker cp D:\my.cnf mysql-test:/etc/mysql/my.cnf # 注解: # cp copy命令 # mysql-test docker镜像的名字 # /etc/mysql/my.cnf docker镜像里my.cnf的路径 # D:\ 拷贝到本机的路径
不同的mysql镜像可能my.cnf的路径不一样,修改前最好也先确认下docker image里my.cnf的路径,确保无误。如何查到my.cnf的路径,可参考两种方法:
①对于安装了图形界面的docker的用户,可在图形界面上找到对应的docker image,点击命令图标,即可打开image的命令窗口,然后使用ls的命令查看
②Windows打开本机的cmd(Linux直接在命令界面)执行如下命令
#列出docker容器,查找出对应的container id docker container ls -a #进入到对应image的命令界面,806c175229ce为对应的container id exec -it 806c175229ce /bin/bash #执行ls命令查看文件目录结构 ls /etc/mysql/
3.修改slave数据库的my.cnf文件(如果mysql是docker镜像,可参考上文*标识中内容)
# 在宿主机上修改mysqld.cnf,修改如下 [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql server-id = 101 log-bin = mysql-bin # 与mysql-master相比,server-id发生了变化 # 不能和其他master,slave的server-id相同
4.重启容器(对于mysql为docker image)或mysql服务(对于mysql安装于物理机)
docker restart mysql-master #重启master数据库 docker restart mysql-slave #重启slave数据库
5.连接master数据库,执行命令查看Master_log_file和Master_log_pos,记录下来后面用
show master status;
6.连接slave数据库,执行如下命令连接master
CHANGE MASTER TO MASTER_HOST='192.168.1.239', --master 数据库服务器或image宿主物理机的ip MASTER_PORT=3307, --mysql-master映射到宿主机的端口 MASTER_USER='slaveusr', MASTER_PASSWORD='password_123', master_log_file='mysql-bin.000001', --上步中查到的值 master_log_pos=1983; --上步中查到的值 START SLAVE;
*注意:Master_Host的值一般不会是localhost或127.0.0.1,如果是用的docker image就更不可能是localhost或127.0.0.1,而是宿主物理机的ip,因为slave的image去找master 的image,使用localhost只能找到当前slave的image.
7. 上步执行成功后,依然在slave数据库中执行show slave status, 查看是否配置成功
首先Slave_IO_Runing、Slave_SQL_Runing 都要是Yes。
其次要看error_log,如果是空,没有error,则说明成功,一旦出现error,需要执行STOP SLAVE IO_THREAD FOR CHANNEL ''停止slave,并重新执行Change Master,重新配置。
8. 验证
在mster数据库中创建一个库, 切换到slave数据库中,可以查看到同样名字的库在slave中被创建了。在master中创建表并插入数据,切换到slave中都可以查看到同步过来的数据。
说明:
① 'slaveusr'为示例的slave用户名,可自定义
② 'password_123'为示例的slave用户密码,可自定义
③ 'mysql-master'为示例的 master docker image的名字,应为用户创建的master docker image的名字
④ 'mysql-slave'为示例的 slave docker image的名字,应为用户创建的slave docker image的名字
⑤ 执行mysql命令可使用Mysql Client连接执行,或直接使用命令执行,本文使用Mysql客户端执行
参考:
快速搭建 MySQL 的主从数据库 - 知乎 (zhihu.com)
mysql主从复制(超简单)_系统网络运维的技术博客_51CTO博客_mysql主从复制步骤
(11条消息) mysql配置主从数据库(超简单)_123liudong-CSDN博客_mysql配置主从数据库