Archives pour l'étiquette Mysql

Memo Serveur Mysql en UTF8 par défaut.

UNICODE UTF8

A toute nouvelle installation d’instance du SGBD MySQL, avant toute utilisation, penser à le configurer en UNICODE pour être tranquille par le suite.

Pour ceci ajouter les lignes suivante dans la section [mysqld] de votre fichier /etc/mysql/my.cnf


[mysqld]
default-character-set=utf8
default-collation=utf8
collation_server=utf8_general_ci
character_set_server=utf8
skip-character-set-client-handshake

UTF8 vs LATIN1

Attention, mysql reste plus rapide en utilisant le jeu de caractère latin1 ou n’importe jeu de caractère localisé. Le nombre de caractère disponible étant plus réduit que en UFT8. La taille des enregistrement sera donc également plus petite en latin1 que en UTF8. Ceci n’a pas beaucoup de sens au vue de nos disques dure de plusieurs centaine de Giga Octet. Mais du coté de la mémoire, de la taille des index ou dans l’embarqué ceci peux avoir son importance.

MySQL – Sauvegarder et restaurer des bases de données

Comment sauvegarder et restaurer des bases de données MSQL

Sauvegarder ?

MySQL inclut des outils qui simplifient la sauvegarde et la restauration, ainsi que le transfert de bases entre différentes plates-formes. Ils permettent aussi l’import et l’export d’enregistrements dans différents formats. Revue de détails.

Les administrateurs de bases de données et les développeurs savent bien à quel point il est important d’effectuer des sauvegardes de données périodiques. En cas de défaillance d’un disque ou de panne d’un serveur, une sauvegarde peut souvent faire la différence entre perdre un an de travail et être à nouveau opérationnel en quelques heures.

Heureusement, si vous utilisez MySQL, vous disposez d’une suite intégrée d’outils de pointe qui simplifient la sauvegarde et la restauration de bases de données. En outre, si vous travaillez sur différentes plates-formes, ces outils permettent également de transférer facilement des bases de données MySQL d’une plate-forme à l’autre et d’exporter et d’importer des enregistrements dans différents formats.

Copier des fichiers de bases de données

Lorsqu’il s’agit de sauvegarder des bases de données MySQL, n’oubliez pas la solution la plus évidente : faire des copies des fichiers des bases à proprement parler.

Comme MySQL utilise le même format de table sur différentes plates-formes, il est en fait possible de copier des fichiers de tables et d’index MySQL d’une plate-forme pour les exploiter sur une autre sans aucun problème (à condition, bien sûr, que vous ayez la même version de MySQL sur les deux plates-formes).

Quels fichiers devriez-vous donc copier ? MySQL stocke toutes ses bases de données dans un répertoire spécial data/, subdivisé en autant de sous-répertoires qu’il y a de bases de données. Les tables et leurs index sont présentés sous forme de fichiers, dont le nom correspond au nom de la table plus une extension.

L’approche la plus simple consiste à copier l’intégralité du répertoire data/ vers un support de sauvegarde et d’archiver ce dernier de sorte que vous puissiez le récupérer à tout moment. Vous pouvez créer un script qui automatise la copie, puis l’inclure dans votre table crontab de sorte qu’il s’exécute quotidiennement ou hebdomadairement, selon la fréquence de mise à jour de vos bases de données.

Si vous transférez des fichiers entre plates-formes Windows et UNIX, il y a un point qui risque de vous poser problème : les noms de fichiers UNIX font la distinction entre majuscules et minuscules, ce qui n’est pas le cas des noms Windows. Par conséquent, les noms des tables MySQL qui mélanges majuscules et minuscules risquent d’être altérés lors du transfert entre Windows et UNIX (les données dans les tables resteront toutefois intactes). Si votre code SQL utilise de tels noms, il risque de ne pas fonctionner correctement tant que vous ne vérifiez pas et ne corrigez pas ces noms et/ou le code. Pour obtenir les meilleurs résultats, utilisez systématiquement des noms de tables en minuscules pour ne pas être confronté à ce problème.

Exporter des tables vers des fichiers texte

