一、MySQL主从复制原理:
1、MySQL将数据变化记录到二进制日志中;
2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中;
3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库
详细步骤:
1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user 、
password、port、ip),并且让从库知道,二进制日志的起点位置(file名 position 号); start
slave
2、从库的IO线程和主库的dump线程建立连接。
3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。
4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。
5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到
master.info中
6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的
relay 会自动被清理purge
二、MySQL主从复制实验
1、环境准备
两台机器一主一从
2、主库配置
#保证主从两机时间统一,安装ntpdate:yum install ntpdate -y
#启动ntpdate服务:[root@localhost ~]# systemctl start ntpdate
#统一时间(主从两机使用ntpdate命令):
[root@localhost ~]# ntpdate ntp1.aliyun.com
2 Aug 11:58:01 ntpdate[6306]: adjust time server 120.25.115.20 offset -0.039909 sec
#主库在/etc/my.cnf设置server-id值并开启binlog参数
[root@localhost ~]# vim /etc/my.cnf
#增加如下两条命令,如下图一
log_bin = mysql-bin
server_id = 11
#主从数据库文件保持一致:在主库创建三个新的数据库db,db1,db2 退出并重新启动mysqld服务,然后通过mysqldump进行备份
[root@localhost ~]#systemctl restart mysqld
[root@localhost ~]# mysqldump -uroot -p123 -B db db1 db2 > db.sql
#通过scp将db.sql传输给从库
[root@localhost ~]# scp db.sql 192.168.10.147:/opt/
#从库:查看传输的sql文件
[root@localhost ~]# cd /opt
[root@localhost opt]# ls
db.sql
#从库登录到mysql执行如下命令
mysql> source /opt/db.sql
mysql> show databases;
#主库创建同步账号:
mysql> grant replication slave on *.* to 'rep'@'192.168.10.%' identified by
'123';
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000008 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#此时回到从库设置设置server-id值和binlog参数如图一(与主库一样操作)
[root@localhost opt]# vim /etc/my.cnf
log_bin=mysql-bin
server-id=13
[root@localhost opt]# systemctl restart mysqld
#登录mysql
mysql> change master to
MASTER_HOST='192.168.10.145',
MASTER_PORT=3306,#默认端口号,可不写
MASTER_USER='rep',
MASTER_PASSWORD='123',
#参照show master status返回的结果填写相应的值
MASTER_LOG_FILE='mysql-bin.000008',
MASTER_LOG_POS=154;
mysql> start slave;
mysql> show slave status \G#结果如图二查看slave_IO_Running和slave_SQL_Running的状态是否都为yes。若都为yes,则配置成功;反之,则需查看mysql日志文件/var/log/mysqld.log
图一:
图二:
三、检验
主库当前的数据库数量:
从库:
#在主库创建新的数据库:
mysql> create database if not exists db4;
Query OK, 1 row affected (0.00 sec)
#查看主库当前数据库状态:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| -S |
| db |
| db1 |
| db2 |
| db3 |
| db4 |
| mysql |
| performance_schema |
| sys |
+--------------------+
10 rows in set (0.00 sec)
从库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db |
| db1 |
| db2 |
| db3 |
| db4 |
| mysql |
| performance_schema |
| sys |
+--------------------+
9 rows in set (0.00 sec)
mysql>
四、错误检查
当进行一主两从配置时,有一台从库机器出现与主库机器UUID相同的问题。
解决办法:
在该从库中登录mysql,随机获取一个UUID
mysql> select UUID();
+--------------------------------------+
| UUID() |
+--------------------------------------+
| c06c559d-3132-11ee-80ec-000c29f96d4c |
+--------------------------------------+
1 row in set (0.00 sec)
#查找auto.cnf文件
find / -iname auto.cnf
#在对应路径找到后:
vim auto.cnf
#将文件中的UUID改为之前获取的UUID如下图
#重启mysqld:
systemctl restart mysqld
#登录mysql,执行如下操作并观察是否为双yes
show slave status \G