日志
- 事务日志 transaction log
- 错误日志 error log
- 通用日志 general log
- 慢查询日志 slow query log
- 二进制日志 binary log
- 中继日志 reley log
事务日志:
事务日志的写入类型为“追加”,因此其操作为“顺序IO”;通常也被称为:预写式日志 write ahead logging
事务日志文件: ib_logfile0, ib_logfile1
事务日志:transaction log
- 事务型存储引擎自行管理和使用,建议和数据文件分开存放
redo log
undo log - Innodb事务日志相关配置:
MariaDB [hellodb]> show variables like '%innodb_log%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| innodb_log_buffer_size | 16777216 | #每个日志文件大小
| innodb_log_checksums | ON |
| innodb_log_compressed_pages | ON |
| innodb_log_file_size | 50331648 |
| innodb_log_files_in_group | 2 | #日志组成员个数
| innodb_log_group_home_dir | ./ | #事务文件路径
| innodb_log_optimize_ddl | ON |
| innodb_log_write_ahead_size | 8192 |
+-----------------------------+----------+
innodb_flush_log_at_trx_commit
说明:设置为1,同时sync_binlog = 1表示最高级别的容错 innodb_use_global_flush_log_at_trx_commit的值确定是否可以使用SET语句重置此变量1
默认情况下,日志缓冲区将写入日志文件,并在每次事务后执行刷新到磁盘。 这是完全遵守ACID特性0
提交时没有任何操作; 而是每秒执行一次日志缓冲区写入和刷新。 这样可以提供更好的性能,但服务器崩溃可能丢失最后一秒的事务2
每次提交后都会写入日志缓冲区,但每秒都会进行一次刷新。 性能比0略好一些,但操作系统或停电可能导致最后一秒的交易丢失