Une alternative à la simple copie consiste à utiliser l’outil mysqldump inclus dans MySQL. Il peut exporter une table, une base de données ou toutes les bases de données vers un fichier texte. L’utilisation de mysqldump est la simplicité même : il suffit d’exécuter le programme avec le nom de la base de données à exporter, comme ci-dessous :


$ mysqldump -u root -p secret stocksdb

L’outil mysqldump se connectera au serveur MySQL, établira une session à l’aide des justificatifs d’identification fournis, puis affichera la structure et les données de la table sous forme de commandes SQL reproductibles. Voici un fragment du résultat :


--
-- Dumping data for table 'portfolio'
--

INSERT INTO portfolio VALUES (1,'DHDU',2589,77.56); INSERT INTO portfolio VALUES (2,'YHOO',3200,45.65); INSERT INTO portfolio VALUES (3,'WMT',100,53.29);

Bien sûr, l’affichage sur la console ne sert pas à grand chose. Il faut que vous inscriviez le résultat dans un fichier qui peut ensuite être sauvegardé et restauré. Il suffit de rediriger le résultat vers un fichier en modifiant la commande précédente :


$ mysqldump -u root -p secret stocksdb > stocksdb.sql [/code]

Pour sauvegarder uniquement une table spécifique, faites suivre le nom de la base de données du nom de la table. La commande suivante n’extrait que la structure et les données de la table users dans la base de données stocksdb :


$ mysqldump -u root -p secret stocksdb users > users.sql

Pour exporter toutes les bases de données du système, utilisez le raccourci —all-databases :


$ mysqldump -u root -p secret --all-databases > backup.sql

Remarque : si vous utilisez l’option —all-databases, le résultat SQL de mysqldump contient une instruction CREATE DATABASE pour initialiser chaque base de données. Il est ainsi plus facile de restaurer l’intégralité des bases de données en une fois (comme vous le verrez ci-après).

Si vous voulez que la sauvegarde ne contienne que la structure de la table, utilisez l’option —no-data :


$ mysqldump -u root -p secret --no-data stocksdb > stocksdb.sql
</code

C'est extrêmement utile si vous avez besoin de créer une copie vierge d'une base de données; par exemple, lorsque vous installez une application et devez initialiser un ensemble de tables sans aucun enregistrement. Vous pouvez également faire l'inverse: sauvegarder uniquement les données, sans la structure de la table:
<code>
$ mysqldump -u root -p secret --no-create-info stocksdb > stocksdb.sql

Attention


-password[=password], -p[password]

Le mot de passe à utiliser lors de la connexion au serveur. Notez que si vous utilisez l’option courte -p, vous ne devez pas laisser d’espace entre l’option et le mot de passe. Si vous spécifiez en omettant la partie ‘=your_pass’, mysqldump vous demandera le mot de passe en ligne de commande.

Maintenant que nous savons comment sauvegarder nos données, nous devons voir comment restaurer une sauvegarde.

Restaurer des tables MySQL à partir de fichiers de sauvegarde texte

La sauvegarde de vos bases de données et tables ne représente que la moitié du processus. L’autre facette consiste à savoir comment les restaurer en cas de panne. Heureusement, cette procédure est très simple avec MySQL. Comme le résultat de mysqldump est une série d’instructions SQL, il peut être simplement redirigé vers un client MySQL pour recréer la structure de la base de données d’origine et son contenu.

En supposant que vous ayez sauvegardé toutes vos bases de données dans un fichier nommé backup.sql avec la commande mysqldump —all-databases, vous pouvez les restaurer à l’aide de la commande suivante :


$ mysql -u root -p secret < backup.sql

Si vous n’avez pas utilisé l’option —all-databases mais avez sauvegardé de façon sélective une ou plusieurs tables ou bases de données, vous devez indiquer à MySQL dans quelle base les placer lorsque vous les restaurez. Pour ce faire, il faut ajouter l’option -D à la ligne de commande précédente. L’exemple suivant restaure les tables du fichier stocksdb.sql dans la base de données appelée stocks2 :


$ mysql -u root -p secret -D stocks2 < stocksdb.sql

Exporter et importer dans différents formats

