MySQL的日志文件及配置

对MySQL中的6种日志文件,以及配置做简单的记录。

版本:MySQL 5.7

二进制日志(binlog)

  • 记录所有引起数据变化的操作,用于备份还原,使用主从复制时也需要开启binlog
  • 默认存放在datadir目录下,在刷新和重启数据库是会滚动二进制文件,产生新的binlog;
[mysql@localhost mysql]$  vi /etc/my.cnf

修改[mysqld]下的配置

#以下为 my.cnf 部分配置
[mysqld]
basedir=/home/mysql/mysql-5.7/
datadir=/home/mysql/mysql-5.7/data/
#序列号
server_id=1
#不指定log文件,默认mysqld-bin.00000* 作为文件名称;
log-bin=mysql-bin
#基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)
binlog_format=Row
#binlog每个日志文件大小
max-binlog-size = 500M
#设置binlog清理时间
expire_logs_days = 7
#binlog缓存大小
binlog_cache_size = 4m
#最大binlog缓存大小
max_binlog_cache_size = 512m

登录MySQL查看相关参数

mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------------------+
| Variable_name                   | Value                                      |
+---------------------------------+--------------------------------------------+
| log_bin                         | ON                                         |
| log_bin_basename                | /home/mysql/mysql-5.7/data/mysql-bin       |
| log_bin_index                   | /home/mysql/mysql-5.7/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                        |
| log_bin_use_v1_row_events       | OFF                                        |
| sql_log_bin                     | ON                                         |
+---------------------------------+--------------------------------------------+
6 rows in set (0.00 sec)

mysql> show variables like '%binlog%';
+--------------------------------------------+----------------------+
| Variable_name                              | Value                |
+--------------------------------------------+----------------------+
| binlog_cache_size                          | 4194304              |
| binlog_checksum                            | CRC32                |
| binlog_direct_non_transactional_updates    | OFF                  |
| binlog_error_action                        | ABORT_SERVER         |
| binlog_format                              | ROW                  |
| binlog_group_commit_sync_delay             | 0                    |
| binlog_group_commit_sync_no_delay_count    | 0                    |
| binlog_gtid_simple_recovery                | ON                   |
| binlog_max_flush_queue_time                | 0                    |
| binlog_order_commits                       | ON                   |
| binlog_row_image                           | FULL                 |
| binlog_rows_query_log_events               | OFF                  |
| binlog_stmt_cache_size                     | 32768                |
| binlog_transaction_dependency_history_size | 25000                |
| binlog_transaction_dependency_tracking     | COMMIT_ORDER         |
| innodb_api_enable_binlog                   | OFF                  |
| innodb_locks_unsafe_for_binlog             | OFF                  |
| log_statements_unsafe_for_binlog           | ON                   |
| max_binlog_cache_size                      | 536870912            |
| max_binlog_size                            | 524288000            |
| max_binlog_stmt_cache_size                 | 18446744073709547520 |
| sync_binlog                                | 1                    |
+--------------------------------------------+----------------------+
22 rows in set (0.00 sec)

事务日志(redo log / undo log )

  • innodb的事务日志包括redo log重做日志,提供前滚操作,undo log回滚日志,提供回滚操作;
  • 保证事务一致性;其中innodb_flush_log_at_trx_commit的配置可控制commit是否刷新log buffer是否刷新到磁盘
  • 当设置为1的时候,事务每次提交都会将log buffer中的日志写入os buffer并调用fsync()刷到log file on disk中。这种方式即使系统崩溃也不会丢失任何数据,但是因为每次提交都写入磁盘,IO的性能较差。
  • 当设置为0的时候,事务提交时不会将log buffer中日志写入到os buffer,而是每秒写入os buffer并调用fsync()写入到log file on disk中。也就是说设置为0时是(大约)每秒刷新写入到磁盘中的,当系统崩溃,会丢失1秒钟的数据。
  • 当设置为2的时候,每次提交都仅写入到os buffer,然后是每秒调用fsync()将os buffer中的日志写入到log file on disk。
