mysql optimize 清理碎片

---定期清理脚本 
0 1  * * 4 root /root/qingli_mysql.sh 
[root@newmysql5 ~]# cat qingli_mysql.sh 
#!/bin/bash 
date=`date +"%Y-%m-%d %H:%M:%S"` 
echo $date >>/root/qingli.log 
tables=$(mysql -u root -p"tina" 2>/dev/null -e "select concat(table_schema,'.',table_name) from information_schema.tables where data_free>0 and engine !='MEMORY';" |grep -v "concat") 

for table in $tables 
do 
  mysql -u root -p"****" 2>/dev/null -e "optimize table $table;" >>/root/qingli.log 
done 
---- 

1、清理mysql碎片 
查询存在碎片的表和碎片的大小: 
mysql>select concat('optimize table ',table_schema,'.',table_name,';'),data_free,engine from information_schema.tables where data_free>0 and engine !='MEMORY'; 
+-----------------------------------------------------------+-----------+--------+ 
| concat('optimize table ',table_schema,'.',table_name,';') | data_free | engine | 
+-----------------------------------------------------------+-----------+--------+ 
| optimize table 117demo.scan_url;                          |   5242880 | InnoDB | 
| optimize table antiyfeature.basic_csv_file;               |   4194304 | InnoDB | 
| optimize table antiyfeature.gen_avl_entry;                |   4194304 | InnoDB | 
| optimize table antiyfeature.sample_info;                  |   4194304 | InnoDB | 
| optimize table avlyun_googleplay.app_package;             |   7340032 | InnoDB | 
| optimize table avlyun_googleplay.app_update;              | 376438784 | InnoDB | 
| optimize table enginedn.ads_opc_avl;                      |   4194304 | InnoDB | 
| optimize table enginedn.avl_info;                         |   4194304 | InnoDB | 
| optimize table enginedn.basic_avl_info;                   |   4194304 | InnoDB | 
| optimize table enginedn.basic_csv_file;                   |   4194304 | InnoDB | 
| optimize table enginedn.gen_change_record;                |   4194304 | InnoDB | 
| optimize table enginedn.opc_avl_info;                     |   4194304 | InnoDB | 
| optimize table enginedn.package_channel;                  |   4194304 | InnoDB | 
| optimize table enginedn.package_info;                     |   4194304 | InnoDB | 
| optimize table enginedn.scdf_avl_info;                    |   4194304 | InnoDB | 
| optimize table enginedn.sign_avl_info;                    |   4194304 | InnoDB | 
| optimize table mobile_event.program_url;                  |   4194304 | InnoDB | 
| optimize table mobile_event.sample;                       |   4194304 | InnoDB | 
| optimize table mobile_event.sample_url;                   |   4194304 | InnoDB | 
| optimize table mobile_event.virus_url;                    |   4194304 | InnoDB | 
| optimize table mysql.innodb_index_stats;                  |   4194304 | InnoDB | 
| optimize table sohu.detail_sohu;                          |   7340032 | InnoDB | 
+-----------------------------------------------------------+-----------+--------+ 
23 rows in set (0.13 sec)   --共有39个表有碎片,较小的已经提前清理,剩下的需要在空闲时间清理,预计耗时1h30min,可放在凌晨执行~ 
清理步骤: 
执行命令optimize table  table_name; 

注意:OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。在OPTIMIZE TABLE运行过程中,MySQL会锁定表。 
即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。

| optimize table antiy_bbs.bbs_common_session;              |      2492 | MEMORY |    --不支持这种格式 
mysql> optimize table antiy_bbs.bbs_common_session; 
+------------------------------+----------+----------+-----------------------------------------------------------+ 
| Table                        | Op       | Msg_type | Msg_text                                                  | 
+------------------------------+----------+----------+-----------------------------------------------------------+ 
| antiy_bbs.bbs_common_session | optimize | note     | The storage engine for the table doesn't support optimize | 
+------------------------------+----------+----------+-----------------------------------------------------------+ 
| optimize table sohu.basic_sohu;                           |   3145728 | InnoDB |   --3M耗时2min47s 