SQL n’est pas le seul format de sortie dans lequel vous pouvez sauvegarder vos bases de données MySQL. Le programme mysqldump vous permet de sauvegarder des enregistrements dans divers formats, dont CSV ou tout autre format avec vos propres délimiteurs. Il vous suffit d’ajouter l’argument —fields-terminated-by à la ligne de commande mysqldump :


$ mysqldump -u root -p secret --no-create-info --tab=/tmp --fields-terminated-by=',' stocksdb

mysqldump générera alors dans le répertorie /tmp un fichier qui contiendra les enregistrements issus de la table stocksdb, les champs étant séparés par une virgule. Si vous voulez que chaque ligne se termine par un séparateur particulier, vous pouvez aussi utiliser l’argument —lines-terminated-by pour marquer chaque ligne par un délimiteur donné.

Tout comme vous pouvez exporter des données dans différents formats, vous pouvez aussi les importer dans différents formats. Par exemple, si vous aviez un fichier séparé par des tabulations qui contient des enregistrements de table, comme suit :

vous pourriez utiliser l’outil mysqlimport pour lire les données dans une base de données MySQL, de la façon suivante :


$ mysqlimport -u root -p secret --fields-terminated-by='\t' test /tmp/portfolio.txt

Sachez que le nom de la base du fichier source détermine dans quelle table les données sont insérées. Dans le cadre de votre procédure de sauvegarde, conservez toujours au moins deux exemplaires de chaque jeu de sauvegarde (chacun étant conservé dans un endroit différent). Lisez également les pages du manuel MySQL pour connaître les divers outils d’exportation et d’importation de données afin de savoir comment les adapter au mieux à votre environnement.

Il faut espérer que vous n’aurez jamais besoin de restaurer une base de données corrompue à partir de vos sauvegardes. Néanmoins, vous pourrez dormir sur vos deux oreilles sachant que, si le pire devait survenir, vous disposez des outils permettant de le faire en toute efficacité et sans guère de gêne pour vos utilisateurs.

Memo check table MyISAM sous MySQL

Vous avez un mail avec comme sujet WARNING : mysqlcheck has found corrupt tables

Avec dans le corps un truc du genre :


ccoop.EMN_ACCES
warning : 1 client is using or hasn't closed the table properly
ccoop.EMN_DROIT
warning : 1 client is using or hasn't closed the table properly
ccoop.EMN_PROFIL
warning : 1 client is using or hasn't closed the table properly
ccoop.EMN_USER
warning : 1 client is using or hasn't closed the table properly
ccoop.LOGSEC
warning : 1 client is using or hasn't closed the table properly
ccoop.afbvbi
warning : 1 client is using or hasn't closed the table properly
ccoop.appli
warning : 1 client is using or hasn't closed the table properly
ccoop.cfg
warning : 1 client is using or hasn't closed the table properly
ccoop.pi11
warning : 1 client is using or hasn't closed the table properly
ccoop.prof
warning : 1 client is using or hasn't closed the table properly
ccoop.ser
warning : 1 client is using or hasn't closed the table properly
ccoop.serban
warning : 1 client is using or hasn't closed the table properly
ccoop.utbanq
warning : 1 client is using or hasn't closed the table properly
demo.EMN_ACCES
warning : 1 client is using or hasn't closed the table properly
demo.LOGSEC
warning : 1 client is using or hasn't closed the table properly
mysql.db
warning : 1 client is using or hasn't closed the table properly
mysql.user
warning : 1 client is using or hasn't closed the table properly

Improperly closed tables are also reported if clients are accessing
the tables *now*. A list of current connections is below.

+----+------------------+-----------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------------------+-----------+----+---------+------+-------+------------------+
| 4 | debian-sys-maint | localhost | | Query | 0 | | show processlist |
+----+------------------+-----------+----+---------+------+-------+------------------+
Uptime: 2 Threads: 1 Questions: 87 Slow queries: 0 Opens: 84 Flush tables: 1 Open tables: 64 Queries per second avg: 43.500

Extrait Doc Officiel MySQL

Doc disponible ici chez Nexen

5.7.2.1 Syntaxe de l’utilitaire myisamchk

myisamchk s’exécute avec une commande de la forme :