图解
- 日志优化
事务日志建议放在单独的一块磁盘上。
vim /etc/my.cnf
[mysqld]
innodb_log_group_home_dir=/yourpath
systemctl restart mariadb
错误日志
mysqld启动和关闭过程中输出的事件信息
mysqld运行中产生的错误信息
event scheduler运行一个event时产生的日志信息
在主从复制架构中的从服务器上启动从服务器线程时产生的信息
- 错误日志相关配置
SHOW GLOBAL VARIABLES LIKE 'log_error'
- 错误文件路径
log_error=/PATH/TO/LOG_ERROR_FILE
- 是否记录警告信息至错误日志文件
log_warnings=1
默认值1
通用日志
通用日志:记录对数据库的通用操作,包括错误的SQL语句
- 通用日志相关设置
#默认值OFF关闭,ON启用
general_log=OFF
#通用日志存放路径
general_log_file=HOSTNAME.log
#存放在类型,默认FILE。如果选择TABLE,则放到mysql库的general_log这张表
log_output=TABLE|FILE|NONE
慢查询日志
慢查询日志:记录执行查询时长超出指定时长的操作
- 相关配置
#开启或关闭慢查询
slow_query_log=ON|OFF
#慢查询的阀值,单位秒,默认10秒
long_query_time=N
#慢查询日志文件
slow_query_log_file=HOSTNAME-slow.log
#查询类型且查询时长超过long_query_time,则记录日志
log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,
query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
#不使用索引或使用全索引扫描,不论是否达到慢查询阀值的语句是否记录日志,默认OFF,即不记录
log_queries_not_using_indexes=ON
#多少次查询才记录,mariadb特有
log_slow_rate_limit = 1
#记录内容
log_slow_verbosity= Query_plan,explain
#新版已废弃
log_slow_queries = OFF 同slow_query_log
- 示例
#临时开启慢查询日志
MariaDB [hellodb]> set global slow_query_log=on;
#查看是否开启
MariaDB [hellodb]> show global variables like 'slow_query_log%';
+---------------------+--------------------+
| Variable_name | Value |
+---------------------+--------------------+
| slow_query_log | ON |
+---------------------+--------------------+
#默认10秒为长查询
MariaDB [(none)]> show global variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
- 查询分析参数
#默认是OFF
MariaDB [hellodb]> show variables like 'profiling';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| profiling | OFF |
+----------------+-------+
查看使用过的命令
MariaDB [hellodb]> show profiles;
+----------+------------+----------------------------------+
| Query_ID | Duration | Query |
+----------+------------+----------------------------------+
| 1 | 0.00202081 | show variables like '%profiling' |
| 2 | 0.01857000 | select * from students |
+----------+------------+----------------------------------+
根据ID就可以找到某条语句的执行过程
MariaDB [hellodb]> show profile for query 2;
+------------------------+----------+
| Status | Duration |
+------------------------+----------+
| Starting | 0.000241 |
| Checking permissions | 0.000021 |
| Opening tables | 0.000930 |
| After opening tables | 0.000176 |
| System lock | 0.000272 |
| Table lock | 0.000113 |
| Opening tables | 0.009604 |
| After opening tables | 0.000112 |
| System lock | 0.000022 |
| Table lock | 0.000591 |
| Closing tables | 0.000013 |
| Unlocking tables | 0.000013 |
| Closing tables | 0.000070 |
| Init | 0.000215 |
| Optimizing | 0.000030 |
| Statistics | 0.002576 |
| Preparing | 0.000037 |
| Executing | 0.000007 |
| Sending data | 0.003259 |
| End of update loop | 0.000021 |
| Query end | 0.000008 |
| Commit | 0.000152 |
| Closing tables | 0.000016 |
| Unlocking tables | 0.000006 |
| Closing tables | 0.000011 |
| Starting cleanup | 0.000007 |
| Freeing items | 0.000010 |
| Updating status | 0.000028 |
| Reset for next command | 0.000008 |
+------------------------+----------+
##中继日志:relay log
主从复制架构中,从服务器用于保存从主服务器的二进制日志中读取的事件
二进制日志
记录导致数据改变或潜在导致数据改变的SQL语句
记录已提交的日志
不依赖于存储引擎类型
功能:通过“重放”日志文件中的事件来生成数据副本
注意:建议二进制日志和数据文件分开存放
二进制日志记录格式
- 二进制日志记录三种格式
- 基于“语句”记录:statement,记录语句,默认模式
- 基于“行”记录:row,记录数据,日志量较大
- 混合模式:mixed, 让系统自行判定该基于哪种方式进行
- 格式配置
show variables like ‘binlog_format';
二进制日志文件的构成
有两类文件
日志文件:mysql|mariadb-bin.文件名后缀,二进制格式
如: mariadb-bin.000001
索引文件:mysql|mariadb-bin.index,文本格式
二进制日志相关的服务器变量:
- 临时启用
set log_bin=ON;
- 写到配置文件
vim /etc/my.cnf
[mysqld]
log_bin=/yourpath
#这样就会在指定的路径下生成mariadb-bin的二进制文件。默认OFF,表示不启用二进制日志功能
#要生成二进制日志,还需要开启sql_log_bin=ON,不过这样默认是开启的
- 其它的配置
#二进制日志记录的格式,默认STATEMENT(语句)。ROW(行),MIXED(混合)
binlog_format=STATEMENT|ROW|MIXED
#单个二进制日志文件的最大体积,到达最大值会自动滚动,默认为1G
max_binlog_size=1073741824
说明:文件达到上限时的大小未必为指定的精确值
#设定是否启动二进制日志即时同步磁盘功能,默认0,由操作系统负责同步日志到磁盘
sync_binlog=1|0
#二进制日志可以自动删除的天数。 默认为0,即不自动删除
expire_logs_days=N
二进制日志相关配置
- 查看mariadb自行管理使用中的二进制日志文件列表,及大小
SHOW {BINARY | MASTER} LOGS
- 查看使用中的二进制日志文件
SHOW MASTER STATUS
- 查看二进制文件中的指定内容
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
#示例
show binlog events in 'mysql-bin.000001' from 6516 limit 2,3
mysqlbinlog : 二进制日志的客户端命令工具
- 命令格式:
mysqlbinlog [OPTIONS] log_file…
[OPTIONS]
--start-position=# #指定开始位置
--stop-position=#
--start-datetime=
--stop-datetime=
时间格式:YYYY-MM-DD hh:mm:ss
--base64-output[=name]
-v -vvv
- 示例:
#例1
mysqlbinlog --start-position=6787 --stop-position=7527 /var/lib/mysql/mariadb-bin.000003 -v
#例2
mysqlbinlog --start-datetime="2018-01-30 20:30:10" --stop-datetime="2018-01-30 20:35:22" mariadb-bin.000003 -vvv
- 利用二进制重放数据库
mysqlbinlog mysql-bin.0000003 -v > testlog.sql
二进制日志事件的格式:
# at 328
#151105 16:31:40 server id 1 end_log_pos 431 Query thread_id=1 exec_time=0 error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1446712300/*!*/;
CREATE TABLE tb1 (id int, name char(30))
/*!*/;
#事件发生的日期和时间:151105 16:31:40
#事件发生的服务器标识:server id 1
#事件的结束位置:end_log_pos 431
#事件的类型:Query
#事件发生时所在服务器执行此事件的线程的ID:thread_id=1
#语句的时间戳与将其写入二进制文件中的时间差:exec_time=0
#错误代码:error_code=0
#事件内容:
#GTID:Global Transaction ID,mysql5.6以mariadb10以上版本专属属性:GTID
清除指定二进制日志:
- purge命令
PURGE { BINARY | MASTER } LOGS
{ TO 'log_name' | BEFORE datetime_expr }
- 示例:
PURGE BINARY LOGS TO 'mariadb-bin.000003'; #删除3之前的日志
PURGE BINARY LOGS BEFORE '2017-01-23';
PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';
- 删除所有二进制日志,index文件重新记数
#mariadb-10.1.6可以使用TO #
RESET MASTER [TO #];
#删除所有二进制日志文件,并重新生成日志文件,
#文件名从#开始记数,默认从1开始,一般是master主机第一次启动时执行
- 切换日志文件:
FLUSH LOGS;
#执行后二进制文件就重新开始新的文件记录