作者:mySi2502876237 | 来源:互联网 | 2023-10-15 16:05
定义
- binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE即使update没有导致数据变化也会被记录、DELETE…)的二进制日志。
- binlog不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,但你可以通过查询通用日志来查看MySQL执行过的所有语句。
- 以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
作用
-
复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves并回放来达到master-slave数据一致的目的
-
数据恢复:通过mysqlbinlog工具恢复数据
-
增量备份(包括差异增量、累积增量,主要利用flush logs配合mysqlbinlog来对binlog中的二进制数据进行分析,将对应数据库的增量数据到出来)
利用mysqlbinlog解析binlog来进行增量恢复时需要注意
- 不要使用 base64-output=decode-rows 参数
–base64-output=decode-rows主要是解析 ROW 级别 binlog 日志时使用。
我们解析日志的时候都会使用:
这是我们解析 binlog 日志时使用的命令,我们可以很直观的分析 binlog 日志。
但是我们想要恢复到数据库中的时候,不能使用–base64-output=decode-rows 参数,否则是无法恢复到数据库的。
- 是否使用–skip-gtids=true参数
–skip-gtids=xxx的作用为:mysqldump
是否使用–skip-gtids=true 参数,要根据情况来定;
第一种情况:
如果我们是要恢复数据到源数据库或者和源数据库有相同 GTID 信息的实例,那么就要使用该参数。如果不带该参数的话,是无法恢复成功的。因为包含的 GTID 已经在源数据库执行过了,根据 GTID 特性,一个 GTID 信息在一个数据库只能执行一次,所以不会恢复成功。
或者
mysql -uroot -p < backup.sql
第二种情况&#xff1a;
如果是恢复到其他实例的数据库并且不包含源实例的 GTID 信息&#xff0c;那么可以不使用该参数&#xff0c;使用或者不使用都可以恢复成功。
binlog的三种模式
-
Row level
日志中会记录每一行数据被修改的情况&#xff0c;然后在slave端对相同的数据进行修改。
优点&#xff1a;能清楚的记录每一行数据修改的细节
缺点&#xff1a;数据量太大
-
Statement level&#xff08;默认&#xff09;
每一条被修改数据的sql都会记录到master的bin-log中&#xff0c;slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql再次执行
优点&#xff1a;解决了 Row level下的缺点&#xff0c;不需要记录每一行的数据变化&#xff0c;减少bin-log日志量&#xff0c;节约磁盘IO&#xff0c;提高新能
缺点&#xff1a;容易出现主从复制不一致
-
Mixed&#xff08;混合模式&#xff09;
结合了Row level和Statement level的优点
如何开启binlog
vim /etc/my.cnf(这个路径根据自己的安装查找吧)
[mysqld]
server_id&#61;1
log_bin &#61; mysql-bin
binlog_format &#61; ROW
expire_logs_days &#61; 5
max_binlog_size &#61; 100M
或者
log_bin&#61;ON
server_id&#61;1
log_bin_basename&#61;/var/lib/mysql/mysql-bin
log_bin_index&#61;/var/lib/mysql/mysql-bin.index
重启服务后即开启了binlog功能
binlog相关的命令
select &#64;&#64;log_bin
select &#64;&#64;log_bin_basename
select &#64;&#64;log_bin_index
reset master;
show master logs;
show master status;
flush logs;
sql_log_bin临时关闭binlog开关
sql_log_bin用来临时关闭binlog&#xff0c;仅仅对当前会话生效&#xff0c;如果在当前会话设置了这个参数&#xff0c;那么该会话中的增删改都不会记录到binlog日志中。
- 所以在主从复制最好不要轻易使用该参数。
- 如果对数据库利用binlog做了增量备份&#xff0c;也最好别轻易使用该参数&#xff0c;如果使用了会导致增量备份的数据不完整。
- 当然了&#xff0c;我们在对数据库进行恢复时&#xff0c;可以在相应的恢复会话中设置该参数&#xff0c;让恢复过程不走binlog&#xff0c;从而加快恢复速度。
set sql_log_bin&#61;0;
select &#64;&#64;session.sql_log_bin;
binlog日志解析工具mysqlbinlog
- 不加任何参数
mysqlbinlog xxxxxxx001 xxxxxxx002
2. 过滤指定数据库的binlog日志
mysqlbinlog -d test xxxxxx01 >test.sql
3.禁止恢复过程产生日志
mysqlbinlog mysqlbinlog -d test -D xxxxxx01 >test.sql
4.如果只想查看常规的SQL语句&#xff0c;而不需要其他内容&#xff0c;那么可以使用 -s 选项&#xff0c;如下所示。
也可以使用 --short-form 选项&#xff0c;效果相同。
5. 从远程服务器获取二进制日志