mysql> show variables like '%innodb%log%';
+----------------------------------+------------+
| Variable_name                    | Value      |
+----------------------------------+------------+
| innodb_api_enable_binlog         | OFF        |
| innodb_flush_log_at_timeout      | 1          |
| innodb_flush_log_at_trx_commit   | 1          |
| innodb_locks_unsafe_for_binlog   | OFF        |
| innodb_log_buffer_size           | 33554432   |
| innodb_log_checksums             | ON         |
| innodb_log_compressed_pages      | ON         |
| innodb_log_file_size             | 134217728  |
| innodb_log_files_in_group        | 2          |
| innodb_log_group_home_dir        | ./         |
| innodb_log_write_ahead_size      | 8192       |
| innodb_max_undo_log_size         | 1073741824 |
| innodb_online_alter_log_max_size | 134217728  |
| innodb_undo_log_truncate         | OFF        |
| innodb_undo_logs                 | 128        |
+----------------------------------+------------+
15 rows in set (0.00 sec)

中继日志(relay-log)

  • 从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件;
  • SQL线程读取relay-log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致;
mysql> show variables like '%relay_log%';
+---------------------------+------------------------------------------------------+
| Variable_name             | Value                                                |
+---------------------------+------------------------------------------------------+
| max_relay_log_size        | 0                                                    |
| relay_log                 |                                                      |
| relay_log_basename        | /home/mysql/mysql-5.7/data/localhost-relay-bin       |
| relay_log_index           | /home/mysql/mysql-5.7/data/localhost-relay-bin.index |
| relay_log_info_file       | relay-log.info                                       |
| relay_log_info_repository | FILE                                                 |
| relay_log_purge           | ON                                                   |
| relay_log_recovery        | OFF                                                  |
| relay_log_space_limit     | 0                                                    |
| sync_relay_log            | 10000                                                |
| sync_relay_log_info       | 10000                                                |
+---------------------------+------------------------------------------------------+
11 rows in set (0.00 sec)

错误日志(mysql_error)

  • MySQL服务启动和关闭过程中的信息以及其它运行中的错误和警告信息;
  • log_error_verbosity:1 错误信息;2 错误信息、告警信息; 3:错误信息、告警信息、通知信息;
    修改[mysqld]下的配置
#以下为 my.cnf 部分配置
[mysqld]
#错误日志目录配置
log-error=/home/mysql/mysql-5.7/logs/mysql_error.log
mysql> show variables like 'log_error%';
+---------------------+--------------------------------------------+
| Variable_name       | Value                                      |
+---------------------+--------------------------------------------+
| log_error           | /home/mysql/mysql-5.7/logs/mysql_error.log |
| log_error_verbosity | 3                                          |
+---------------------+--------------------------------------------+
2 rows in set (0.00 sec)

一般日志(general_log)

  • 记录SQL操作的 DDL / DML 日志,记录信息非常简单,但包括完整的SQL语句;
  • 开启general_log会产生非常庞大的日质量,一般不建议开启;
#以下为 my.cnf 部分配置
[mysqld]
#一般日志开启 默认关闭
general_log=on
#一般日志文件路径
general_log_file=/tmp/mariadb_general_log.log
mysql> show variables like '%general%';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log      | ON                           |
| general_log_file | /tmp/mariadb_general_log.log |
+------------------+------------------------------+
2 rows in set (0.00 sec)

慢查询日志(slow_query_log)

  • 记录所有执行超过long_query_time设置的SQL语句;
  • 可以通过slow_query_log分析出系统中SQL语句的存在的问题,方便我们进行优化;
#以下为 my.cnf 部分配置
[mysqld]
#慢查询SQL时间设置(秒)
long_query_time=1
#开启慢查询SQL日志 默认 OFF
slow-query-log=ON
#慢查询日志文件路径
slow-query-log-file=/home/mysql/mysql-5.7/logs/mysql-slow.log
mysql> show variables like '%slow_query_log%';
+---------------------+-------------------------------------------+
| Variable_name       | Value                                     |
+---------------------+-------------------------------------------+
| slow_query_log      | ON                                        |
| slow_query_log_file | /home/mysql/mysql-5.7/logs/mysql-slow.log |
+---------------------+-------------------------------------------+
2 rows in set (0.01 sec)

结尾

登录服务器查询相关日志还是比较麻烦的,所以可以使用ELK+Filebeat对一般日志错误日志慢查询日志进行收集,从而进行分析。后续我会更新ELK7+Beat的分布式日志收集方案的搭建教程。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335