Blog

Compilation et utilisation de mydumper

Écrit le 13 03 2014 par Kévin MET _

Coucou les amis, aujourd'hui on va compiler mydumper et regarder comment l'utiliser. Pourquoi utiliser mydumper alors qu'on a ce bon vieux mysqldump qui fait déjà très bien le boulot me direz vous ? Et bien, voici la liste des avantages par rapport à mysqldump :

  • Plus rapide car multithreadé.
  • Plus rapide car il utilise un global read lock uniquement le temps de dumper les tables en MyISAM.
  • La compression via gzip est déjà intégrée.
  • Un lock quasi inexistant en utilisant des tables InnoDB.
  • Un fichier (ou plus) de dump par table. Cela permet de ne restaurer qu'une seule table.

Il existe tout de même un désavantage, mydumper ne peut pas sauver les vues, procédure stockées, etc. Il ne faut non plus compter sur lui pour dumper les schémas des base de données, il faut donc utiliser mysqldump pour cela.

Partie 1 - Installation

Maintenant on va passer à la compilation. Pour cela, on commence par se placer dans un répertoire sympa comme /root/install par exemple et par télécharger l'archive. Il s'agit de la version 0.6.1 à l'heure ou j'écris ces lignes. Ensuite on la décompresse et on rentre dans le dossier fraichement créé. Et on installes les dépendances.


# cd /root/install
# wget https://launchpad.net/mydumper/0.6/0.6.1/+download/mydumper-0.6.1.tar.gz
# tar xvzf mydumper-0.6.1.tar.gz
# cd mydumper-0.6.1/
# aptitude install libglib2.0-dev libmysqlclient18.1-dev zlib1g-dev libpcre3-dev

On commence par lancer un cmake -L pour voir les options de compilation disponibles :


root@web0:~/install/mydumper-0.6.1# cmake -L
-- The C compiler identification is GNU 4.7.2
-- The CXX compiler identification is GNU 4.7.2
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Using mysql-config: /usr/bin/mysql_config
-- Found MySQL: /usr/include, /usr/lib/libmysqlclient_r.so;/usr/lib/x86_64-linux-gnu/libpthread.so;/usr/lib/x86_64-linux-gnu/libz.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/librt.so;/usr/lib/x86_64-linux-gnu/libssl.so;/usr/lib/x86_64-linux-gnu/libcrypto.so;/usr/lib/x86_64-linux-gnu/libdl.so
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.7") 
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.26") 
-- checking for one of the modules 'glib-2.0'
-- checking for one of the modules 'gthread-2.0'
-- checking for module 'libpcre'
--   found libpcre, version 8.30
-- Found PCRE: /usr/include  

CMake Warning at docs/CMakeLists.txt:9 (message):
  Unable to find Sphinx documentation generator


-- ------------------------------------------------
-- MYSQL_CONFIG = /usr/bin/mysql_config
-- CMAKE_INSTALL_PREFIX = /usr/local
-- BUILD_DOCS = ON
-- RUN_CPPCHECK = OFF
-- Change a values with: cmake -D<Variable>=<Value>
-- ------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: /root/install/mydumper-0.6.1
-- Cache values
BUILD_DOCS:BOOL=ON
CMAKE_BUILD_TYPE:STRING=
CMAKE_INSTALL_PREFIX:PATH=/usr/local
MYSQL_ADD_INCLUDE_DIR:FILEPATH=/usr/include
MYSQL_CONFIG:FILEPATH=/usr/bin/mysql_config
MYSQL_CONFIG_PREFER_PATH:FILEPATH=/bin
MYSQL_LIBRARIES_crypto:FILEPATH=/usr/lib/x86_64-linux-gnu/libcrypto.so
MYSQL_LIBRARIES_dl:FILEPATH=/usr/lib/x86_64-linux-gnu/libdl.so
MYSQL_LIBRARIES_m:FILEPATH=/usr/lib/x86_64-linux-gnu/libm.so
MYSQL_LIBRARIES_mysqlclient_r:FILEPATH=/usr/lib/libmysqlclient_r.so
MYSQL_LIBRARIES_pthread:FILEPATH=/usr/lib/x86_64-linux-gnu/libpthread.so
MYSQL_LIBRARIES_rt:FILEPATH=/usr/lib/x86_64-linux-gnu/librt.so
MYSQL_LIBRARIES_ssl:FILEPATH=/usr/lib/x86_64-linux-gnu/libssl.so
MYSQL_LIBRARIES_z:FILEPATH=/usr/lib/x86_64-linux-gnu/libz.so
RUN_CPPCHECK:BOOL=OFF

