服务器磁盘爆满,好捉急呀,如何清理MySQL日志?
前言
服务器爆满,清理MySQL的日志可以立马释放空间,本文对常用日志清理做了详细的阐述
🚀 1.错误日志
错误日志对 mysql的启动、运行、关闭过程进行了记录,
MySQL DBA 在遇到问题时候,第一时间应该查看这个错误日志文件,
该文件不但记录了出错信息,还记录了一些警告信息以及正确信息,
这个 error 日志文件类似于 oracle 的 alert 文件。
可以通过“show variables like ‘log_error’;”命令查看错误日志的路径
🌈 1.1 配置方法
默认是启动的,一般以err做后缀名,需要在参数文件中配置
先找到参数文件
log_error = /usr/local/mysql/data/error.err
🌈 1.2 错误日志清理
[root@jeames data]# mv log.err log-old.err
mysql> FLUSH LOGS;
服务器将关闭并重新打开日志文件
C:\Users\wangd>mysqladmin -uroot -p -P3308 flush-logs
🚀 2.慢查询日志
当查询超过一定时间没有返回结果的时候,才会记录进慢查询日志。
• 慢查询日志可以帮助 DBA 找出执行效率缓慢的 SQ语句,为数据库优化工作提供帮助。
• 慢查询日志默认是不开启的,建议开启慢查询日志。
• 当需要进行采样分析时手工开启。
🌈 2.1 功能
MySQL的慢查询日志是 MySQL 提供的一种日志记录,
它用来记录在 MySQL 中响应时间超过阀值的语句,
具体指 运行时间超过 long_query_time 的值的 SQL ,则会被记录到慢查询日志中。
mysql> show variables like ‘%long_query_time%’;
long_query_time 的默认值为 10,意思是运行 10S 以上的语句。
默认情况下,Mysql 数据库并不启动慢查询日志,
需要我们手动来设置这个参数,
当然,如果不是调优需要的话,一般不建议启动该参数,
因为开启慢查询日志会或多或少带来一定的性能影响。
慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。
🌈 2.2 慢查询日志开启
关于慢查询日志,主要涉及到下面几个参数:
slow_query_log :是否开启慢查询日志功能(必填)
slow_query_log_file:慢查询日志文件及位置
long_query_time :超过设定值,将被视作慢查询,并记录至慢查询日志文件中(必填)
也就是说,只有满足以上三个条件,“慢查询功能”才可能正确开启。
mysql> show variables like ‘%slow_%’;
mysql> set global slow_query_log=1;
mysql> show variables like ‘%slow_%’;
show variables like ‘%slow_query_log_file%’;
参数文件修改如下:
修改配置文件my.cnf,在[mysqld]下的下方加入
[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1
重启MySQL服务service mysqld restart即可
🌈 2.3 清除慢查询日志
select * from performance_schema.global_variables where variable_name in
(‘slow_query_log’,‘log_output’,‘slow_query_log_file’,‘long_query_time’)
SET GLOBAL slow_query_log = ‘OFF’;
mysql> flush slow logs;
🌈 2.4 慢查询写到表里
– log_output 默认是FILE,表示慢查询日志输入至日志文件,可以通过set修改输出为TABLE
mysql> show variables like ‘%log_output%’;
#默认是FILE,表示慢查询日志输入至日志文件,可以通过set修改输出为TABLE
mysql> set global log_output = ‘FILE’;
mysql> set global log_output = ‘TABLE’;
无法直接删除,如果直接删除的话,
会出现“ERROR 1556 (HY000): You can’t use locks with log tables.”的错误提示
SET GLOBAL slow_query_log = ‘OFF’;
RENAME TABLE slow_log TO slow_log_temp;
DELETE FROM slow_log_temp WHERE start_time < DATE(NOW());
RENAME TABLE slow_log_temp TO slow_log;
SET GLOBAL slow_query_log = ‘ON’;
🚀 3.全查询日志
全查询日志记录了所有对数据库请求的信息,
正确的 SQL才会被记录下来(错误写法的 SQL 语句不会记录),
包括 show、查询 select 语句、权限不足的语句(ERROR 1044 (42000): Access denied for user)。默认位置在变量 datadir 下,默认文件名为:主机名.log。
MySQL 的通用查询日志默认情况下是不开启的,当需要进行采样分析时手工开启
mysql> show variables like ‘general_log’;
mysql> show variables like ‘%general_log_file%’;
🌈 3.1 日志开启
mysql> SET GLOBAL general_log=1;
mysql> show variables like ‘general_log’;
默认名称为:变量 datadir 下:主机名.log
查询日志记录查询语句与启动时间,建议不是在调试环境下不要开启查询日志,
因为会不断占据你的磁盘空间,并会产生大量的 IO。
🌈 3.2 日志清理
##log清理
SET GLOBAL general_log = ‘OFF’;
[root@jeames data]# mv jeames.log jeames_old.log
mysql> flush general logs;
##如果你的日志是写到表里的,则通过以下方法
SET GLOBAL general_log = ‘OFF’;
RENAME TABLE general_log TO general_log_temp;
DELETE FROM general_log_temp WHERE event_time < DATE(NOW());
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = ‘ON’;
🚀 4.二进制日志
Binlog是MySQL中一个很重要的日志,记录了对数据库进行变更的操作,
但是不包括 select操作以及 show 操作,因为这类操作对数据库本身没有没有修改。
如果想记录 select和 show 的话,那就需要开启全查询日志。
另外 binlog 还包括了执行数据库更改操作时间和执行时间等信息。
binlog 是 MySQL Server 层记录的二进制日志文件,逻辑层面
🌈 4.1 二进制日志配置
注:若想开启二进制日志,则必须加上 server_id 参数,如下
[mysqld]
log-bin
server_id=80233306
🌈 4.2 作用
(1)恢复 recovery 。某些数据的恢复需要二进制日志,在全库文件恢复后,
可以在此基础上通过二进制日志进行 point-to-time 的恢复(mysqldump 全量恢复+binlog增量恢复)。
(2)复制(replication)。其原理和恢复类似,
通过复制和执行二进制日志使得一台远程的 mysql数据库(slave)于一台 mysql 数据库(master)进行实时同步。
🌈 4.3 清理二进制日志
mysql> show variables like ‘%binlog_expire_logs_seconds%’ ;
mysql 8开始 expire_logs_days废弃
启用binlog_expire_logs_seconds设置binlog自动清除日志时间
保存时间 以秒为单位;默认2592000 30天
14400 4小时;86400 1天;259200 3天
##自动删除
mysql> set global binlog_expire_logs_seconds=86400;
mysql> set global binlog_expire_logs_seconds=2592000;
##手动删除
默认日志文件达到 1G 都会重新生成一个新的二进制日志文件
mysql> select @@max_binlog_size;
#binlog.000025 之前的日志都会被删除
mysql> PURGE BINARY LOGS TO ‘binlog.000025’;
#时间’2020-04-28 23:59:59’之前的日志都会被删除
mysql> PURGE BINARY LOGS BEFORE ‘2020-04-28 23:59:59’;
#清空历史二进制日志,从 000001 开始重新
mysql> RESET MASTER;
mysql> select @@binlog_format ;