因为日志文件是掌握数据库运行状态的重要参数,所以日志文件的维护也有十分重要的意义。Mysql 的日志类型有错误日志、通用查询日志、二进制日志、慢查询日志。mysql
1. 错误日志sql
(1) 错误日志主要是记录当MySQL 启动和中止时,以及在运行过程当中发生任何错误时的相关信息。错误日志默认保存在 MySQL 的安装路径 data 文件夹下,后缀名是 .err 。数据库
[root@localhost mysql]# cd data/
[root@localhost data]# ls
auto.cnf ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 ibtmp1 mysql performance_schema sysvim
(2)在tata 文件夹下,此时尚未错误日志。在Mysql 的配置文件中,能够指定日志文件的保存位置和日志的文件名。若是没有指定文件名,使用socket
host_name.err 做为文件名。ide
[root@localhost data]# vim /etc/my.cnf //修改主配置文件工具
[mysqld]
测试log-error=/usr/local/mysql/data/mysql_error.log //指定保存错误日志的位置优化
(3)重启 MySQL , 生成 mysql_error.log 用来记录错误日志。this
[root@localhost data]# systemctl restart mysqld.service //重启mysql
[root@localhost data]# ls
auto.cnf ibdata1 ib_logfile1 mysql performance_schema
ib_buffer_pool ib_logfile0 ibtmp1 mysql_error.log sys //错误日志
2.通用查询日志
(1) 通用日志用来记录MsQL 的全部链接和语句,默认时关闭的。使用 SHOW语句能够查询出日志的信息。
mysql> show variables like 'general%';
+------------------+-------------------------------------+
| Variable_name | Value |
+------------------+-------------------------------------+
| general_log | OFF | //通用查询日志 默认关闭
| general_log_file | /usr/local/mysql/data/localhost.log |
+------------------+-------------------------------------+
2 rows in set (0.00 sec)
(2) 修改 MySQL 配置文件,开启通用查询日志,指定通用查询日志的位置。
[root@localhost data]# vim /etc/my.cnf
[mysqld]
general_log=ON //开启通用查询日志
general_log_file=/usr/local/mysql/data/mysql_general.log //指定位置
(3)重启 mysql 服务,通用查询日志生效
[root@localhost data]# systemctl restart mysqld.service
[root@localhost data]# ls
auto.cnf ibdata1 ib_logfile1 mysql mysql_general.log sys 通用查询日志
ib_buffer_pool ib_logfile0 ibtmp1 mysql_error.log performance_schema
(4)使用SHOW 语句查看通用查询日志已经打开,general_log 对应的值是 ON。
mysql> show variables like 'general%';
+------------------+-----------------------------------------+
| Variable_name | Value |
+------------------+-----------------------------------------+
| general_log | ON |
| general_log_file | /usr/local/mysql/data/mysql_general.log |
+------------------+-----------------------------------------+
2 rows in set (0.00 sec)
3二进制日志
(1)二进制日志用来记录全部更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,主要目的是在恢复数据时可以最大程度的恢复数据库。二进制是默认开启的,在data 文件夹下,数据量大时,它会自动分割成多个日志文件,以数字做为扩展名。
mysql> show variables like 'log_bin%';
+---------------------------------+---------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------+
| log_bin | ON |
| log_bin_basename | /usr/local/mysql/data/mysql-bin |
| log_bin_index | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+---------------------------------------+
5 rows in set (0.00 sec)
修改MySQL 配置文件 添加 log_bin=mysql-bin 语句。
[root@localhost data]# vim /etc/my.cnf
[mysqld]
log_bin=mysql-bin
(2)重启 mysql 服务,二进制日志生效
[root@localhost data]# systemctl restart mysqld.service
[root@localhost data]# ls
auto.cnf ibdata1 ib_logfile1 mysql mysql-bin.index mysql_general.log sys
ib_buffer_pool ib_logfile0 ibtmp1 mysql-bin.000001 mysql_error.log performance_schema //二进制日志
(3)二进制日志能够使用MySQL 的工具 mysqlbinlog 查看二进制文件。
[root@localhost data]# mysqlbinlog --no-defaults mysql-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#180829 16:05:21 server id 1 end_log_pos 123 CRC32 0x8d08f4c5 Start: binlog v 4, server v 5.7.17-log created 180829 16:05:21 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
wVOGWw8BAAAAdwAAAHsAAAABAAQANS43LjE3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADBU4ZbEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AcX0CI0=
'/*!*/;
# at 123
#180829 16:05:21 server id 1 end_log_pos 154 CRC32 0xabee8725 Previous-GTIDs
# [empty]
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
4.慢查询日志
慢查询日志记录全部执行时间超过long_query_time 秒的 SQL 语句,用于找到那些查询语句执行时间长,以便对其进行 优化。默认慢查询日志是关闭的, slow_query_log 是慢查询的选项,默认时OFF 。
mysql> show variables like '%slow%'; //查看MySQL 慢查询功能是否开启
+---------------------------+------------------------------------------+
| Variable_name | Value |
+---------------------------+------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF | //状态为OFF
| slow_query_log_file | /usr/local/mysql/data/localhost-slow.log |
+---------------------------+------------------------------------------+
5 rows in set (0.00 sec)
(1)能够使用 SQL 语句开启慢查询功能。
mysql> set global slow_query_log=ON; //开启 MySQL 慢查询功能
Query OK, 0 rows affected (0.00 sec)mysql> show variables like '%slow%';
+---------------------------+------------------------------------------+
| Variable_name | Value |
+---------------------------+------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON | //状态为ON
| slow_query_log_file | /usr/local/mysql/data/localhost-slow.log |
+---------------------------+------------------------------------------+
5 rows in set (0.01 sec)
(2)开启MySQL 慢查询功能还能够在 MySQL 的配置文件中进行设定。
[root@localhost data]# vim /etc/my.cnf
[mysqld]
slow_query_log=ON //启动慢查询功能
slow_query_log_file=mysql_slow_query.log //指定存放慢查询日志文件位置
long_qurey_time=1 //设置了超过 1 秒执行的语句被记录
重启MySQL 后,慢查询日志 mysql_slow_query.log 被建立。常常检查慢查询日志,当有查询语句被记录,就须要对其进行优化处理。
[root@localhost data]# systemctl restart mysqld.service //重启MySQL
[root@localhost data]# ls
auto.cnf ib_logfile1 mysql-bin.000001 mysql_error.log sys
ib_buffer_pool ibtmp1 mysql-bin.000002 mysql_general.log
ibdata1 localhost-slow.log mysql-bin.000003 mysql_slow_query.log //慢查询日志
ib_logfile0 mysql mysql-bin.index performance_schema
查看慢查询时间设置
mysql> show variables like 'long_query_time'; //查看慢查询时间设置
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 1.000000 | //慢查询时间为 1 秒,与以前配置文件中时间相同
+-----------------+----------+
1 row in set (0.00 sec)
进行慢查询测试生成慢查询日志。
mysql> select sleep(6); //休眠6s
+----------+
| sleep(6) |
+----------+
| 0 |
+----------+
1 row in set (6.00 sec)mysql> show global status like '%slow%'; //查看慢查询状态
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| Slow_launch_threads | 0 |
| Slow_queries | 1 |
+---------------------+-------+
2 rows in set (0.00 sec)
查看生成的慢查询日志
[root@localhost data]# cat mysql_slow_query.log //查看生成的慢查询日志
/usr/local/mysql/bin/mysqld, Version: 5.7.17-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /usr/local/mysql/mysql.sock
Time Id Command Argument
/usr/local/mysql/bin/mysqld, Version: 5.7.17-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /usr/local/mysql/mysql.sock
Time Id Command Argument
# Time: 2018-08-29T09:04:25.235721Z
# User@Host: root[root] @ localhost [] Id: 4
# Query_time: 6.001888 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1535533465;
select sleep(6); // 休眠 6 秒