Script PHP - Optimiser toutes les bases de données.

WRInaute accro
Bonjour,

Je souhaiterai savoir s'il existe un script permettant d'optimiser toutes les bases de données, sans devoir renseigner quel bases sont existantes.

Ceci pour but sur un dédié de lancer le script une fois par mois...
 
WRInaute accro
Il y a effectivement une commande mais là, je ne me rappel plus trop...
Regarde sur les sites de PHP, ça doit être mis quelque part...
 
WRInaute impliqué
Je te laisse le soin de faire le script mais je te donne les 3 requêtes qui te serviront à construire le tout.

Code:
SHOW DATABASES

Code:
USE {$database}

Code:
SHOW TABLE STATUS
(dans celle-là, ne te sers que des lignes où Data_free > 0)

Puis pour finir
Code:
OPTIMIZE TABLE {$table}

Au besoin je te ponds le code entier ;)
 
WRInaute accro
Merci je fais chercher un peu...
En fait ça je connaissais:
OPTIMIZE TABLE

Mais je sais que l'on pouvait le faire pour une table spécifique (donc il faut connaitre toutes les tables, un peu fastidieux, si l'on en rajoute chaque foi..).

Le truc est que je suis entrain de chercher une méthode pas trop lourde pour lister les table, ou simplement le fiare d'une manière global sur toute les tables, un genre de ALL.
 
WRInaute impliqué
Petite astuce, voici à quoi servent respectivement les requêtes que je t'ai donné :
  1. Lister les bases de données
  2. Sélectionner une base de données
  3. Lister les tables de la base en cours d'utilisation (cf #2)
  4. Optimiser une table donnée
 
WRInaute accro
Le point 3 sert à quoi ?
(on ne peut optimiser une table utilisée ?)
très peut de chance de pouvoir les optimiser alors, si elles sont souvent utilisées...
 
WRInaute impliqué
-_- OK bon spa grave, j'te fais le script ça ira plus vite.
(en cours d'utilisation : cf #2 avec le USE database, ça concerne la base, pas la table et indépendamment de ce que tes scripts font ailleurs).

Bref j'te fais ça quand je peux hein.
 
WRInaute impliqué
Code:
<?php
$mysql_connexion = mysql_connect('localhost', '***', '***', true);

//ETAPE 1 : on liste les bases de données
$db = array();
$mysql_query = mysql_query("SHOW DATABASES;");
while( $ligne = mysql_fetch_assoc($mysql_query) )
{
	array_push($db, $ligne['Database']);
}

//ETAPE 2 : pour chaque base, on liste les tables pour ne conserver que celles qu'on optimisera
foreach( $db as $database )
{
	mysql_query("USE `{$database}`");
	//
	$tables = array();
	$mysql_query = mysql_query("SHOW TABLE STATUS;");
	while( $ligne = mysql_fetch_assoc($mysql_query) )
	{
		//seulement s'il y a des pertes de données
		if( $ligne['Data_free'] > 0 )
		{
			array_push($tables, '`'.$ligne['Name'].'`');
		}
	}
	
	//Optimisation
	$tables = implode(',', $tables);
	mysql_query("OPTIMIZE TABLES {$tables};");
}

//ETAPE 3 : on clôture la connexion
mysql_close($mysql_connexion);
unset($mysql_connexion, $mysql_query, $tables, $database, $db, $ligne);
?>
 
WRInaute impliqué
Normal car là ça concerne PHP. Ca permet de bien délimiter la variable qu'on utilise dans une chaîne.

Code:
"USE `{$database}`"
revient au même que
Code:
"USE `".$database."`"

A part que la deuxième écriture est un poil plus rapide mais plus chiante à lire (à mes yeux).

Pour l'histoire de l'array_push, je stocke dans un tableau le nom des tables encadrées avec des ` (pour éviter des problèmes de mots clés réservés à MySQL). C'est tout. tu peux les enlever mais si un jour tu nommes mal une table, ça la fera planter ^^
 
WRInaute accro
ok merci.

Donc les ` dans le premier cas c'est pour le même principe...mots réservés.

OK merci à toi encore, c'est vraiment sympa de ta part !
 
Discussions similaires
Haut