MySQL有一个OPTIMIZE TABLE命令,可用于回收MySQL安装中未使用的空间.有没有办法(内置命令或公共存储过程)为数据库和/或服务器安装中的每个表运行此优化,或者这是您必须自己编写脚本的东西?
Ike*_*ker 394
您可以mysqlcheck在命令行中执行此操作.
一个数据库:
mysqlcheck -o <db_schema_name>
Run Code Online (Sandbox Code Playgroud)
所有数据库:
mysqlcheck -o --all-databases
Run Code Online (Sandbox Code Playgroud)
Ism*_*uel 23
我制作了这个"简单"的脚本:
set @tables_like = null;
set @optimize = null;
set @show_tables = concat("show tables where", ifnull(concat(" `Tables_in_", database(), "` like '", @tables_like, "' and"), ''), " (@optimize:=concat_ws(',',@optimize,`Tables_in_", database() ,"`))");
Prepare `bd` from @show_tables;
EXECUTE `bd`;
DEALLOCATE PREPARE `bd`;
set @optimize := concat('optimize table ', @optimize);
PREPARE `sql` FROM @optimize;
EXECUTE `sql`;
DEALLOCATE PREPARE `sql`;
set @show_tables = null, @optimize = null, @tables_like = null;
Run Code Online (Sandbox Code Playgroud)
要运行它,只需将其粘贴到连接到数据库的任何SQL IDE中.
注意:此代码不适用于phpmyadmin.
它运行一个show tables语句并将其存储在准备好的语句中.然后它optimize table在选定的集合中运行a .
您可以通过在var中设置不同的值来控制要优化的表@tables_like.
Dmi*_*mov 18
以下示例php脚本可以帮助您优化数据库中的所有表
<?php
dbConnect();
$alltables = mysql_query("SHOW TABLES");
while ($table = mysql_fetch_assoc($alltables))
{
foreach ($table as $db => $tablename)
{
mysql_query("OPTIMIZE TABLE '".$tablename."'")
or die(mysql_error());
}
}
?>
Run Code Online (Sandbox Code Playgroud)
小智 14
使用简单的shell脚本完成修复所有数据库中所有表的所有必要过程:
#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze
Run Code Online (Sandbox Code Playgroud)
小智 11
对于所有数据库:
mysqlcheck -Aos -uuser -p
Run Code Online (Sandbox Code Playgroud)
对于一个数据库优化:
mysqlcheck -os -uroot -p dbtest3
Run Code Online (Sandbox Code Playgroud)
Chr*_*ris 11
如果要分析、修复和优化 MySQL 服务器中所有数据库中的所有表,可以从命令行一次性完成。不过,您将需要 root 来执行此操作。
mysqlcheck -u root -p --auto-repair --optimize --all-databases
Run Code Online (Sandbox Code Playgroud)
运行后,系统将提示您输入 MySQL 根密码。之后,它将开始,您将看到正在发生的结果。
示例输出:
yourdbname1.yourdbtable1 OK
yourdbname2.yourdbtable2 Table is already up to date
yourdbname3.yourdbtable3
note : Table does not support optimize, doing recreate + analyze instead
status : OK
etc..
etc...
Repairing tables
yourdbname10.yourdbtable10
warning : Number of rows changed from 121378 to 81562
status : OK
Run Code Online (Sandbox Code Playgroud)
如果您不知道 root 密码并且正在使用 WHM,您可以在 WHM 中更改它,方法是: 主页 > SQL 服务 > MySQL Root 密码
从phpMyAdmin和其他来源,您可以使用:
SET SESSION group_concat_max_len = 99999999;
SELECT GROUP_CONCAT(concat('OPTIMIZE TABLE `', table_name, '`;') SEPARATOR '') AS O
FROM INFORMATION_SCHEMA.TABLES WHERE
TABLE_TYPE = 'BASE TABLE'
AND table_name!='dual'
AND TABLE_SCHEMA = '<your databasename>'
Run Code Online (Sandbox Code Playgroud)
然后,您可以将结果复制并粘贴到新查询中,或者从您自己的源中执行它。如果看不到整个语句:

| 归档时间: |
|
| 查看次数: |
323137 次 |
| 最近记录: |