Respuestas:
desde la línea de comando puede usar:
mysqlcheck -A --auto-repair
El comando es este:
mysqlcheck -u root -p --auto-repair --check --all-databases
Debe proporcionar la contraseña cuando se le solicite,
o puede ejecutar este, pero no se recomienda porque la contraseña está escrita en texto sin cifrar:
mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases
Utilice la siguiente consulta para imprimir REPAIR
declaraciones SQL para todas las tablas dentro de una base de datos:
select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables
where table_schema='mydatabase';
Después de eso, copie todas las consultas y ejecútelas mydatabase
.
Nota: reemplace mydatabase
con el nombre de base de datos deseado
No es necesario escribir la contraseña, solo use cualquiera de estos comandos (se explica por sí mismo):
mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize
El siguiente comando funcionó para mí usando el símbolo del sistema (como administrador) en Windows:
mysqlcheck -u root -p -A --auto-repair
Ejecute mysqlcheck con el usuario root, solicite una contraseña, verifique todas las bases de datos y repare automáticamente las tablas dañadas.
No hay un comando predeterminado para hacer eso, pero puede crear un procedimiento para hacer el trabajo. Iterará a través de filas de information_schema
y llamará REPAIR TABLE 'tablename';
a cada fila. CHECK TABLE
aún no es compatible con declaraciones preparadas. Aquí está el ejemplo (reemplace MYDATABASE con el nombre de su base de datos):
CREATE DEFINER = 'root'@'localhost'
PROCEDURE MYDATABASE.repair_all()
BEGIN
DECLARE endloop INT DEFAULT 0;
DECLARE tableName char(100);
DECLARE rCursor CURSOR FOR SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA`=DATABASE();
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET endloop=1;
OPEN rCursor;
FETCH rCursor INTO tableName;
WHILE endloop = 0 DO
SET @sql = CONCAT("REPAIR TABLE `", tableName, "`");
PREPARE statement FROM @sql;
EXECUTE statement;
FETCH rCursor INTO tableName;
END WHILE;
CLOSE rCursor;
END
Me gusta esto para una simple verificación desde el shell:
mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>
mysql -ss
para omitir los nombres de las columnas de la salida; esto permitiría eliminarlos NR != 1
de su código
Es posible que necesite nombre de usuario y contraseña:
mysqlcheck -A --auto-repair -uroot -p
Se le pedirá una contraseña.
mysqlcheck -A --auto-repair -uroot -p{{password here}}
Si desea poner cron, ¡PERO su contraseña será visible en texto plano!
Si quedan tablas dañadas después
mysqlcheck -A --auto-repair
tratar
mysqlcheck -A --auto-repair --use-frm