传统的mysql主从复制的实现方法及原理
1、mysql主从复制原理
1)master更新数据时,会先将信息写入master服务器的二进制日志,然后根据二进制日志写入真实数据到数据库&表中。
2)然后通过dump thread线程通知slave服务器同步数据。
3)slave收到消息后,触发已经启动的IO线程及sql线程,IO线程通过连接master线程,读取master-info文件获取位置点(pos),master服务器通过dump thread线程将位置点后的内容传给slave的IO线程。IO线程收到数据后,将数据写入到本地的relay-log中。
4)之后sql线程开始工作,先读取relay-log.info,获知上次在relay-log文件中执行的位置,然后在该位置继续向后执行。通过这种方式及可保持主从服务器上的数据完全一致。
2、本实例主从复制实现环境
1)配置环境
master(192.168.1.124):Linux-centos7、mysql5.7
slave(192.168.1.125):Linux-centos7、mysql5.7
2)两台服务器环境一致,非克隆关系
3)桥接网络
4)关闭防火墙及核心防护:
service firewalld stop
systemctl disable firewalld
setenforce 0
sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
3、实现步骤:
1、配置主从服务器my.cof
master服务器:
vi /etc/my.cof
[mysqld]
character_set_server = utf8
log-bin
server-id = 1
slave服务器:
vi /etc/my.cof
[mysqld]
server-id = 2
改完后刷新服务:
service mysqld restart
2、注册从库授权用户
在master上执行:
grant replication slave on *.* to 'pengyuyao'@'%' identified by 'Sanchuang123#';
更新日志
flush logs;
3、全备master数据库
注意:此处的密码为你自定义的数据库密码
1)将master数据库全部导出到all_db.sql
mysqldump -uroot -p'Sanchuang123#' --all-databases > /root/all_db.sql
2)将sql文件传给slave:
scp /root/all_db.sql root@192.168.1.125:/root
3)salve将sql文件导入slave数据库:
mysql -uroot -p'Sanchuang123#' <all_db.sql
4、slave配置从库、等级主库及授权用户
1)master上查看正在使用的二进制日志:
show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| localhost-bin.000002 | 154 | | | |
+----------------------+----------+--------------+------------------+-------------------+
由此获知二进制日志文件名称及pos位置
2)slave配置主库信息:
在这里插入代码片
CHANGE MASTER TO MASTER_HOST='192.168.1.124',
MASTER_USER='pengyuyao',
MASTER_PASSWORD='Sanchuang123#',
MASTER_PORT=3306,
MASTER_LOG_FILE='localhost-bin.000002',
MASTER_LOG_POS=154;
以上设置的信息为:
master的IP地址
授权用户
用户密码
master数据库的监听端口
二进制文件名
pos
5、slave开启IO线程及sql线程
start slave;
查看slave有没有打开:
show slave status \G;
检查IO线程和sql线程是否开启:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
检查slave有没有master.info文件(rpm\yum安装默认/var/lib/mysql):
cat /var/lib/mysql/master.info
到这里没有问题可以确定主从复制已经成功实现了!
7、验证
1)master创建测试文件:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> create database pyy;
2)slave查看是否有该文件:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| pyy |
| sys |
+--------------------+
5 rows in set (0.00 sec)
成功!