实现的原理
MySQL实现的机制
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
具体实现
环境说明
MySQL5.7(无数据) + CentOS7
(两组)
实现
1.主库配置
#查看数据库状态
systemctl status mysqld
#停服务器
systemctl stop mysqld
#修改配置文件
vi /etc/my.cnf
#修改内容
[mysqld]
server-id=1
log-bin=mysql-bin
#解释:server-id服务的唯一标识(主从之间都必须不同);log-bin启动二进制日志名称为mysql-bin
#重启
systemctl start mysqld
#登录
mysql -uroot -p
2.在主库中新添加一个从库的账号
#添加一个名称为repl,账号密码为repl123456,允许登录的从库ip为192.168.1.132的账号(%为任意ip)
mysql> CREATE USER 'repl'@'192.168.1.132' IDENTIFIED BY 'repl123456';
#题外话:如果提示密码太简单不复合策略加在前面加这句
mysql> set global validate_password_policy=0;
#给从库账号授权
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.132';
#说明给repl一个从库复制的权限在这个192.168.1.132ip上
#查看主库的状态
mysql> SHOW MASTER STATUS
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 619 | | | |
+------------------+----------+--------------+------------------+-------------------+
#记住:File是二进制日志文件名,Position 是日志开始的位置。后面从库会用到 后面从库会用到 后面从库会用到
3.从库配置
#查看数据库状态
systemctl status mysqld
#停服务器
systemctl stop mysqld
#修改配置文件
vi /etc/my.cnf
#修改的内容
[mysqld]
server-id=2
#重启
systemctl start mysqld
#登录
mysql -uroot -p
#使用主库授权的账号
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.131',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='repl123456',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=619;
#说明:
#192.168.1.131:主库主机ip
#repl:主库授权的账号
#repl123456:主库授权账号密码
#mysql-bin.000001:主库日志文件名
#619:主库日志文件位置
#重启
systemctl reatart mysqld
4.测试
在主库添加数据库,表,数据
检测从库是不是有同样操作。
主从相关命令
#查看主库状态
Show master status
#查看从库状态
Show slave status
#启动从库
stop slave;
关于从库停机无法同步
问题描述
从库停机修改配置,从起数据库之后,出现无法同步主库内容
#主库状态
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 619 | | | |
+------------------+----------+--------------+------------------+-------------------+
#从库状态
mysql> show slave status\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: No
...
#正常情况下Slave_SQL_Running是Yes才对
解决方案
#停止主从
mysql> stop slave;
#设置
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> START SLAVE;
#重新启动主从,从库断开期间那部分丢失的数据会自动同步过来的