Transférer une base MySQL d’un serveur à l’autre

21 août 2007

Voilà une petite technique pour copier une base MySQL d’un serveur à l’autre

Sur le serveur A, on commence par se placer dans /tmp

serverA: mkdir -p /tmp/DUMPDIR
serverA: cd /tmp
serverA: mysqldump -u user -ppassword -Q --tab=DUMPDIR db_name
serverA: scp -r DUMPDIR user@serverB:/tmp/
serverA: rm -rf /tmp/DUMPDIR/*

Sur le serveur B on importe bien gentiment

serverB: mysqladmin -u user -ppassword create db_name
serverB: cat DUMPDIR/*.sql | mysql -u user -ppassword db_name
serverB: mysqlimport -u user -ppassword db_name /tmp/DUMPDIR/*.txt
serverB: rm -rf /tmp/DUMPDIR

Ici on ne parle pas d’éventuelles différences de version de MySQL. Dans mon cas, j’avais un MySQL 3.23 sur le serveur A et un MySQL 5.0 sur le serveur B et tout semble s’être bien passé, mais il vaut mieux consulter la doc sur les migrations pour ne pas risquer des pertes de données liées à des changements profonds entre les versions.

http://dev.mysql.com/doc/refman/5.0/en/upgrade.html
http://dev.mysql.com/doc/refman/5.0/en/upgrading-to-arch.html

Dans MySQL 5, pour vérifier l’intégrité des tables, on lance cette commande :

serverB: mysqlcheck --check-upgrade --all-databases --auto-repair -u user -ppassword

Mise à jour du 28 avril 2008 :
Il est possible d’utiliser 2 opions intéressantes avec mysqlimport :

  • -r (ou –replace) permet de remplacer les lignes qui comportent la même clé (et donc ne provoque pas d’erreur et d’arrêt de l’import). C’est à utiliser lorsqu’on veut mettre à jour la table en conservant ce qui n’existe pas dans l’import.
  • -d (ou –delete) permet de vider la table avant la lecture du fichier d’import. C’est à utiliser lorsqu’on veut totalement remplacer le contenu des tables.

[Qmail] Envoyer une copie des mails sur une autre adresse

16 août 2007

Je fixe ici une info qui n’est pas un secret ni une configuration très avancée, mais je l’ai souvent utilisée et souvent oubliée. Maintenant je sais où chercher si ma mémoire fuit de nouveau.

Voilà la situation :

  • sur mes serveurs de mail j’utilise Qmail
  • j’ai un compte mail de boulot : jeremy.lecour@boulot.com
  • j’ai un compte perso Gmail : mon.adresse.secrete@gmail.com

En partant en vacances j’ai souhaité continuer de relever mes e-mail de boulot sans pour autant utiliser de client POP ou IMAP. Je voulais donc envoyer une copie de chaque mail reçu sur “jeremy.lecour@boulot.com” vers mon compte Gmail, sans perturber le fonctionnement normal de mon compte boulot.

Il faut utiliser les fonctionnalités des fichiers “.qmail-xxx” pour donner des indications personnalisées à Qmail.

Par défaut, pour un compte mail classique (par de redirection, …) il existe une structure ressembalant à ça :
/home/vpopmail/domains/boulot.com/jeremy.lecour/(…)

Il suffit de créer un fichier
/home/vpopmail/domains/boulot.com/.qmail-jeremy:lecour :
| /home/vpopmail/bin/vdelivermail '' jeremy.lecour
&mon.adresse.secrete@gmail.com

La seconde ligne indique à Qmail d’envoyer le mail à l’adresse “mon.adresse.secrete@gmail.com”.
La première ligne indique à Qmail de distribuer le courrier normalement. Si elle n’est pas présente, alors il n’y aura qu’un simple redirection et pas de copie.

L’interface web de l’excellent QmailAdmin ne permet pas ce réglage.
Elle permet de faire des redirections (ajouter des lignes “&adresse@mail.com”) dans le fichier, mais ne fait plus la distribution locale avant la redirection.
Si le fichier a été créé manuellement, QmailAdmin respectera son contenu mais il est impossible de rajouter la commande de distribution dans le champ de l’adresse destinataire. Un mécanisme de vérification doit certainement l’empêcher pour éviter des injections de code shell. Dans notre cas c’est ce que nous faisons manuellement, mais nous avons un tel accès aux fichiers de Qmail que c’est considéré comme intentionnel et non malveillant alors que l’interface web est “relativement” moins sécurisée.


Safari est moins permissif que Firefox sur le Javascript

2 août 2007

Je suis en pleine période de développement d’une application web qui utilise pas mal de Javascript, notamment dans des requêtes Ajax.

J’ai commencé par travailler avec Firefox + Firebug et j’ai bien avancé, jusqu’à ce que je m’aperçoive que Safari était un peu moins permissif dans le code Javascript.

Voici un exemple de ce qui passe sans problème dans Firefox 2.0.0.5 sur Mac mais pas sur Safari 2 (sur Mac aussi) :

new Ajax.Updater('relations_experts_projets_' + up, '/admin.php', {
	method: 'get',
	evalScripts: true,
	parameters: {
		c: 'experts',
		a: 'list_projets',
		ajax: '1',
		ide: ide,
	},
});

Voici maintenant ce que Safari accepte :

new Ajax.Updater('relations_experts_projets_' + up, '/admin.php', {
	method: 'get',
	evalScripts: true,
	parameters: {
		c: 'experts',
		a: 'list_projets',
		ajax: '1',
		ide: ide
	}
});

Regardez de près, c’est subtil.

Il ne doit pas y avoir de virgule après le dernier élément d’un Hash.

Ayant beaucoup codé en PHP, j’ai appris à laisser volontairement les virgules après le dernier élément d’un tableau. C’est très pratique lorsqu’on veut changer l’ordre des éléments et qu’on oublie d’ajuster la virgule.

Il semble bien que je doive revoir mes habitudes. De là à penser que le PHP est trop permissif, il n’y a qu’un pas (j’ai d’autres exemples dans ma manche).

Quand la différence entre Firefox et Safari, je ne saurai dire lequel respecte la norme ECMAScript à le lettre et encore moins lequel a raison (de la respecter, de l’assouplir, ou bien de la durcir).