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的更改操作记录信息