On utilisera donc les options qui nous intéressent, en l’occurrence je vais juste changer le prefix dans l'exemple qui suit :


root@web0:~/install/mydumper-0.6.1# cmake -DCMAKE_INSTALL_PREFIX:PATH=/opt/mydumper-0.6.1

-- Using mysql-config: /usr/bin/mysql_config
-- Found MySQL: /usr/include, /usr/lib/libmysqlclient_r.so;/usr/lib/x86_64-linux-gnu/libpthread.so;/usr/lib/x86_64-linux-gnu/libz.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/librt.so;/usr/lib/x86_64-linux-gnu/libssl.so;/usr/lib/x86_64-linux-gnu/libcrypto.so;/usr/lib/x86_64-linux-gnu/libdl.so

CMake Warning at docs/CMakeLists.txt:9 (message):
  Unable to find Sphinx documentation generator


-- ------------------------------------------------
-- MYSQL_CONFIG = /usr/bin/mysql_config
-- CMAKE_INSTALL_PREFIX = /opt/mydumper-0.6.1
-- BUILD_DOCS = ON
-- RUN_CPPCHECK = OFF
-- Change a values with: cmake -D<Variable>=<Value>
-- ------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: /root/install/mydumper-0.6.1

Il ne reste plus qu'à compiler :


root@web0:~/install/mydumper-0.6.1# make
Scanning dependencies of target mydumper
[ 20%] Building C object CMakeFiles/mydumper.dir/mydumper.c.o
[ 40%] Building C object CMakeFiles/mydumper.dir/binlog.c.o
In file included from /root/install/mydumper-0.6.1/binlog.c:27:0:
/usr/include/sql_common.h:26:18: fatal error: hash.h: No such file or directory
compilation terminated.
make[2]: *** [CMakeFiles/mydumper.dir/binlog.c.o] Error 1
make[1]: *** [CMakeFiles/mydumper.dir/all] Error 2
make: *** [all] Error 2

FAIL : /usr/include/sql_common.h:26:18: fatal error: hash.h: No such file or directory

On voit qu'il nous manque un header de MySQL. Personnellement je suis fan de Percona server. C'est donc la version que j'utilise. Il faudra donc télécharger les sources et copier le fichier dans /usr/include. Soit on passe par le dépôt de Percona, soit on passe par le site et on télécharge les sources qui correspondent à la version de MySQL qui tourne sur notre serveur. Dans l'exemple suivant, j'utilise les dépôts de Percona.


# apt-get source percona-server-server-5.6
# cp percona-server-5.6-5.6.15-rel63.0/include/hash.h /usr/include/

On relance un make :


root@web0:~/install/mydumper-0.6.1# make
[ 20%] Building C object CMakeFiles/mydumper.dir/binlog.c.o
[ 40%] Building C object CMakeFiles/mydumper.dir/server_detect.c.o
[ 60%] Building C object CMakeFiles/mydumper.dir/g_unix_signal.c.o
make[2]: *** No rule to make target `/usr/lib/libmysqlclient_r.so', needed by `mydumper'.  Stop.
make[1]: *** [CMakeFiles/mydumper.dir/all] Error 2
make: *** [all] Error 2

Encore un FAIL : make[2]: *** No rule to make target `/usr/lib/libmysqlclient_r.so', needed by `mydumper'. Stop.

En fait /usr/lib/libmysqlclient_r.so pointe sur un fichier qui n'existe pas. On va corriger ça :


# ls -l /usr/lib/libmysqlclient_r.so
lrwxrwxrwx 1 root root 22 Feb 19 14:38 /usr/lib/libmysqlclient_r.so -> libmysqlclient_r.so.18

# ls /usr/lib/libmysqlclient_r.so.18
ls: cannot access libmysqlclient_r.so.18: No such file or directory

Correction :


# unlink /usr/lib/libmysqlclient_r.so
# ln -s /usr/lib/libmysqlclient_r.so.18.1.0 /usr/lib/libmysqlclient_r.so

On relance la compilation en croisant les doigts :


root@web0:~/install/mydumper-0.6.1# make
Linking C executable mydumper
[ 80%] Built target mydumper
Scanning dependencies of target myloader
[100%] Building C object CMakeFiles/myloader.dir/myloader.c.o
Linking C executable myloader
[100%] Built target myloader

Ça passe bien ! On installe :


root@web0:~/install/mydumper-0.6.1# make install 
[ 80%] Built target mydumper
[100%] Built target myloader
Install the project...
-- Install configuration: ""
-- Installing: /opt/mydumper-0.6.1/bin/mydumper
-- Installing: /opt/mydumper-0.6.1/bin/myloader

