帮助中心/最新通知

质量为本、客户为根、勇于拼搏、务实创新

< 返回文章列表

【服务器相关】MySQL数据库日志的详细分析

发表时间:2025-06-16 03:46:00 小编:主机乐-Yutio
master和binary是同义词

purge master logs before 'yyyy-mm-dd hh:mi:ss'将会删除指定日期之前的所有日志。但是若指定的时间处在正在使用中的日志文件中,将无法进行purge。


mysql> purge master logs before ‘2017-03-29 07:36:40’;

mysql> show warnings;
+———+——+—————————————————————————+
| Level | Code | Message |
+———+——+—————————————————————————+
| Warning | 1868 | file ./mysql-bin.000003 was not purged because it is the active log file. |
+———+——+—————————————————————————+

3.使用–expire_logs_days=N选项指定过了多少天日志自动过期清空。

5.4 二进制日志的记录格式

在MySQL 5.1之前,MySQL只有一种基于语句statement形式的日志记录格式。即将所有的相关操作记录为SQL语句形式。但是这样的记录方式对某些特殊信息无法同步记录,例如uuid,now()等这样动态变化的值。

从MySQL 5.1开始,MySQL支持statement、row、mixed三种形式的记录方式。row形式是基于行来记录,也就是将相关行的每一列的值都在日志中保存下来,这样的结果会导致日志文件变得非常大,但是保证了动态值的确定性。还有一种mixed形式,表示如何记录日志由MySQL自己来决定。

日志的记录格式由变量binlog_format来指定。其值有:row,statement,mixed。innodb引擎的创始人之一在博客上推荐使用row格式。

下面将记录格式改为row。


mysql> alter table student add birthday datetime defaultnow();
mysql> flush logs;
mysql> set binlog_format=’row’;
mysql> insert into student values(7,’xiaowoniu’,’female’,now());

查看产生的日志。


[root@xuexi data]# mysqlbinlog mysql-bin.000005
…前面固定部分省略…
‘;
# at 120
#1703298:06:24 server id 1end_log_pos 200 CRC32 0x0ac02649Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1490745984;
SET @@session.pseudo_thread_id=1;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1;
SET @@session.sql_mode=1075838976;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8;
SET @@session.time_zone=’SYSTEM’;
SET @@session.lc_time_names=0;
SET @@session.collation_database=DEFAULT;
BEGIN
;
# at 200
#1703298:06:24 server id 1end_log_pos 258 CRC32 0xb8cdfd09Table_map: `test`.`student` mapped to number 94
# at 258
#1703298:06:24 server id 1end_log_pos 314 CRC32 0x8ce6f72cWrite_rows: table id 94 flags: STMT_END_F

BINLOG ‘
gPraWBMBAAAAOgAAAAIBAAAAAF4AAAAAAAEABHRlc3QAB3N0dWRlbnQABAMP/hIFHgD3AQAMCf3N
uA==
gPraWB4BAAAAOAAAADoBAAAAAF4AAAAAAAEAAgAE//AHAAAACXhpYW93b25pdQGZnDqBmCz35ow=
‘;
# at 314
#1703298:06:24 server id 1end_log_pos 345 CRC32 0x7a48c057Xid = 114
COMMIT;
DELIMITER ;
…后面固定部分省略…

发现是一堆看不懂的东西,使用-vv可将这些显示出来。可以看出,结果中记录的非常详细,这也是为什么基于row记录日志会导致日志文件极速变大。


[root@xuexi data]# mysqlbinlog mysql-bin.000005 -vv
…前面省略…
BINLOG ‘
gPraWBMBAAAAOgAAAAIBAAAAAF4AAAAAAAEABHRlc3QAB3N0dWRlbnQABAMP/hIFHgD3AQAMCf3N
uA==
gPraWB4BAAAAOAAAADoBAAAAAF4AAAAAAAEAAgAE//AHAAAACXhpYW93b25pdQGZnDqBmCz35ow=
‘;
### INSERT INTO `test`.`student`
### SET
### @1=7
### @2=’xiaowoniu’
### @3=1
### @4=’2017-03-29 08:06:24′
# at 314
…后面省略…

还有一种mixed模式。这种模式下默认会采用statement的方式记录,只有以下几种情况会采用row的形式来记录日志。

1.表的存储引擎为NDB,这时对表的DML操作都会以row的格式记录。

2.使用了uuid()、user()、current_user()、found_rows()、row_count()等不确定函数。但测试发现对now()函数仍会以statement格式记录,而sysdate()函数会以row格式记录。

