基于二进制日志的主从复制
一、基于二进制日志主从复制概述
在这种方法中,作为主服务器(数据库更改的源)操作的MySQL实例将更新和更改作为“事件”写入二进制日志。二进制日志中的信息根据记录的数据库更改以不同的日志格式存储。从服务器被配置为从主服务器读取二进制日志,并在从服务器的本地数据库上执行二进制日志中的事件。
每个从机接收二进制日志的全部内容的副本。从机负责决定二进制日志中的哪些语句应该执行。除非另有说明,否则主二进制日志中的所有事件都在从系统上执行。如果需要,您可以将从机配置为仅处理应用于特定数据库或表的事件。
每个从机都保存一个二进制日志坐标的记录:从主机读取和处理的文件中的文件名和位置。这意味着可以将多个从机连接到主机并执行同一二进制日志的不同部分。由于从机控制此进程,因此可以在不影响主机操作的情况下连接和断开各个从机与服务器的连接。另外,由于每个从机记录二进制日志中的当前位置,因此可以断开从机连接,重新连接,然后恢复处理。
主设备和每个从设备必须配置一个唯一的ID(使用server U ID系统变量)。此外,每个从机必须配置有关主主机名、日志文件名和该文件中位置的信息。这些细节可以在MySQL会话中使用从机上的CHANGE MASTER TO语句进行控制。详细信息存储在从机的主信息存储库中,可以是文件或表。
二、mysql安全初始化
主从机器上的操作一样
1.查看初始密码
2.更改初始密码
3.登陆验证新密码
三、主从的配置
环境信息
mysql主机:172.25.7.5
mysql从机:172.25.7.6
1.主机的配置
(1)启用二进制日志记录,并建立唯一的服务器ID
vim /etc/my.conf #启用二进制日志记录
systemctl restart mysqld #重启服务
(2)创建用户
CREATE USER 'repl'@'172.25.7.%' IDENTIFIED BY 'Sll123+456'; #创建用户repl,密码是Sll123+456,供172.25.7这个网段的机器使用
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.25.7.%'; #授权 *.*代表所有库的所有表
SHOW MASTER STATUS; #查看状态
2.从机的配置
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.25.7.5',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='Sll123+456',
-> MASTER_LOG_FILE='mysql-bin.000002', #看主机状态时候的两个参数
-> MASTER_LOG_POS=1169;
START SLAVE; #开启从机模式
3.测试
主机建立一个数据库,从机上看是否能看到
从机上测试
基于gpid的主从复制
一、什么是基于GPID的主从复制
当使用gtid时,每个事务都可以在原始服务器上提交并由任何从服务器应用时进行标识和跟踪;这意味着当启动新的从服务器或故障转移到新的主服务器时,使用gtid引用这些文件中的日志文件或位置是不必要的,这大大简化了这些任务。因为基于GTID的复制完全基于事务,所以很容易确定主服务器和从服务器是否一致;只要主服务器上提交的所有事务也提交到从服务器上,就可以保证两者之间的一致性。
通俗的来讲,不管在主机还是从机,同一个事务在日志文件里的gtid号是一样的。它主要解决普通主从复制的延时问题,单线程太慢,多线程可能导致数据不一致。
二、配置
主机:
vim /etc.myconf
gtid_mode=ON
enforce-gtid-consistency=ON
systemctl restart mysqld
从机:
vim /etc.myconf
gtid_mode=ON
enforce-gtid-consistency=ON
systemctl restart mysqld
下面进入数据库开始配置
mysql -uroot -p #密码Sll123+456
STOP SLAVE; #先关闭从机复制,因为上一个实验的时候打开了
mysql> CHANGE MASTER TO
-> MASTER_HOST = '172.25.7.5',
-> MASTER_USER = 'repl',
-> MASTER_PASSWORD = 'Sll123+456',
-> MASTER_AUTO_POSITION=1;
START SLAVE; #再次打开
SHOW slave status\G; #Slave_IO_Running和Slave_SQL_Running都得是yes才行
测试:
主机创建表格并写入数据
从机上查看:
再次查看状态和数据表的信息:
show slave status\G;
use mysql;
select * from gtid_executed;