shell> myisamchk [options] tbl_name

Les options spécifient ce que vous voulez que myisamchk fasse. Elles sont décrites dans ce chapitre. Vous pouvez aussi obtenir une liste d’options en invoquant le programme avec myisamchk —help . Sans option, myisamchk va simplement vérifier les tables. Pour obtenir plus d’information ou pour demander à myisamchk de prendre des mesures correctives, il faut ajouter l’une des options listées ici.

tbl_name est la table que vous voulez réparer ou vérifier. Si vous exécutez myisamchk autre part que dans le dossier de données, vous devez spécifier le chemin jusqu’au fichier, car sinon, myisamchk n’aura aucune idée d’où chercher les données dans votre base. En fait, myisamchk ne se préoccupe pas du fait que le fichier que vous utilisez est dans le dossier de base ou pas : vous pouvez copier le fichier à réparer dans un autre dossier, et y faire les opérations d’entretien. Vous pouvez spécifier plusieurs noms de tables à myisamchk si vous le voulez. Vous pouvez aussi spécifier un nom sous la forme d’un fichier d’index (avec l’option .MYI ), qui vous permettra de spécifier toutes les tables dans un dossier en utilisant le schéma *.MYI . Par exemple, si vous êtes dans le dossier de données, vous pouvez spécifier toutes les tables dans le dossier comme ceci : shell> myisamchk *.MYI

Si vous n’êtes pas dans le dossier de données, et que vous souhaitez vérifier toutes les tables, vous devez ajouter le chemin jusqu’au dossier :


shell> myisamchk /path/to/database_dir/*.MYI

Vous pouvez même vérifier toutes les tables de toutes les bases avec le chemin suivant :


shell> myisamchk /path/to/datadir/*/*.MYI

La méthode recommandée pour vérifier rapidement toutes les tables est : myisamchk —silent —fast /path/to/datadir/*/*.MYI isamchk —silent /path/to/datadir/*/*.ISM

Si vous voulez vérifier toutes les tables et réparer celles qui sont corrompues, vous pouvez utiliser la ligne suivante :


myisamchk --silent --force --fast --update-state -O key_buffer=64M \
-O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI
isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.ISM

Ces commandes ci-dessus supposent que vous avez plus de 64 Mo de libres. Pour plus d’informations sur l’allocation de mémoire avec myisamchk , voyez la section Utilisation de la mémoire avec myisamchk .Notez que si vous obtenez une erreur comme celle-ci :


myisamchk: warning: 1 clients is using or hasn't closed the table properly

Cela signifie que vous essayez de vérifier une table qui a été modifiée par un autre programme (comme le serveur mysqld ) qui n’a pas encore refermé le fichier de table, ou que le fichier n’a pas été correctement refermé.Si mysqld fonctionne, vous devez forcer la fermeture correcte des fichiers de tables avec la commande FLUSH TABLES , et vous assurer que personne n’utilise les tables durant vos opérations avec myisamchk . En MySQL version 3.23, la meilleure méthode pour éviter ce problème est d’utiliser la commande CHECK TABLE au lieu de myisamchk pour vérifier les tables.

CORNER : PHP & MySQL

Un coin de web

Un petit soft de blog appelé corner et réalisé en formation, très, très simple avec quelque fonction de base :

- Une identification (et encore)
- Vérification avant de poster définitivement
- Un cache pour limiter les requêtes SQL
- Un pseudo système de stat
- Une micro syntaxe wiki maison
- Des liens automatiques
- Le tout en XHTML exclusivement

Tout cela est éclaté dans plusieurs fichiers pour en faciliter l’utilisation. Il y a un fichier README qui comporte les requêtes SQL à copier coller dans phpmyadmin pour créer les tables MySQL nécessaires.

Vous trouverez également plusieurs fichier test avec des bouts de code ainsi que quelque répertoire contenant des versions précédentes ou des ébauches.

GZ - 78.4 ko
corner.tar.gz

Attention aucun support sur cette application, c’est du brutal, cela reste une simple mise en pratique de quelque éléments apprit en formation ou sur le tas. Libre à vous d’en faire n’importe quoi dans les limites de la GPL 🙂