--出现这种,就表示已经清理了 
mysql> optimize table antiy_bbs.bbs_ucenter_newpm; 
+-----------------------------+----------+----------+-----------------------------+ 
| Table                       | Op       | Msg_type | Msg_text                    | 
+-----------------------------+----------+----------+-----------------------------+ 
| antiy_bbs.bbs_ucenter_newpm | optimize | status   | Table is already up to date | 
+-----------------------------+----------+----------+-----------------------------+ 
1 row in set (0.25 sec) 

MYSQL的文档说明了,当INNODB时,MYSQL会以ALTER TABLE去执行这个命令。 所以最终还是会看到 OK 的状态。 
mysql> OPTIMIZE TABLE foo; 
+----------+----------+----------+-------------------------------------------------------------------+ 
| Table    | Op       | Msg_type | Msg_text                                                          | 
+----------+----------+----------+-------------------------------------------------------------------+ 
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead | 
| test.foo | optimize | status   | OK                                                                | 
+----------+----------+----------+-------------------------------------------------------------------+ 

//////////////////////////////////// 
注意:生产上不要随便操作,因为会锁表。 

mysql> show index from basic_sohu from sohu; 
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| basic_sohu |          0 | PRIMARY  |            1 | id          | A         |        8764 |     NULL | NULL   |      | BTREE      |         |               | 
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
1 row in set (0.00 sec) 

mysql中OPTIMIZE TABLE的作用 (2009-04-01 17:44:39)转载▼ 
标签: 杂谈 分类: 工作 
1、先来看看多次删除插入操作后的表索引情况 
mysql> SHOW INDEX FROM `tbl_name`; 
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| tbl_name | 0 | PRIMARY | 1 | StepID | A | 1 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | FlowID | 1 | FlowID | A | 1 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerCount | 1 | WagerCount | A | 1 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_3 | 1 | WagerID | A | 1 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_3 | 2 | StepType | A | 1 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_3 | 3 | ParamResult | A | 1 | 255 | NULL | | BTREE | | 
| tbl_name | 1 | StepType_2 | 1 | StepType | A | 1 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | StepType_2 | 2 | ParamResult | A | 1 | 255 | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_2 | 1 | WagerID | A | 1 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_2 | 2 | StepType | A | 1 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_2 | 3 | ParamResult | A | 1 | 255 | NULL | | BTREE | | 
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
11 rows in set (0.01 sec) 
2、优化表 
mysql> optimize table tbl_name; 
+---------------+----------+----------+----------+ 
| Table | Op | Msg_type | Msg_text | 
+---------------+----------+----------+----------+ 
| test.tbl_name | optimize | status | OK | 
+---------------+----------+----------+----------+ 
1 row in set (40.60 sec) 
3、再来看看优化后的效果 
mysql> SHOW INDEX FROM `tbl_name`; 
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| tbl_name | 0 | PRIMARY | 1 | StepID | A | 172462 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | FlowID | 1 | FlowID | A | 86231 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerCount | 1 | WagerCount | A | 4311 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_3 | 1 | WagerID | A | 86231 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_3 | 2 | StepType | A | 172462 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_3 | 3 | ParamResult | A | 172462 | 255 | NULL | | BTREE | | 
| tbl_name | 1 | StepType_2 | 1 | StepType | A | 9 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | StepType_2 | 2 | ParamResult | A | 86231 | 255 | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_2 | 1 | WagerID | A | 86231 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_2 | 2 | StepType | A | 172462 | NULL | NULL | | BTREE | | 
| tbl_name | 1 | WagerID_2 | 3 | ParamResult | A | 172462 | 255 | NULL | | BTREE | | 
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
最后,来看看手册中关于 OPTIMIZE 的描述: 
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用 
OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新 
利用未使用的空间,并整理数据文件的碎片。 

在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次 
即可,只对特定的表运行。 

OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。 

注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。

时间: 2024-10-01 22:20:47

mysql optimize 清理碎片的相关文章

mysql简单的碎片清理脚本

mysql简单的碎片清理脚本 #!/bin/bash date=`date +"%Y-%m-%d %H:%M:%S"` echo $date >>/root/qingli.log tables=$(/usr/local/mysql/bin/mysql -u root -p"tina" 2>/dev/null -e "select concat(table_schema,'.',table_name) from information_sc

