介绍二进制日志及其对复制的影响、GTID的复制等等
复制问题解决了什么问题:
MySQL中有很多类型的日志
可以参考:http://www.php.cn/mysql-tutorials-362068.html
MySQL服务层日志
MySQL存储引擎层日志
其中MySQL中的二进制日志与存储引擎无关,记录了所有对MySQL数据库的修改事件,包括增删改查时间和对表结构的修改事件。可以通过binlog命令工作对日志进行查看。
binlog_format=STATEMENT
操作示例
>mysql -uroot -proot
mysql> show variables like 'binlog_format'; #查看二进制日志格式,下边显示使用row
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set session binlog_format=statement; #设置成statement格式
mysql> show variables like 'log_bin'; #查询二进制日志是否开启,显示关闭
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
开启二进制日志
打开mysql的配置文件添加log_bin配置
[mysqld]
log_bin = mysql_bin#位置自定义,如/var/lib/mysql/sql_log/mysql_bin
刷新bin_logs;
mysql>flush logs;
mysql>flush binary logs;
+---------------------+-------------+
| Log_name | File_size |
+---------------------+-------------+
| mysql-bin.000001 | 201 |
+---------------------+-------------+
| mysql-bin.000002 | 154 |
+---------------------+-------------+
#各种数据库操作,statement日志会记录自行的SQL
>create xx
>select xxx
>update xx
>delete xx
查看二进制日志
$ cd /var/lib/mysql/sql_log/
$ ls
mysql-bin.000001 mysql-bin.000002 mysql-bin.index mysql-error.log
$ mysqlbinlog -vv mysql-bin.000002 #查看日志内容,可以清楚的看到执行的SQL语句
binlog_format=ROW
ROW格式可以避免MySQL复制中出现的主从不一致问题,MySQL5.7默认采用的日志格式
基于行的日志会分别记录每一行的数据修改
优点
缺点
binlog_row_image=[FULL|MINIMAL|NOBLOB]
FULL 记录所有的列的变化
MINIMAL 只会记录修改的列的变化
NOBLOB 不记录BLOB类型的变化
mysql> set session binlog_format=row; #设置成row格式
mysql> flush logs;
mysql> show variables like 'binlog_row_image';
+-----------------+--------+
| Variable_name | Value |
+-----------------+--------+
| binlog_row_image| FULL |
+---------------+----------+
#各种数据操作
mysql> create xxx
mysql> update xxx
mysql> insert
mysql> delete
查看二进制日志
$ cd /var/lib/mysql/sql_log/
$ ls
mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.index mysql-error.log
$ mysqlbinlog -vv mysql-bin.000003 #查看日志内容,可以清楚的看到数据的变化,需要加 -vv 查看
binlog_format = MIXED
特点
如何选择二进制日志的格式,建议:
binlog_format=mixed
或
binlog_format=row
binlog_row_image=minimal
根据二进制的数据格式,复制可以分为
基于SQL语句的复制(SBR)
二进制日志格式使用statement格式
优点
缺点
基于行的复制(RBR)
二进制日志格式使用的是基于行的日志格式
优点
缺点
混合模式
根据实际内容在以上两者间切换
如果主从服务器上的MySQL都是最新安装的,为了实现主从复制需要进行如下步骤
mysql>create user 'repl'@'IP段' identified by 'PassWord';
mysql>grant replication slave on *.* to 'repl'@'IP段';
binlog_format二进制格式要设置,前面内容讲解到
my.cnf文件配置
[mysqld]
#启用二进制日志(可自定义存放位置,需要先创建并赋予权限)
log_bin = /var/lib/mysql/sql_log/mysql_bin
# mkdir /var/lib/mysql/sql_log
# chown -R mysql:mysql /var/lib/mysql/sql_log/
#指定主服务器的服务ID,整个服务集群中式唯一的(自定义,集群中不重复即可)
server_id = 100
#启用二进制日志(可自定义存放位置,需要先创建并赋予权限)
log_bin = /var/lib/mysql/sql_log/mysql_bin
# mkdir /var/lib/mysql/sql_log
# chown -R mysql:mysql /var/lib/mysql/sql_log/
#指定从服务器的服务ID,整个服务集群中式唯一的(自定义,集群中不重复即可)
server_id = 101
#启用中继日志(可自定义存放位置)
relay_log = /var/lib/mysql/sql_log/mysql_relay_bin
#可选,建议从服务器只读
read_only = on
#可选(如果需要将从服务器作为其他服务器的主服务器时必须设置,否则不设置)
log_slave_updates = on
如果是新服务器 或 数据都是一致的跳过此步骤
两种导出方式
mysqldump --master-data -single-transaction#会对表造成大量阻塞
xtrabackup --slave-info#对全部都是innodb的表最好的选择,不会阻塞
mysql> SHOW MASTER STATUS \G;
*************************** 1. row ***************************
File: mysql_bin.000007
Position: 5856
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
mysql>CHANGE MASTER TO
->MASTER_HOST='master_host_ip',#主DB服务器IP
->MASTER_USER='repl',#主DB复制用户
->MASTER_PASSWORD='PassWord',#主DB复制用户密码
->MASTER_LOG_FILE='mysql_bin.000007',#在主DB查看日志文件
->MASTER_LOG_POS=5856;#在主DB查看节点
mysql>show slave status \G;#查看复制链路是否启动
mysql>start slave;#启动复制链路
mysql>show processlist; #可以看到从服务器上建立的进程
检查以下两个参数是否为Yes
mysql>show slave status \G;
*************************** 1. row ***************************
Slave_IO_Running: Yes #YES表示成功
Slave_SQL_Running: Yes #YES表示成功
Last_IO_Errno: 0 #IO错误代码
Last_IO_Error: #IO错误提示
Last_SQL_Errno: 0 #SQL错误代码
Last_SQL_Error: #SQL错误提示
可以看到Command:Binlog Dump
mysql> SHOW PROCESSLIST \G;
*************************** 2. row ***************************
Id: 143
User: repl
Host: 192.168.10.1:55402
db: NULL
Command: Binlog Dump
Time: 9527
State: Master has sent all binlog to slave; waiting for more updates
Info: NULL
*************************** 3. row ***************************
基于日志点的复制的
优点
缺点
MySQL5.6 时支持的模式
基于GTID的复制与基于日志的的复制有很大的区别
什么是GTID即全局事务ID,其保证为每一个在主上提交的事务在复制集群中可以生成一个唯一的ID
GTID=source_id:transaction_id
使用了GTID后不可使用如下操作
create table …select
在事务中使用create temporary table 建立临时表使用关联更新事务表和事非事务表
操作步骤
mysql>create user 'repl' @ 'IP段' identified by 'PassWord';
mysql>grant replication slave on *.* to 'repl' @ 'IP段';
log_bin = /usr/local/mysql/log/mysql-bin
server_id = 100
gtid_mode = on #启动gtid
enforce-gtid-consiste #强制gtid一致性,保证事务安全
log-slave-updates = on # mysql5.7可以不用这个参数
server_id = 101
relay_log = /usr/local/mysql/log/relay_log
gtid_mode = on
enforce-gtid-consistency
log-slave-updates = on # mysql5.7可以不用这个参数
read_only = on #建议
master_info_repository = TABLE #建议
realy_log_info_repository = TABLE #建议
mysqldump --single-transaction --master-data --triggers --routines --all-database -uroot -p >> all2.sql;
#会对表进行加锁
xtrabackup --slave-info
#scp all2.sql [email protected]:/root #拷贝备份文件到从库
# mysql -uroot -p < all2.sql #初始化从服务器,导入后主从数据库初始化是一致的。
mysql>CHANGE MASTER TO MASTER_HOST = 'master_host_ip'
MASTER_USER = 'repl'
MASTER_PASSWORD = 'PassWord'
MASTER_AUTO_POSITION = 1;
基于GTID复制的优缺点
优点
缺点
选择复制模式要考虑的问题
下边来了解一下MySQL常见的拓扑结构
用途
有一台主服务器对外提供服务,一台服务器处于只读状态,并且只作为热备使用。
在对外提供服务的主库出现故障或者是计划性的维护时才会进行切换,使原来的备库成为主库,而原来的主库会成为新的备库,并处理只读或者是下线状态,维护完成后重新上线。
主备模式下的主-主复制的配置注意事项
主主模式的主主复制模式
两个主同时对外提供服务,并不能分担写负载
主主模式下的主主复制缺点:
如果一定要使用主主复制模式,应该注意一下事项:
auto_increment_increment = 2
auto_increment_offset = 1 | 2
影响主从延迟的原因
MySQL5.7上使用多线程复制
mysql>stop slave
mysql>set global slave_parallel_type = 'logical_clock'; #使用逻辑时钟的方式复制
mysql>set global slave_parallel_workers=4; #设置多线程复制的数量
mysql>start slave;#启动复制
mysql>show processlist; #查看进程的数量
mysql>show variables like 'slave_parallel_type'; #查看并发类型配置
mysql>show variables like 'slave_parallel_workers'; #查看并发线程数量
由于数据损坏或丢失所引起的主从复制错误
MySQL复制无法解决的问题
参考文章
https://github.com/caojx-git/learn/blob/master/notes/mysql/打造扛得住的MySQL.md