MYSQL日志管理
我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。
个人博客:传送阵
笔者微信:zhanghe15069028807
目录
日志 | 作用 |
---|---|
error log错误日志 | 记录mysql启停错误信息,用于运维排错 |
general log普通日志 | 记录客户端查询日志,用于开发 |
bin log 二进制日志 | 用于增加备份 |
slow log 慢查询日志 | 查询执行速度慢的语句,用于调优 |
1、错误日志
错误日志是我们运维人员用的最多的日志了,里面记录了数据库启动/关闭时的提示信息,我们可以利用错误日志定位到错误。
1、查看错误日志默认存放的位置
MariaDB [(none)]> show variables like "log_error%";
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| log_error | /var/log/mariadb/mariadb.log |
+---------------+------------------------------+
1 row in set (0.00 sec)
2、更改错误日志存放的位置并授权
[root@mysql01 ~]# grep error /etc/my.cnf
[mysqld]
log-error=/log/mysql/err.log
[root@mysql01 ~]# mkdir -p /log/mysql ; touch /log/mysql/err.log
[root@mysql01 ~]# chown -R mysql:mysql /log/mysql/err.log
//然后重启数据库
3、查看错误日志常用操作
[root@mysql01 ~]# grep -i "error" /log/mysql/err.log
2、查询日志
查询日志会把所有人对数据库的所有的操作都记录下来,常用于开发测试数据库,运维默认将其关闭,因为一直开着它,会产生大量的无用IO。
1、开启general日志
[root@mysql01 ~]# grep "general" /etc/my.cnf
[mysqld]
general_log=ON
general_log_file=/log/mysql/select.log
2、创建对应的目录与日志文件,并授权
[root@mysql01 ~]# mkdir -p /log/mysql
[root@mysql01 ~]# touch /log/mysql/select.log
[root@mysql01 ~]# chown -R mysql:mysql /log/mysql/select.log
//重启生效
3、查看日志,任何操作都会记录
[root@mysql01 ~]# cat /log/mysql/select.log
/usr/libexec/mysqld, Version: 5.5.64-MariaDB (MariaDB Server). started with:
Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
191122 11:51:28 3 Connect root@localhost as anonymous on
3 Query select @@version_comment limit 1
3 Query show databases
3 Quit
4、通过变量查看查询日志的位置与启动
MariaDB [(none)]> show variables like "general_log%";
+------------------+-----------------------+
| Variable_name | Value |
+------------------+-----------------------+
| general_log | ON |
| general_log_file | /log/mysql/select.log |
+------------------+-----------------------+
2 rows in set (0.00 sec)
//临时开启查询日志
MariaDB [(none)]> set global general_log = ON;
Query OK, 0 rows affected (0.00 sec)
//临时关闭查询日志
MariaDB [(none)]> set global general_log = OFF;
Query OK, 0 rows affected (0.00 sec)
3、慢查询日志
慢查询日志用于运维人员定位到执行缓慢的语句,用于数据库的调优。运维能做的仅仅是通过慢查询日志来找出哪些语句比较慢,然后把这语句告诉开发,让开发进行做索引或语句的优化,运维不能擅自改动,因为开发对于业务比较熟悉。数据库语句执行较慢的原因主要有二:
- 开发水平较低,把能简单操作语句写的很长,很复杂,比较普通内连接能完成的事结果把语句写的很长很复杂
- 数据量很大导致的速度慢,这种情况就需要建立索引了,但索引最好也是开发进行建立。
1、开启慢查询日志
[root@mysql01 ~]# cat /etc/my.cnf
[mysqld]
slow_query_log = on
slow_query_log_file=/log/mysql/slow.log
long_query_time=2
#log_queries_not_using_indexes #忽略索引,索引做的不好也会查的慢
2、创建对应目录与日志文件,并授权
[root@mysql01 ~]# mkdir -p /log/mysql ; touch /log/mysql/slow.log
[root@mysql01 ~]# chown -R mysql:mysql /log/mysql/slow.log
//重启数据库生效
3、执行过慢语句进行测试
MariaDB [(none)]> select BENCHMARK(500000000,2*3); #6秒
+--------------------------+
| BENCHMARK(500000000,2*3) |
+--------------------------+
| 0 |
+--------------------------+
1 row in set (6.14 sec)
4、检查慢日志是否记录
[root@mysql01 ~]# cat /log/mysql/slow.log
/usr/libexec/mysqld, Version: 5.5.64-MariaDB (MariaDB Server). started with:
Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 191122 12:14:20
# User@Host: root[root] @ localhost []
# Thread_id: 2 Schema: QC_hit: No
# Query_time: 6.138377 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1574396060;
select BENCHMARK(500000000,2*3);
4、二进制日志
二进制日志只记录数据被修改的信息,所以二进制日志常用于做数据恢复。
1、开启binLog
二进制日志
[root@mysql01 ~]# cat /etc/my.cnf
[mysqld]
server-id = 161
log-bin = /log/mysql/bin/sql_70_161
expire_logs_days = 30 #30天前之前的内容自动删除
mysql> show variables like 'log_bin%'; #查看二进制日志是否开启成功
2、创建对应目录与日志文件,并授权
[root@mysql01 ~]# mkdir -p /log/mysql/bin
[root@mysql01 ~]# touch /log/mysql/bin/sql_70_161
[root@mysql01 ~]# chown -R mysql:mysql /log/mysql/bin
[root@mysql01 ~]# systemctl restart mariadb
3、查看binlog
信息
[root@mysql01 ~]# mysqlbinlog -v /log/mysql/bin/sql_70_161.000001
4、日志截断
-
切割binlog日志
重启数据库或者执行flush logs;
在控制台执行reset master会清空所有binlog(危险) -
删除部分binlog日志
MariaDB [(none)]> purge master logs to 'sql_70_161.000003'; #删除指定日志以前的日志文件