运维之数据库碎片整理PHP脚本

数据库运行时间久了,会产生大量碎片,从而影响数据库速度。

于是想弄个脚本每天整理下所有数据库表碎片。于是写了这个脚本,使用很方便,只要在脚本里面设置好主机、帐号和密码即可。

可以添加到计划任务每天执行一次即可。

Crontab参考:

00 02 * * * php /server/scripts/mysql/optimise_all_table.php>>/var/log/mysql_optimise_all_table.log 2>&1

提醒:

服务器要能命令行执行php命令,而且注意要开启msyql拓展。

脚本如下:
<?php
$host='127.0.0.1:3306';
$user='root';
$pass='123456';
$ignore_dbs=array('information_schema','performance_schema','mysql');
mysql_connect($host, $user, $pass) or die(" [".date('Y-m-d H:i:s')."]".'can not connect to databse'."\n");
$dbs= getRsCol(getRs(mysql_query('show databases')), 'Database');
$dbs=  array_diff($dbs, $ignore_dbs);
$tables=array();
foreach ($dbs as $db) {
    $_tables=  getRsCol(getRs(mysql_db_query($db, 'show tables')), 'Tables_in_'.$db);
    foreach ($_tables as $table) {
        $tables[]='`'.$db.'`.'.'`'.$table.'`';
    }
}

echo "==========此次优化开始".date('Y-m-d H:i:s')."==========\n";
foreach ($tables as $table) {
    echo " [".date('Y-m-d H:i:s')."]至";
    $rs=  getRs(mysql_query('OPTIMIZE TABLE '.$table));
    echo '['.date('H:i:s')."]优化表[$table] status:{$rs[0]['Msg_text']}\n";
}
echo "==========此次优化完毕".date('Y-m-d H:i:s')."==========\n";

function getRs($res){
    $ret=array();
    while ($row = mysql_fetch_assoc($res)) {
        $ret[]=$row;
    }
    return $ret;
}

function getRsCol($rs,$col) {
    $ret=array();
    foreach ($rs as $v) {
        $ret[]=$v[$col];
    }
    return $ret;
}

发表新评论