当数据库磁盘空间不足的时候,一般选择扩容,归档,优化表空间。
优化表空间主要包括:重复索引、未使用的索引,表空间大小情况,清理碎片。
undo redo 临时表空间 binlog relaylog general_log error_log 等。
还有一种,MySQL数据库崩溃,执行失败,执行超时,异常情况下可能会导致一些存放中间结果的残留中间表。
一般以#sql开头。
以下清理方法,均可能导致大量的buffer io的占用,因此在业务低峰期执行,避免影响业务,甚至MySQL崩溃。
一、索引表空间
(1) 索引
查询没有主键的表
SELECT * FROM information_schema.tables AS t
LEFT JOIN (SELECT DISTINCT table_schema, table_name FROM information_schema.`KEY_COLUMN_USAGE` ) AS kt ON kt.table_schema=t.table_schema AND kt.table_name = t.table_name
WHERE t.table_schema NOT IN ('mysql', 'information_schema', 'performance_schema')
and t.table_type='BASE TABLE'
AND kt.table_name IS NULL
重复索引和未使用索引
show create table xxxx;去分析
或者 查询重复索引 和未使用过的索引
select * from sys.schema_redundant_indexes;
select * from sys.schema_unused_indexes;
如果没有开启。或者SQL:
select a.`table_schema`,a.`table_name`,a.`index_name`,a.`index_columns`,b.`index_name`,b.`index_columns`,concat('ALTER TABLE `',a.`table_schema`,'`.`',a.`table_name`,'` DROP INDEX `',a.`index_name`,'`') from ((select `information_schema`.`statistics`.`TABLE_SCHEMA` AS `table_schema`,`information_schema`.`statistics`.`TABLE_NAME` AS `table_name`,`information_schema`.`statistics`.`INDEX_NAME` AS `index_name`,max(`information_schema`.`statistics`.`NON_UNIQUE`) AS `non_unique`,max(if(isnull(`information_schema`.`statistics`.`SUB_PART`),0,1)) AS `subpart_exists`,group_concat(`information_schema`.`statistics`.`COLUMN_NAME` order by `information_schema`.`statistics`.`SEQ_IN_INDEX` ASC separator ',') AS `index_columns` from `information_schema`.`statistics` where ((`information_schema`.`statistics`.`INDEX_TYPE` = 'BTREE') and (`information_schema`.`statistics`.`TABLE_SCHEMA` not in ('mysql','sys','INFORMATION_SCHEMA','PERFORMANCE_SCHEMA'))) group by `information_schema`.`statistics`.`TABLE_SCHEMA`,`information_schema`.`statistics`.`TABLE_NAME`,`information_schema`.`statistics`.`INDEX_NAME`) a
join (select `information_schema`.`statistics`.`TABLE_SCHEMA` AS `table_schema`,`information_schema`.`statistics`.`TABLE_NAME` AS `table_name`,`information_schema`.`statistics`.`INDEX_NAME` AS `index_name`,max(`information_schema`.`statistics`.`NON_UNIQUE`) AS `non_unique`,max(if(isnull(`information_schema`.`statistics`.`SUB_PART`),0,1)) AS `subpart_exists`,group_concat(`information_schema`.`statistics`.`COLUMN_NAME` order by `information_schema`.`statistics`.`SEQ_IN_INDEX` ASC separator ',') AS `index_columns` from `information_schema`.`statistics` where ((`information_schema`.`statistics`.`INDEX_TYPE` = 'BTREE') and (`information_schema`.`statistics`.`TABLE_SCHEMA` not in ('mysql','sys','INFORMATION_SCHEMA','PERFORMANCE_SCHEMA'))) group by `information_schema`.`statistics`.`TABLE_SCHEMA`,`information_schema`.`statistics`.`TABLE_NAME`,`information_schema`.`statistics`.`INDEX_NAME`) b
on(((a.`table_schema` = b.`table_schema`) and (a.`table_name` = b.`table_name`))))
where ((a.`index_name` <> b.`index_name`) and (((a.`index_columns` = b.`index_columns`) and ((a.`non_unique` > b.`non_unique`) or ((a.`non_unique` = b.`non_unique`) and (if((a.`index_name` = 'PRIMARY'),'',a.`index_name`) > if((b.`index_name` = 'PRIMARY'),'',b.`index_name`))))) or ((locate(concat(a.`index_columns`,','),b.`index_columns`) = 1) and (a.`non_unique` = 1)) or ((locate(concat(b.`index_columns`,','),a.`index_columns`) = 1) and (b.`non_unique` = 0))));
未使用过的索引:
select `information_schema`.`statistics`.`TABLE_SCHEMA` AS `table_schema`,`information_schema`.`statistics`.`TABLE_NAME` AS `table_name`,`information_schema`.`statistics`.`INDEX_NAME` AS `index_name`,max(`information_schema`.`statistics`.`NON_UNIQUE`) AS `non_unique`,max(if(isnull(`information_schema`.`statistics`.`SUB_PART`),0,1)) AS `subpart_exists`,group_concat(`information_schema`.`statistics`.`COLUMN_NAME` order by `information_schema`.`statistics`.`SEQ_IN_INDEX` ASC separator ',') AS `index_columns` from `information_schema`.`statistics` where ((`information_schema`.`statistics`.`INDEX_TYPE` = 'BTREE') and (`information_schema`.`statistics`.`TABLE_SCHEMA` not in ('mysql','sys','INFORMATION_SCHEMA','PERFORMANCE_SCHEMA'))) group by `information_schema`.`statistics`.`TABLE_SCHEMA`,`information_schema`.`statistics`.`TABLE_NAME`,`information_schema`.`statistics`.`INDEX_NAME`
查询索引的使用情况
select index_name,rows_selected,rows_inserted,rows_updated,rows_deleted from schema_index_statistics where table_schema='dbname';
清理方法:完成后空间会立刻释放
alter table tab_name drop index idx_name;
drop index idx_name on tab_name;
(2)表空间大小(筛选大表):
数据文件占用大小(筛选大表top20)
select table_schema,table_name,round((sum(data_length+index_length))/1024/1024,2) as TotalSizeMB
from information_schema.tables
#where table_schema='test'
#and table_name='f_clusters'
group by table_schema,table_name
#having TotalSizeMB > 1000
order by TotalSizeMB desc
limit 20;
物理文件大小:5.7及以上
SELECT
CONCAT(SUM(TOTAL_EXTENTS), ' MB') AS TotalFileSize
FROM
INFORMATION_SCHEMA.FILES;
表碎片率
select table_schema,table_name,round(sum(data_length)/1024/1024,2) as DataSizeMB,
round(sum(index_length)/1024/1024,2) as IndexSizeMB,
round((sum(data_length+index_length+data_free))/1024/1024,2) as TotalSizeMB,
round(sum(data_free)/1024/1024,2) as FreeSizeMB,
round((sum(data_free)/sum(data_length+index_length+data_free))/1024/1024,2) as FreePct
FROM information_schema.TABLES
where table_schema not in ('mysql','information_schema','performance_schema','sys')
#and table_schema='test'
#and table_name='f_clusters''
group by table_schema,table_name
#having TotalSizeMB > 1000
order by FreePct desc
limit 20;
或者指定碎片率大于50%的表:
having FreePct >50;
分区表索引大小:
SELECT SUM(stat_value) pages, index_name,
(SUM(stat_value)*@@innodb_page_size)/1024/1024 as total_length
FROM mysql.innodb_index_stats WHERE table_name like 'ums_clientdata#P%'
AND stat_name = 'size' GROUP BY index_name;
普通表,索引大小:
SELECT SUM(stat_value) pages, index_name,
(SUM(stat_value)*@@innodb_page_size)/1024/1024 size_M
FROM mysql.innodb_index_stats WHERE table_name='t_fan_dynamic'
AND stat_name = 'size' GROUP BY index_name;
清理方法:回收碎片空间,包括表和索引,立刻释放
optimize table tab_name;
ALTER TABLE xxxx ENGINE= INNODB
部分数据数据归档,使用delete语句是无法释放空间,只会标记数据行。需要使用optimize table来回收空间。
不需要的表库/已经归档的表库。(可以使用mysqldump直接导出SQL语句,归档至本地)
drop table tab_name/drop database db_name
如果还是无法回收空间。可以新建表,迁移数据到新表的方法回收。
lock table tab_name;
insert into new_tab_name select * from tab_name;
rename tab_name to old_tab_name; rename new_tab_name to tab_name;
drop table old_tab_name;
二、 undo 表空间
mysql undo 表空间设置自动扩展,如果业务上有跑批量或者大表的DML操作时,引起大事物,或针对多张大表关联更新时间较长,大量的未提交长事务等。可能短时间内会导致undo表空间暴涨。
MySQL8.0方法:
mysql8.0 innodb_undo_log_truncate参数默认开启的,并且mysql8.0中默认innodb_undo_tablespace为2个。
mysql> show variables like '%undo%';
+--------------------------+-----------------------+
| Variable_name | Value |
+--------------------------+-----------------------+
| innodb_max_undo_log_size | 4294967296 |
| innodb_undo_directory | /data1/mysql8/undolog |
| innodb_undo_log_encrypt | OFF |
| innodb_undo_log_truncate | ON |
| innodb_undo_tablespaces | 2 |
+--------------------------+-----------------------+
5 rows in set (0.01 sec)
mysql> system du -sh /data/mysql8/undolog/*
16M /data/mysql8/undolog/undo_001
16M /data/mysql8/undolog/undo_002
添加新的undo表空间undo003。系统默认是2个undo,大小设置4G
mysql>create undo tablespace undo003 add datafile '/data/mysql8/undolog/undo003.ibu';
注意:创建添加新的undo必须以.ibu结尾,否则触发错误.
查看系统中的undo表空间信息,如下:
mysql>select * from information_schema.INNODB_TABLESPACES where name like '%undo%';
+------------+-----------------+------+------------+-----------+-----------+----------------+--------+
| SPACE | NAME | FLAG | ROW_FORMAT | PAGE_SIZE | FILE_SIZE | ALLOCATED_SIZE | STATE |
+------------+-----------------+------+------------+-----------+-----------+----------------+--------+-
| 4294967279 | innodb_undo_001 | 0 | Undo | 16384 | 16777216 | 16777216 | active|
| 4294967278 | innodb_undo_002 | 0 | Undo | 16384 | 16777216 | 16777216 | active|
| 4294967277 | undo003 | 0 | Undo | 16384 | 16777216 | 16777216 | active|
+------------+----------------------+----+------------+-----------+---------------+------------+---------+
3 rows in set (0.00 sec)
查看到上述视图中 innodb_undo_002 大小达到16777216 (16M)其状态state为active。手动将其设置为 inactive,使其自动触发 innodb_undo_log_truncate 回收。
mysql >alter undo tablespace innodb_undo_002 set inactive;
mysql >select * from information_schema.INNODB_TABLESPACES where name like '%undo%';
+------------+-----------------+------+------------+-----------+-----------+----------------+--------+
| SPACE | NAME | FLAG | ROW_FORMAT | PAGE_SIZE | FILE_SIZE | ALLOCATED_SIZE | STATE |
+------------+-----------------+------+------------+-----------+-----------+----------------+--------+-
| 4294967279 | innodb_undo_001 | 0 | Undo | 16384 | 16777216 | 16777216 | active|
| 4294967278 | innodb_undo_002 | 0 | Undo | 16384 | 16777216 | 16777216 | empty |
| 4294967277 | undo003 | 0 | Undo | 16384 | 16777216 | 16777216 | active|
+------------+-----------------+------+------------+-----------+---------------+------------+---------+
3 rows in set (0.00 sec)
此时可以查看对应操作系统目录中的 undo_002状态 empty
查看新增的undo003文件大小
mysql >system du -sh /data1/mysql8/undolog/*
16M /data1/mysql8/undolog/undo_001
1M /data1/mysql8/undolog/undo_002
16M /data1/mysql8/undolog/undo003.ibu
重新将innodb_undo_002设置为active状态
mysql >alter undo tablespace innodb_undo_002 set active;
确认状态。
mysql >select * from information_schema.INNODB_TABLESPACES where name like '%undo%';
为什么直接不能直接针对膨胀的undo设置为inactive,系统默认创建的undo表空间默认2个,不得少于2个。
新创建添加的可以正常设置为inactive之后,使用drop方式删除,如下:
mysql >alter undo tablespace undo003 set inactive;
mysql >drop undo tablespace undo003;
mysql>system du -sh /data1/mysql8/undolog/*
总结:
1、增加undo表空间的数量大于2.
2、设置膨胀的undo表空间为inactive
3、系统参数innodb_undo_log_truncate打开后会自动回收。innodb_purge_rseg_truncate_frequency调小可加快回收
4、设置原undo表空间为active,删除新添加的表空间。
MySQL 5.5方法:
MySQL5.5以及之前,InnoDB的undo log也是存放在ibdata1里面的。一旦出现大事务,这个大事务所使用的undo log占用的空间就会一直在ibdata1里面存在,即使这个事务已经关闭。
没有直接的办法,只能全库导出sql文件,然后重新初始化mysql实例,再全库导入
MySQL 5.6方法:
MySQL 5.6增加了参数:独立表空间,从ibdata1中独立出来。
innodb_undo_directory undo表空间目录,实例初始化之后不可更改
innodb_undo_logs回滚段的个数,默认128。
innodb_undo_tablespaces,表空间个数。 实例初始化之后不可更改。
没有直接的办法,只能全库导出sql文件,然后重新初始化mysql实例,再全库导入
MySQL 5.7方法:
MySQL 5.7引入了新的参数,innodb_undo_log_truncate,开启后可在线收缩拆分出来的undo表空间。
在满足以下2个条件下,undo表空间文件可在线收缩:
(1)innodb_undo_tablespaces>=2。因为truncate undo表空间时,该文件处于inactive状态,如果只有1个undo表空间,那么整个系统在此过程中将处于不可用状态。为了尽可能降低truncate对系统的影响,建议将该参数最少设置为3;
(2)innodb_undo_logs>=35(默认128)。因为在MySQL 5.7中,第一个undo log永远在系统表空间中,另外32个undo log分配给了临时表空间,即ibtmp1,至少还有2个undo log才能保证2个undo表空间中每个里面至少有1个undo log;
满足以上2个条件后,把innodb_undo_log_truncate设置为ON即可开启undo表空间的自动truncate,这还跟如下2个参数有关:
(1)innodb_max_undo_log_size,undo表空间文件超过此值即标记为可收缩,默认1G,可在线修改;
(2)innodb_purge_rseg_truncate_frequency,指定purge操作被唤起多少次之后才释放rollback segments。当undo表空间里面的rollback segments被释放时,undo表空间才会被truncate。由此可见,该参数越小,undo表空间被尝试truncate的频率越高。
# 为了实验方便,我们减小该值
innodb_max_undo_log_size = 100M
innodb_undo_log_truncate = ON
innodb_undo_logs = 128
innodb_undo_tablespaces = 3
innodb_purge_rseg_truncate_frequency = 10
create table t1(
id int primary key auto_increment,
name varchar(200));
insert into t1(name) values(repeat('a',200));
......
插入足够多的数据。 这时undo表空间文件大小如下,可以看到有一个undo文件已经超过了100M:
-rw-r----- 1 mysql mysql 13M Feb 17 17:59 undo001
-rw-r----- 1 mysql mysql 128M Feb 17 17:59 undo002
-rw-r----- 1 mysql mysql 64M Feb 17 17:59 undo003
此时,为了,让purge线程运行,可以运行几个delete语句:
mysql> delete from t1 limit 1;
......
再查看undo文件大小:
-rw-r----- 1 mysql mysql 13M Feb 17 18:05 undo001
-rw-r----- 1 mysql mysql 10M Feb 17 18:05 undo002
-rw-r----- 1 mysql mysql 64M Feb 17 18:05 undo003
可以看到,超过100M的undo文件已经收缩到10M了。
三、 redo 表空间
MySQL8.0 方法
从MySQL8.0.30开始支持参数innodb_redo_log_capacity。该参数设定redo日志的总大小,默认100MB,最大值为128G。该参数设置后原有的innodb_log_files_in_group和innodb_log_file_size参数将被忽略。
MySQL会自动在innodb_log_group_home_dir目录中创建#innodb_redo,每个文件大小为innodb_redo_log_capacity/32。测试环境中设置总大小320M,每一个redo文件大小10M。 未使用的redo日志文件名带_tmp后缀。
mysql> select @@global.innodb_redo_log_capacity;
+-----------------------------------+
| @@global.innodb_redo_log_capacity |
+-----------------------------------+
| 335544320 |
+-----------------------------------+
1 row in set (0.00 sec)
mysql> system ls -lthr /data/mysql/log/#innodb_redo
total 320M
-rw-r----- 1 mysql mysql 10M Oct 19 15:58 #ib_redo2_tmp
-rw-r----- 1 mysql mysql 10M Oct 19 15:58 #ib_redo3_tmp
-rw-r----- 1 mysql mysql 10M Oct 19 15:58 #ib_redo4_tmp
-rw-r---- 1 mysql mysql 10M Oct 19 15:58 #ib_redo5_tmp
-rw-r----- 1 mysql mysql 10M Oct 19 15:58 #ib_redo1
-rw-r-----. 1 mysql mysql 10M Oct 19 15:58 #ib_redo6_tmp
.....
当前使用的redo日志:
mysql> select * from performance_schema.innodb_redo_log_files\G
*************************** 1. row ***************************
FILE_ID: 1
FILE_NAME: /data/mysql/log/#innodb_redo/#ib_redo1
START_LSN: 101996544
END_LSN: 112480256
SIZE_IN_BYTES: 10485760
IS_FULL: 0
CONSUMER_LEVEL: 0
1 row in set (0.00 sec)
redo日志写入的当前LSN:
mysql> show global status like 'Innodb_redo_log_current_lsn';
+-----------------------------+-----------+
| Variable_name | Value |
+-----------------------------+-----------+
| Innodb_redo_log_current_lsn | 102001409 |
+-----------------------------+-----------+
1 row in set (0.00 sec)
也可以用LSN的变化量预估一个合理的redo文件大小
#可以使用以下SQL评估1分钟lsn的变化量,作为innodb_redo_log_capacity的值。
mysql> select @a:=(select VARIABLE_VALUE from global_status where VARIABLE_NAME='Innodb_redo_log_current_lsn');select sleep(60);select @b:=(select VARIABLE_VALUE from global_status where VARIABLE_NAME='Innodb_redo_log_current_lsn');select (@b-@a)/1024/1024;
+--------------------------------------------------------------------------------------------------+
| @a:=(select VARIABLE_VALUE from global_status where VARIABLE_NAME='Innodb_redo_log_current_lsn') |
+--------------------------------------------------------------------------------------------------+
| 102016920 |
+--------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
+-----------+
| sleep(60) |
+-----------+
| 0 |
+-----------+
1 row in set (1 min 0.00 sec)
+--------------------------------------------------------------------------------------------------+
| @b:=(select VARIABLE_VALUE from global_status where VARIABLE_NAME='Innodb_redo_log_current_lsn') |
+--------------------------------------------------------------------------------------------------+
| 102037622 |
+--------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
+----------------------+
| (@b-@a)/1024/1024 |
+----------------------+
| 0.019742965698242188 |
+----------------------+
1 row in set (0.01 sec)
没有办法回收。重新初始化实例,导入数据。
四、 临时表
MySQL在以下几种情况会创建临时表:
1、UNION查询(MySQL 5.7起,执行UNION ALL不再产生临时表,除非需要额外排序。);
2、用到TEMPTABLE算法或者是UNION查询中的视图;
3、ORDER BY和GROUP BY的子句不一样时;
4、表连接中,ORDER BY的列不是驱动表中的;
5、DISTINCT查询并且加上ORDER BY时;
6、SQL中用到SQL_SMALL_RESULT修饰符的查询;
7、FROM中的子查询(派生表);
8、子查询或者semi-join时创建的表;
9、评估多表UPDATE语句;
10、评价GROUP_CONCAT()或COUNT(DISTINCT) 表达式计算;
要确定语句是否需要临时表,请使用EXPLAIN并检查Extra列以查看是否显示Using temporary。但对于派生或实物化的临时表EXPLAIN不一定会显示Using temporary。
MySQL内部参数tmp_table_size表示内部的临时表的最大值,其实生效的是tmp_table_size和max_heap_table_size这两个值之间的最小的那个值。当创建的临时表超过这个值(或者max_heap_table_size)时,MySQL将会在磁盘上创建临时表。
当服务器创建内部临时表(在内存或磁盘上)时,会增加Created_tmp_tables状态变量(SHOW PROCESSLIST可以看到)。如果服务器在磁盘上创建表(最初或通过转换内存中的表),它会增加Created_tmp_disk_tables状态变量。
mysql> show global status like '%Created_tmp%';
通过检查Created_tmp_disk_tables和Created_tmp_tables这两个global状态值来判断在磁盘上创建临时表的次数来进行相应的调优。
某些查询条件阻止使用内存中临时表,在以下几种情况下,会创建磁盘临时表:
1、表中存在BLOB或TEXT列;
2、在SELECT列表中存在任何字符串列的最大长度大于512(二进制字符串的字节),如果被UNION或UNION ALL使用;
3、SHOW COLUMNS FROM DB和DESCRIBE语句中使用BLOB作为用于某些列的类型;
default_tmp_storage_engine是控制CREATE TEMPORARY TABLE创建的临时表的引擎类型,在以前默认是MEMORY。
内部临时表 可以在内存中保持并且由MEMORY存储引擎处理,或者由存储在磁盘上的InnoDB或MyISAM存储引擎处理。
从MySQL 5.7.5开始,新增一个系统选项internal_tmp_disk_storage_engine可定义磁盘临时表的引擎类型为InnoDB
show global variables like '%internal_tmp_disk_storage_engine%';
5.7开始
innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:30G 超过上限时,需要生成临时表的SQL无法被执行.
检查INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO,找到最大的临时表对应的线程,kill之即可释放,但表空间并不会释放。
ibtmp1重启时会被重新初始化,因此释放方法:重启实例。
五、 binlog
查看日志数量和大小
show binary logs;
设置自动删除10天之前的binlog:
mysql> set global expire_logs_days = 10;
手动删除。删除mysql-bin.000002之前的binlog日志(不包括mysql-bin.000002)
mysql> PURGE MASTER LOGS TO 'mysql-bin.000002';
删除指定时间之前的
mysql> PURGE MASTER LOGS BEFORE '2020-06-19 00:00:00';
删除多少天前的。
PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 60 DAY);
注意:清理之前,查看当前master的位点。slave同步的位点。避免主从复制异常。
reset master
方法可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个以.000001为后缀新的二进制日志文件。 该语法一般只用在主从环境下初次建立复制时。 在主从复制进行过程中,该语句是无效的。
六、relay log
relay log通常不需要人工清理,因为从库的复制线程在应用完relay log中的事务后,会自动把relay log删除。每次复制的IO线程重启,都会生成一个新的relay log,每个relay log文件的大小由参数max_relay_log_size控制,该参数默认为0,即表示其大小和binlog文件大小一致,通常也为1G。
清理方法:
执行命令来清除relay log文件,比如:reset slave 和 reset slave all。这两个命令会忘记主从复制关系的位置信息,master.info文件和relay-log.info,将relay log文件全部删除,并且生成新的索引从1开始的relay log。使用之前必须使用stop slave 命令将复制进程停止。
mysql>STOP SLAVE;
mysql>reset slave
mysql>STOP SLAVE;
注 所有的relay log将被删除不管他们是否被SQL thread进程完全应用。
在 5.6 版本中 reset slave 并不会清理存储于内存中的复制信息,在5.6.3 版本以及以后 使用使用 RESET SLAVE ALL 来完全的清理复制连接参数信息。
七、general_log 和 慢查询日志slow_log
有三个参数:general_log、log_output、general_log_file,
set global general_log=on; -- 开启日志功能
set global general_log_file='tmp/general.log'; -- 设置日志文件保存位置
set global log_output='table'; -- 设置输出类型为 table。则数据会直接保存在mysql.general_log中。
set global log_output='file'; -- 设置输出类型为file,这会保存在general_log_file指定的位置
清理方法:
SET GLOBAL general_log = 'OFF';
truncate table mysql.general_log;
如果是输出到文件。者直接清空。
echo > tmp/general.log
慢日志
set global slow_query_log = on;
set global slow_query_log_file = '/data/slow.log';
set global long_query_time = 3;
log_output 同上,指定输出的类型。表还是文件。
清理方法:
SET GLOBAL slow_query_log = 'OFF';
truncate table mysql.slow_log;
如果是输出到文件。直接清空。
echo > /data/slow.log
八、error_log
一般输出到文件。记录运行日志,启动关闭,死锁,错误,异常等信息。
配置[mysqld]中
log_error = /data/error.log
log_error_verbosity=2 #错误日志级别,记录的信息不同。
清理方法:
echo > /data/error.log
九、残留的中间表
SELECT * FROM information_schema.innodb_sys_tables WHERE name like '%#sql%';
或者系统下,数据目录下的表文件。
非常多类似#sql-*.ibd暂时文件和同文件名称的#sql-*.frm
清理方法:
drop table `#mysql50##sql-928_76f7`;
十、审计日志
默认不开启。第三方则有,增长比较大。控制其大小。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战