Mysql5.7在CentOS7上实现主从复制

实现的原理

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; 
#重新启动主从,从库断开期间那部分丢失的数据会自动同步过来的

参考文章

猜你喜欢

转载自blog.csdn.net/csdn2193714269/article/details/78601101