Archives de catégorie : Mysql

[MySql] : sauvegarder les bases une à une individuellement

Sauvegarder ses bases de données est essentiel en cas de crash mais aussi pour être en mesure de fournir à tout moment un dump. N’oubliez pas que vous pouvez retrouver les autres articles databases sur cette page.

Par contre il existe de nombreuses manière de faire. Mysql fait cela très bien et très facilement. Mais parfois on a des besoins particuliers.

Par exemple, comme les restaurations portent souvent sur une seule base, on ne souhaite pas disposer d’un dump complet. D’ailleurs cela peut aussi éviter de se trimbaler des fichiers trop gros ou encore de gérer la confidentialité de données entre clients.

Comment sauvegarder les bases mysql une à une c’est à dire en ayant un fichier par base ?

C’est assez simple avec une petite boucle :

for db in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $db | gzip > "/backups/mysqldump-$(hostname)-$db-$(date +%Y-%m-%d-%H.%M.%S).gz"; done

Donc :

  • on dresse la liste des bases avec un show databases
  • on parcourt tout cela avec un for
  • pour chaque base on lance un mysqldump
  • puis on gzippe chaque fichier généré

[Mysql] : comment générer le sql pour recréer un table ?

C’est un article similaire à celui que j’ai déjà pu faire pour oracle mais vous allez vous rendre compte qu’avec mysql c’est plus simple. Eh oui pas de dbms et autres trucs tordus de ce genre un simple « show » suffit.

Ah oui, j’allais oublier qu’avant de faire  ce genre de manip par un « show » je passais par des manips sur les dumps… autant dire que ce n’était pas léger et que cela a des limites très vite atteintes.

Alors comment récupérer le sql d’une table avec la commande « show » ? Facile

mysql> show create table matable;
+---------+-------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-------------------------------------------------------------------------------------------------------------------------------------+
| matable | CREATE TABLE `matable` (
`id` int(11) DEFAULT NULL,
`monchamp` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+-------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)

C’est facile donc et très efficace. Et vous comment pratiquez vous mysql et quelle version ?

mysql-recreate-table

[Mysql] : comment merger deux tables en une ?

Merger des tables sur mysql c’est possible. En effet, vous pouvez faire des associations de table assez facilement. Personnellement je ne suis pas un fan de cette solution nous allons voir pourquoi un peu plus loin. Commençons par créer deux tables similaires au niveau de la structure :

mysql> create table tab3 (f1 varchar(255)) ENGINE=MyISAM;
Query OK, 0 rows affected (0,08 sec)

mysql> create table tab4 (f2 varchar(255)) ENGINE=MyISAM;
Query OK, 0 rows affected (0,08 sec)

Puis insérons des données dans ces tables :

mysql> insert into tab4 values ('table 2');
Query OK, 1 row affected (0,00 sec)

mysql> insert into tab4 values ('table 2');
Query OK, 1 row affected (0,00 sec)

Maintenant créons la table de merge :

mysql> create table fusion (f1 varchar(255)) ENGINE=MERGE UNION=(tab3,tab4) INSERT_METHOD=LAST;
Query OK, 0 rows affected (0,07 sec)

Et voici maintenant son contenu :

mysql> select * from fusion;
+---------+
| f1 |
+---------+
| table 1 |
| table 1 |
| table 2 |
| table 2 |
+---------+
4 rows in set (0,01 sec)

Mais supprimons une des tables composant la table de merge et procédons à un nouveau SELECT :

mysql> drop table tab3;
Query OK, 0 rows affected (0,00 sec)

mysql> select * from fusion;
ERROR 1168 (HY000): Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist

Et voilà mysql nous jette car nous venons de casser un des éléments constitutif de la table de merge. Pas terrible. Vous comprenez donc pourquoi il vaut mieux éviter de créer des tables de merge.

Et vous utilisez vous des tables de ce type ? avez vous rencontré des problèmes avec ?

mysql_table_merge

[Mysql] : comment déconnecter un utilisateur ? (de force)

Mysql est un moteur de bdd performant et sympathique à l’utilisation, un peu à l’image de postgres. Si vous utilisez un WAMP ou LAMP pour faire vos développements, vous utilisez donc Mysql. C’est d’ailleurs certainement ce qui a permis la très forte progression de ce moteur ces dernières années.

Retrouvez d’autres articles sur la page databases.

Un DBA lorsqu’il doit intervenir sur une base ou un moteur, doit parfois être le seul connecter à la base ou à la machine. Mais certaines applications ne rendent pas la main très facilement. C’est souvent moins le cas des utilisateurs humains mais cela peut aussi être le cas d’une personne réticente ou encore mieux le DBA a besoin d’y aller comme un gros bourin et décide de reprendre la main de force.

Bref c’est dans ces derniers cas que l’on peut s’intéresser à vouloir déconnecter un user par la force (en lui coupant son processus).

Comment fait-on ?

La première chose à faire c’est de lister les processus en cours et les users et bases correspondants.

Voici la commande :

mysql> show processlist;

le résultat prend la forme suivante :

 +-----+------+-----------+---------+---------+-------+-------+------------------+
    | Id  | User | Host      | db      | Command | Time  | State | Info             |
    +-----+------+-----------+---------+---------+-------+-------+------------------+
    | 235 | appli1 | 192.20.1.2 | mydb | Query   | 28619 |       | NULL             |
    | 238 | owner | localhost | mydb | Query   |   853 |       | NULL             |
    | 241 | owner | localhost | NULL    | Query   |     0 | NULL  | show processlist |
    +-----+------+-----------+---------+---------+-------+-------+------------------+
    3 rows in set (0.00 sec)

Dans notre cas nous voulons déconnecter appli1. Pour cela il suffit de repérer l’Id de la session (soit 235). Puis lancer :

mysql> kill 235

Et voilà le user appli1 est déconnecté.

N’hésitez pas en commentaire à partager vos pratiques sur mysql.

MySQL.svg