mysql日志基本参数
事务日志
事务日志仅innodb支持,记录了所有的提交和未提交的事务,这样才能支持rollback手动回滚,且突发事件后系统可以自动将未提交的事务自动回滚,而已提交的事务如果未写到磁盘中,系统也会自动重新执行事务保证事务的ACID特性。
MariaDB [(none)]> show variables like "%innodb_log%";
+-------------------------------+------------+
| Variable_name | Value |
+-------------------------------+------------+
| innodb_log_arch_dir | |
| innodb_log_arch_expire_sec | 0 |
| innodb_log_archive | OFF |
| innodb_log_block_size | 0 |
| innodb_log_buffer_size | 16777216 |
| innodb_log_checksum_algorithm | DEPRECATED |
| 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 |
+-------------------------------+------------+
13 rows in set (0.00 sec)
其中主要介绍以下四个参数:
| innodb_log_file_size | 50331648 |:记录了每个事务日志的最大容量
| innodb_log_files_in_group | 2 |:记录了能生成多少个事务日志文件
| innodb_log_group_home_dir | ./ |:记录的事务日志的路径,根的位置为数据库data的路径。
事务日志的个数主要体现为下图,设置了个数为2,则生成两个文件,当日志达到设定的要求时则会重新从头覆盖旧数据。
innodb_flush_log_at_trx_commit=0|1|2|3:性能优化参数,主要通过写入磁盘的方式和间隔作为区分,因此也有性能上和可靠性上的差异
默认为1。
0:将每个事务写入到日志缓存中,同时间隔一秒将一秒内的数据一次行从日志缓存中写入到磁盘,此方式减少了对磁盘的IO请求,增加了读写效率
2:与0相似,不同的是事务提交到系统内存缓存中,由内存每隔一秒一次性写入到磁盘中,风险和0一样,但是和0相比,效率稍微低一点。
1:每次事务执行后将存入到事务日志的缓存中,同时直接写入到磁盘中,不像0或者2一样要间隔一秒,而是执行一条写入一条,此方式保证数据写入磁盘的可靠性,但是加大了磁盘IO的请求,效率低下。
3:模拟MariaDB 5.5组提交(每组提交3个同步),此项MariaDB 10.0支持
错误日志
记录了mysql启动、关闭时的错误信息
mysql运行中的错误日志
event scheduler运行一个event时产生的日志信息
在主从复制架构中的从服务器上启动从服务器线程时产生的信息
查看错误日志相关参数:
log_error:显示错误日志路径
MariaDB [(none)]> show global variables like 'log_error';
+---------------+---------------------------+
| Variable_name | Value |
+---------------+---------------------------+
| log_error | /data/mysql/masterdns.err |
+---------------+---------------------------+
log_warnings:是否记录警告日志
MariaDB [(none)]> select @@log_warnings;
+----------------+
| @@log_warnings |
+----------------+
| 2 |
+----------------+
通用日志
记录了所有的通用操作,包括错误命令等。
general_log:是否开启on/1,off/0
general_log_file:通用日志名称
log_output=TABLE|FILE|NONE
table:以数据库方式存放
file:以文件方式存放(默认
)
none:不存放通用日志
MariaDB [(none)]> show global variables like "general_log%";
+------------------+---------------+
| Variable_name | Value |
+------------------+---------------+
| general_log | OFF |
| general_log_file | masterdns.log |
+------------------+---------------+
设置set global general_log=1;
查看日志文件,可以看到各种执行命令的日志。
设置为表形式存放通用日志set global log_output="table";
存放的表为mysql.general_log
慢查询日志
顾名思义,就是记录了执行慢的命令的日志,但是慢的条件有很多,比如时间长,多少次执行慢才是真的慢,是否记录因为没用索引而查询慢等等。
常见的慢查询变量:
slow_query_log=ON|OFF #开启或关闭慢查询
long_query_time=N #慢查询的阀值,单位秒
slow_query_log_file=HOSTNAME-slow.log #慢查询日志文件
log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan, query_cache,query_cache_miss,tmp_table,tmp_table_on_disk #上述查询类型且查询时长超过long_query_time,则记录日志
log_queries_not_using_indexes=ON #不使用索引或使用全索引扫描,不论是否达到慢查询阀值的语 句是否记录日志,默认OFF,即不记录
log_slow_rate_limit = 1 #多少次查询才记录,mariadb特有
log_slow_verbosity= Query_plan,explain #记录内容
log_slow_queries = OFF 同slow_query_log #新版已废弃
开启慢查询日志,并设置时间为2S.
通过select sleep(*) from hellodb.teachers;
执行命令测试结果。
启用因为没用索引而超时的查询参数
set global log_queries_not_using_indexes=1;
此处没有过多的数据而无法实验~~~。
此处在介绍一个可以分析慢查询日志慢在哪的工具profile
启用:set profiling=1;
显示查询日志列表:show profiles;
查询时间花费:show profile for query id;
MariaDB [hellodb]> show profile for query 3;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000096 |
| checking permissions | 0.000011 |
| Opening tables | 0.002366 |
| After opening tables | 0.000011 |
| System lock | 0.000004 |
| Table lock | 0.000008 |
| init | 0.000036 |
| optimizing | 0.000011 |
| statistics | 0.000035 |
| preparing | 0.000020 |
| executing | 0.000003 |
| Sending data | 0.000020 |
| User sleep | 1.004567 |
| User sleep | 1.000277 |
| User sleep | 1.015405 |
| User sleep | 1.015779 |
| end | 0.000069 |
| query end | 0.000063 |
| closing tables | 0.000021 |
| Unlocking tables | 0.000241 |
| freeing items | 0.000039 |
| updating status | 0.000039 |
| logging slow query | 0.000259 |
| cleaning up | 0.000017 |
+----------------------+----------+
查询CPU花费时间show profile cpu for query id;
MariaDB [hellodb]> show profile cpu for query 3;
+----------------------+----------+----------+------------+
| Status | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| starting | 0.000096 | 0.000023 | 0.000070 |
| checking permissions | 0.000011 | 0.000002 | 0.000006 |
| Opening tables | 0.002366 | 0.002371 | 0.000000 |
| After opening tables | 0.000011 | 0.000006 | 0.000000 |
| System lock | 0.000004 | 0.000005 | 0.000000 |
| Table lock | 0.000008 | 0.000007 | 0.000000 |
| init | 0.000036 | 0.000038 | 0.000000 |
| optimizing | 0.000011 | 0.000010 | 0.000000 |
| statistics | 0.000035 | 0.000037 | 0.000000 |
| preparing | 0.000020 | 0.000018 | 0.000000 |
| executing | 0.000003 | 0.000003 | 0.000000 |
| Sending data | 0.000020 | 0.000020 | 0.000000 |
| User sleep | 1.004567 | 0.000903 | 0.000131 |
| User sleep | 1.000277 | 0.001553 | 0.001303 |
| User sleep | 1.015405 | 0.000276 | 0.001964 |
| User sleep | 1.015779 | 0.000561 | 0.001706 |
| end | 0.000069 | 0.000014 | 0.000043 |
| query end | 0.000063 | 0.000016 | 0.000046 |
| closing tables | 0.000021 | 0.000005 | 0.000015 |
| Unlocking tables | 0.000241 | 0.000062 | 0.000189 |
| freeing items | 0.000039 | 0.000007 | 0.000021 |
| updating status | 0.000039 | 0.000009 | 0.000029 |
| logging slow query | 0.000259 | 0.000000 | 0.000264 |
| cleaning up | 0.000017 | 0.000000 | 0.000011 |
+----------------------+----------+----------+------------+
二进制日志
(重要、重要、重要),重要的事情说三遍。
二进制日志保存了所有执行完成的事务,通常用来还原数据库,因为数据库备份时定期的,而中间的时间有可能出现故障导致数据丢失,所以不仅要还原数据库,还要通过二进制日志将中间丢失的数据通过日志中的命令重新还原数据丢失前的所有操作过程,从而更加完整的还原数据。
建议:将二进制日志当作数据库,与数据库分开存放防止数据库文件同时丢失将二进制日志也删除。
二进制日志构成:
日志文件:xxxxxxxx.000001,记录每条执行完成的事务日志。
索引文件:xxxxx.index,记录日志文件有哪些。
二进制日志常见变量:
sql_log_bin=ON|OFF:
#是否记录二进制日志,默认ON
log_bin=/PATH/BIN_LOG_FILE:
#指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开 启才可
binlog_format=STATEMENT|ROW|MIXED:
#二进制日志记录的格式,默认STATEMENT
max_binlog_size=1073741824:
#单个二进制日志文件的最大体积,到达最大值会自动滚动,默认为1G #说明:文件达到上限时的大小未必为指定的精确值
sync_binlog=1|0:
#设定是否启动二进制日志即时同步磁盘功能,默认0,由操作系统负责同步日志到磁盘 expire_logs_days=N:#二进制日志可以自动删除的天数。 默认为0,即不自动删除
sql_log_bin
默认是开启的不是一个配置选项,无法在my.cnf中配置。
log_bin
为配置中的选项,更改文件路径时需要注意:
1.目录存在
2.mysql用户必须有权限访问,建议设置成 mysql的所有者和所属组
binlog_format
变量设置二进制日志存放语句的方式有三种:
1.存放语句
记录:参数为statement
记录了每一个语句,比如
delete from teachers where age > (select avg(age) from teachers);
该模式存放的数据量会比较少,但是语句模式无法存放变量,从而产生一个问题,如代码所示,avg(age)在每个时间段是不一样的,所以哪怕是还原二进制日志的操作也不一定能完整的回复原本的数据
2.存放行
记录:参数为row
存放每一条语句哪怕是
update teachers set age =20 where age < 20;
这个语句会将语句拆分为每一行的记录,如果age<20的记录有三条,则二进制日志中会保存3条update语句。因此选择该模式会产生大量的二进制日志文件。
3.混合模式:参数为mixed
混合1和2方式,系统自行判定
二进制日志相关命令:
;show master logs
:查看已生成的可由命令管理的二进制列表
MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 351 |
| mysql-bin.000002 | 111891686 |
+------------------+-----------+
show master status;
:显示当前正在使用的二进制日志。
MariaDB [hellodb]> show master status;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000002 | 111891686 | | |
+------------------+-----------+--------------+------------------+
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
:从指定位置查询。
MariaDB [(none)]> show binlog events in 'mysql-bin.000002' from 328 limit 2,3;
+------------------+-----+------------+-----------+-------------+----------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+------------+-----------+-------------+----------------------------------------------------------------------------------+
| mysql-bin.000002 | 402 | Query | 1 | 537 | use `hellodb`; insert into test(name) values (concat('wang', NAME_CONST('i',1))) |
| mysql-bin.000002 | 537 | Xid | 1 | 568 | COMMIT /* xid=24 */ |
| mysql-bin.000002 | 568 | Gtid | 1 | 610 | BEGIN GTID 0-1-2 |
+------------------+-----+------------+-----------+-------------+----------------------------------------------------------------------------------+
查看二进制日志客户端工具mysqlbinlog
通过此工具可以得到指定时间段和指定位置的二进制日志,将此部分日志导出作为数据库导入,从而达到还原数据库的作用。
用法:
mysqlbinlog [OPTIONS] log_file…
--start-position=# 指定开始位置
--stop-position=# --start-datetime= #时间格式:YYYY-MM-DD hh:mm:ss
--stop-datetime=
--base64-output[=name]
-v -vvv
二进制日志格式:
/
示例# 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
日志示例(此处密码为空,默认账号为root,所以不必加其他参数,其他环境记得加参数
):
清除二进制日志:清除指定时间前或者指定文件前的日志
如下:清楚03的日志等于清楚03之前的所有日志,不包括03本身。
但是不会将存在文件删除,而是从列表中清除二进制日志的索引。
格式如下:
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
举例:
PURGE BINARY LOGS TO 'mariadb-bin.000003'; #删除mariadb-bin.000003之前的日志
PURGE BINARY LOGS BEFORE '2017-01-23';
PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';
ariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000002 | 111891709 |
| mysql-bin.000003 | 342 |
+------------------+-----------+
2 rows in set (0.00 sec)
MariaDB [(none)]> purge master logs to 'mysql-bin.000003' ;
Query OK, 0 rows affected (0.04 sec)
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000003 | 342 |
+------------------+-----------+
flush logs
:重新生成(切换)二进制日志(后缀从04变成了05)
重启服务的效果与flush logs效果相同,均重新生成日志
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000003 | 389 |
| mysql-bin.000004 | 385 |
+------------------+-----------+
2 rows in set (0.00 sec)
MariaDB [(none)]> flush logs;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000003 | 389 |
| mysql-bin.000004 | 432 |
| mysql-bin.000005 | 385 |
+------------------+-----------+
reset master [to #]
:删除二进制日志(包括文件本身)并指定后缀从多少开始
不指定数字,则删除所有二进制日志,从01开始
MariaDB [(none)]> reset master;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 328 |
+------------------+-----------+
指定数字,删除所有二进制日志。
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 328 |
+------------------+-----------+
1 row in set (0.00 sec)
MariaDB [(none)]> reset master to 3;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000003 | 328 |
+------------------+-----------+