Snippets tagged "mysql"
Corriger l'encodage d'un fichier MYSql
Pour corriger les caractères bizarres qui peuvent apparaitre à la place des accents après une remontée d'un fichier de dump, il est possible de fixer l'encodage pour la connexion en rajoutant au début du fichier la ligne :
SET CHARACTER SET <encodage>;
J'utilise notamment souvent UTF8 dans ce cas, le fichier provenant d'un dump effectué sous linux, et remontant dans une base en latin1.
Dump de toutes les bases d'un serveur MySQL dans des fichiers multiples
Si comme moi vous avez sous la main un serveur abritant plusieurs (dizaines, voir centaines de) bases de données, le jour où une des bases de données plante et qu'on vous demande de la restaurer, je vous souhaite bien du courage si vous n'avez qu'un résultat de mysqldump --all-databases sous la main.
Afin de pallier ce problème, j'ai écris ce script bash qui vous facilitera bien la vie !
Au programme :
sauvegarde des dump de chaque base dans des fichiers séparés compressés en gzip, eux même situés dans un dossier nommé en fonction de la date
suppression automatique du dump effectué il y a 7 jours.
Le script est destiné à être exécuté par un cron, par exemple toutes les nuits.
#!/bin/bash #paramètres de configuration du script #completer ici par le nom d'un utilisateur autorisé à dumper toutes vos bases : strMysqlUser="" #completer ici par le mot de passe de cet utilisateur : strPassword="" # completer ici par le chemin vers le repertoire de travail où va se trouver le dump # il est possible de préfixer le répertoire : # "/rep/de/travail/prefix_" donnera alors /rep/de/travail/prefix_20070505 repTravail="" #mémorisation de la date du jour et de la date d'il y a 7 jours dateActuelle=$(date +%Y%m%d) datePassee=$(date --date '7 days ago' +%Y%m%d) #Suppression de la sauvegarde d'il y a 7 jours echo "["$(date +%F\ %X)"] Suppression des dump du "$datePassee repTravailPasse=$repTravail$datePassee rm -R $repTravailPasse # début du dump echo "["$(date +%F\ %X)"] Dump du : "$dateActuelle repTravailActuel=$repTravail$dateActuelle mkdir $repTravailActuel # récupération de la liste des bdd, "tail -n +2" est présent pour ne pas récupérer le titre "Databases" renvoyé par mysql listDatabase=$(mysql --user=$strMysqlUser --password=$strPassword --exec="SHOW DATABASES;" | tail -n +2) #dump de chaque base dans un fichier for lineDatabase in $listDatabase do echo "["$(date +%F\ %X)"] Debut du dump de la base "$lineDatabase" vers "$repTravailActuel mysqldump --user="$strMysqlUser" --password="$strPassword" "$lineDatabase" | gzip > "$repTravailActuel"/"$lineDatabase".sql.gz echo "["$(date +%F\ %X)"] Dump compressé dans "$repTravailActuel"/"$lineDatabase".sql.gz" done echo "["$(date +%F\ %X)"] Fin de la sauvegarde" exit 0
Gestion des tags en SQL
Un schema classique de gestion de tags :
CREATE TABLE Project ( project_id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, url TEXT NOT NULL, PRIMARY KEY (project_id) ) ENGINE=MyISAM; CREATE TABLE Tags ( tag_id INT UNSIGNED NOT NULL AUTO_INCREMENT, tag_text VARCHAR(50) NOT NULL, PRIMARY KEY (tag_id), INDEX (tag_text) ) ENGINE=MyISAM; CREATE TABLE Tag2Project ( tag INT UNSIGNED NOT NULL, project INT UNSIGNED NOT NULL, PRIMARY KEY (tag, project), INDEX rv_primary (project, tag) ) ENGINE=MyISAM;
Pour récupérer tous les projets taggué php ou mysql :
SELECT p.name FROM Project p INNER JOIN Tag2Project t2p ON p.project_id = t2p.project INNER JOIN Tag t ON t2p.tag = t.tag_id WHERE t.tag_text IN ('mysql', 'php');
Pour récupérer tous les projets taggué php et mysql :
SELECT p.name FROM Project p CROSS JOIN Tag t1 CROSS JOIN Tag t2 INNER JOIN Tag2Project t2p ON p.project_id = t2p.project AND t2p.tag = t1.tag_id INNER JOIN Tag2Project t2p2 ON t2p.project = t2p2.project AND t2p2.tag = t2.tag_id WHERE t1.tag_text = "php" AND t2.tag_text = "mysql";
Tiré et adapté de la présentation Join-fu de Jay Pipes
Export/Import d'une base MySQL utf8
C'est pas facile, mais c'est possible.
I. Exportation de la base :
$ mysqldump -uuser -p --opt --default-character-set=utf8 mabase > mabase.sql
II. Reconversion :
$ iconv -f iso-8859-1 -t utf-8 mabase.sql > mabase_utf8.sql
III. Reimport :
$ mysql -uuser -p mabase < mabase_utf8.sql
Mailer un backup mysql comme attachement en ligne de commande
On va utiliser mutt :
$ sudo apt-get install mutt
La commande (cronable) :
$ mysqldump -uroot -p --all-databases --opt \
| bzip2 > /path/to/backup/export.sql.bz2 \
&& echo "En date du " `date` \
| mutt -s "[Nikobox] Backup MySQL total du `date | awk '{ print $2,$3,$4}'`" \
-a /path/to/backup/export.sql.bz2 you@fai.com
[Symfony] Traiter les OR sql avec Propel
Voici comment gérer les "ou" SQL dans Propel :
$criteria = new Criteria(); $criteria->add(TotoPeer::NAME, 'Gérard Bouchard'); $criterion = $criteria->getNewCriterion ( TotoPeer::ID, 5 )->addOr($criteria->getNewCriterion ( TotoPeer::ID, 10 )); $criteria->addAnd($criterion); TotoPeer::doSelect($criteria);
Ceci donnera quelque chose comme :
SELECT * FROM toto WHERE toto.NAME = 'Gérard Bouchard' AND ( toto.ID = 5 OR toto.ID = 10 );
Can't start server: Bind on TCP/IP port: Cannot assign requested address
Des fois, MySQL c'est chiant. Merci IRC !
<n1k0> help <n1k0> je dois installer un server mysql5 sur une ubuntu lts server toute fraiche <n1k0> apt-get install mysql-server-5.0 <n1k0> et là c'est le drâme <n1k0> il me sort ...failed or took more than 6s. <n1k0> Please take a look at the syslog. <n1k0> /usr/bin/mysqladmin: connect to server at 'localhost' failed <n1k0> error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)' <n1k0> Check that mysqld is running and that the socket: '/var/run/mysqld/mysqld.sock' exists! <n1k0> dans le syslog, j'ai : <n1k0> [ERROR] Can't start server: Bind on TCP/IP port: Cannot assign requested address <n1k0> netstat, ps et lsof me montrent qu'aucun autre mysql ne tourne <n1k0> j'ai tenté --reinstall --purge, rien n'y fait <Yann2> et si t'essaie de démarrer le serveur? <david`bgk> port utilisé ? <n1k0> j'ai même rebooté la machine (!) <n1k0> port 3306 libre <Yann2> avec sudo /etc/init.d/ ? <n1k0> rien n'y fait <Yann2> meme message d'erreur? <n1k0> ouais <david`bgk> et /var/run/mysqld/mysqld.sock existe ? <n1k0> non justement <n1k0> mais d'ou vient le bleme ?? <worf|work> dans /etc/mysql/my.cnf regarde quel est le bind-adress <worf|work> si y en a un etc... <n1k0> j'ai aussi ^G/usr/bin/mysqladmin: connect to server at 'localhost' failed <[NikO]> j'adore les boulets sur msn, ils m'ajoutent dans leur contact, et ils me font 't'es ki ?' <n1k0> dans le syslog <worf|work> netstat -an | grep 3306 <worf|work> regarde si y a un truc qui listen aussi <n1k0> bind-address : 127.0.0.1 <worf|work> il doit servir qu'en local ce mysql ? <worf|work> ou d'autres machines devront s'y connecter ? <n1k0> rien n'ecoute <n1k0> non c'est du local pur <worf|work> dans ps y a aucun mysqld ? <n1k0> non <worf|work> tapes : safe_mysqld <worf|work> ou mysqld_safe <worf|work> (si ça existe) <n1k0> command not found <n1k0> ah <n1k0> Starting mysqld daemon with databases from /var/lib/mysql <n1k0> mysqld_safe[4716]: started <n1k0> STOPPING server from pid file /var/run/mysqld/mysqld.pid <n1k0> mysqld_safe[4729]: ended <n1k0> gné <worf|work> ls -la /var/lib/mysql <n1k0> total 20532 <n1k0> drwxr-xr-x 3 mysql mysql 4096 2007-01-10 13:35 . <n1k0> drwxr-xr-x 22 root root 4096 2007-01-10 13:21 .. <n1k0> -rw-r--r-- 1 root root 0 2007-01-10 13:21 debian-5.0.flag <n1k0> -rw-rw---- 1 mysql mysql 10485760 2007-01-10 13:35 ibdata1 <n1k0> -rw-rw---- 1 mysql mysql 5242880 2007-01-10 13:35 ib_logfile0 <n1k0> -rw-rw---- 1 mysql mysql 5242880 2007-01-10 13:21 ib_logfile1 <n1k0> drwxr-xr-x 2 mysql root 4096 2007-01-10 13:21 mysql <worf|work> ça m'a l'air pourtant pas mal <n1k0> Le truc qui m'inquiète c'est : <worf|work> chown mysql:mysql /var/lib/mysql <n1k0> http://www.debianforum.de/forum/viewtopic.php?t=59014&sid=f89fc839052a659222b63b77b55572d5 <n1k0> et surtout http://www.linuxforums.org/forum/servers/41668-mysql-problems-_-solved-_.html <n1k0> Genre personne y comprend rien <n1k0> le chown a rien changé <worf|work> dans ton my.cnf vire ton bind-adresse <n1k0> ok <n1k0> ça marche ! <n1k0> bouarf <worf|work> ton interface loopback est pas en bon état :) <n1k0> yep <worf|work> ferme ton 3306 avec un firewall <worf|work> et pi toute façon quand tu fais tes GRANT restreint les ensuite à l'ip de la machine. <Rik24d> david`bgk: je parlais bien évidemment des négo entre apple et les opérateurs <worf|work> ifconfig lo <worf|work> ça dit quoi ? <n1k0> lo Link encap:Local Loopback <n1k0> LOOPBACK MTU:16436 Metric:1 <n1k0> RX packets:0 errors:0 dropped:0 overruns:0 frame:0 <n1k0> TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 <n1k0> collisions:0 txqueuelen:0 <n1k0> RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) <worf|work> c le script réso qui pue <worf|work> ifconfig lo UP <Rik24d> n1k0: http://paste.inertie.org ;) <david`bgk> paste.inertie.org :p <david`bgk> arf <n1k0> Rik24d, flemme + mode panic = excusez moi <neuro`> Quelqu'un qui torche en rewrite rules ici ? <david`bgk> c'est juste que c'est nouveau mais personne l'utilise ;) <n1k0> YEAH <n1k0> merci mille fois worf|work <worf|work> verifie tes scripts de démarrage <n1k0> I owe you a beer, quand tu veux <worf|work> c'est pas normal que lo soit pas UP <worf|work> et ça doit etre ça qui merde, pas mysql <n1k0> yep <n1k0> mais là le truc tourne, je peux installer ma demo <n1k0> je ferai un gros check up cet aprem <n1k0> merci encore <worf|work> de rien
Installer DBDesigner4 sur Ubuntu
$ wget -c http://213.115.162.124/external/DBDesigner4/DBDesigner4-0.5.4-0.i586.rpm
$ wget -c http://prdownloads.sourceforge.net/skychart/libborqt-6.9.0-2.i386.rpm?use_mirror=switch
$ sudo alien DBDesigner4-0.5.4-0.i586.rpm
$ sudo alien libborqt-6.9.0-2.i386.rpm
$ sudo dpkg -i dbdesigner4_0.5.4-1_i386.deb
$ sudo dpkg -i libborqt_6.9.0-3_i386.deb
$ sudo ln -sf /usr/lib/DBDesigner4/*.so /usr/lib
Une dernière chose :
http://forums.mysql.com/read.php?113,59885,59926#msg-59926
[Symfony] Executer une requête spécifique (custom query) avec Propel
$con = Propel::getConnection(); $stmt = $con->prepareStatement('SELECT foo, bar FROM baz WHERE name=? AND active=?'); $stmt->setString(1, 'MyName'); $stmt->setString(2, '1'); $rs = $stmt->executeQuery(ResultSet::FETCHMODE_NUM);
Ou encore plus con :
Propel::getConnection()->executeUpdate('SET FOREIGN_KEY_CHECKS=0');
Dumper toutes les bases mysql et les réimporter
Dump :
$ mysqldump -uroot -p --all-databases --opt > export.sql
Reimport :
$ mysql -uroot -p < export.sql
Avec compression bz2 :
Export :
$ mysqldump -uroot -p --all-databases --opt | bzip2 > export.sql.bz2
Réimport :
$ bzcat export.sql.bz2 | mysql -uroot -p
