这是一篇mysql5.7主从(master/slave)同步配置实验记录。因为需要多个mysql配合实验,所以我使用了docker来解决这个问题(docker的安装参考使用脚本安装docker)
实验环境:mysql5.7+docker
1、下载mysql5.7的镜像
docker pull mysql:5.7.25
2、启动两个mysql容器,分别当做master和slave,且端口分别为3306和3307
账号:root
密码:123456
docker run --name=mysql-master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.25
docker run --name=mysql-slave -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.25
3、进入master的容器并登录mysql(2a8是容器id)
docker exec -it 2a8 bash
mysql -uroot -p123456
因为主从同步的原理是:主库将每次数据库操作都记录到一个binlog文件中,然后从库连接到主库并读取这个文件依次执行一样的操作。由此达到主从同步的效果。所以我们要先新建一个从库用来登录主库并读取上文提到的文件的账户,并赋予他相应权限。在这里为了实验方便直接使用root账户并直接给root账户赋予所有的权限。
grant all on *.* to 'root'@'%' identified by '123456';
flush privileges;
修改master的配置(有的容器没有vim,可以自行安装一下vim或者用其他文本编辑器,配置文件为/etc/mysql/mysql.cnf),在master的配置中增加以下配置:
[mysqld]
log-bin=mysql-bin
server-id=1
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-do-db=test
server-id每个数据库必须不一样,一样会有错误
binlog-ignore-db表示不需要同步的数据库
binlog-do-do表示需要同步的数据库
注:如果不需要针对特定的数据库进行同步。则不进行binlog-ignore-db和binlog-do-do的配置,默认会对mysql中的所有数据库进行同步。
配置完了重启数据库,因为这里使用的是docker所以直接重启容器即可
docker restart 2a8
重新进入master的mysql命令行并使用以下命令
show master status;
会看到以下数据,这里可以将file和position的值记录下来之后有用
+------------------+----------+--------------+---------------------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+---------------------------------------------+-------------------+
| mysql-bin.000001 | 154 | test | information_schema,mysql,performance_schema | |
+------------------+----------+--------------+---------------------------------------------+-------------------+
1 row in set (0.00 sec)
到这一步master的数据库就配置完毕了
4、配置从库,有些命令跟主库命令基本差不多,这里不多赘述,只记录不同的部分
修改slave数据库的配置
[mysqld]
log-bin=mysql-bin
server-id=2
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
binlog-ignore-db=sys
replicate-do-db=test
replicate-ignore-db=test2
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
注意:binlog-ignore-db和replicate-do-db以及replicate-ignore-db和主库差不多意思。如果需要全库同步的话不进行配置
然后重启数据库,再登录数据库的命令行界面执行
stop slave;
change master to master_host='192.168.5.131',master_user='root',master_password='123456',master_port=3306, master_log_file ='mysql-bin.000001', master_log_pos=154;
start slave;
master_host是主库所在的ip
master_user是上头设置的登录账号,这里使用root
master_password是密码
master_port是主库的端口,不配置此项默认3306。注意这里不能加引号,纯数字。
master_log_file和master_log_pos是上头说需要记住的两个数据。
然后可以使用
show slave status;
查看从库的配置。
5、至此主从同步设置完毕,可以自行测试一下结果。