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:
- Marek Demčák (2008-09-26): Jak opravit poškozenou innodb MySQL databázi
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.
- Roman Matěna (2008-04-02) MySQL database repair, jak opravit poškozenou databázi nebo špatně uzavřené tabulky, jak synchronizujete databáze?
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...