51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

MySQL 二进制日志(log_bin)介绍

3二进制日志(log_bin)

在进行增量恢复数据时,需要先了解什么是binlog日志,此日志文件其实就是用于记录对数据库进行操作更改的语句信息的;

并且记录更改的语句信息以事件形式进行记录,但是需要注意的是查询相关的语句是不会被记录的,比如:select、show;

然而作为所有对数据库的改操作事件信息都会被记录,比如:insert、update、create、drop。。。

查看数据库binlog日志配置参数:

进入到数据库服务系统环境中,可以使用命令进行查看binlog日志功能是否开启;

# 未开启binlog日志功能时,查看系统binlog功能配置参数状态
mysql> show variables like '%log_bin%';
+-----------------------------------------+-------+
| Variable_name                               | Value |
+-----------------------------------------+-------+
| log_bin                                            | OFF   |
| sql_log_bin                                     | ON    |
+-----------------------------------------+-------+
3 rows in set (0.00 sec)
--- 通过以上输出信息可以看到log_bin为off状态,表示binlog日志功能尚未开启

# 已开启binlog日志功能后,查看系统binlog功能配置参数状态
mysql> show variables like '%log_bin%';
+-----------------------------------------+-------+
| Variable_name                               | Value |
+-----------------------------------------+-------+
| log_bin                                            | ON    |
| sql_log_bin                                     | ON    |
+-----------------------------------------+-------+
3 rows in set (0.00 sec)
--- 通过以上输出信息可以看到log_bin为on状态,表示binlog日志功能已经开启

01 binlog 日志信息基本配置

server_id=6
-- 进行主从操作时,需要进行此信息配置;
log_bin=ON      
-- 默认日志功能处于关闭状态
log_bin_basename=/data/3306/data/binlog        
-- 定义日志文件存储的路径信息,建议日志文件路径与数据存放路径进行分离;

# 配置信息简写方式:开启数据库binlog日志记录功能
[root@xiaoq ~]# vim /etc/my.cnf
-- 激活binlog日志记录功能,需要对数据库服务配置文件进行编辑修改
[mysqld]
server_id=6
log_bin=/data/3306/binlog/mysql-bin
-- 进行binlog日志目录路径信息修改时,需要创建指定的目录并设置权限信息,最后需要重新启动数据库服务生效;
或者
log_bin=binlog
-- 只是设置日志名称信息,日志会自动保存到数据库服务指定的数据目录中;

# 配置文件修改后需要重启数据库服务,加载配置文件改动的信息:
[root@xiaoQ ~]# /etc/init.d/mysqld restart 
[root@xiaoQ xiaoQ]# ll -h /data/3306/data/binlog*
-rw-rw----. 1 mysql mysql 245 6月  24 02:19 /data/3306/data/binlog.00000N
-rw-rw----. 1 mysql mysql   16 6月  24 02:19 /data/3306/data/binlog.index
-- 数据库服务重启后,已经可以在数据库的数据存储目录中,看到binlog日志文件的踪影

说明:企业真实环境,日志处于默认激活记录状态,可以使用日志信息进行灾难数据恢复,以及可以用于实现主从复制;

02 binlog 日志配置信息扩展

# 参数一:sync_binlog 表示刷新日志到磁盘策略
mysql> select @@sync_binlog;
+---------------------+
| @@sync_binlog |
+---------------------+
|                          1 |
+---------------------+
1 row in set (0.00 sec)
-- 在进行主从同步过程的双一标准的其中一个1的信息配置,主要是控制缓冲区里的binlog日志信息如何刷写到磁盘中;
-- 此参数信息是有三种方式进行配置的:
-- 参数信息配置0:表示由操作系统缓存自己决定,什么时候刷新日志到磁盘中;
-- 参数信息配置1:表示每次事务提交,立即刷新日志到磁盘中;(此方式配置更安全)
-- 参数信息配置N:表示每组事务提交,按照组的事务次数定义,确定刷新日志到磁盘中的频次;(可以有效减少IO性能损耗)
-- 参数官方资料链接:https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html

# 参数二:binlog_format 定义binlog日志的格式信息
mysql> select @@binlog_format;
+------------------------+
| @@binlog_format  |
+------------------------+
| ROW                         |
+------------------------+
1 row in set (0.00 sec)
-- 在进行主从同步数据恢复时,此参数配置可能会影响数据恢复的一致性问题;
-- 此参数信息是有三种方式进行配置的,确定了主从复制的级别,只针对DML语句的日志才有效;
-- 参数信息配置 statement(SBR):语句格式记录binlog;
create database xiaoQ;  -- DDL DCL语句只能使用statement 表示的就是原原本本的语句信息,即做什么就记录什么;
-- 参数信息配置 row(RBR):行格式记录binlog(默认模式)
update t1 set a=10 where id<10;    -- 会记录行的变化信息,属于底层的记录信息,可能会有多个变化日志信息记录
-- 参数信息配置 mixed(MBR):混合格式记录binlog
    -- 由数据库服务自行决定,是记录语句信息,还是记录行的变化信息;

03 日志信息查看方法:

可以通过查看方式,获取binlog日志里的数据信息,一般在数据库启动时,日志记录功能就开启了;

可以利用日志中记录信息,将数据库服务的数据信息恢复到指定的时间点,同时也可以支持主从数据复制(在其它机器上回放日志);

