systemadmin.es > DBA > Importador/Exportador para MySQL: mydumper y myloader

Importador/Exportador para MySQL: mydumper y myloader

De sobra es conocido que mysqldump no es la mejor forma de hacer backups por lo básica que es la herramienta. Anteriormente ya hemos hablado de otras herramientas como mylvmbackup que hace un backup físico (datafiles) de la base de datos, vamos a ver el caso de mydumper.

Dicha herramienta la ha creado Domas Mituzas que según dice:

My current occupations:
Database Engineer at Facebook
Systems Engineer at Wikimedia Foundation (Wikipedia)

Para instalarla haremos:

cd /usr/local/src
wget https://launchpad.net/mydumper/0.5/0.5.2/+download/mydumper-0.5.2.tar.gz
tar xzf mydumper-0.5.2.tar.gz 
cd mydumper-0.5.2

Necesitaremos tener instalado cmake:

cmake .
make && make install

Una vez instalado mediante –help podemos ver que tenemos muchas opciones disponibles. Una particularmente interesante que estaría bien implementar en mylvmbackup es la protección contra queries largas que permite definir un umbral para matarlas y poder fer el backup:

# 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
  -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
  -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
  -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

Un ejemplo de ejecución con 3 threads para una base de datos en concreta, dejando el backup en /var/backup/mydumper, sería:

# time mydumper --database=cacavaca_wp --threads=3 --user=root --password=$(cat /var/mysql/.mysql.root.pass) -o /var/backup/mydumper

real	0m5.329s
user	0m0.032s
sys	0m0.013s

Esto nos generará un directorio con los ficheros:

# find
.
./export-20131112-193803
./export-20131112-193803/cacavaca_wp.wp_term_relationships-schema.sql
./export-20131112-193803/cacavaca_wp.wp_term_taxonomy-schema.sql
./export-20131112-193803/cacavaca_wp.wp_links-schema.sql
./export-20131112-193803/cacavaca_wp.wp_posts.sql
./export-20131112-193803/cacavaca_wp.wp_term_taxonomy.sql
./export-20131112-193803/cacavaca_wp.wp_terms-schema.sql
./export-20131112-193803/cacavaca_wp.wp_links.sql
./export-20131112-193803/cacavaca_wp.wp_postmeta.sql
./export-20131112-193803/cacavaca_wp.wp_comments.sql
./export-20131112-193803/cacavaca_wp.wp_options-schema.sql
./export-20131112-193803/cacavaca_wp.wp_comments-schema.sql
./export-20131112-193803/cacavaca_wp.wp_users.sql
./export-20131112-193803/cacavaca_wp.wp_postmeta-schema.sql
./export-20131112-193803/cacavaca_wp.wp_commentmeta-schema.sql
./export-20131112-193803/cacavaca_wp.wp_options.sql
./export-20131112-193803/metadata
./export-20131112-193803/cacavaca_wp.wp_usermeta.sql
./export-20131112-193803/cacavaca_wp.wp_term_relationships.sql
./export-20131112-193803/cacavaca_wp.wp_usermeta-schema.sql
./export-20131112-193803/cacavaca_wp.wp_terms.sql
./export-20131112-193803/cacavaca_wp.wp_users-schema.sql
./export-20131112-193803/cacavaca_wp.wp_posts-schema.sql

Si nos fijamos, crea un dos ficheros por tabla: nos separa el schema (cómo se crea la tabla) de los datos.

-rw-rw-r-- 1 root root    1485 Nov 12 19:38 cacavaca_wp.wp_posts-schema.sql
-rw-rw-r-- 1 root root 3079759 Nov 12 19:38 cacavaca_wp.wp_posts.sql

Por ejemplo, el fichero llamado schema sería:

# cat cacavaca_wp.wp_posts-schema.sql
/*!40101 SET NAMES binary*/;
/*!40014 SET FOREIGN_KEY_CHECKS=0*/;

CREATE TABLE `wp_posts` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_author` bigint(20) unsigned NOT NULL DEFAULT '0',
  `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_content` longtext NOT NULL,
  `post_title` text NOT NULL,
(...)
) ENGINE=MyISAM AUTO_INCREMENT=2645 DEFAULT CHARSET=utf8;

Y en el otro tendríamos los datos:

# cat cacavaca_wp.wp_posts.sql
/*!40101 SET NAMES binary*/;
/*!40014 SET FOREIGN_KEY_CHECKS=0*/;
INSERT INTO `wp_posts` VALUES
(...)

Debemos tener en cuenta que para bases de datos pequeñas no va a significar una reducción del tiempo de backup respecto un simple mysqldump, sino lo contrario:

# time mysqldump -p$(cat /var/mysql/.mysql.root.pass) cacavaca_wp > cacavaca_wp.sql

real	0m0.090s
user	0m0.048s
sys	0m0.014s

Aún así ganamos al tener los backups mucho mejor preparados para restauraciones parciales. La otra herramienta del pack es myloader para luego cargar los backups, podemos ver las opciones:

# myloader --help
Usage:
  myloader [OPTION...] multi-threaded MySQL loader

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

Application Options:
  -d, --directory                   Directory of the dump to import
  -q, --queries-per-transaction     Number of queries per transaction, default 1000
  -o, --overwrite-tables            Drop tables if they already exist
  -B, --database                    An alternative database to restore into
  -e, --enable-binlog               Enable binary logging of the restore data
  -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

Este es mucho más simple, la opción más relevante es la que permite indicar la base de datos a la que restaurar (permite no tener que mantener el nombre):

# myloader -d export-20131112-193803 -B cacavaca_wp_back -t 3 -p $(cat /var/mysql/.mysql.root.pass)

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>