目录
一、MySQL日志的分类
1、错误日志(必须开启,无法关闭)
2、普通日志(默认关闭)
3、慢查询日志(默认关闭)
4、二进制日志(默认关闭)
5、中继日志
6、事务日志
二、二进制日志的查看
1、show binlog
2、mysqlbinlog
查看MySQL中和日志相关的参数:
mysql> SHOW VARIABLES LIKE '%log%';
+-----------------------------------------+----------------------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------------------+
| back_log | 1024 |
| binlog_cache_size | 32768 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | MIXED |
| binlog_stmt_cache_size | 32768 |
| expire_logs_days | 7 |
| general_log | ON |
| general_log_file | /export/data/mysql/log/mysql.log |
| innodb_flush_log_at_trx_commit | 2 |
| innodb_locks_unsafe_for_binlog | OFF |
| innodb_log_buffer_size | 8388608 |
| innodb_log_file_size | 536870912 |
| innodb_log_files_in_group | 3 |
| innodb_log_group_home_dir | /export/data/mysql/data |
| innodb_mirrored_log_groups | 1 |
| log | ON |
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_error | /export/data/mysql/log/error.log |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | ON |
| log_slow_queries | ON |
| log_warnings | 1 |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| max_relay_log_size | 0 |
| relay_log | relay-log |
| relay_log_index | |
| relay_log_info_file | relay-log.info |
| relay_log_purge | ON |
| relay_log_recovery | OFF |
| relay_log_space_limit | 0 |
| slow_query_log | ON |
| slow_query_log_file | /export/data/mysql/log/slow.log |
| sql_log_bin | ON |
| sql_log_off | OFF |
| sync_binlog | 0 |
| sync_relay_log | 0 |
| sync_relay_log_info | 0 |
+-----------------------------------------+----------------------------------+
在配置文件my.cnf中的配置
character-set-server = utf8
lower_case_table_names = 1
log-output = FILE # 设置了general log和慢日志内存存储的方式,默认是file
log-error = /export/data/mysql/log/error.log # 错误日志
general_log # 一般查询日志 开启
general_log_file = /export/data/mysql/log/mysql.log # 一般查询日志 指定文件
pid-file = /export/data/mysql/data/mysql.pid
slow-query-log # 慢查询日志 开启
slow_query_log_file = /export/data/mysql/log/slow.log # 慢查询日志 指定文件
tmpdir = /export/data/mysql/tmp/
long_query_time = 0.1 # 设置慢查询的时间阀值,默认是10秒
sync_binlog = 0 # 设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次;
#--- REPL ---#
server-id = 8185
log-bin = mysql-bin # 二进制日志
binlog_format = mixed # binlog_format={statement|row|mixed} 指定二进制日志的类型
expire_logs_days = 7
relay-log = relay-log
replicate-ignore-db = test
log_slave_updates
skip-slave-start
日志分类
分类 日志名称
服务器日志 服务错误日志
服务器日志 慢查询日志
服务器日志 综合查询日志
事务日志 存储引擎事务日志
事务日志 二进制日志
服务器日志:记录进程启动运行过程中的特殊事件,帮助分析MySQL服务遇到的问题 根据需求抓取特定的SQL语句,追踪性能可能存在的问题的业务SQL
事务日志:记录应用程序对数据的所有更改 可用于数据恢复 可用于实例间数据同步
通过命令:
show global variables like 'log_error';
查看log_error设置的错误日志文件的物理位置。
mysql> show global variables like 'log_error';
+---------------+----------------------------------+
| Variable_name | Value |
+---------------+----------------------------------+
| log_error | /export/data/mysql/log/error.log |
+---------------+----------------------------------+
1 row in set (0.00 sec)
log_error = /path/to/error_log_file # 定义错误日志文件
log_warnnings = {1|0} # 是否记录警告信息于错误日志中
通过命令:
show global variables like 'general_log';
查看是否开启
mysql> show global variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | ON |
+---------------+-------+
1 row in set (0.00 sec)
通过下面的命令可以开启和关闭:
set @@global.general_log = 0; 关闭
set @@global.general_log = 0; 开启
注意:我们同样可以采用my.cnf中添加general_log=on/off;此时我们使用set方式修改会不起作用。
general_log_file:general_log开启后,数据库将自动创建日志文件,次参数设置了general_log文件存放的物理位置。
show global variables like 'general_log_file';
mysql> show global variables like 'general_log_file';
+------------------+----------------------------------+
| Variable_name | Value |
+------------------+----------------------------------+
| general_log_file | /export/data/mysql/log/mysql.log |
+------------------+----------------------------------+
1 row in set (0.00 sec)
log={ON|OFF} # 是否记录所有语句的日志信息于一般查询日志文件(general_log)中;
log_output={TABLE | FILE | NONE} # 定义log保存形式,none表示不保存日志;table和file可以同时出现,用逗号分隔即可;
general_log={ON|OFF} # 是否启动查询日志;
general_log_file # 定义一般查询日志保存的文件;
mysql > SET GOLBAL general_log ={OFF|ON};启用或关闭一般查询日志
mysql > SET GLOGAL log_output=’TABLE’;选项可以控制log的存放方法,table表示以表格的方式存放。
通过命令:
show global variables like 'slow_query_log';
查看是否开启
mysql> show global variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | ON |
+----------------+-------+
1 row in set (0.00 sec)
通过下面的命令可以开启和关闭:
set @@global.slow_query_log = 1;
set @@global.slow_query_log = 0;
slow_query_log_file:设置慢日志的文件地址
mysql> show global variables like 'slow_query_log_file';
+---------------------+----------------------------------+
| Variable_name | Value |
+---------------------+----------------------------------+
| slow_query_log_file |/export/data/mysql/log/slow.log |
+---------------------+----------------------------------+
1 row in set (0.01 sec)
long_query_time:设置慢查询的时间阀值,默认是10秒。
mysql> show global variables like 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.100000 |
+-----------------+----------+
1 row in set (0.00 sec)
log_queries_not_using_indexes:设置没有使用索引的查询语句是否记录在慢日志文件中。
mysql> show global variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |
+-------------------------------+-------+
1 row in set (0.00 sec)
慢日志查看
慢日志地查询分为两种情形,慢查询日志的数据形式设置为table以及数据方式设置为file.
table: 采用mysql.slow_log进行查询。
file: 可以执行查看原文本文件
次数最多的语句或慢查询时间最长的语句,对应的工具为:mysqldumpslow.pl,参数如下:-s 分析慢查询时指定排序参数,可选的有:al 表示平均锁定时间,ar 表示平均返回记录数,at 表示平均查询时间。-t 参数表示只显示指定的行数。
long_query_time # 定义慢查询的时长;
slow_query_log {ON|OFF} # 全局参数,设定是否启用慢查询日志;它的输出位置也取决于log_output的值;
slow_query_log_file # 定义日志文件路径及名称;
log_slow_filter # 慢查询日志过滤类型;
log_slow_queries # 是否启用慢查询日志,会话级别的;
log_rate_limit=1 # 定义其日志记录速率;
log_slow_verbosity # 是否记录详细格式的日志信息;
记录了对MySQL数据库进行的修改操作,影响数据潜在的内容的信息,select的是不会被记录到二进制日志的,二进制日志也叫复制日志,默认在数据目录下,专门查看日志的命令是:mysqlbinlog
功能:1、做时间点恢复,要想从哪个时间点恢复我们可以手动调的,所以这是一个备份恢复的重要工具
2、 mysql主从复制架构中使用;
binlog有三种格式:Statement、Row以及Mixed。
1)、Statement
每一条会修改数据的sql都会记录在binlog中。
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。
缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,
以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题。
ps:相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,
但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,
其所产生的日志量会增加多少,以及带来的IO性能问题。
2)、Row
5.1.5版本的MySQL才开始支持row level的复制,它不记录sql语句上下文相关信息,仅保存哪条记录被修改。
优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。
而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题.
缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。
ps:新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,
如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
3)、 Mixed
从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合。
在Mixed模式下,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,
MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。
通过命令:show global variables like 'log_bin';
查看是否开启
mysql> show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
log_bin_index:记录二进制文件的清单
show variables like 'log_bin_index';
这两个参数都是静态变量,无法使用set命令对其进行修改赋值。只能通过my.cnf文件设置。
log_bin=/mysql/data/mysql-bin-log;但是设置时需要设置server-id,否则无法启动mysql
server-id参数用于在复制中,为主库和备库提供一个独立的ID,以区分主库和备库;开启二进制文件的时候,需要设置这个参数。
查看当前的二进制写入文件
mysql> SHOW MASTER STATUS;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.001151 | 220558401 | | |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
查看二进制日志列表
mysql> SHOW BINARY LOGS;
+------------------+------------+
| Log_name | File_size |
+------------------+------------+
| mysql-bin.001144 | 1123973398 |
| mysql-bin.001145 | 1127377275 |
| mysql-bin.001146 | 1114898757 |
| mysql-bin.001147 | 1600890313 |
| mysql-bin.001148 | 1649695399 |
| mysql-bin.001149 | 1368255728 |
| mysql-bin.001150 | 1550672610 |
| mysql-bin.001151 | 220558401 |
+------------------+------------+
8 rows in set (0.00 sec)
记录方式:binlog_format={STATEMENT|ROW|MIXED}
参数:
STATEMENT:语句;
ROW:行(语句影响到的行内容);
MIXED:混编;
相关命令
☉查看二进制日志文件列表:SHOW MASTER|BINARY LOGS;
☉查看当前正在使用的二进制日志文件:SHOW MASTER STATUS;
☉查看二进制日志文件中的事件:SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
服务器变量:
log_bin=/PATH/TO/BIN_LOG_FILE
指明记录二进制文件的路径,为了数据安全,建议放在不同的存储设备中
sql_log_bin={ON|OFF}
指明是否记录日志于二进制文件中
max_binlog_size=1073741824
二进制日志文件大小的上限值,超过会自动滚动
sync_binlog={1|0}
一旦有事件提交,就立刻从内存中同步到文件中去,建议启用
它其实跟复制相关的,与二进制日志几乎相同,只不过它不是用于记录事件的,而是作为读取数据的源并且在本地执行的,当然中继日志是在从服务器上。
设定参数:
MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE '%relay%';查看中继日志的相关参数信息
relay_log=file_name # 设定中继日志的文件名称
relay_log_index=file_name # 设定中继日志的索引文件名,默认为为数据目录中的host_name-relay-bin.index
relay_log_purge={ON|OFF} # 是否自动清理不再需要的中继日志
relay_log_space_limit= # 设定用于存储所有中继日志文件的可用空间大小,0表示不限制
relay_log_recovery:跟中继日志自动恢复相关的
relay_log={空}:是否启用中继日志的
暂存事务提交的数据,实现将随机I/O转换成顺序I/O;
事务数据提交流程:innodb_buffer-->事务日志-->数据文件;
事务日志文件组,至少应该有2个日志文件,一般保存在数据目录下,为ib_logfile0和ib_logfile1;
注意事项:
尽可能使用小事务以提升事务引擎的性能;因为事务越大,回滚开销越大;
崩溃恢复:将提交的事务从事务日志中同步至数据文件,将未提交的事务执行回滚操作,以保证数据一致性;
避免磁盘故障导致事务文件丢失:对事务日志所在的磁盘做数据镜像;
事务日志文件和数据文件应分离存放:防止对同一磁盘过于频繁的I/O操作;
一般步骤:
1、登录mysql安装的那台机器,找到my.cnf.我的my.cnf文件在etc地下,所有执行 cat /etc/my.cnf ,看到如图所示的binlogs存放位置
2、进入日志所在目录 cd /home/mysql/logs/binlogs, 输入ls -al 查看需要查看的binlogs产生的时间。
3、如果需要查询2017-09-17 07:21:09到2017-09-19 07:59:50 数据库为geeRunner 的操作日志,输入如下命令将数据写入到一个备用的txt即可。
mysqlbinlog --no-defaults --database=geeRunner --start-datetime="2017-09-17 07:21:09" --stop-datetime="2017-09-19 07:59:50" binlogs.000080 > sanjiaomao.txt
4、如果本地查询,输入命令
mysqlbinlog --no-defaults --database=geeRunner --start-datetime="2017-09-17 07:21:09" --stop-datetime="2017-09-19 07:59:50" binlogs.000080 | more
5、如果取下来查询,使用winscp工具,登录到db所在机器,将数据取出来。
6、如果需要过滤,只查询insert,update,delete的语句,可以这样写:
mysqlbinlog --no-defaults --database=raceEnroll binlogs.000078 |grep update |more
查看binlog内容
show binlog events in 'mysql-bin.000011';
show binlog events in 'mysql-bin.000011' from 60 limit 3;
mysqlbinlog c:/tmp/mylog/mysql-bin.000001
--start-datetime | --stop-datetime
--start-position | --stop-position
参考:
https://blog.csdn.net/dbdoctor/article/details/53184019
https://www.cnblogs.com/xiaocen/p/3709114.html
http://blog.51cto.com/1992tao/1878595
https://blog.csdn.net/u010002184/article/details/78996283
https://blog.csdn.net/sunyuhua_keyboard/article/details/78226742