Aujourd'hui nous allons parler MySQL.

Si pour une raison x ou y (performance, nettoyage, ...) vous souhaitez vider une table sans perdre son historique voici comment vous pouvez le faire en 3 étapes.

Sommaire
  1. Obtenir la requête SQL de création de la table qui nous intéresse
  2. Créer une coquille vide à partir de cette requête SQL
  3. Renommer en une passe l'ancienne table en table d'archive et la coquille vide comme nouvelle table de référence

Pour imager notre propos nous prendrons comme exemple la table 'logs' que nous souhaitons historiser en la renommant 'logs_20160506'.

1. Obtention de la requête SQL
$ mysql -u <USER> -p<PASSWORD> -h <MYSQL_HOST> <DATABASE>
mysql> SHOW CREATE TABLE logs \G

Il vous suffira de copier la requête retournée par la dernière commande ; par exemple :

CREATE TABLE logs (
    id INT NOT NULL AUTO_INCREMENT,
    host VARCHAR(256) DEFAULT NULL,
    level VARCHAR(10) DEFAULT NULL,
    datetime datetime DEFAULT NULL,
    msg text,
    PRIMARY KEY (id)
);
2. Création de notre future table (coquille vide)

Collez la requête obtenue en étape 1. en faisant attention à utiliser un nom temporaire ; dans l'exemple ci-dessous nous la nommerons logs_temp :

mysql> CREATE TABLE logs_temp (
    id INT NOT NULL AUTO_INCREMENT,
    host VARCHAR(256) DEFAULT NULL,
    level VARCHAR(10) DEFAULT NULL,
    datetime datetime DEFAULT NULL,
    msg text,
    PRIMARY KEY (id)
);
Query OK, 0 rows affected (0.01 sec)

Si vous n'avez pas de message d'erreur vous pouvez continuer, sinon vérifiez bien que la table que vous essayez de créer n'existe pas déjà (via la commande SHOW TABLES).

3. Renommer l'ancienne et la nouvelle table en une seule passe

Nous allons maintenant renommer pour archive notre ancienne table et promouvoir la table vide nouvellement créée. Pour éviter toute coupure de service nous allons réaliser ces 2 opérations en une seule requête.

Toujours en reprenant notre exemple cela va donner :

  • logs --> logs_20160505
  • logs_temp --> logs
mysql> RENAME TABLE logs TO logs_20160506, logs_temp TO logs;
Query OK, 0 rows affected (0.01 sec);
Tag(s) : #mysql

Partager cet article

Repost 0
Pour être informé des derniers articles, inscrivez vous :