RuWeb.net Forum

сокращение базы данных
vncabb - 28.8.2012 в 07:36

на моем аккаунте установлен phpbb 3, который сильно сорит в базе данных.
В частности, разрастаются таблицы:
phpbb_log
phpbb_sessions.
Удаление старых записей даст результат. Но как оказалось, необходимо дефрагментировать базу данных.
Небольшой скрипт оптимизации базы данных PHPBB3.

1файл класс оптимизации базы данных
mysqloptimizer.class.php
--------------------------
<?php
class TMySQLTableOptimizer
{
// SQL to extract tables that needs optimizing.
const
osql = 'SELECT table_schema, table_name FROM information_schema.tables WHERE DATA_FREE > 0';

// Connection link
private static $dblink;

// Connection properties
public static $server = 'localhost';
public static $user = 'root';
public static $password = '';

// databases list
public static $table_list = array();

// DBs to exclude
public static $exclude_db = array('information_schema', 'performance_schema');

// Two-dimension array of collected SQL errors. They are keyed by procedure.
// Second key depends on failed function: Connect, Query, Fetch
public static $errors = array();

private static function Query($sql) {
$r = @mysql_query($sql, self::$dblink);
$e = mysql_errno(self::$dblink);
if ($e) self::$errors['failed_query'][$sql] = $e . ' ' . mysql_error(self::$dblink);
return $r;
}

private static function Fetch($query) {
$r = @mysql_fetch_array($query, MYSQL_ASSOC);
$e = mysql_errno(self::$dblink);
if ($e) self::$errors['failed_fetch'][(int)$query] = $e . ' ' . mysql_error(self::$dblink);
return $r;
}

private static function Setup() {
self::$dblink = @mysql_connect(self::$server, self::$user, self::$password);
$e = mysql_errno();
if ($e) self::$errors['failed_connect'][0] = $e . ' ' . mysql_error();
return self::$dblink;
}

private static function Cleanup() {
self::Query('FLUSH TABLES');
mysql_close(self::$dblink);
}

// build array of all databases excluding in $exclude_db field
// if self::$table_list is array and contain non-zero elements, return it as result
private static function EnumDatabases(){
if (!is_array(self::$table_list) || !count(self::$table_list)) {
self::$table_list = array(); // clear DBs list
$q = self::Query(self::osql); // Build DBs list
while ($db = self::Fetch($q)) {
if (!in_array($db['table_schema'], self::$exclude_db))
self::$table_list[] = $db['table_schema'] . '.' . $db['table_name'];
}
@mysql_free_result($q);
}
}

// Main function. Call to optimize
public static function Optimize($server = '', $user = '', $password = '') {
self::$server = empty($server) ? self::$server : $server;
self::$user = empty($user) ? self::$user : $user;
self::$password = empty($password) ? self::$password : $password;
if (self::Setup()) {
self::EnumDatabases(); // Enumerate all tables of all databases
reset(self::$table_list); // Move array pointer to the first element
foreach(self::$table_list as $cur_table)
$q = self::Query('OPTIMIZE TABLE ' . $cur_table);
}
self::Cleanup();
}
} //end class
?>
----------------

2файл задание крон. удаляет старые записи в таблице phpbb_log, дефрагментирует базу данных
crondb.php
-----------------
<html>
<head> <title>Оптимизация базы данных форума PHPBB3</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<?
//удаление лишних строк из таблицы $table_prefixlog
include '../forum/config.php';

$sql1 = "SELECT log_id FROM `".$table_prefix."log` ORDER BY log_id LIMIT 1;";
$sql2 = "SELECT log_id FROM `".$table_prefix."log` ORDER BY log_id DESC LIMIT 1;";

$conn = mysql_connect($dbhost, $dbuser, $dbpasswd)
or die("Нет соединения с Базой Данных");
mysql_select_db ($dbname, $conn);
$result1 = mysql_query($sql1, $conn);
$result2 = mysql_query($sql2, $conn);

$row1 = mysql_fetch_array($result1);
$log_id_min = (int) $row1[0];
$row2 = mysql_fetch_array($result2);
$log_id_max = (int) $row2[0];
echo $row1[0]." ".$log_id_max."<br>";

$logmax = $log_id_max - 1000;
$sql = "DELETE FROM `".$table_prefix."log` WHERE log_id >= ".$log_id_min." AND log_id <= ".$logmax.";";

echo $sql."<br>";

$result = mysql_query($sql, $conn);

if ($result) echo "Лишние таблицы форума phpbb 3 успешно удалены";


mysql_close($conn);


?>


<?php
//подключение класса оптимизации бд
require ('mysqloptimizer.class.php');

//оптимизация базы данных (оптимизация фрагментированных таблиц)
// Uncomment if needed
// TMySQLTableOptimizer::$exclude_db = array();
// TMySQLTableOptimizer::$table_list = array('my_db.first_table', 'my_db.second_table');

TMySQLTableOptimizer::Optimize('', $dbuser, $dbpasswd);
echo '<p>All done. Raw dump of possible errors: </p>';
var_dump(TMySQLTableOptimizer::$errors);
?>

-----------

Скрипт может быть полезен для оптимизации бд.
У меня объем базы данных уменьшился в 4 раза.