Snippets tagged "mysql" 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.

by gameplayer on 2007-06-08, tagged mysql  sysadmin 

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
by gameplayer on 2007-04-26, tagged bash  linux  mysql  server  sysadmin 

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

by Nicolas Perriault on 2008-05-15, tagged join  mysql  sql  tags 

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
by Nicolas Perriault on 2008-02-27, tagged mysql  utf8 

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
by Nicolas Perriault on 2007-02-09, tagged backup  cli  debian  mail  mutt  mysql  sysadmin  ubuntu 
(2 comments)

[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
  );
by Nicolas Perriault on 2007-01-15, tagged mysql  php  propel  sql  symfony 

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
by Nicolas Perriault on 2007-01-10, tagged bug  mysql  sysadmin 

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

by Nicolas Perriault on 2006-12-04, tagged linux  mysql  softs  ubuntu 
(2 comments)

[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');
by Nicolas Perriault on 2006-11-28, tagged mysql  propel  sql  symfony 

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
by Nicolas Perriault on 2006-11-05, tagged linux  mysql  server  sysadmin  ubuntu 
(4 comments)