3.使用了insert delay语句。

4.使用了临时表。

5.5 二进制日志相关的变量

注意:在配置binlog相关变量的时候,相关变量名总是搞混,因为有的是binlog,有的是log_bin,当他们分开的时候,log在前,当它们一起的时候,bin在前。在配置文件中也同样如此。

  • log_bin = {on | off | base_name} #指定是否启用记录二进制日志或者指定一个日志路径(路径不能加.否则.后的被忽略)
  • sql_log_bin ={ on | off } #指定是否启用记录二进制日志,只有在log_bin开启的时候才有效
  • expire_logs_days = #指定自动删除二进制日志的时间,即日志过期时间
  • binlog_do_db = #明确指定要记录日志的数据库
  • binlog_ignore_db = #指定不记录二进制日志的数据库
  • log_bin_index = #指定mysql-bin.index文件的路径
  • binlog_format = { mixed | row | statement } #指定二进制日志基于什么模式记录
  • binlog_rows_query_log_events = { 1|0 } # MySQL5.6.2添加了该变量,当binlog format为row时,默认不会记录row对应的SQL语句,设置为1或其他true布尔值时会记录,但需要使用mysqlbinlog -v查看,这些语句是被注释的,恢复时不会被执行。
  • max_binlog_size = #指定二进制日志文件最大值,超出指定值将自动滚动。但由于事务不会跨文件,所以并不一定总是精确。
  • binlog_cache_size = 32768 #基于事务类型的日志会先记录在缓冲区,当达到该缓冲大小时这些日志会写入磁盘
  • max_binlog_cache_size = #指定二进制日志缓存最大大小,硬限制。默认4G,够大了,建议不要改
  • binlog_cache_use:使用缓存写二进制日志的次数(这是一个实时变化的统计值)
  • binlog_cache_disk_use:使用临时文件写二进制日志的次数,当日志超过了binlog_cache_size的时候会使用临时文件写日志,如果该变量值不为0,则考虑增大binlog_cache_size的值
  • binlog_stmt_cache_size = 32768 #一般等同于且决定binlog_cache_size大小,所以修改缓存大小时只需修改这个而不用修改binlog_cache_size
  • binlog_stmt_cache_use:使用缓存写二进制日志的次数
  • binlog_stmt_cache_disk_use: 使用临时文件写二进制日志的次数,当日志超过了binlog_cache_size的时候会使用临时文件写日志,如果该变量值不为0,则考虑增大binlog_cache_size的值
  • sync_binlog = { 0 | n } #这个参数直接影响mysql的性能和完整性
    • sync_binlog=0:不同步,日志何时刷到磁盘由FileSystem决定,这个性能最好。
    • sync_binlog=n:每写n次事务(注意,对于非事务表来说,是n次事件,对于事务表来说,是n次事务,而一个事务里可能包含多个二进制事件),MySQL将执行一次磁盘同步指令fdatasync()将缓存日志刷新到磁盘日志文件中。Mysql中默认的设置是sync_binlog=0,即不同步,这时性能最好,但风险最大。一旦系统奔溃,缓存中的日志都会丢失。

在innodb的主从复制结构中,如果启用了二进制日志(几乎都会启用),要保证事务的一致性和持久性的时候,必须将sync_binlog的值设置为1,因为每次事务提交都会写入二进制日志,设置为1就保证了每次事务提交时二进制日志都会写入到磁盘中,从而立即被从服务器复制过去。

5.6 二进制日志定点还原数据库

只需指定二进制日志的起始位置(可指定终止位置)并将其保存到sql文件中,由mysql命令来载入恢复即可。当然直接通过管道送给mysql命令也可。

至于是基于位置来恢复还是基于时间点来恢复,这两种行为都可以。选择时间点来恢复比较直观些,并且跨日志文件恢复时更方便。

恢复多个二进制日志文件时:
mysqlbinlog mysql-bin.[*] | mysql -uroot -p password

或者将它们导入到一个文件中后恢复。


mysqlbinlog mysql-bin.000001 > /tmp/a.sql
mysqlbinlog mysql-bin.000002 >>/tmp/a.sql
mysql -u root -p password -e “source /tmp/a.sql”

总结

到此这篇关于MySQL日志的文章就介绍到这了,更多相关MySQL日志分析内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

正在回复: 取消回复

发表评论

暂无评论
成为第一个留下见解的人

联系我们
返回顶部