MySQL主从复制(同步)
一、主从复制
1.1 主服务器
1.1.1 建立一个用于主从的mysql用户
#单主但从时只要在主建立同步用户即可。
GRANT REPLICATION SLAVE ON *.* to <用户名>@'%' IDENTIFIED BY '<密码>';
#建立用于同步的用户,赋予slave权限
GRANT REPLICATION CLIENT ON *.* to <用户名>@'%' ;
#赋予client权限
flush privileges;
#更新权限设置1.1.2 编辑配置文件/etc/my.cnf内容
[mysqld]
server-id=01
log-bin=mysql-bin
expire_logs_days=30
#自动清理30天前的log文件
replicate_do_db=test
#配置需要同步的库,这个配置与slave统一,可以不写。
#注意1:每个库单数写一行replicate_do_db,否则可能出现bug。
#注意2:避免使用binlog-do-db=test指定需同步库。
replicate_ignore_db=mysql
replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=sys
#配置忽略的库,如果不写,则会默认复制所有的库。
#注意:避免使用binlog-ignore-db=mysql方式忽略库
binlog_format=STATEMENT
#binlog日志格式
#STATEMENT:记录SQL语句,发送到从机运行。
#ROW:记录每一行的改变。
#MIXED:自动选择。1.1.3 配置完成后重启mysql服务
systemctl restart mysqld
#重启mysql服务
登陆mysql并执行:
show variables like '%log_bin%';
# 查看log_bin日志是否启动成功
log-bin为on即可
show master status;
#查看master的状态,file和position在配置slave时会用到。1.2 从服务器
1.2.1编辑配置文件/etc/my.cnf内容
[mysqld]
server-id=10
relay-log=mysql-relay
#启用relaylog
read_only = 1
#将从库设置为只读,一般用户将不能写入从库。(超级用户可写入)
master_info_repository=TABLE
#从服务器开启并行复制,设置为TABLE,性能有1倍的差距。
relay_log_info_repository=TABLE
#可以避免relay.info更新不及时,SLAVE重启后导致的主从复制数据重复插入报错问题。
relay-log-recovery = 1
把当前接收到的relay log清理掉,然后从SQL Thread应用到的位置,重新拉取relay log。1.2.2 配置完成后重启mysql服务
systemctl restart mysqld
#重启mysql服务
登陆mysql服务器:
change master to master_host='<主服务器地址>',master_port=3306,master_user='<用于同步的用户名>',master_password='<密码>',master_log_file='<主库的file值>',master_log_pos=<主库的position值>;
#设置Master服务器的信息
#在Master上运行show master status查看file值和pos值。
start slave;
#启动slave服务
show slave status\G;
#查看slave状态Slave_IO_Running和Slave_SQL_Running都为yes,这表示成功。
1.2.3 停止或重新配置主从
在主服务器上执行:
reset master;
#清除master配置在从服务器上执行
stop slave;
#停止从机复制
RESET SLAVE ALL;
#清除slave配置执行命令后,重启从服务器。
输出内容:

1.3 测试
尝试向主库中创建库或写入数据,从库中会同步。
1.4 排错
Slave_IO_Running和Slave_SQL_Running如果出现no。则可以使用show slave status\G;查看是否存在报错信息。
提示报错:Last_IO_Error:The slave I/O thread stops because a fatal error is encountered when it try to get the value of SERVER_ID variable from master.
#读取master的SERVER_ID失败,原因为slave账号的权限不足造成。
#同步账号需要2个权限:
REPLICATION SLAVE
REPLICATION CLIENT
需要检查账号是否具有此权限。提示报错:Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
#原因是两个MySQL的UUID相同。找到配置文件,修改UUID的值或者删除后重启mysql服务即可。
find / -name "auto.cnf"
#找到auto.cnf文件
#auto.cnf文件内容如下:
[auto]
server-uuid=e4bf8ddc-6174-11ec-bb9b-005056abb266
二、双主双从
2.1 双主配置
[mysqld]
server-id=20
log-bin=mysql-bin
#开启并指定binlog日志
log-slave-updates
#作为从库有写入时也记录binlog日志
auto-increment-increment=2
#自增ID步长
auto-increment-offest=1
#自增ID起始值
replicate_ignore_db=mysql
#忽略的库
#注意:避免使用binlog-ignore-db=mysql方式忽略库
binlog-do-db=test
#需同步的库
binlog_format=STATEMENT
#binlog日志格式(各格式特点见上文)三、主从同步过程(三个线程)
主库线程
binlong dump thread(binlog输出线程):每当有从库连接到主库的时候,主库都会创建一个线程,然后发送binlog给从库。
从库线程
I/O thread (I/O线程):从库创建I/O线程,该线程从主库中请求binlog。从库的I/O线程读取主库的binlog输出线程发送的更新请求并拷贝这些更新到本地。其中包括relay log文件。
SQL thread(SQL线程):从库创建一个SQL线程,这个线程从I/O线程写到relay log的更新事件并执行。
master.info:记录了上一次读取到master同步过来的binlog的位置,以及连接master和启动复制必须的所有信息。
relay log(中继日志):从数据库Slave服务的I/O线程从主数据库Master服务的二进制日志中读取数据库的更改记录并写入到中继日志中,然后在Slave数据库执行修改操作。记录了文件复制的进度,下一个事件从什么位置开始,由SQL线程负责更新。