mysql压缩表空间

 

REPAIR TABLE `table_name` 修复表 
OPTIMIZE TABLE `table_name` 优化表 

 

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会锁定表

# coding=utf-8

# 特别说明:
import sys,os
import time,shutil,datetime
from mysql_helper import MysqlHelper


def main():
    print datetime.datetime.now()
    Repair()
    print datetime.datetime.now()


def Repair():
    mysqlClient = MysqlHelper('1.2.3.4', 'root', '密码', "mysql")

    # 取出基本满足规则的数据库名,后面再做进一步检查
    sql_str = "show databases;"
    rows = mysqlClient.select(sql_str)
    db_list = []
    for row in rows:
        db_name = row[0]
        if db_name != 'mysql' and db_name != 'information_schema' :
            #print "===%s===" %(db_name)
            db_list.append(db_name)

    for db in db_list:
        n = 1
        # 判断db是否符合规则
        print "===%s===" %(db)
        mysqlClient.select('use ' + db  + ';')
        rows2 = mysqlClient.select('show tables;');
        for row_2 in rows2:            
            table_name = row_2[0]            
            print "%s" %(table_name)
            sql_repair = 'REPAIR TABLE ' + table_name + ';'
            print sql_repair
            sql_optimize = 'OPTIMIZE TABLE ' + table_name + ';'
            print sql_optimize
            mysqlClient.select(sql_repair)
            mysqlClient.select(sql_optimize)


if __name__ == '__main__':
    main()
#!/usr/bin/python
import sys
import os
import MySQLdb


class MysqlHelper:

    def __init__(self, MySqlHost, MySqlUser, MySqlPasswd, MySqlDB):
        try:
            self._conn = MySQLdb.connect(host=MySqlHost, user=MySqlUser,passwd=MySqlPasswd,db=MySqlDB, charset='utf8')
        except Exception, e:
            print e

    def __del__(self):
        if self._conn is not None:
            self._conn.close()

    def select(self,sql_str):
        try:
            _cursor = self._conn.cursor()
            _cursor.execute(sql_str)
            results = _cursor.fetchall()
            _cursor.close()
            return results
        except Exception, e:
            raise Exception,e

    def no_select(self,sql_str):
        try:
            _cursor = self._conn.cursor()
            _cursor.execute(sql_str)
            self._conn.commit()
            _cursor.close()    
        except Exception, e:
            raise Exception,e


    

if __name__=='__main__':
    mysql = MysqlHelper()

 

你可能感兴趣的:(mysql)