1、日志的类型
查询日志:
用于保存当前系统所有跟查询操作相关的信息;(不仅仅SELECT语句)
繁忙的Mysql服务器上查询操作很频繁,每次都记录日志,会导致系统性能下降和额外的空间开销,不应该开启;默认为关闭
查询日志相关的变量:
log:{ON|oFF} 是否记录所有语句的日志信息于一般查询日志文件(general_log),已弃用
log_output={TABLE|FILE|NONE}
table和file可以同时出现,用逗号分隔即可
general_log={ON|OFF}是否启用查询日志
general_log_file=hostname.log 定义了一般查询日志保存的文件,通常是hostname.log
慢查询日志:
查询执行时长超过指定时长的查询,即为慢查询
通常用于定位查询操作执行过慢的评估工具,很有必要启动慢查日志;默认为关闭
慢查询日志相关的变量:
slow_query_log={ON|OFF} 是否启用慢查询日志,它的输出位置也取决于log_output={table|file|none}
slow_query_log_file=hostname-slow.log 定义慢查询日志的文件
long_query_time=10.00000 慢查询的时间,超过这个时间就是慢查询
long_slow_filter: 不记录慢查记录
log_slow_queries={ON|OFF} 会话级别的慢查询日志开关
log_slow_rate_limit=N 记录慢查日志的速率
log_slow_verbosity 是否记录慢查询日志的详细信息
错误日志:
记录服务器启动和关闭过程中的信息;服务器运行过程中的错误信息;
事件调度器运行一个事件时产生的信息;在复制架构中的从服务器上启动从服务器线程时产生的信息
log_error = /path/to/error_log_file 错误日志记录的文件
log_warnings = {1|0} 是否记录警告信息保存至错误日志中,默认为1
二进制日志:
记录修改相关的操作,用来实现复制的凭据
中继日志:
从服务器从主服务器上的复制过来的二进制日志
对于非从服务器,中继日志没有启用;
和中继日志相关的服务器变量:
relay_log 值的格式和二进制日志一样
relay_log_index 值的格式和二进制日志一样
relay_log_purge = {ON|OFF} 是否自动清理不在需要的中继日志;默认ON
relay_log_space_limit 中继大小是否限制;默认0
relay_log_recovery 中继日志自动恢复相关
事务日志:
将随机I/O转换为顺序I/O
日志文件组:至少要存在两个,实现轮询
注意:尽可能使用小事务来替代大事务来提升事务引擎的性能
2、二进制日志
记录了当前服务器的数据修改和有潜在可能性影响数据修改的语句
作用:
按时间点恢复
复制
默认存放在数据目录下,通常情况下为mysql-bin:
[root@Node5 ~]# ls /data/mydata aria_log.00000001 ib_logfile1 mysql-bin.000001 mysql-bin.000005 Node5.pid aria_log_control multi-master.info mysql-bin.000002 mysql-bin.000006 performance_schema ibdata1 mydb mysql-bin.000003 mysql-bin.index test ib_logfile0 mysql mysql-bin.000004 Node5.err [root@Node5 mydata]# file mysql-bin.000006 mysql-bin.000006: MySQL replication log ### 二进制格式的文件,需要用专门的工具mysqlbinlog来查看: [root@Node5 mydata]# mysqlbinlog mysql-bin.000006 ### 文件格式 # at 6842 #170221 16:26:52 server id 1 end_log_pos 6880 GTID 0-1-63 ddl /*!100001 SET @@session.gtid_seq_no=63*//*!*/; # at 6880 #170221 16:26:52 server id 1 end_log_pos 6961 Query thread_id=55 exec_time=0 error_code=0 use `mysql`/*!*/; SET TIMESTAMP=1487665612/*!*/; FLUSH QUERY CACHE /*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
事件的偏移位置(时间记录法):position
时间记录(空间记录法):time
查看当前使用的二进制日志和下一个事件开始时的基于的位置:show master status;
MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000006 | 6961 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.35 sec) MariaDB [(none)]>
日志滚动:
可以按照大小定义:默认当超过1G(未必精确),日志会滚动
时间定义:
每次重启服务器或执行执行flush logs,会滚动二进制日志和中继日志
mysql记录二进制日志的格式:
基于语句:statement,
date()这类会发生变化的数据存储会不一致
基于行:row,更精确,但数据量更大
很有可能会产生大量数据
混合模式:mixed,mysqld自动判断基于语句还是基于行
手动清除日志: # 不能直接删除二进制日志文件
PURGE { BINARY | MASTER } LOGS
{ TO 'log_name'(某各文件名之前) | BEFORE datetime_expr(某个时间之前) }
# 如果按时间来清楚二进制日志时,指定的时间点位于某二进制日志文件中,也能正常清楚
查看前服务器使用过的二进制日志文件列表:
MariaDB [(none)]> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 27990 | | mysql-bin.000002 | 346 | | mysql-bin.000003 | 1510 | | mysql-bin.000004 | 346 | | mysql-bin.000005 | 346 | | mysql-bin.000006 | 7004 | | mysql-bin.000007 | 409 | | mysql-bin.000008 | 366 | +------------------+-----------+ 8 rows in set (0.00 sec) MariaDB [(none)]>
在mysql命令行下也可以使用:SHOW BINLOG EVENTS命令来查看二进制日志:
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
MariaDB [(none)]> SHOW BINLOG EVENTS IN "mysql-bin.000008"; +------------------+-----+-------------------+-----------+-------------+--------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------------+-----------+-------------+--------------------------------------------+ | mysql-bin.000008 | 4 | Format_desc | 1 | 249 | Server ver: 10.1.21-MariaDB, Binlog ver: 4 | | mysql-bin.000008 | 249 | Gtid_list | 1 | 288 | [0-1-63] | | mysql-bin.000008 | 288 | Binlog_checkpoint | 1 | 327 | mysql-bin.000007 | | mysql-bin.000008 | 327 | Binlog_checkpoint | 1 | 366 | mysql-bin.000008 | +------------------+-----+-------------------+-----------+-------------+--------------------------------------------+ 4 rows in set (0.00 sec)
Server-id:服务器身份标识
GTID:global transaction identifier 全局事务ID,MySQL5.6在5.5的基础上增加的新特性,GTID是完成多线程复制的基本依据
指定从某个位置开始读取二进制日志:
MariaDB [(none)]> SHOW BINLOG EVENTS IN "mysql-bin.000008" FROM 288; +------------------+-----+-------------------+-----------+-------------+------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------------+-----------+-------------+------------------+ | mysql-bin.000008 | 288 | Binlog_checkpoint | 1 | 327 | mysql-bin.000007 | | mysql-bin.000008 | 327 | Binlog_checkpoint | 1 | 366 | mysql-bin.000008 | +------------------+-----+-------------------+-----------+-------------+------------------+ 2 rows in set (0.00 sec) [root@Node5 mydata]# mysqlbinlog --start-position=288 mysql-bin.000008 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #170221 21:04:25 server id 1 end_log_pos 249 Start: binlog v 4, server v 10.1.21-MariaDB created 170221 21:04:25 # Warning: this binlog is either in use or was not closed properly. BINLOG ' 2TqsWA8BAAAA9QAAAPkAAAABAAQAMTAuMS4yMS1NYXJpYURCAGxvZwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA3QAEGggAAAAICAgCAAAACgoKAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAEEwQAAMOvkZ0= '/*!*/; # at 288 #170221 21:04:25 server id 1 end_log_pos 327 Binlog checkpoint mysql-bin.000007 # at 327 #700101 8:00:00 server id 1 end_log_pos 366 Binlog checkpoint mysql-bin.000008 DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; [root@Node5 mydata]#
mysqlbinlog是mysql服务器的客户端工具,常用的选项:
-u:用户帐号
-p:密码
-h:主机
-P:端口
--start-position
--stop-position
--start-datetime='时间'
--stop-datetime='时间'
时间格式:YYYY-MM-DD hh:mm:ss
-R,--read-from-remote-server
从MySQL服务器读二进制日志。如果未给出该选项,任何连接参数选项将被忽略。
[root@Node5 ~]# mysqlbinlog -h192.168.10.5 -p123 -R mysql-bin.000002
二进制日志文件内容格式:
事件发生的日期和时间
服务器ID
事件结束位置
事件的类型
原服务器生成此事件时的线程ID号
语句时间戳和写入二进制文件的时间差,单位为秒
错误代码,0表示正常执行
事件内容
事件位置(相当于下一事件的开始位置)
和二进制日志相关的服务器变量:
log_bin = {ON|OFF}, 还可以是一个文件路径指定文件如:/data/mybinlog/master-log
### 查看配置文件/etc/my.cnf中log_bin的配置 log-bin=mysql-bin
log_bin_trust_function_creators={ON|OFF} 不阻止任何存储函数,一般关闭,默认OFF
sql_log_bin = {ON|OFF} 当前会话是否将二进制文件进入进二进制文件
sql_log_off 是否将一般查询日志记入查询日志
sync_binlog
MariaDB [node5]> select @@sync_binlog; +---------------+ | @@sync_binlog | +---------------+ | 0 | +---------------+ 1 row in set (0.00 sec)
sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。
当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。
binlog_format = {|statement|row|mixed} 默认自动mixed
max_binlog_cache_size = mysql二进制日志的缓冲区大小,仅用于缓存事务类的语句
max_binlog_stmt_cache_size 语句缓冲区大小,即事务类和非事务类公用的大小
max_binlog_size 二进制日志文件的上限,单位为字节,默认为1G
注意:
切勿将二进制日志与数据文件放在同一设备,能提升IO性能,又能防止因磁盘硬件损坏而造成数据无法恢复
可以临时通过sql_log_bin来控制二进制日志的写入