Il ne reste plus qu'à faire un lien symbolique dans /opt et à modifier le PATH pour y ajouter le dossier du binaire :


# ln -s /opt/mydumper-0.6.1/ /opt/mydumper
# vim /etc/profile

Ajouter le dossier /opt/mydumper/bin dans le PATH

Partie 2 - Utilisation

Maintenant qu'on a bien suer pour l'installation, on va pouvoir s'amuser avec notre nouveau jouet. Pour la liste d'option, un bon vieux --help va nous aider :


root@web0:~# mydumper --help
Usage:
  mydumper [OPTION...] multi-threaded MySQL dumping

Help Options:
  -?, --help                  Show help options

Application Options:
  -B, --database              Database to dump
  -T, --tables-list           Comma delimited table list to dump (does not exclude regex option)
  -o, --outputdir             Directory to output files to
  -s, --statement-size        Attempted size of INSERT statement in bytes, default 1000000
  -r, --rows                  Try to split tables into chunks of this many rows. This option turns off --chunk-filesize
  -F, --chunk-filesize        Split tables into chunks of this output file size. This value is in MB
  -c, --compress              Compress output files
  -e, --build-empty-files     Build dump files even if no data available from table
  -x, --regex                 Regular expression for 'db.table' matching
  -i, --ignore-engines        Comma delimited list of storage engines to ignore
  -m, --no-schemas            Do not dump table schemas with the data
  -k, --no-locks              Do not execute the temporary shared read lock.  WARNING: This will cause inconsistent backups
  --less-locking              Minimize locking time on InnoDB tables.
  -l, --long-query-guard      Set long query timer in seconds, default 60
  --kill-long-queries         Kill long running queries (instead of aborting)
  -b, --binlogs               Get a snapshot of the binary logs as well as dump data
  -D, --daemon                Enable daemon mode
  -I, --snapshot-interval     Interval between each dump snapshot (in minutes), requires --daemon, default 60
  -L, --logfile               Log file name to use, by default stdout is used
  --tz-utc                    SET TIME_ZONE='+00:00' at top of dump to allow dumping of TIMESTAMP data when a server has data in different time zones or data is being moved between servers with different time zones, defaults to on use --skip-tz-utc to disable.
  --skip-tz-utc               
  --use-savepoints            Use savepoints to reduce metadata locking issues, needs SUPER privilege
  --success-on-1146           Not increment error count and Warning instead of Critical in case of table doesn't exist
  -h, --host                  The host to connect to
  -u, --user                  Username with privileges to run the dump
  -p, --password              User password
  -P, --port                  TCP/IP port to connect to
  -S, --socket                UNIX domain socket file to use for connection
  -t, --threads               Number of threads to use, default 4
  -C, --compress-protocol     Use compression on the MySQL connection
  -V, --version               Show the program version and exit
  -v, --verbose               Verbosity of output, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2

Pour l'utilisation, c'est plutôt simple. Voici un exemple avec une seule base de données :


# mkdir /root/test
# mydumper -o /root/test -c -m -B base -u root -p rootpassword -t 8 -v 3
** Message: Thread 1 connected using MySQL connection ID 14092216
** Message: Thread 2 connected using MySQL connection ID 14092217
** Message: Thread 3 connected using MySQL connection ID 14092218
** Message: Thread 4 connected using MySQL connection ID 14092219
** Message: Thread 5 connected using MySQL connection ID 14092220
** Message: Thread 6 connected using MySQL connection ID 14092221
** Message: Thread 7 connected using MySQL connection ID 14092222
** Message: Thread 8 connected using MySQL connection ID 14092223
[...]
** Message: Thread 6 shutting down
** Message: Thread 3 shutting down
** Message: Thread 5 shutting down
** Message: Thread 8 shutting down
** Message: Thread 4 shutting down
** Message: Thread 2 shutting down
** Message: Thread 1 shutting down
** Message: Thread 7 shutting down
** Message: Finished dump at: 2014-03-18 16:42:44

Bon là on fait ça en root mais en vrai il faut faire un utilisateur dédié au backup. C'est plus propre et plus secure. Sinon, vos backups sont dans le dossier /root/test et les tables sont compressées. La liste des options que j'ai utilisé :

  • -o : dossier de destination
  • -c : active la commpression
  • -m : ne sauve pas les schémas
  • -B : spécifie la base à sauver
  • -u : utilisateur
  • -p : password
  • -t : nombre de threads
  • -v : niveau de verbosité du log

Pour restaurer, il suffit d'utiliser myloader sans décompresser les fichiers :


# myloader -d /root/test -u root -B base -p rootpassword -t 8 -v 3
♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.