【转】利用optimize、存储过程和系统表对mysql数据库表进行批量碎片清理释放表空间

本文收集于本人的笔记本,由于找不到原文出处。在此省略,如哪位知道可以联系我加上。

核心是利用mysql系统表和“optimize table 表名”命令,对mysql数据表进行空间的释放。由于delete和drop table都不会释放表空间(truncate 命令会释放表空间【将所有的数据都删除】),所以需要利用optimize 命令进行释放。

这个存储过程目的是给一个库的所有表来整理碎片的。一个表随着插入很频繁,或者一直更新不停的,就会积累好多碎片。如果及时整理一下,查询效率会高出好多。

DELIMITER $$

DROP PROCEDURE IF EXISTS `mysql`.`sp_optimize_tables`$$

CREATE PROCEDURE `mysql`.`sp_optimize_tables`(
 IN db_name varchar(255))
BEGIN
  -- Created by david yeung 20080128.

  -- To optimize all the tables in exact database.

  declare cnt int default 0;
  declare i int default 0;
  select count(*) as total from information_schema.tables where table_schema = db_name into cnt;
  while i < cnt
  do
    -- Get the table's exact name.
    set @stmt = concat('select table_name from information_schema.tables where table_schema = ''',db_name,''' order by table_name asc limit ',i,',1 into @tb_name');
    prepare s1 from @stmt;
    execute s1;
    drop prepare s1;
    set @stmt = '';
    set @stmt = concat('optimize table ',db_name,'.',@tb_name);
    prepare s1 from @stmt;
    execute s1;
    drop prepare s1;
    set @stmt = '';
    set i = i + 1;
  end while;
  -- Refresh tables.

  flush tables;
END$$

DELIMITER ;

 

调用示例:

mysql> use mysql
Database changed
mysql> call sp_optimize_tables('david_test');
+------------------------------+----------+----------+----------+
| Table                        | Op       | Msg_type | Msg_text |
+------------------------------+----------+----------+----------+
| david_test.test1 | optimize | status   | OK       |
+------------------------------+----------+----------+----------+
1 row in set (0.26 sec)

+--------------------------+----------+----------+----------+
| Table                    | Op       | Msg_type | Msg_text |
+--------------------------+----------+----------+----------+
| david_test.test2| optimize | status   | OK       |
+--------------------------+----------+----------+----------+
1 row in set (0.35 sec)

+---------------------------------------+----------+----------+----------+
| Table                                 | Op       | Msg_type | Msg_text |
+---------------------------------------+----------+----------+----------+
| david_test.test3 | optimize | status   | OK       |
+---------------------------------------+----------+----------+----------+
1 row in set (0.45 sec)

+--------------------------+----------+----------+----------+
| Table                    | Op       | Msg_type | Msg_text |
+--------------------------+----------+----------+----------+
| david_test.test_article | optimize | status   | OK       |
+--------------------------+----------+----------+----------+
1 row in set (4.13 sec)

...

+----------------------------------+----------+----------+----------+
| Table                            | Op       | Msg_type | Msg_text |
+----------------------------------+----------+----------+----------+
| david_test.test_article_content | optimize | status   | OK       |
+----------------------------------+----------+----------+----------+
1 row in set (37.81 sec)

+-----------------------+----------+----------+----------+
| Table                 | Op       | Msg_type | Msg_text |
+-----------------------+----------+----------+----------+
| david_test.members | optimize | status   | OK       |
+-----------------------+----------+----------+----------+
1 row in set (40.02 sec)

+--------------------+----------+----------+----------+
| Table              | Op       | Msg_type | Msg_text |
+--------------------+----------+----------+----------+
| david_test.test_site | optimize | status   | OK       |
+--------------------+----------+----------+----------+
1 row in set (40.31 sec)

+--------------+----------+----------+----------+
| Table        | Op       | Msg_type | Msg_text |
+--------------+----------+----------+----------+
| david_test.t | optimize | status   | OK       |
+--------------+----------+----------+----------+
1 row in set (41.10 sec)

Query OK, 0 rows affected (41.13 sec)

时间: 2024-10-24 16:12:38

【转】利用optimize、存储过程和系统表对mysql数据库表进行批量碎片清理释放表空间的相关文章

Ubuntu与windows双系统下共用MySQL数据库的方法_Mysql

双系统配置及MySQL数据库存储情境:Windows XP下d:\mysql\data中存有MySQL数据库,Linux系统为Ubuntu Server 9.10. 双系统安装完毕,利用GURB启动到Ubuntu Server 9.10,以管理员身份登录. 1)并读写方式(RW)认方式挂载Windows中D分区至/media/wind. 2)更改/media/wind/mysql/data权限 sudo chow mysql:mysql /media/wind/mysql/data (其中两个m

linux中修改AMH系统面板默认MYSQL数据库存储路径方法

正常情况下我们的VPS主机环境如果按照类似AMH之类的面板,如果有数据盘的时候网站项目会独立用数据盘存储,而系统以及面板环境数据库存储会在系统盘中,因为也不会占据太大的硬盘空间.上午的时候,有一个朋友需要老左帮助解决AMH面板的数据库也放到数据盘中,担心哪天系统数据或者缓存导致系统盘占满问题. 修改AMH系统面板默认MYSQL数据库存储路径方法 解决修改AMH系统面板默认MYSQL数据库存储路径方法 第一.复制AMH面板数据库到挂载目录文件夹 这里老左看到挂载的数据盘是HOME目录下(挂载AMH

CentOS 6.5系统上安装MySQL数据库

1.查看系统是否安装了MySQL      使用命令:      #rpm -qa | grep mysql 2.卸载已安装的MySQL       卸载mysql命令如下:        #rpm -e --nodeps  mysql-libs-5.1.61-4.el6.x86_64      要将 /var/lib/mysql文件夹下的所有文件都删除干净 3.安装新的MySQL       命令如下:       #rpm -ivh MySQL-server-5.5.30-1.el6.x86

MySQL重装系统后还原MySQL数据库总结

方法一 在安装mysql数据库前我们利用phpmyadmin备份数据库,安装好之后直接导入即可. 方法二 1.先在运行中输入services.msc,找到MysQL的服务,将其停止: 2.然后备份新安装的MY.INI和DATA这两个目录,直接将其原来mysql/data下的文件拷到新安装的mysql/data目录下即可: 3.启动MysQL服务. 方法三 用mysql命令模式备份与还原数据 mysqldump -h 主机 -u数据户用户名 -p数据库密码 数据库 > bak.sql MySql还

教你如何在windows与linux系统中设置MySQL数据库名、表名大小写敏感_Mysql

在 MySQL 中,数据库和表其实就是数据目录下的目录和文. 因而,操作系统的敏感性决定数据库和表命名的大小写敏感.这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix/Linux 系统中是大小写敏感的. MySQL大小写敏感可以通过配置文件的lower_case_table_names参数来控制. WINDOWS: 编辑MySQL安装目录下的my.ini 文件,在[mysqld]节下 添加 lower_case_table_names=0 (备注:为0时大小

浅谈怎样在UNIX系统下安装MySQL数据库

# cd /usr/src # tar -zvxf mysql-3.22.25-pc-linux-gnu-i686.tar.gz (产生 mysql-3.22.25-pc-linux-gnu-i686目录) # cd mysql-3.22.25-pc-linux-gnu-i686 # ./configure --prefix=/usr/local/mysql (其中参数设定目的安装路径) # make # make install 注意在运行configure时,设定MySQL的安装目的路径为/

不需手动锁表同步mysql数据库

  确保系统安装有perl-DBD-mysql Yum install perl-DBD-mysql 安装xtrabackup Xtrabackup 2.1以后的版本不支持innodb引擎,因此需要下载2.0.*的版本. Wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.0.7/RPM/rhel5/x86_64/percona-xtrabackup-2.0.7-552.rhel5.x86_64.rpm 执行 rpm –iv

Linux系统无法访问MySQL数据库怎么解决

  1.问题及异常 ThreadPoolAsynchronousRunner - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@75d634ea -- APPARENT DEADLOCK!!! Complete Status: Managed Threads: 3 Active Threads: 3 Active Tasks: 2.查找原因 费劲周知,确定是MySQL权限的问题 3.解决过程 1> mysql

liunx系统下安装mysql数据库5.7.13版本

一:在/usr/local目录下解压安装包 二:mysql的目录结构 三:添加用户组mysql,添加用户mysql,给/usr/local/mysql目录授权给mysql用户.安装mysql服务,生成第一次登陆的临时密码:sj06riLBKd,>--安装mysql的时候报错,则缺少依赖库,需要安装依赖库./bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: N