Esta sección explica como hacer copias de seguridad (completas e
incrementales) y como realizar mantenimiento de tablas. La
sintaxis de las sentencias SQL descritas aquí se detalla en
Sección 13.5, “Sentencias de administración de base de datos”. La mayor parte de la
información aquí contenida se aplica principalmente a tablas
MyISAM
. Los procedimientos de copia de
seguridad para InnoDB
se explican en
Sección 15.8, “Hacer una copia de seguridad y recuperar una base de datos InnoDB
”.
Debido a que las tablas de MySQL se almacenan como archivos, es
fácil hacer una copia de seguridad. Para hacer una copia
consistente haga un LOCK TABLES
en las tablas
relevantes, seguido de un FLUSH TABLES
para
las tablas. Consulte Sección 13.4.5, “Sintaxis de LOCK TABLES
y UNLOCK TABLES
” y
Sección 13.5.5.2, “Sintaxis de FLUSH
”. Solo necesita obtener un bloqueo de
lectura; esto permite a otros clientes continuar consultando la
tabla mientras usted está haciendo una copia de los archivos
del directorio de la base de datos. La sentencia FLUSH
TABLES
es necesaria para asegurarse de que todas las
páginas de índice activas se escriben al disco antes de qeu
comience la copia.
Si quiere hacer una copia de una tabla a un nivel SQL, puede
utilizar SELECT INTO ... OUTFILE
o
BACKUP TABLE
. Para SELECT INTO ...
OUTFILE
, el archivo de salida no debe existir
previamente. Esto también es cierto para BACKUP
TABLE
, ya que permitir que archivos externos sean
sobreescritos sería un riesgo de seguridad. Consulte
Sección 13.2.7, “Sintaxis de SELECT
” y Sección 13.5.2.2, “Sintaxis de BACKUP TABLE
”.
Otra técnica para hacer copias de seguridad de una base de datos es utilizar el programa mysqldump o el script mysqlhotcopy script. Consulte See Sección 8.7, “El programa de copia de seguridad de base de datos mysqldump” y Sección 8.8, “El programa de copias de seguridad de base de datos mysqlhotcopy”.
-
Hacer una copia completa de su base de datos:
shell> mysqldump --tab=
/path/to/some/dir
--optdb_name
O:
shell> mysqlhotcopy
db_name
/path/to/some/dir
También puede simplemente copiar todos los archivos de tablas (
*.frm
,*.MYD
, y*.MYI
) siempre que el servidor no esté actualizando nada. El script mysqlhotcopy utiliza este método. (Pero tenga en cuenta que estos métodos no funcionan si su base de datos contiene tablasInnoDB
.InnoDB
no almacena los contenidos de las tablas en directorios de base de datos, y mysqlhotcopy funciona solo para tablasMyISAM
eISAM
.) -
Pare mysqld si se está ejecutando, y después reinicielo con la opción
--log-bin[=file_name]
. Consulte Sección 5.10.3, “El registro binario (Binary Log)”. Los archivos binarios de registro le dan la información que necesita para replicar los cambios que se han producido en la base de datos tras el punto en que usted ejecutó mysqldump.
Para las tablas InnoDB
es posible realizar
una copia de seguridad en línea que no requiere bloqueos en las
tablas; consulte Sección 8.7, “El programa de copia de seguridad de base de datos mysqldump”
MySQL tiene soporte para copias de seguridad incrementales:
Usted necesita iniciar el servidor con la opción
--log-bin
para activar el registro binario;
consulte Sección 5.10.3, “El registro binario (Binary Log)”. En el momento en que
usted quiera realizar una copia de seguridad incremental (que
contenga todos los cambios que han ocurrido desde la última
copia de seguridad, completa o incremental), usted debe rotar el
registro binario utilizando FLUSH LOGS
. Hecho
esto, necesita copiar a la localización de seguridad todos los
registros binarios que daten desde el momento de la última
copia de seguridad hasta el último. Estos logs binarios son la
copia de seguridad incremental; cuando necesite restaurar la
copia, los puede aplicar tal como se explica más adelante. La
próxima vez que haga una copia de seguridad compelta, también
debe rotar el registro binario haciendo FLUSH
LOGS
, mysqldump --flush-logs
, o
mysqlhotcopy --flushlogs
. Consulte
Sección 8.7, “El programa de copia de seguridad de base de datos mysqldump” y Sección 8.8, “El programa de copias de seguridad de base de datos mysqlhotcopy”.
Si su servidor MySQL es un servidor esclavo de replicación,
entonces independientemente del método de copia de seguridad
que elija, también debe copiar los archivos
master.info
y
relay-log.info
cuando copie los datos de su
esclavo. Estos archivos son siempre necesarios para continuar la
replicación después de una restauración de los datos del
esclavo. Si su esclavo está replicando comandos LOAD
DATA INFILE
, debería también copiar cualquier
archivo SQL_LOAD-*
que pueda existir en el
directorio especificado por la opción
--slave-load-tmpdir
. (Esta localización es
por defecto el valor de la variable tmpdir
,
si no se especifica.) El esclavo necesita estos archivos para
reiniciar la replicación de cualquier operación LOAD
DATA INFILE
interrumpida.
Si tiene que restaurar tablas MyISAM
, intente
recuperarlas utilizando REPAIR TABLE
o
myisamchk -r primero. Esto debería funcionar
en el 99.9% de los casos. Si myisamchk falla,
intente el siguiente procedimiento. Tenga en cuenta que solo
funciona si tiene activado el registro binario iniciando el
servidor MySQL con la opción --log-bin
;
consulte Sección 5.10.3, “El registro binario (Binary Log)”.
-
Restaure la copia de seguridad original de mysqldump, o la copia de seguridad binaria.
-
Ejecute el siguiente comando para ejecutar de nuevo las actualizaciones de los registros binarios:
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
En algunos casos, quizá quiera reejecutar solo ciertos registros binarios, desde ciertas posiciones (lo usual es querer reejecutar todos los registros binarios desde el punto de restauración, excepto, posiblemente, algunas sentencias incorrectas). Consulte Sección 8.5, “La utilidad mysqlbinlog para registros binarios” para más información sobre la utilidad mysqlbinlog y como utilizarla.
También puede hacer copias de seguridad selectivas de archivos individuales:
-
Para volcar la tabla, utilice
SELECT * INTO OUTFILE '
file_name
' FROMtbl_name
. -
Para recargar la tabla, restaurela con
LOAD DATA INFILE 'file_name' REPLACE ...
Para evitar registros duplicados, la tabla tiene que tener un índicePRIMARY KEY
oUNIQUE
. La palabra claveREPLACE
hace que los viejos registros sean reemplazados con los nuevos cuando un nuevo registro tiene la misma clave que uno antiguo.
Si tiene problema de rendimientos con su servidor mientras realiza copias de seguridad, una estrategia que puede ayudarle es crear replicación y hacer las copias de seguridad en el esclavo en vez de en el maestro. Consulte Sección 6.1, “Introducción a la replicación”.
Si está utilizando un sistema de ficheros Veritas, puede hacer una copia de seguridad así:
-
Desde un programa cliente, ejecute
FLUSH TABLES WITH READ LOCK
. -
Desde otra línea de comandos, ejecute
mount vxfs snapshot
. -
Desde el primer cliente, ejecute
UNLOCK TABLES
. -
Copie los archivos de la captura (snapshot).
-
Desmonte la captura.
Esta sección explica un procedimiento para realizar copias de seguridad que le permiten recuperar datos tras diferentes tipos de problemas:
-
Fallo del sistema operativo
-
Fallo de energía
-
Fallo del sistema de ficheros
-
Problema de hardware (disco duro, placa madre, etc)
Los comandos de ejemplo no incluyen opciones como
--user
y --password
para
los programas mysqldump y
mysql. Usted debería incluir las opciones
que sean necesarias para que el servidor MySQL le permita
conectarse.
Asumiremos que los datos están almacenados en el motor
InnoDB
de MySQL, que tiene soporte para
transacciones y recuperación automática de fallos. Siempre
asumiremos que el servidor MySQL está bajo carga de trabajo en
el momento del fallo. Si no fuera así, no se necesitaría
ninguna recuperación.
Para casos de fallos de energía o de sistema operativo, podemos
asumir que el disco de datos de MySQL está disponible tras el
reinicio. Puede que entonces los archivos de datos de
InnoDB
no contengan datos consistentes debido
al fallo, pero InnoDB
lee sus registros y
encuentra en ellos la lista de transacciones confirmadas y no
confirmadas qeu todavía no han sido volcadas a sus archivos de
datos, y los vuelca. La información sobre este proceso de
recuperación de errores se le muestra al usuario a través del
registro de errores de MySQL. Lo siguiente, es un extracto de
ejemplo del registro:
InnoDB: Database was not shut down normally. InnoDB: Starting recovery from log files... InnoDB: Starting log scan based on checkpoint at InnoDB: log sequence number 0 13674004 InnoDB: Doing recovery: scanned up to log sequence number 0 13739520 InnoDB: Doing recovery: scanned up to log sequence number 0 13805056 InnoDB: Doing recovery: scanned up to log sequence number 0 13870592 InnoDB: Doing recovery: scanned up to log sequence number 0 13936128 ... InnoDB: Doing recovery: scanned up to log sequence number 0 20555264 InnoDB: Doing recovery: scanned up to log sequence number 0 20620800 InnoDB: Doing recovery: scanned up to log sequence number 0 20664692 InnoDB: 1 uncommitted transaction(s) which must be rolled back InnoDB: Starting rollback of uncommitted transactions InnoDB: Rolling back trx no 16745 InnoDB: Rolling back of trx no 16745 completed InnoDB: Rollback of uncommitted transactions completed InnoDB: Starting an apply batch of log records to the database... InnoDB: Apply batch completed InnoDB: Started mysqld: ready for connections
En casos de fallos del sistema de fichero o de hardware, podemos asumir que el disco de datos de MySQL no está disponible tras el reinicio. Esto significa que MySQL no puede arrancar normalmente porque algunos bloques de datos del disco no son legibles. En este caso, es necesario reformatear el disco, instalar uno nuevo, o en cualquier caso, corregir el problema subyacente. Después es necesario recuperar nuestros datos de MySQL desde copias de seguridad, lo que significa que tenemos que tener copias ya realizadas. Para asegurarse de que sea así, vayamos hacia atrás en el tiempo y diseñemos una política de copias de seguridad.
Todos sabemos que las copias de seguridad deben programarse
periodicamente. Las copias completos (una captura del estado
de los datos en un momento del tiempo) puede hacerse con
diferentes herramientas, en MySQL. Por ejemplo,
InnoDB Hot Backup
nos provee con una copia
de seguridad en línea sin bloqueos de los archivos de datos
de InnoDB
, y con
mysqldump obtenemos copias de seguridad
lógicas online. En esta explicación utilizaremos
mysqldump.
Supongamos que hacemos una copia de seguridad el domingo, a
las 1 PM, cuando la carga es baja. El siguiente comando hace
un hace una copia de seguridad completa de todas nuestras
tablas InnoDB
de todas las bases de datos:
shell> mysqldump --single-transaction --all-databases > backup_sunday_1_PM.sql
Esto es una copia de seguridad en línea, sin bloqueos, que no
molesta a las lecturas y escrituras de las tablas. Hemos
supuesto antes que nuestras tablas son
InnoDB
, así que
--single-transaction
hace una lectura
consistente y garantiza que los datos vistos por
mysqldump no cambian. (Los cambios hechos
por otros clientes a las tablas InnoDB
no
son vistas por el proceso mysqldump.) Si
también tenemos otros tipos de tablas, debemos suponer que no
han sido cambiadas durante la copia de seguridad. Por ejemplo,
para las tablas MyISAM
en la base de datos
mysql
, debemos suponer que no se estaban
haciendo cambios administrativos a las cuentas MySQL durante
la copia de seguridad.
El archivo .sql
resultante producido por
el comando mysqldump contiene una serie de
sentencias SQL INSERT
que se pueden
utilizar para recargar las tablas volcadas más tarde.
Las copias de seguridad completas son necesarias, pero no son siempre convenientes. Producen ficheros muy grandes y llevan tiempo generarse. No son óptimos en el sentido de que cada copia completa sucesiva incluye todos los datos, incluidas las partes que no han cambiado desde el último. Después de realizar una copia de seguridad completa inicial, es más eficiente hacer copias incrementales. Son más pequeñas, y llevan menos tiempo de realización. A cambio, en el momento de la recuperación, no podrá restaurarlo únicamente recargando la copia completa. También deberá procesar las copias incrementales para recuperar los cambios incrementales.
Para hacer copias de seguridad incrementales, necesitamos
guardar los cambios incrementales. El servidor MySQL debería
ser iniciado siempre con la opción
--log-bin
para que almacene estos cambios
en un archivo mientras actualiza los datos. Esta opción
activa el registro binario, así que el servidor escribe cada
sentencia SQL que actualiza datos en un archivo lllamado
registro binario de MySQL. Miremos al directorio de datos de
un servidor MySQL que fue iniciado con la opción
--log-bin
y que se ha estado ejecutando
durante algunos días. Encontramos estos archivos de registro
binario:
-rw-rw---- 1 guilhem guilhem 1277324 Nov 10 23:59 gbichot2-bin.000001 -rw-rw---- 1 guilhem guilhem 4 Nov 10 23:59 gbichot2-bin.000002 -rw-rw---- 1 guilhem guilhem 79 Nov 11 11:06 gbichot2-bin.000003 -rw-rw---- 1 guilhem guilhem 508 Nov 11 11:08 gbichot2-bin.000004 -rw-rw---- 1 guilhem guilhem 220047446 Nov 12 16:47 gbichot2-bin.000005 -rw-rw---- 1 guilhem guilhem 998412 Nov 14 10:08 gbichot2-bin.000006 -rw-rw---- 1 guilhem guilhem 361 Nov 14 10:07 gbichot2-bin.index
Cada vez que se reinicia, el servidor MySQL crea un nuevo
archivo de registro binario utilizando el siguiente número en
la secuencia. Mientras el servidor se está ejecutando,
podemos comunicarle manualmente que cierre el archivo de
registro binario actual y comience otro nuevo, ejecutando la
sentencia SQL FLUSH LOGS
o con el comando
mysqladmin flush-logs.
mysqldump también tiene una opción para
volcar los logs. El archivo .index
en el
directorio de datos contiene la lista de todos los archivos de
registro binario de MySQL en el directorio. Este archivo se
utiliza para replicación.
El registro binario de MySQL es importante para la restauración, porque son copias incrementales de datos. Si se asegura de volcar los registros cuando hace su copia de seguridad completa, entonces cualquier registro binario creado tras esa copia contiene todos los cambios hechos desde entonces. Modifiquemos el comando mysqldump previo un poco para que vuelque los registros binarios de MySQL en el momento de la copia de seguridad completa, y para que el archivo de volcado contenga el nombre del registro binario actual:
shell> mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > backup_sunday_1_PM.sql
Tras ejecutar este comando, el directorio de datos contiene un
nuevo archivo de registro binario,
gbichot2-bin.000007
. El archivo
.sql
resultante contiene estas líneas:
-- Position to start replication or point-in-time recovery from -- CHANGE MASTER TO MASTER_LOG_FILE='gbichot2-bin.000007',MASTER_LOG_POS=4;
Como el comando mysqldump ha hecho una copia de seguridad completa, estas líneas significan dos cosas:
-
El archivo
.sql
contiene todos los cambios hechos antes de cualquier cambio escrito al registro binariogbichot2-bin.000007
o posterior. -
Todos los cambios registrados tras la copia de seguridad no están presentes en el archivo
.sql
, pero lo están en el registro binariogbichot2-bin.000007
o posterior.
El lunes, a las 1 PM, podemos crear una copia de seguridad
incremental volcando los registros para comenzar un nuevo
registro binario. Por ejemplo, ejecutando un comando
mysqladmin flush-logs creamos
gbichot2-bin.000008
. Todos los cambios
producidos entre el domingo a la 1 PM cuando se hizo la copia
completa, y el lunes a la 1 PM están en el archivo
gbichot2-bin.000007
. Esta copia
incremental es importante, así que es una buena idea copiarla
a un lugar seguro. (Por ejemplo, en cinta o DVD, o copiándolo
a otra máquina.) El martes a la 1 PM, ejecute otro comando
mysqladmin flush-logs. Todos los cambios
desde el lunes a la 1 PM hasta el martes a la 1 PM están en
el archivo gbichot2-bin.000008
(que
también debería ser copiado a un lugar seguro).
Los registros binarios de MySQL ocupan espacio de disco. Para ligerar espacio, púrguelos de vez en cuando. Una manera de hacerlo es borrar los registros binarios que no se necesiten, como cuando hacemos una copia de seguridad completa:
shell> mysqldump --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > backup_sunday_1_PM.sql
Tenga en cuenta que: Borrar los registros binarios de MySQL con mysqldump --delete-master-logs puede ser peligroso si su servidor es un servidor maestro de replicación, porque los servidores esclavos pueden no haber procesado completamente los contenidos del registro binario.
La descripción de la sentencia PURGE MASTER
LOGS
explica lo que debe ser verificado antes de
borrar los registros binarios de MySQL. Consulte
Sección 13.6.1.1, “Sintaxis de PURGE MASTER LOGS
”.
Ahora suponga que tenemos un fallo catastrófico el miércoles a las 8 AM que requiere restauración de las copias de seguridad. Para recuperarnos, primero restauramos la última copia de seguridad completa que tenemos (la del domingo a la 1 PM). El archivo de copia completo es tan solo una serie de sentencias SQL, así qeu restaurarlo es muy fácil:
shell> mysql < backup_sunday_1_PM.sql
En este punto, el estado de los datos ha sido restaurado al
del domingo a la 1 PM. Para restaurar los datos hechos desde
entonces, debemos usar las copias incrementales, es decir los
archivos de registro binario
gbichot2-bin.000007
y
gbichot2-bin.000008
. Extraigalos, si es
necesario, de allá donde estuviesen guardados, y luego
procese sus contenidos de la siguiente manera:
shell> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql
Ahora hemos recuperado los datos hasta su estado del martes a
la 1 PM, pero todavía hay cambios que faltan desde esa fecha
hasta el momento del fallo. Para no perderlos, deberíamos
haber hecho que el servidor MySQL almacenase sus registros
MySQL en un lugar seguro (discos RAID, ...) diferente del
lugar donde almacena sus archivos de datos, para que estos
registros no estuvieran únicamente en el disco destruido. (Es
decir, iniciar el servidor con la opción
--log-bin
que especifique una localización
en un dispositivo físico diferente del que contiene el
directorio de datos. De esta manera, los registros no se
pierden aún si el dispositivo que contiene el directorio
sí.) Si hubiésemos hecho esto, podríamos tener el archivo
gbichot2-bin.000009
a mano, y podríamos
aplicarlo para restaurar hasta los cambios más recientes sin
ninguna pérdida a como estaban en el momento del fallo.
En caso de un fallo de sistema operativo o energía,
InnoDB
hace todo el trabajo de
restauración de datos por si mismo. Pero para asegurarse de
que puede dormir bien, tenga en cuenta los siguientes puntos:
-
Ejecute siempre el servidor MySQL con la opción
--log-bin
, o mejor aún--log-bin=
log_name
, donde el archivo de registro está guardado en algún medio diferente al disco en donde está el directorio de datos. Si tiene un medio seguro tal, también puede ser bueno para hacer balanceo de carga de disco (que resulta en una mejora de rendimiento). -
Haga copias de seguridad completas periodicas, utilizando el último comando mysqldump dado previamente, que hace una copia de seguridad en línea sin bloqueo.
-
Haga copias de seguridad incrementales periodicamente volcando los registros con
FLUSH LOGS
o mysqladmin flush-logs.
El siguiente texto explica como utilizar
myisamchk para comprobar o reparar tablas
MyISAM
(tablas con archivos
.MYI
and .MYD
).
Puede utilizar la utilidad myisamchk para obtener información sobre las tablas de su base de datos, o para comprobar, reparar u optimizarlas. Las siguientes secciones explican como invocar myisamchk (incluyendo una descripción de sus opciones), como establecer un calendario de mantenimiento de tablas, y como utilizar myisamchk para que realice sus diferentes funciones.
Aunque la reparación de tablas con myisamchk es bastante segura, siempre es una buena idea hacer una copia de seguridad antes de hacer una reparación (o cualquier operación de mantenimiento que pueda hacer muchos cambios a una tabla)
Las operaciones de myisamchk que afectan a
índices pueden causar que los índices
FULLTEXT
sean recreados con parámetros que
son incompatibles con los valores utilizados por el servidor
MySQL. Para evitar esto, lea las instrucciones en
Sección 5.8.3.2, “Opciones generales demyisamchk”.
En muchos casos, podría encontrar más simple hacer el
mantenimiento de las tablas MyISAM
utilizando
las sentencias SQL que realizan las mismas operaciones que
myisamchk:
-
Para comprobar o reparar tablas
MyISAM
tables, useCHECK TABLE
oREPAIR TABLE
. -
Para optimizar tablas
MyISAM
, useOPTIMIZE TABLE
. -
Para analizar tablas
MyISAM
, useANALYZE TABLE
.
Estas sentencias pueden ser utilizadas directamente, o mediante el programa cliente mysqlcheck, que provee de una interfaz de línea de comandos.
Una de las ventajas de estas sentencias sobre myisamchk es que el servidor hace todo el trabajo. Con myisamchk, usted debe asegurare de que el servidor no utiliza las tablas al mismo tiempo. Si no es así, podría haber interacciones no deseadas entre myisamchk y el servidor.
Invoque myisamchk de la siguiente manera:
shell> myisamchk [opciones
]tbl_name
Las options
especifican lo que
quiere que myisamchk haga. Se describen en
las secciones posteriores. También puede obtener una lista de
las opciones invocando myisamchk --help.
Sin opciones, myisamchk simplemente comprueba la tabla, como operación por defecto. Para obtener más información, o decirle a myisamchk que tome medidas correctivas, especifique las opciones tal como se explica en la siguiente guía.
tbl_name
es el nombre de la tabla
que quiere comprobar o reparar. Si ejecuta
myisamchk desde otro lugar que no sea el
directorio de la base de datos, debe especificar la ruta hasta
este directorio, porque myisamchk no tiene
la más mínima idea de en qué lugar se encuentra la base de
datos. De hecho, myisamchk no se preocupa
por si los archivos sobre los que trabaja se encuentran en un
directorio de base de datos. Puede copiar los archivos que
corresponden a la tabla en cualquier otro lugar, y hacer las
operaciones de recuperación allí.
Puede invocar varios nombres de tablas en la línea de
comandos de myisamchk, si lo desea.
También puede especificar una tabla nombrando a su archivo de
índices (el archivo con extensión
.MYI
). Esto permite que especifique todas
las tablas de un directorio utilizando el patrón
*.MYI
. Por ejemplo, si se encuentra en un
directorio de una base de datos, puede comprobar todas las
tablas MyISAM
de ese directorio de la
siguiente manera:
shell> myisamchk *.MYI
Si no se encuentra en el directorio de la base de datos, puede comprobar todas las tablas especificando la ruta al directorio:
shell> myisamchk /path/to/database_dir/*.MYI
Incluso se podría comprobar todas las tablas en todas las bases de datos especificando un comodín en la ruta a el archivo de datos MySQL:
shell> myisamchk /path/to/datadir/*/*.MYI
La manera recomendada de comprobar rápidamente todas las
tablas MyISAM
e ISAM
es:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI shell> isamchk --silent /path/to/datadir/*/*.ISM
Si usted quiere comprobar todas las tablas
MyISAM
e ISAM
y
repararlas si alguna está corrompida, puede utilizar los
siguientes comandos:
shell> myisamchk --silent --force --fast --update-state \ -O key_buffer=64M -O sort_buffer=64M \ -O read_buffer=1M -O write_buffer=1M \ /path/to/datadir/*/*.MYI shell> isamchk --silent --force -O key_buffer=64M \ -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M \ /path/to/datadir/*/*.ISM
Estos comandos asumen que tiene más de 64MB libres. Para más información sobre reserva de memoria con myisamchk, consulte Sección 5.8.3.6, “Utilización de la memoria por parte de myisamchk”.
Debe asegurarse de que ningún otro programa está utilizando las tablas mientras ejecute myisamchk. Si no es así, cuando ejecute myisamchk, puede obtener el siguiente mensaje de error:
warning: clients are using or haven't closed the table properly
Esto significa que está intentando comprobar una tabla que ha sido cambiada por otro programa (como podría ser el servidor mysqld) que no ha cerrado aún el archivo, o que ha muerto sin cerrar el archivo adecuadamente.
Si mysqld se está ejecutando, debe
forzarlo a volcar cualquier modificación de tablas que
todavía esté almacenada en memoria, utilizando
FLUSH TABLES
. Debería entonces asegurarse
de que nadie está utilizando las tablas sobre las que se
ejecuta myisamchk. La manera más fácil de
evitar este problema es utilizar CHECK
TABLE
en vez de myisamchk para
comprobar las tablas.
Las opciones descritas en esta sección pueden utilizarse para cualquier tipo de operación de mantenimiento de tabla realizada por myisamchk. Las secciones que siguen a la presente explican las opciones que pertenecen tan solo a operaciones específicas, como la comprobación o reparación de tablas.
-
--help, -?
Muestra un mensaje de ayuda y finaliza.
-
--debug=
debug_options
, -#debug_options
Escribe un registro de depuración. La cadena
debug_options
suele ser frecuentemente'd:t:o,
file_name
'. -
--silent, -s
Modo silencioso. Escribe solo cuando ocurre algún tipo de error. Puede usar
-s
dos veces (-ss
) para hacer que myisamchk sea muy silencioso. -
--verbose, -v
Modo explícito. Imprime más información. Esto puede ser utilizado en conjunción con
-d
y-e
. Utilice-v
múltiples veces (-vv
,-vvv
) para producir aún más información. -
--version, -V
Muestra información sobre la versión y finaliza.
-
--wait, -w
En vez de terminar con un error si la tabla se encuentra bloqueada, espera a que la tabla se desbloquee antes de continuar. Tenga en cuenta que si está ejecutando mysqld con la opción
--skip-external-locking
, la tabla sólo puede haber sido bloqueada por otro comando myisamchk.
También puede establecer las variables utilizando
--
var_name
=value
opciones:
Variable | Valor por defecto |
decode_bits
|
9 |
ft_max_word_len
|
dependiente-de-versión |
ft_min_word_len
|
4 |
ft_stopword_file
|
lista interna |
key_buffer_size
|
523264 |
myisam_block_size
|
1024 |
read_buffer_size
|
262136 |
sort_buffer_size
|
2097144 |
sort_key_blocks
|
16 |
write_buffer_size
|
262136 |
Las posibles variables de myisamchk y sus valores por defecto pueden ser examinadas con myisamchk --help:
sort_buffer_size
se utiliza cuando las
claves son reparadas mediante ordenación, que es el caso
normal cuando se utiliza --recover
.
key_buffer_size
se utiliza cuando se está
comprobando una tabla con --extend-check
o
cuando las claves se están reparando insertándolas registro
a registro en la tabla (como cuando se hacen inserciones
normales). La reparación a través del "key buffer" se
utiliza en los siguientes casos:
-
Ha utilizado
--safe-recover
. -
Los archivos temporales necesarios para ordenar las claves serían más del doble de grandes que cuando se crea el archivo de claves directmaente. Esto ocurre usualmente cuando hay valores grandes en la clave (tipos de columna como
CHAR
,VARCHAR
, oTEXT
), porque la operación de ordenamiento necesita almacenar los valores de las claves por completo mientras procede. Si tiene mucho espacio temporal y puede forzar a que myisamchk repare mediante ordenación, puede utilizar la opción--sort-recover
.
La reparación mediante el "key buffer" necesita mucho menos espacio de disco que utilizar ordenación, pero es también mucho más lenta.
Si quiere una reparación más rápida, establezca las
variables key_buffer_size
y
sort_buffer_size
a un valor aproximadamente
dle 25% de la memoria disponible. Puede subir ambas variables
a un valor grande, porque solo se utiliza una de ellas a la
vez.
myisam_block_size
es el tamaño utilizado
para los bloques de índices.
ft_min_word_len
y
ft_max_word_len
indican la longitud de
palabra mínima y máxima para índices
FULLTEXT
.
ft_stopword_file
indica un archivo de
"palabra de parada". Esto necesita establecerse en las
siguientes circunstancias.
Si utiliza myisamchk para realizar una
operación que modifica los índices de las tablas (como una
reparación o un análisis), los índices
FULLTEXT
son reconstruidos utilizando el
archivo de palabra de parada por defecto a menos que
especifique lo contrario. Esto puede resultar en el fallo de
sentencias.
El problema ocurre porque estos parámetros son sólo
conocidos por el servidor. No están almacenados en los
archivos de índices de MyISAM
. Para evitar
el problema, si usted a modificado la longitud mínima o
máxima de palabra, o el archivo de palabra de parada en el
servidor, especifique los mismos valores de
ft_min_word_len
,
ft_max_word_len
, y
ft_stopword_file
para
myisamchk que los que ha utilizado para
mysqld. Por ejemplo, si ha establecido una
longitud de palabra mínima de 3, puede reparar una tabla con
myisamchk así:
shell> myisamchk --recover --ft_min_word_len=3 tbl_name
.MYI
Para asegurarnos de que myisamchk y el
servidor utilizan los mismos valores para los parámetros de
full-text, podemos ponerlos en las secciones
[mysqld]
y [myisamchk]
de un archivo de opciones:
[mysqld] ft_min_word_len=3 [myisamchk] ft_min_word_len=3
Una alternativa a utilizar myisamchk es
usar las sentencias REPAIR TABLE
,
ANALYZE TABLE
, OPTIMIZE
TABLE
, o ALTER TABLE
. Estas
sentencias son ejecutadas por el servidor, que conoce los
parámetros de full-text apropiados que debe utilizar.
myisamchk soporta las siguientes opciones para las operaciones de comprobación de tablas:
-
--check, -c
Comprueba si hay errores en la tabla. Esta es la operación por defecto si no se especifica ninguna opción que seleccione la operación a realizar.
-
--check-only-changed, -C
Comprueba sólo las tablas que han cambiado desde la última comprobación.
-
--extend-check, -e
Comprueba la tabla muy concienzudamente. Esto es muy lento si la tabla tiene muchos índices. Esta opción debería ser utilizada únicamente en casos extremos. Normalmente, myisamchk o myisamchk --medium-check deberían ser capaces de determinar si hay algún error en la tabla.
Si está utilizando
--extend-check
y tiene bastante memoria, establecer un valor grande para la variablekey_buffer_size
ayuda a que la operación de reparación vaya más rápido. -
--fast, -F
Comprueba solo las tablas qeu no han sido cerrados apropiadamente.
-
--force, -f
Realiza una operación de reparación automaticamente si myisamchk encuentra cualquier error en la tabla. El tipo de reparación es el mismo que el que se espcifica con la opción
--repair
o-r
. -
--information, -i
Imprime estadísticas informativas sobre la tabla que se comprueba.
-
--medium-check, -m
Realiza una comprobación que es más rápida que
--extend-check
. Esta comprobación encuentra solo el 99.99% de todos los errores, lo que debería ser suficiente en la mayor parte de los casos. -
--read-only, -T
No señala la tabla como comprobada. Esto es útil si utiliza myisamchk para comprobar una tabla que está siendo utilizada por otra aplicación que no utiliza bloqueos, como mysqld cuando se ejecuta con la opción
--skip-external-locking
. -
--update-state, -U
Almacena información en el archivo
.MYI
para indicar que la tabla ha sido comprobada, o si la tabla tiene fallos. Esto debería utilizarse par obtener el máximo beneficio de la opción--check-only-changed
, pero no debería utilizarse esta opción si se está ejecutando el servidor mysqld, con la opción--skip-external-locking
, y éste está utilizando la tabla.
myisamchk tiene soporte para las siguientes opciones en las operaciones de reparación de tablas:
-
--backup, -B
Realiza una copia de seguridad del archivo
.MYD
con el formatofile_name-time.BAK
-
--character-sets-dir=
path
El directorio donde los juegos de carácteres están instalados. Consulte Sección 5.9.1, “El conjunto de caracteres utilizado para datos y ordenación”.
-
--correct-checksum
Corrige la información de checksum de la tabla.
-
--data-file-length=
#
, -D#
Longitud máxima del archivo de datos. (cuando se está reconstruyendo el archivo de datos porque está ``lleno'').
-
--extend-check, -e
Realiza una reparación que intenta recuperar todos los registros posibles del archivo de datos. Normalmente esto también encuentra un montón de registros basura. No utilice esta opción al menos que esté desesperado.
-
--force, -f
Sobreescribe los archivos temporales viejos (archivos con nombres como
tbl_name
.TMD) en vez de interrumpir la reparación. -
--keys-used=
#
, -k#
Para myisamchk, el valor de esta opción indica qué índices tiene que actualizar. Cada bit binario de la opción, corresponde a un índice de la tabla, donde el primer índice es el bit 0. Para isamchk, esta opción indica que sólo los primeros
#
índices de la tabla deben ser actualizados. En cualquier caso, un valor de 0 en la opción desahbilita las actualizaciones a todos los índices, lo que puede ser utilizado para obtener inserciones más rápidas. Los índices desactivados pueden ser reactivados utilizando myisamchk -r. -
--no-symlinks, -l
No sigue los enlaces simbólicos. Normalmente repara una tabla que esté apuntada por un enlace simbólico. Esta opción no existe en MySQL 4.0, porque las versiones a partir de la 4.0 no eliminan los enlaces simbólicos durante las operaciones de reparación.
-
--parallel-recover, -p
Utiliza la misma técnica que
-r
y-n
, pero crea todas las claves en paralelo, utilizando hilos de ejecución diferentes. Esto es código en estado alpha. Utilícelo bajo su propia responsabilidad. -
--quick, -q
Consigue una reparación más rápida al no modificar el archivo de datos. Puede especificar esta opción dos veces para forzar a myisamchk a modificar el archivo original de datos en el caso de claves duplicadas.
-
--recover, -r
Realiza una reparación que puede resolver casi cualquier problema, excepto las claves únicas que no son únicas (que es un error extremadamente raro en tablas
MyISAM
). Si quiere recuperar una tabla, esta es la primera opción a intentar. Debería intentar con-o
sólo si myisamchk comunica que la tabla no puede recuperarse con-r
. (En el improbable caso de que-r
falle, el archivo de datos permanece intacto.)Si tiene memoria suficiente, debería incrementar el valor de
sort_buffer_size
. -
--safe-recover, -o
Hace una reparación utilizando un méto de recuperación antiguo que lee todos los registros en orden y actualiza todos los árboles de índices basándose en los registros encontrados. Esto es de un orden de magnitud más lento que
-r
, pero puede gestionar un puñado de casos muy improbables que-r
no puede. Este método de recuperación también utiliza mucho menos espacio de disco que-r
. Normalmente debería reparar primero con-r
, y luego utilizar-o
solo si-r
falla.Si tiene mucha memoria, debería incrementar el valor de
key_buffer_size
. -
--set-character-set=
name
Cambia el juego de carácteres utilizado por los índices de tabla. Esta opción fue reemplazada por
--set-collation
en MySQL 5.0.3. -
--set-collation=
name
Cambia la colación utilizada para ordenar los índices de las tablas. El nombre del código de carácteres viene implícito en la primera parte del nombre de la colación. Esta opción fue añadida en MySQL 5.0.3.
-
--sort-recover, -n
Fuerza a que myisamchk utilice ordenación para establecer las claves aunque los archivos temporales puedan ser muy grandes.
-
--tmpdir=
path
, -tpath
La ruta a el directorio que debe utilizarse para almacenar archivos temporales. Si no está establecida, myisamchk utiliza el valor de la variable de entorno
TMPDIR
.tmpdir
puede ser establecido como una lista de rutas de directorios que son utilizadas sucesivamente de una manera a lo "round-robin" para crear archivos temporales. El carácter de separación entre los nombres de directorio es el de dos puntos en Unix (':
') y el punto y coma en Windows, Netware, y OS/2 (';
'). -
--unpack, -u
Descomprime una tabla que fue comprimida con myisampack.
myisamchk tiene soporte para las siguientes opciones en cuanto a acciones que no son comprobaciones ni reparaciones de tablas:
-
--analyze, -a
Analiza la distribución de las claves. Esto mejora el rendimiento de las join habilitando al optimizador de join para escober mejor el orden en que unirá las tablas y qué claves debería utilizar. Para obtener información sobre la distribución, utilice el comando myisamchk --description --verbose
tbl_name
o la sentenciaSHOW KEYS FROM
tbl_name
. -
--description, -d
Imprime información descriptiva sobre la tabla.
-
--set-auto-increment[=
value
], -A[value
]Fuerza que la numeración auto incremental para los nuevos registros comience en un valor dado (o superior, si existen registros con valores autoincrementales tan altos). Si
value
no está especificado, el incremente automático comienza con al valor más grande que haya actualmetne en la tabla, más uno. -
--sort-index, -S
Ordena los bloques de árboles de índices de mayor a menor. Esto optimiza las búsquedas y hace que el escaneo por clave de las tablas sea más rápido.
-
--sort-records=
#
, -R#
Ordena los registros de acuerdo a un índice particular. Esto hace que sus datos están mucho más localizables y puede agilizar operaciones
SELECT
yORDER BY
basados en rangos que utilicen este índice. (La primera vez que utilice esta opción para ordenar una tabla, puede ser muy lento.) Para determinar los números de índices de una tabla, utiliceSHOW KEYS
, que muestra los índices de una tabla en el mismo orden en que myisamchk los ve. Los ínidces están numerados comenzando por 1.
La reserva de memoria es importante cuando ejecute
myisamchk. myisamchk no
utiliza más memoria de la que se especifique con las opciones
-O
. Si usted va a utilizar
myisamchk en tablas muy grandes, debería
primero decidir cuanta memoria quiere utilizar. Por defecto,
se utilizarán más o menos 3MB para realizar reparaciones.
Utilizando valores más grandes, puede conseguir que
myisamchk funcione más rápido. Por
ejemplo, si tiene más de 32MB de RAM, podría utilizar estas
otras opciones (además de las otras que pueda especificar):
shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...
Utilizar -O sort=16M
probablemente sea
suficiente para la mayoría de los casos.
Tenga en cuenta que myisamchk utiliza
archivos temporales en TMPDIR
. Si
TMPDIR
apunta a un sistema de ficheros en
memoria, podría quedarse fácilmente sin memoria y obtener
errores. Si esto ocurre, haga que TMPDIR
apunte a algún directorio de un sistema de ficheros con más
espacio y ejecute el comando myisamchk de
nuevo.
Mientras está reparando, myisamchk también necesita mucho espacio de disco:
-
Doble el espacio del archivo de datos (el original y una copia). Este espacio no se necesitará si hace una reparación con la opción
--quick
; en este caso solo se reconstruye el archivo de índices (la copia se crea en el mismo directorio que el original.) -
El espacio para el archivo de índices que reemplaza al viejo. El archivo de índices viejo se trunca en el inicio de la operación de reparación, así que usualmente este espacio se ignora. Este espacio debe estar en el mismo sistema de ficheros que el archivo de índices original.
-
Cuando utilice
--recover
o--sort-recover
(pero no al utilizar--safe-recover
), necesitará espacio para un buffer de ordenación. El espacio requerido es:(
clave_más_larga
+longitud_de_puntero_a_registro
) *número_de_registros
* 2Puede comprobar la longitud de las claves y la longitud_de_puntero_a_registro con myisamchk -dv
tbl_name
. Este espacio se reserva en el directorio temporal (especificado porTMPDIR
o--tmpdir=
path
).
Si tiene algún problema con el espacio de disco durante una
reparación, puede intentar utilizar
--safe-recover
en vez de
--recover
.
Si ejecuta mysqld con
--skip-external-locking
(lo que es la
opción por defecto en algunos sistemas, como Linux), no puede
utilizar myisamchk de manera segura para
comprobar una tabla si mysqld está
utilizando esta misma tabla. Si puede asegurarse de que nadie
está accediendo a las tablas a través de
mysqld mientras ejecuta
myisamchk, entonces solo tendrá que hacer
mysqladmin flush-tables antes de comenzar
la comprobación de las tablas. Si no puede garantizar esto,
entonces debe parar mysqld mientras
comprueba las tablas. Si ejecuta myisamchk
mientras mysqld está actualizando las
tablas, puede obtener un aviso de que una tabla está corrupta
aún cuando no sea así.
Si no está utilizando
--skip-external-locking
, puede utilizar
myisamchk para comprobar tablas en
cualquier momento. Mientras hace esto, todos los clientes que
intenten actualizar la tabla esperarán hasta que
myisamchk esté listo para continuar.
Si utiliza myisamchk para reparar u
optimizar tablas, debe siempre asegurarse
de que el servidor mysqld no está
utilizando la tabla (esto es también aplicable cuando el
usted esté utilizando
--skip-external-locking
). Si no apaga
mysqld, al menos debe hacer un
mysqladmin flush-tables antes de ejecutar
myisamchk. Sus tables podrían
corromperse si el servidor y
myisamchk acceden a las tablas
simultáneamente.
Esta sección describe como comprobar y actuar si existe corrupción en bases de datos MySQL. Si sus tablas se corrompen frecuentemente, usted debería intentar encontrar la razón. Consulte Sección A.4.2, “Qué hacer si MySQL sigue fallando (crashing)”.
Para una explicación de como las tablas
MyISAM
pueden corromperse, consulte
Sección 14.1.4, “Problemas en tablas MyISAM
”.
Cuando realice recuperación de fallos, es importante entender
que cada tabla MyISAM
con nombre
tbl_name
en una base de datos
corresponde a tres archivos en el directorio de la base de
datos:
Archivo | Propósito |
tbl_name .frm |
Archivo de definición (formato) |
tbl_name .MYD |
Archivo de datos |
tbl_name .MYI |
Archivo de índices |
Cada uno de estos tres tipos de archivos tiene un tipo de peligro de corrupción diferente, pero la mayoría de problemas ocurren más frecuentemente en los archivos de datos e índices.
myisamchk trabaja creando una copia de el
archivo de datos .MYD
registro a
registro. Finaliza el estadio de reparación borrando el viejo
archivo .MYD
y renombrando el nuevo
archivo a el nombre original. Si utiliza
--quick
, myisamchk no
crea un archivo.MYD
temporal, sino que
asume que el archivo .MYD
está correcto
y solo genera un nuevo archivo de índices sin tocar el
archivo .MYD
. Esto es seguro porque
myisamchk automáticamente detecta sí el
archivo .MYD
está corrompido, y para la
reparación si lo está. También puede especificar la opción
--quick
dos veces. En este caso,
myisamchk no aborta al encontrar algunos
errores (como erroes de clave duplicada), sino que intenta
resolverlo modificando el archivo .MYD
.
Normalmente, la utilización de dos opciones
--quick
es útil sólo si tiene muy poco
espacio libre para realizar una reparación normal. En este
caso, al menos debería hacer una copia de seguridad antes de
ejecutar myisamchk.
Para comprobar una tabla MyISAM
, utilice
los siguientes comandos:
-
myisamchk
tbl_name
Esto encuentra el 99.99% de todos los errores. Lo que no puede encontrar es corrupción que involucre sólo al archivo de datos (lo que es muy inusual). Si quiere comprobar una tabla, normalmente debería ejecutar myisamchk sin opciones, o al menos con la opción
-s
o--silent
. -
myisamchk -m
tbl_name
Esto encuentra el 99.999% de todos los errores. Primero comprueba todos los índices, y después lee todos los registros. Calcula en checksum para todas las claves en los registros, y verifica que coincida con el de las claves en el árbol de índices.
-
myisamchk -e
tbl_name
Esto hace una comprobación completa y exhaustiva de todos los datos (
-e
significa ``comprobación extendida''). Hace una comprobación-lectura de la clave de cada registro para verificar que de hecho apuntan al registro correcto. Esto normalmente puede llevar mucho tiempo para una tabla grande que tenga muchos índices. Normalmente myisamchk se para tras el primer error que encuentra. Si quiere obtener más información, puede añadir la opción--verbose
(-v
). Esto causa que myisamchk durante un máximo de 20 errores. -
myisamchk -e -i
tbl_name
Igual que el comando previo, pero la opción
-i
le dice a myisamchk que imprima también algunas estadísticas informativas.
En la mayoría de casos, un comando myisamchk sin más argumentos que el nombre de la tabla original es suficiente para comprobar la tabla.
La discusión en esta sección describe cómo usar
myisamchk en tablas
MyISAM
(extensiones
.MYI
y .MYD
).
También puede ( y debe, si es posible) usar los comandos
CHECK TABLE
y REPAIR
TABLE
para chequear y reparar tablas
MyISAM
. Consulte
Sección 13.5.2.3, “Sintaxis de CHECK TABLE
” y
Sección 13.5.2.6, “Sintaxis de REPAIR TABLE
”.
Los síntomas de tablas corruptas incluyen consultas que abortan inesperadamente y errores observables como los siguientes:
-
tbl_name
.frm is locked against change -
Can't find file
tbl_name
.MYI (Errcode:###
) -
Unexpected end of file
-
Record file is crashed
-
Got error
###
from table handler
Para obtener ejecución acerca de los errores puede ejectuar
perror ###
,
donde ###
es el número de error.
El siguiente ejemplo muestra cómo usar
perror para encontrar el significado de la
mayoría de errores comunes que indican un problema con la
tabla:
shell> perror 126 127 132 134 135 136 141 144 145 126 = Index file is crashed / Wrong file format 127 = Record-file is crashed 132 = Old database file 134 = Record was already deleted (or record file crashed) 135 = No more room in record file 136 = No more room in index file 141 = Duplicate unique key or constraint on write or update 144 = Table is crashed and last repair failed 145 = Table was marked as crashed and should be repaired
Tenga en cuenta que el error 135 (no more room in record file)
y el error 136 (no more room in index file) no son errores que
puedan arreglarse con una simple reparación. En este caso,
debe usar ALTER TABLE
para incrementar los
valores de las opciones de tabla MAX_ROWS
y
AVG_ROW_LENGTH
:
ALTER TABLEtbl_name
MAX_ROWS=xxx
AVG_ROW_LENGTH=yyy
;
Si no conoce los valores actuales de las opciones de tabla,
use SHOW CREATE TABLE
o
DESCRIBE
.
Para los otros errores, debe reparar las tablas. myisamchk normalmente detecta y arregla la mayoría de problemas que ocurren.
El proceso de reparación incluye hasta cuatro etapas, descritas aquí. Antes de empezar, debe cambiar la localización al directorio de la base de datos y comprobar los permisos de los ficheros de las tablas. En Unix, asegúrese que puede leerlos el usuario con el que corre mysqld (y con su usuario, ya que necesita acceder a los ficheros que está comprobando). En caso que necesite modificar ficheros, debe tener también permiso de escritura.
Las opciones que puede usar para el mantenimiento de tablas con myisamchk y isamchk se describen en varias de las primeras subsecciones de Sección 5.8.3, “Mantenimiento de tablas y recuperación de un fallo catastrófico (crash)”.
La siguiente sección es para los casos en los que los comandos anteriores fallen o si quiere usar las características extendidas que myisamchk y isamchk proporcionan.
Si va a reparar una tabla desde la línea de comandos, debe parar el servidor mysqld en primer lugar. Tenga en cuenta que cuando ejectua mysqladmin shutdown en un servidor remoto, el servidor mysqld todavía está activo durante un periodo de tiempo una vez que mysqladmin devuelve el control, hasta que todas las consultas están paradas y todas las claves se han volcado a disco.
Etapa 1: Comprobación de tablas
Ejecute myisamchk *.MYI o
myisamchk -e *.MYI si tiene más tiempo.
Use la opción -s
(silencio) para suprimir
información innecesaria.
Si el servidor mysqld está parado, debe
usar la opción --update-state
para decirle
a myisamchk que marque la tabla como
'comprobada'.
Debe reparar sólo las tablas en que myisamchk anuncia un error. Para estas tables, pase a la Etapa 2.
Si obtiene errores extraños al hacer la comprobación (tales
como errores out of memory
), o si
myisamchk cae, pase a la Etapa 3.
Etapa 2: Reparación sencilla
Nota: Si quiere que una operación de reparación sea mucho
más rápida, debe cambiar los valores de las variables
sort_buffer_size
y
key_buffer_size
al 25% aproximado de la
cantidad de memoria disponible al ejecutar
myisamchk o isamchk.
En primer lugar, intente myisamchk -r -q
tbl_name
(-r
-q
significa ``modod de recuperación rápido'').
Intenta reparar el fichero de indexación sin tocar el fichero
de datos. Si el fichero de datos contiene todo lo que debería
y los vínculos de borrado apuntan a la localización correcta
dentro del fichero de datos, esto debería funcionar, y la
tabla estaría reparada. Empiece a reparar la siguiente tabla.
Si no es así, use el siguiente procedimiento:
-
Haga una copia de seguridad del fichero de datos antes de continuar.
-
Use myisamchk -r
tbl_name
(-r
significa ``modo de recuperación''). Esto elimina registros incorrectos y registros borrados del fichero de datos y recunstruye el fichero de indexación. -
Si el paso precedente falla, use myisamchk --safe-recover
tbl_name
. El modo de recuperación seguro usa un método de reucperación antiguo que soporta algunos casos que los metodos normales de recuperación no soportan (pero es más lento).
Si obtiene errores extraños al reparar (tales como errores
out of memory
), o si
myisamchk cae, pase a la Etapa 3.
Etapa 3: Reparaciones complicadas
Debe llegar a esta etapa sólo si el primer bloque de 16KB en el fichero de indexación está destruido o contiene información incorrecta, o si el fichero de indexación no se encuentra. En este caso, es necesario crear un nuevo fichero de indexación. Hágalo así:
-
Mueva el fichero de datos a una ubicación segura.
-
Use el fichero descriptor de la tabla para crear unos ficheros de datos e indexación nuevos (vacíos):
shell> mysql
db_name
mysql> SET AUTOCOMMIT=1; mysql> TRUNCATE TABLEtbl_name
; mysql> quitSi su versión de MySQL no soporta
TRUNCATE TABLE
, useDELETE FROM
tbl_name
en su lugar. -
Copie el antiguo fichero de datos otra vez sobre el nuevo fichero de datos (recién creado). (No se limite a mover el fichero antiguo sobre el nuevo; debe guardar una copia por si algo falla.)
Vuelva a la Etapa 2. myisamchk -r -q debería funcionar. (Este no debería ser un bucle sin fin.)
Puede usar REPAIR TABLE
tbl_name
USE_FRM, que
realiza el proceso completo automáticamente.
Etapa 4: Reparaciones muy complicadas
Debe llegar a esta etapa sólo si el fichero de descripción
.frm
ha tenido problemas. Esto no
debería ocurrir nunca, ya que el fichero de descripción
nunca cambia una vez que la tabla se crea:
-
Restaure el fichero de descripción desde una copia de seguridad y vuelva a la Etapa 3. También puede restaurar el fichero índice y volver a la Etapa 2. En este último caso, puede comenzar con myisamchk -r.
-
Si no tiene una copia de seguridad pero sabe exactamente cómo se creó la tabla, cree una copia de la tabla en otra base de datos. Borre el nuevo fichero de datos, luego mueva los ficheros
.frm
de descripción y.MYI
de indexación desde la otra base de datos a la base de datos que tiene problemas. Esto le da unos nuevos ficheros de descripción e indexación, pero deja el fichero de datos.MYD
solo. Vuelva a la Etapa 2 y trate de reconstruir el fichero de indexación.
Para eliminar registros fragmentados y eliminar espacio desperdiciado resultante del borrado o actualización de registros, ejecute myisamchk en modo recuperación:
shell> myisamchk -r nombre_tabla
Puede optimizar una tabla de la misma forma usando el comando
SQL OPTIMIZE TABLE
. OPTIMIZE
TABLE
realiza una reparación de la tabla y un
análisis de las claves, y también ordena el árbol de
índices para obtener un mejor rendimiento en la búsqueda de
claves. No hay posibilidad de interacción no deseada entre
una utilidad y el servidor, ya que el servidor hace todo el
trabajo cuando usa OPTIMIZE TABLE
. Consulte
Sección 13.5.2.5, “Sintaxis de OPTIMIZE TABLE
”.
myisamchk tiene una serie de opciones que puede usar para mejorar el rendimiento de una tabla:
-
-S
,--sort-index
-
-R
index_num
,--sort-records=
index_num
-
-a
,--analyze
Para una descripción completa de estas opciones, consulte Sección 5.8.3.1, “Sintaxis para invocar myisamchk”.
Es una buena práctica realizar chequeos de las tablas
regularmente en lugar de esperar a que ocurran los problemas.
Una forma de chequear y reparar tablas MyISAM
es con los comandos CHECK TABLE
y
REPAIR TABLE
. Consulte
Sección 13.5.2.3, “Sintaxis de CHECK TABLE
” y Sección 13.5.2.6, “Sintaxis de REPAIR TABLE
”.
Otro modo de chequear tablas es usar
myisamchk. Para mantenimiento, puede usar
myisamchk -s. La opción
-s
(forma corta de
--silent
) hace que
myisamchk se ejecute en modo silencioso,
mostrando mensajes sólo cuando hay algún error.
Es una buena idea chequear las tablas al arrancar el servidor.
Por ejemplo, cada vez que la máquina se reinicia durante una
actualización, normalmente necesita chequear todas las tablas
que hayan podido ser afectadas. (Éstas son las ``tablas que
creemos que han fallado.'') Para chequear automáticamente
tablas MyISAM
, arranque el servidor con la
opción --myisam-recover
.
Un test todavía mejor sería chequear cualquier tabla cuya
fecha de última modificación es más reciente que la del
fichero .pid
.
Debe chequear las tablas regularmente durante operaciones
normales del sistema. En MySQL AB, utilizamos un trabajo
cron para chequear todas nuestras tablas
importantes una vez a la semana, usando una línea como esta en
un fichero crontab
:
35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI
Esto muestra información acerca de tablas que han fallado de forma que podemos examinarlas y repararlas cuando es necesario.
Como no hemos tenido tablas que hayan fallado inesperadamente (tablas que se corrompen por razones distintas a fallos de hardware) durante un par de años (esto es cierto), una vez a la semana es más que suficiente para nosotros.
Recomendamos que para empezar, ejecute myisamchk -s cada noche en todas la tablas que se hayan actualizado durante las últimas 24 horas, hasta que confíe en MySQL tanto como nosotros.
Normalmente, las tablas MySQL necesitan poco mantenimiento. Si
cambia las tablas MyISAM
con registros de
tamaño dinámico (tablas con columnas
VARCHAR
, BLOB
, o
TEXT
) o tiene tablas con muchos registros
borrados puede que quiera defragmentar/reaprovechar espacio de
las tablas de vez en cuendo (una vez al mes?).
Puede hacerlo con OPTIMIZE TABLE
en las
tablas en cuestión. O, si puede parar el servidor
mysqld por un rato, cambiando la
localización al directorio de datos y usando este comando
mientras el servidor está parado:
shell> myisamchk -r -s --sort-index -O sort_buffer_size=16M */*.MYI
Para obtener una descripción de tabla o estadísticas acerca de ella, use el comando mostrado a continuación:
-
myisamchk -d
nombre_tabla
Ejecute myisamchk en ``modo descripción'' para producir una descripción de la tabla. Si inicia el servidor MySQL usando la opción
--skip-external-locking
, myisamchk puede reportar un error para una tabla que se actualice mientras está en ejecución. Sin embargo, ya que myisamchk no cambia la tabla en modo descripción, no hay riesgo de destruir los datos. -
myisamchk -d -v
nombre_tabla
Añadiendo
-v
myisamchk se ejecuta en modo información (verbose) así que produce más información acerca de lo que está haciendo. -
myisamchk -eis
nombre_tabla
Muestra sólo la información más importante de una tabla. Esta operación es lenta ya que debe leer la tabla entera.
-
myisamchk -eiv
nombre_tabla
Es como
-eis
, pero dice lo que está haciendo.
A continuación hay unos ejemplos de la salida de estos comandos. Están basados en una tabla con estos tamañanos de fichero de datos e índices:
-rw-rw-r-- 1 monty tcx 317235748 Jan 12 17:30 company.MYD -rw-rw-r-- 1 davida tcx 96482304 Jan 12 18:35 company.MYM
Ejemplos de salida de myisamchk -d:
MyISAM file: company.MYI Record format: Fixed length Data records: 1403698 Deleted blocks: 0 Recordlength: 226 table description: Key Start Len Index Type 1 2 8 unique double 2 15 10 multip. text packed stripped 3 219 8 multip. double 4 63 10 multip. text packed stripped 5 167 2 multip. unsigned short 6 177 4 multip. unsigned long 7 155 4 multip. text 8 138 4 multip. unsigned long 9 177 4 multip. unsigned long 193 1 text
Ejemplo de salida de myisamchk -d -v:
MyISAM file: company Record format: Fixed length File-version: 1 Creation time: 1999-10-30 12:12:51 Recover time: 1999-10-31 19:13:01 Status: checked Data records: 1403698 Deleted blocks: 0 Datafile parts: 1403698 Deleted data: 0 Datafile pointer (bytes): 3 Keyfile pointer (bytes): 3 Max datafile length: 3791650815 Max keyfile length: 4294967294 Recordlength: 226 table description: Key Start Len Index Type Rec/key Root Blocksize 1 2 8 unique double 1 15845376 1024 2 15 10 multip. text packed stripped 2 25062400 1024 3 219 8 multip. double 73 40907776 1024 4 63 10 multip. text packed stripped 5 48097280 1024 5 167 2 multip. unsigned short 4840 55200768 1024 6 177 4 multip. unsigned long 1346 65145856 1024 7 155 4 multip. text 4995 75090944 1024 8 138 4 multip. unsigned long 87 85036032 1024 9 177 4 multip. unsigned long 178 96481280 1024 193 1 text
Ejemplo de salida de myisamchk -eis:
Checking MyISAM file: company Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4 Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4 Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4 Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3 Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4 Total: Keyblocks used: 98% Packed: 17% Records: 1403698 M.recordlength: 226 Packed: 0% Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00 Record blocks: 1403698 Delete blocks: 0 Recorddata: 317235748 Deleted data: 0 Lost space: 0 Linkdata: 0 User time 1626.51, System time 232.36 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 627, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 639, Involuntary context switches 28966
Ejemplo de salida de myisamchk -eiv:
Checking MyISAM file: company Data records: 1403698 Deleted blocks: 0 - check file-size - check delete-chain block_size 1024: index 1: index 2: index 3: index 4: index 5: index 6: index 7: index 8: index 9: No recordlinks - check index reference - check data record references index: 1 Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4 - check data record references index: 2 Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4 - check data record references index: 3 Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4 - check data record references index: 4 Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3 - check data record references index: 5 Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 6 Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 7 Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 8 Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 9 Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4 Total: Keyblocks used: 9% Packed: 17% - check records and index references [LOTS OF ROW NUMBERS DELETED] Records: 1403698 M.recordlength: 226 Packed: 0% Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00 Record blocks: 1403698 Delete blocks: 0 Recorddata: 317235748 Deleted data: 0 Lost space: 0 Linkdata: 0 User time 1639.63, System time 251.61 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0 Blocks in 4 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 10604, Involuntary context switches 122798
Explicación de los tipos de información que produce myisamchk se dan a continación. ``Keyfile'' se refiere al fichero índice. ``Record'' y ``row'' son sinónimos.
-
MyISAM file
(Fichero MyISAM)Nombre del fichero índice
MyISAM
. -
File-version
(Versión del fichero)Versión del formato
MyISAM
. Actualmente siempre es 2. -
Creation time
(Fecha de creación)Cuando se creó el fichero de datos.
-
Recover time
(Fecha de recuperación)Cuando el fichero de índices/datos se reconstruyó por última vez.
-
Data records
(Fecha de recuperación)Cuántos registros hay en la tabla.
-
Deleted blocks
(Bloques borrados)Cuántos bloques borrados todavía tienen espacio reservado. Puede optimizar la tabla para minimizar este espacio. Consulte Sección 5.8.3.10, “Optimización de tablas”.
-
Datafile parts
(Partes de ficheros de datos)Para el formato de registros dinámicos, indica cuántos bloques de datos hay. Para una tabla optimizada sin registros fragmentados, es lo mismo que
Registros de datos
. -
Deleted data
(Datos borrados)Cuántos bytes hay de datos borrados sin reclamar. Puede optimizar la tabla para minimizar este espacio. Consulte Sección 5.8.3.10, “Optimización de tablas”.
-
Datafile pointer
(Puntero fichero de datos)El tamaño del puntero del fichero de datos, en bytes. Normalmente es de 2, 3, 4, o 5 bytes. La mayoría de tablas se administran con 2 bytes, pero MySQL no puede controlar esto todavía. Para tablas arregladas, esta es la dirección de un registro. Para tablas dinámicas, es la dirección de un byte.
-
Keyfile pointer
(Puntero fichero de claves)El tamaño del puntero del fichero índice, en bytes. Normalmente es de 1, 2, o 3 bytes. La mayoría de tablas se administran con 2 bytes, pero esto se calcula automáticamente por MySQL. Siempre es la dirección de un bloque.
-
Max datafile length
(Máximo tamaño fichero de datos)Cuánto puede crecer el fichero de datos, en bytes.
-
Max keyfile length
(Máximo tamaño fichero de claves)Cuánto puede creceer el fichero índice, en bytes.
-
Recordlength
(Tamaño registro)El tamaño de cada registro, en bytes.
-
Record format
(Formato de registro)El formato usado para almacenar registro de tablas. Los ejemplos precedentes usan
Fixed length
. Otros valores posibles sonCompressed
yPacked
. -
table description
(Descripción de tabla)Una lista de todas las claves en la tabla. Para cada clave, myisamchk muestra alguna información a bajo nivel:
-
Key
(Clave)El número de esta clave.
-
Start
(Inicio)Dónde en el registro comienza esta parte del índice.
-
Len
(Longitud)El tamaño de esta parte del índice. Para números empaquetados, este debería ser siempre la longitud completa de la columna. Para cadenas de carácteres, podría ser menor que la longitud total de la columna indexada, ya que puede indexar un prefijo de una columna de cadenas de carácteres.
-
Index
(Índice)Si un valor clave puede existir múltiples veces en el índice. Los valores son
unique
omultip.
(múltiples). -
Type
(Tipo)Qué tipo de datos tiene esta parte del índice. Este es un tipo de datos
MyISAM
con las opcionespacked
,stripped
, oempty
. -
Root
(Raíz)Dirección del bloque índice raíz.
-
Blocksize
(Tamaño de bloque)El tamaño de cada bloque de índices. Por defecto es de 1024, pero el valor puede cambiar en tiempo de compilación cuando MySQL se construye desde el código fuente.
-
Rec/key
(Registros/clave)Este es un valor estadístico usado por el optimizador. Dice cuántos registros hay por valor para esta clave. Una clave única siempre tiene un valor de 1. Puede actualizarse tras la carga de una tabla (o muy cambiada) con myisamchk -a. Si no se actualiza en absoluto, el valor por defecto es 30.
Para la tabla mostrada en los ejemplos, hay dos líneas para
table description
(descripción de tabla) para el noveno índice. Esto indica que es un índice de múltiples partes, en este caso con dos. -
-
Keyblocks used
(Bloques de claves usados)Porcentaje de los bloques de clave usados. Cuando una tabla se ha reorganizad con myisamchk, como en los ejemplos, los valores son muy altos (muy cerca del máximo teórico).
-
Packed
(Empaquetado)MySQL intenta empaquetar las claves con un sufijo común. Sólo puede usarse para índices en columnas
CHAR
,VARCHAR
. Para cadenas de carácteres largas que tienen partes izquierdas de la cadena similares, esto puede reducir significativamente el espacio usado. En el tercer ejemplo dado anteriomente, la cuarta clave tiene una longitud de 10 carácteres y se consigue una reducción del 60% del espacio. -
Max levels
(Número máximo de niveles)La profunidad del árbol-B para esta clave. Tablas grandes con valores de clave grandes obtienen valores altos.
-
Records
RegistrosNúmero de registros en la tabla.
-
M.recordlength
Longitud de registro mediaLa media de la longitud de los registros. Este valor es la longitud de registro para tablas con registros de longitud fija, ya que todos los registros tienen la misma longitud.
-
Packed
EmpaquetadoEspacios vacíos al final de las cadenas de carácteres en MySQL. El valor
Packed
indica el porcentaje de ahorro conseguido haciendo un empaquetado. -
Recordspace used
Espacio de registro usadoPorcentaje del fichero de datos usado.
-
Empty space
Espacio vacíoPorcentaje del fichero de datos sin usar.
-
Blocks/Record
Bloques/RegistroNúmero medio de bloques por registro (de cuántos enlaces se compone un registro fragmentado). Siempre es 1.0 para una tabla con formato fijo. Este valor debe estar tan cercano a 1.0 como sea posible. Si crece mucho, puede reorganizar la tabla. Consulte Sección 5.8.3.10, “Optimización de tablas”.
-
Recordblocks
Bloques de registroCuántos bloques (enlaces) se usan. Para formato fijo, esto es lo mismo que el número de registros.
-
Deleteblocks
Bloques borradosCuántos bloques (enlaces) están borrados.
-
Recorddata
Datos de registroCuántos bytes en el fichero de datos se usan.
-
Deleted data
Datos borradosCuántos bytes en el fichero de datos están borrados (no usados).
-
Lost space
Espacio perdidoSi un registro se actualiza a una longitudo más pequeña, se pierde algo de espacio. Este valor es la suma de todas estas pérdidas, en bytes.
-
Linkdata
Datos enlazadosCuando se usa el formato de tabla dinámico, los fragmentos de registros se enlazan con punteros (de 4 a 7 bytes cada uno).
Linkdata
es la suma de la cantidad de almacenamiento usada por estos punteros.
Si una tabla se ha comprimido con myisampack, myisamchk -d muestra información adicional acerca de cada columna de la tabla. Consulte Sección 8.2, “myisampack, el generador de tablas comprimidas de sólo lectura de MySQL”, para un ejemplo de esta información y una descripción de lo que significa.