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'; #删除指定日志以前的日志文件

原文地址:https://www.cnblogs.com/yizhangheka/p/11911093.html