REALIZAR Y RESTAURAR COPIAS DE SEGURIDAD EN MYSQL

* Primer método: parar el servidor y copiar o restaurar los ficheros, que están
en el directorio de datos (normalmente en ‘/var/lib/mysql/’). Para obtener
dicho directorio:

SHOW VARIABLES LIKE ‘datadir’;

En tablas de tipo MyISAM estos ficheros están en una carpeta con el nombre de
la base de datos, tienen el mismo nombre que las tablas y extensiones ‘*.frm’
(formato), ‘*.myd’ (datos), y ‘*.myi’ (índices).

En tablas de tipo InnoDB se encuentran ficheros con los nombres de las tablas
y extensión ‘*.frm’ en la carpeta de la base de datos, y en el directorio
principal de datos existen varios ficheros de datos con nombre ‘ibdata1’,
‘ibdata2’, … que comparten todas las bases de datos InnoDB del servidor, y
también los ficheros de «logs» de InnoDB: ‘ib_logfile0’, ‘ib_logfile1’, …

(Aviso: si los ficheros InnoDB vamos a copiarlos de un ordenador a otro, debe
cumplirse:
(1) que las bases de datos y tablas tengan nombres en minúsculas;
(2) que ambos ordenadores utilicen aritmética entera de complemento a dos; y
(3) que si hay tablas con columnas de tipo numero real, ambos ordenadores
utilicen el formato de números reales especificado por la IEEE.)

Ejemplos de realización de copias de seguridad: (1) con tar, (2) con zip, (3)
con rsync, (4) con cp, (5) con cp sólo bbdd world, (6) con cp sólo tabla City.

mysqladmin -u root -p shutdown

(1) sudo tar czf /tmp/mysql-backup.tar.gz /var/lib/mysql/
(2) sudo zip -r /tmp/mysql-backup.zip /var/lib/mysql/
(3) sudo rsync -r /var/lib/mysql/ /tmp/mysql-backup
(4) sudo cp -r /var/lib/mysql/ /tmp/mysql-backup
(5) sudo cp -r /var/lib/mysql/world/ /tmp/mysql-backup
(6) sudo cp -r /var/lib/mysql/world/City.* /tmp/mysql-backup

sudo /etc/init.d/mysql start

Ejemplos de restauración de las copias (vigilad con los permisos y con que el
propietario de los ficheros siga siendo ‘mysql’):

sudo /etc/init.d/mysql stop

sudo cp -r /otro_directorio/ /var/lib/mysql/
sudo chown -R mysql.mysql /var/lib/mysql/

sudo /etc/init.d/mysql start

* Segundo método: mediante el script ‘mysqlhotcopy’. Sólo sirve para tablas
MyISAM, pero es rápido y no hace falta parar el servidor ya que el script
bloquea las tablas. Se ejecuta localmente en el servidor.

Ejemplos de realización de copias de seguridad:

sudo mysqlhotcopy world /otro_directorio -u root -p contraseña

Ejemplos de restauración de las copias (vigilad con los permisos y con que el
propietario de los ficheros siga siendo ‘mysql’):

sudo /etc/init.d/mysql stop

sudo cp -r /otro_directorio/ /var/lib/mysql/
sudo chown -R mysql.mysql /var/lib/mysql/

sudo /etc/init.d/mysql start

* Tercer método: mediante el comando ‘mysqldump’. Es menos rápido, pero sirve
para todo tipo de tablas. El fichero que genera no contiene los datos, sino
instrucciones SQL que generan las tablas y les insertan los datos, por lo que
también nos sirve para migrar las bases de datos de MySQL a otro gestor. Se
puede ejecutar de forma local y remota, y los ficheros quedan en el servidor.

Ejemplos de realización de copias de seguridad:

mysqldump -u root -p world > world.sql
mysqldump -u root -p world Country City > pais_i_ciutat.sql
mysqldump -u root -p –xml world > world.xml
mysqldump -u root -p –tab=/tmp world
mysqldump -u root -p –all-databases > backup.sql
mysqldump -u root -p –opt world | mysql -h 192.168.0.110 -u root -pcontraseña mundo
mysqldump -u root -p –no-data world | mysql -h 192.168.0.110 -u root -pcontraseña mundo

Ejemplos de restauración de las copias:

mysql world -u root -p < world.sql

* Cuarto método: las sentencias SQL ‘BACKUP TABLE’ y ‘RESTORE TABLE’, que no
explicaré porque han quedado obsoletas.

* Para restaurar los cambios en la base de datos que se produjeron después de
la copia de seguridad debemos obtener dichos cambios de los ficheros de «logs»:

– Miramos cuales son posteriores a la fecha de la copia de seguridad:

ls -l /var/log/mysql


-rw-rw—- 1 mysql adm 11949 2007-02-04 09:23 mysql-bin.000102
-rw-rw—- 1 mysql adm 117 2007-02-04 13:46 mysql-bin.000103
-rw-rw—- 1 mysql adm 11906 2007-02-04 13:48 mysql-bin.000104

– Si queremos asegurarnos comprobando su contenido:

mysqlbinlog /var/log/mysql/mysql-bin.000102 | less

– Los restauramos ordenadamente:

mysqlbinlog /var/log/mysql/mysql-bin.000102 | mysql -u root -p
mysqlbinlog /var/log/mysql/mysql-bin.000103 | mysql -u root -p
mysqlbinlog /var/log/mysql/mysql-bin.000104 | mysql -u root -p

* Relacionado con el tema de las copias de seguridad, podemos comprimir las
tablas MyISAM que ya no se actualizan para que ocupen mucho menos espacio.
Comprimidas con la utilidad ‘myisampack’ todavía se pueden consultar aunque
no se pueden actualizar hasta que se descomprimen de nuevo con ‘myisamchk’.

myisampack /var/lib/mysql/world/City.MYI
myisamchk –recover –quick /var/lib/mysql/world/City.MYI

Para descomprimirlas:

myisamchk –unpack /var/lib/mysql/world/City.MYI

Para consultar si estaban comprimidas:

shell> mysql world -u root -p -e «SHOW TABLE STATUS LIKE ‘City'»

* Lecturas para profundizar:
– http://dev.mysql.com/doc/refman/5.0/es/disaster-prevention.html
– http://dev.mysql.com/doc/refman/5.0/es/mysqlhotcopy.html
– http://dev.mysql.com/doc/refman/5.0/es/mysqldump.html
– http://dev.mysql.com/doc/refman/5.0/es/mysqlbinlog.html
– http://dev.mysql.com/doc/refman/5.0/es/myisampack.html