MySQL数据清理的需求分析和改进

昨天帮一个朋友看了MySQL数据清理的问题,感觉比较有意思,具体的实施这位朋友还在做,已经差不多了,我就发出来大家一起参考借鉴下. 为了保证信息的敏感,里面的问题描述可能和真实情况不符,但是问题的处理方式是真实的. 首先这位朋友在昨天下午反馈说他有一个表大小是近600G,现在需要清理数据,只保留近几个月的数据.按照这个量级,我发现这个问题应该不是很好解决,得非常谨慎才对.如果是通用的思路和方法,我建议是使用冷热数据分离的方式.大体有下面的几类玩法: exchange partition,这是亮点

mysql optimize innodb 优化详解

如果对mysql表,进行大范围删除后,最好做一个表优化,这样会快一些.以前写过一篇类似的,针对myisam存储引擎的.请参考:实例说明optimize table在优化mysql时很重要 1,删除数据,并尝试优化 mysql> delete FROM `test` WHERE d_id>397136;  Query OK, 306356 rows affected (19.48 sec)    mysql> optimize table test;  +------------+----

mysql主库清理数据,从库保留

因为业务需要,想在mysql主库清理一些数据,但从库想要保留,根据网友介绍,可以根据binlog跳过清理的命令  1.确保主从同步的情况下,主库开始操作 mysql> flush logs;                    --刷新日志,切换一个新的binlog日志,比较小,后面修改就会方便些 Query OK, 0 rows affected (0.21 sec)  mysql> show master status \G *************************** 1.

MySQL 自动清理binlog日志的方法_Mysql

说明: 开启MySQL binlog日志的服务器,如果不设置自动清理日志,默认binlog日志一直保留着,时间一长,服务器磁盘空间被binlog日志占满,导致MySQL数据库出错. 使用下面方法可以安全清理binlog日志 一.没有主从同步的情况下清理日志 mysql -uroot -p123456 -e 'PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ),INTERVAL 5 DAY)'; #mysql 定时清理5天前的binlog mysql -u root

Facebook MySQL: 索引在线碎片整理特性

背景 我们知道Innodb使用BTREE来进行数据组织存储,当发生INSERT/UPDATE/DELETE时,有可能会产生数据s碎片,不能有效的利用page空间.而这些空洞在未来甚至有可能不再被使用到.即使是顺序的Insert,也可能产生空间浪费:为了保证以后对相同page的更新不会产生page分裂,Innodb总是为其保留一部分的剩余空间. 本文是对之前写的这篇博客的整理和补充(http://mysqllover.com/?p=1014) DML操作的空间影响 INSERT操作 对于INSER

【MySQL】mysql optimize table

维护mysql 对表空间的回收策略是只拓展,不回收.对表执行delete之后,表空间是不回收的,空闲的空间可以被insert 继续使用,通常执行truncate,重新逻辑导出,再导入或者执行optimize table 三种都可以重新使用未使用的表空间. 本文介绍一下optimize table OPTIMIZE TABLE可以重新利用未使用的空间,并整理数据文件的碎片. 1 演示回收空间 删除之前: [root@rac1 test]# ll tab.ibd -rw-rw---- 1 mysql

如何回收mysql表的碎片

由于操作人员大量的删除了relationship表的数据达2千万行,但是mysql并不自动回收空间,所以决定做碎片整理(先测试): myisamchk -r relationship 在mysql运行下做的,结果做完后查询的时候出现下面的问题: ERROR 1030 (00000): Got error 127 from table handler 这个问题很郁闷,应该不会出现问题的呀,后来查阅资料发现了问题: 如果你用--skip-locking运行mysqld(它在一些系统上是缺省的,如Li

解析mysql 表中的碎片产生原因以及清理_php技巧

大量删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来 .对于不同的存储引擎整理碎片的方式不一样.myisam可以有以下方式:mysql> show table status from test like 'testusers'\G*************************** 1. row ***************************  ....           Rows: 3 Avg_row_length: 45