MySQL/Oprava tabulky

MySQL/Oprava tabulky

Nestává se to často, ale občas k tomu dojde – poškodí se tabulka, což je zpravidla dost nepříjemná záležitost.

Níže vycházím z události, která se mi přihodila v databázi hes16obj dne 2015-09-05 v tabulce zak, což je tabulka zákazníků.

Vznik problému editovat

Do políčka http, ktterý byl dimenzován jako VARCHAR 40, jsem v rozhraní phpMyAdmin zadal dvě URL, které se tam nevešly, takže jsem obdržel hlásku, že pole bylo oříznuto. (Přitom mi bylo trochu divné, že ve formuláři phpMyAdmin se to pole zobrazuje větší, než je jeho dimenze.) Rozhodl jsem se tedy pole zvětšit na 60 znaků. Poté se u phpMyAdmina objevila hláška "Ukládám" (nebo něco v tom smyslu), ale už to trvalo několik minut a pořád nic.

Nebyl jsem si jistý, jestli byl příkaz zpracován, zkusil jsem se tedy k databázi připojit z jiného okna phpMyAdminu, ale bezvýsledně.

Řádkový klient mysql funguje, příkaz

show columns from zak;

proběhl v pořádku, ukázal mi původní velikost

+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| http       | varchar(40) | YES  |     | NULL    |       |

Když jsem ale zadal dotaz

select * from zak;

nedočkal jsem se už odpovědi (nutno ukončit ctrl-C). Z toho jsem usoudil, že asi bude nějaký problém s tabulkou :-(

Co s tím? editovat

Nejdřív z posledního exportu zjistím, o jaký se jedná stroj:

CREATE TABLE IF NOT EXISTS `zak` (
...
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci CHECKSUM=1 COMMENT='Zákazníci';

Pak gůglím:

mysql oprava tabulky

a nacházím:

Týká se to InnoDB, ale něco se snad hodí i na MyISAM.

CHECK TABLE zak;

– nedočkám se odpovědi.

Z příkazového řádku se pokusím nejdříve udělat zálohu:

mysqldump -upetr -p********* hes16obj > hes16objw02problem.sql

Opět nekonečné čekání, nic prostě nejde udělat.

Koukám na

/var/log/mysql/error.log

– není tam nic, nulová délka.

Mysqlcheck editovat

Existuje nejen pro Win, ale je i u Ubuntu.

mysqlcheck -upetr -p****** hes16obj
hes16obj.obj                                       OK
hes16obj.obj_old                                   OK
hes16obj.text                                      OK
hes16obj.zak                                       OK

Tak dle něj je vše OK.

Najednou zjišťuji, že funguje i příkaz

CHECK TABLE zak;
+--------------+-------+----------+----------+
| Table        | Op    | Msg_type | Msg_text |
+--------------+-------+----------+----------+
| hes16obj.zak | check | status   | OK       |
+--------------+-------+----------+----------+
1 row in set (0.01 sec)
mysql> show columns from zak;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
...
| http       | varchar(60) | YES  |     | NULL    |       |
...
+------------+-------------+------+-----+---------+-------+
38 rows in set (0.00 sec)

Tak najednou jakoby bylo vše v pořádku – jen jakoby to prodloužení pole ze 40 na 60 znaků trvalo asi hodinu a mezitím server další dotazy na tuto tabulku nevyřizoval...