systemadmin.es > DBA > REPAIR para todas las tablas con FULLTEXT

REPAIR para todas las tablas con FULLTEXT

Al realizar modificaciones en las variables de FULLTEXT de MySQL que hacen referencia a como se indexan (ft_min_word_len, ft_max_word_len y ft_stopword_file) deberemos reconstruir los índices con REPAIR TABLE.

Podemos encontrar la siguiente referéncia en el manual de MySQL sobre las variables de FULLTEXT:

If you modify full-text variables that affect indexing (ft_min_word_len, ft_max_word_len, or ft_stopword_file), or if you change the stopword file itself, you must rebuild your FULLTEXT indexes after making the changes and restarting the server. To rebuild the indexes in this case, it is sufficient to do a QUICK repair operation:

mysql> REPAIR TABLE tbl_name QUICK;

Each table that contains any FULLTEXT index must be repaired as just shown. Otherwise, queries for the table may yield incorrect results, and modifications to the table will cause the server to see the table as corrupt and in need of repair.

En el caso de tener que realizar los cambios a una base de datos con muchas tablas y que no sabemos de antemano cuales usan FULLTEXT podemos realizar una query a la base de datos information_schema para obtener el listado:

mysql> select TABLE_SCHEMA,TABLE_NAME,INDEX_NAME,INDEX_TYPE from STATISTICS LIMIT 1;
+------------------+---------------+------------+------------+
| TABLE_SCHEMA     | TABLE_NAME    | INDEX_NAME | INDEX_TYPE |
+------------------+---------------+------------+------------+
(...)
+------------------+---------------+------------+------------+
7454 rows in set (28.78 sec)

Vemos como en INDEX_TYPE tenemos el tipo de indice, por lo que con una simple condición WHERE podemos extraer todos los indices FULLTEXT.

A partir de estos datos podemos generar mediante CONCAT el listado de comandos que posteriormente ejecutaremos:

mysql> select DISTINCT (CONCAT('REPAIR TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' QUICK;')) from information_schema.STATISTICS where INDEX_TYPE="FULLTEXT" INTO OUTFILE '/tmp/repairfulltext';
271 rows in set (28.92 sec)

Usamos DISTINCT porque una tabla podría tener dos (o más) indices FULLTEXT, pero solo hace falta ejecutar el REPAIR una vez.

Finalmente podemos ejecutar los comandos generados:

mysql> SOURCE /tmp/repairfulltext;

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>