对于binlog日志信息的查看,主要目的是为了日后日志事件信息的截取操作;

查看方式一:确认数据库binlog日志数量
mysql> show binary logs;
+------------------+-------------+--------------+
| Log_name        | File_size  | Encrypted |
+------------------+-------------+--------------+
| binlog.000001 |           156 | No               |
+------------------+-------------+--------------+
-- 获取数据库服务运行过程中,使用的binlog日志的情况

mysql> flush logs;
Query OK, 0 rows affected (0.12 sec)
-- 可以执行flush刷新命令,从而生成新的binlog日志文件,类似于实现了日志切割功能;
mysql> show binary logs;
+------------------+-------------+--------------+
| Log_name        | File_size  | Encrypted |
+------------------+-------------+--------------+
| binlog.000001 |            200 | No             |
| binlog.000002 |            156 | No             |
+------------------+-------------+--------------+
2 rows in set (0.00 sec)
查看方式二:确认数据库binlog日志状态
mysql> create database test_binlog;
Query OK, 1 row affected (0.03 sec)
-- 模拟数据服务有修改操作
mysql> select * from world.city limit 1;
Query OK, 1 row affected (0.03 sec)
-- 模拟数据服务有修改操作
mysql> show binary logs;
+------------------+-------------+--------------+
| Log_name        | File_size  | Encrypted |
+------------------+-------------+--------------+
| binlog.000001 |           200 | No              |
| binlog.000002 |           362 | No              |
+------------------+-------------+--------------+
2 rows in set (0.00 sec)
-- 可以看到binlog日志的存储量发生了变化,但是在做查询操作时,binlog日志的存储量并未发生变化

mysql> show master status;
+------------------+------------+------------------+-----------------------+-------------------------+
| File                   | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+------------+------------------+-----------------------+-------------------------+
| binlog.000002 |          362 |                          |                                 |                                  |
+------------------+------------+------------------+-----------------------+-------------------------+
1 row in set (0.00 sec)
-- 查看获取当前使用的binlog日志情况,以及产生的日志量字节大小;

查看方式三:查看数据库binlog日志信息

mysql> show binlog events in 'binlog.000002';
-- binlog日志信息是以事件方式进行记录的,所以日志查看过程是查看事件信息
-- 一般binlog日志的前两行,表示日志格式头信息(日志简单的描述信息)
-- 一般binlog日志中的query信息,就是对数据库的操作语句,其中包含了创建数据库的语句;

具体binlog事件信息:

查看方式四:筛选数据库binlog日志事件

# 模拟生成binlog日志事件信息
mysql> source ~/world.sql;
mysql> drop database world;
mysql> source ~/world.sql;

# 获取删除数据库的事件信息:
# 筛选数据库日志方式一:
[root@xiaoq data]# mysql -e "show binlog events in 'binlog.000002'"|grep "drop database"
binlog.000002	722789	Query	1	722896	drop database world /* xid=5363 */
-- 获取指定事件信息产生的起点位置和终点位置信息;

# 筛选数据库日志方式二:
mysql> pager less
-- 在数据库中定义pager功能,数据库连接会话退出即失效;
mysql> show binlog events in 'binlog.000002';
-- 此时查看日志事件信息具有了翻页功能
/drop database
| binlog.000002 |  722789 | Query          |         1 |      722896 | drop database world /* xid=5363 */
mysql> pager grep "drop database"
PAGER set to 'grep "drop database"'
-- 表示开启数据库pager的过滤功能
mysql> show binlog events in 'binlog.000002';
| binlog.000002 |  722789 | Query          |         1 |      722896 | drop database world /* xid=5363 */ 
-- 再次查看binlog事件信息时,只过滤显示删除数据库的操作事件日志

说明:在实际生产环境中,若binlog日志量比较大时,需要快速过滤关键日志事件行,可以使用以上查看日志方法;

获取数据库binlog日志记录信息异常:

进行数据库服务数据信息更改操作,随后查看binlog日志信息的变化:

# 进行数据库创建操作
mysql> create database xiaoQ;
mysql> show databases;

# 查看获取binlog日志记录信息
[root@xiaoQ ~]# mysqlbinlog /var/lib/mysql/binlog.000001 
mysqlbinlog: unknown variable 'default-character-set=utf8mb4'
-- 由于在数据库在客户端配置文件中添加了default-character-set=utf8mb4字符编码信息,因此造成无法查看binlog
[root@xiaoQ ~]# cat /etc/my.cnf.d/client.cnf 
[client]
#default-character-set=utf8mb4
[client-mariadb]
#default-character-set=utf8mb4
-- 可以临时调整先将客户端的字符编码配置信息注释,
[root@xiaoQ ~]# mysqlbinlog /var/lib/mysql/binlog.000001
... 省略部分信息 ...
# at 494
#220624  2:35:02 server id 1  end_log_pos 579 Query	thread_id=2	exec_time=0	error_code=0
SET TIMESTAMP=1656009302/*!*/;
create database xiaoQ
/*!*/;
... 省略部分信息 ...
-- 在binlog日志文件中,已经记录了之前的创建xiaoQ的更改操作记录信息
赞(6)
未经允许不得转载:工具盒子 » MySQL 二进制日志(log_bin)介绍