MySQL日志类型
- MySQL有几个不同的日志文件,可以帮助你找出mysqld内部发生的事情:
日志文件 | 记入文件中的信息类型 |
错误日志 | 记录启动、运行或停止时出现的问题 |
查询日志 | 记录建立的客户端连接和执行的语句 |
二进制日志 | 记录所有更改数据的语句。主要用于复制和即时点恢复 |
慢日志 | 记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询 |
事务日志 | 记录InnoDB等支持事务的存储引擎执行事务时产生的日志 |
- 默认情况下,所有日志创建于mysqld数据目录中。通过刷新日志,你可以强制 mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。当你执行一个FLUSH LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,出现日志刷新。如果你正使用MySQL复制功能,从复制服务器将维护更多日志文件,被称为接替日志。
1.错误日志
- 服务器启动和关闭过程中的信息
- 服务器运行过程中的错误信息
- 事件调度器运行一个时间是产生的信息
- 在从服务器上启动从服务器进程是产生的信息
定义:
可以用--log-error[=file_name]选项来指定mysqld保存错误日志文件的位置。如果没有给定file_name值,mysqld使用错误日志名host_name.err 并在数据目录中写入日志文件。如果你执行FLUSH LOGS,错误日志用-old重新命名后缀并且mysqld创建一个新的空日志文件。(如果未给出--log-error选项,则不会重新命名)。
- 查看当前错误日志配置:
mysql> show global variables like '%log_error%';
- 是否记录警告日志
mysql> SHOW GLOBAL VARIABLES LIKE '%log_warnings%';
2.通用查询日志
- 启动开关:general_log={ON|OFF}
- 日志文件变量:general_log_file[=/PATH/TO/file]
- 全局日志开关:log={ON|OFF} 该开关打开后,所有日志都会被启用
- 记录类型:log_output={TABLE|FILE|NONE}:
因此,要启用通用查询日志,需要至少配置general_log=ON,log_output={TABLE|FILE}。而general_log_file如果没有指定,默认名是host_name.log。
看看上述几个值的默认配置:
SHOW GLOBAL VARIABLES LIKE '%general_log%';
mysql> SHOW GLOBAL VARIABLES LIKE '%log_output%';
3.慢查询日志
- MySQL如果启用了slow_query_log=ON选项,就会记录执行时间超过long_query_time的查询(初使表锁定的时间不算作执行时间)。日志记录文件为slow_query_log_file[=file_name],如果没有给出file_name值, 默认为主机名,后缀为-slow.log。如果给出了文件名,但不是绝对路径名,文件则写入数据目录。
默认与慢查询相关变量:
mysql> SHOW GLOBAL VARIABLES LIKE '%slow_query_log%';
- 默认没有启用慢查询,为了服务器调优,建议开启
开启方法:
SET GLOBAL slow_query_log=ON; 当前生效,永久有效配置文件中设置
- 使用mysqldumpslow命令获得日志中显示的查询摘要来处理慢查询日志
# mysqldumpslow slow.log
- 那么多久算是慢呢?
如果查询时长超过
long_query_time
的定义值(默认
10
秒),即为慢查询:
mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
4.二进制日志
二进制日志启动开关:
log-bin [= file_name]
在
5
.6
及以上版本一定要手动指定。
5
.6
以下版本默认
file_name
为
$datadir/mysqld-
binlog
- 查看二进制日志的工具为:mysqlbinlog
查看二进制日志是否开启:
mysql> show global variables like 'log_bin';
永久开启方式:
[root@localhost ~]# vim /etc/my.cnf
在[mysqld]下添加:
log_bin
server_id=36 //需要配置server_id,这里取ip地址后两位,注意不要重复
重启服务systemctl restart mysqld,进入mysql中。
mysql> show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.01 sec)
二进制日志的管理
[root@localhost ~]# ls /var/lib/mysql //可以看到存放日志的文件
我们可以给存放二进制日志的文件起名,与系统默认起名区分开来
日志滚动
- 每次重启MySQL服务,日志都会自动滚动一次。
- 另外如果需要手动滚动,则使用命令 mysql> FLUSH LOGS。
在sql里刷新或输入指令,重启mysql服务之后,会看到新的日志文件
日志查看
- 查看有哪些二进制日志文件:
mysql> SHOW BINARY LOGS;
- 查看当前正在使用的是哪一个二进制日志文件:
mysql> SHOW MASTER STATUS;
- 查看二进制日志内容:
mysql> SHOW BINLOG EVENTS IN 'mysqld-binlog.000002';
//该语句还可以加上Position(位置),指定显示从哪个Position(位置)开始:
mysql> SHOW BINLOG EVENTS IN 'mysqld-binlog.000002' FROM 203;
- 使用命令mysqlbinlog查看二进制日志内容:
mysqlbinlog [options] log-files
- 使用二进制日志还原数据:
使用
mysqlbinlog
读取需要的日志内容,使用标准输入重定向到一个
sql
文件,然后在
mysql
服务器上导入即可,如下:
[root@localhost mysql]# mysqlbinlog mysqld-binlog.000002 >/root/temp_date.sql
删除二进制日志文件
- 二进制日志文件不能直接删除的,如果使用rm等命令直接删除日志文件,可能导致数据库的崩溃。
必须使用命令
PURGE
删除日志,语法如下:
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
mysql> purge binary logs to 'mysql-bin.000002'; //删除2号之前的日志文件
Query OK, 0 rows affected (0.01 sec)
用reset master命令删除所有日志,新日志重新从000001开始编号
用
purge
master logs to
'filename.******'
命令可以删除指定编号前的所有日志