Popravak oštećene MySQL baze

Kako smo u članku o alatu fsck spominjali, oštećenja datotečnog sustava su iako ne prečesto, ali ipak moguća. Čak i ako se sustav prilikom podizanja oporavio, to još ne znači da će svi servisi proraditi od prve. Dobar primjer je MySQL, koji se vrlo često rabi kod raznih CMS sustava, pa je prestanak rada baze podataka time postao ozbiljan problem, jer znači i prestanak rada web stranica.

U većini slučajeva, MySQL se može oporaviti sam, no ponekad je ipak potrebna intervencija sistem-inženjera. Ukoliko je ta intervencija potrebna, u logovima ćete moći vidjeti poruke poput ove:

Table 'vocabulary' is marked as crashed and should be repaired

Srećom, problem možemo probati riješiti na tri načina. Osim naredbenog retka MySQL-a ("CHECK TABLE/REPAIR TABLE"), postoje i alati myisamchk, te mysqlcheck. Alati myisamchk i mysqlcheck mogu detektirati i popravljati samo probleme u MyISAM tablicama, ali "CHECK TABLE" može detektirati probleme u InnoDB tablicama (ne i popraviti).

MyISAM je osnovni "storage engine" MySQL-a, a rabi se još i InnoDB. MyISAM je MySQL-ova implementacija ISAM enginea, i vrlo je brza, ali i neotpornija na rušenja baze. InnoDB je bolji, ali zahtjeva više memorije i sporiji je. Više o svim enginima koje MySQL podržava pročitajte na http://en.wikipedia.org/wiki/MySQL i http://en.wikipedia.org/wiki/MyISAM.

1. način: "CHECK/REPAIR TABLE"

Sintaksa naredbe je:

mysql> CHECK TABLE tablica[,tablica2...] [opcija][,opcija2...]

Opcije koje možete rabiti su:

QUICK, FAST, CHANGED, MEDIUM, EXTENDED

Opcija QUICK je najbrža i najpovršnija, dok je EXTENDED najsporija i najdetaljnija, dok su opcije između tih kompromis između brzine i detaljnosti. Koju ćete rabiti ovisi od slučaja do slučaja. Ukoliko vam je baza mala nema prepreka da odmah stavite opciju EXTENDED:

# mysql -u root -p
Enter password:********
...
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> CHECK TABLE user EXTENDED;
+------------+-------+----------+----------+
| Table      | Op    | Msg_type | Msg_text |
+------------+-------+----------+----------+
| mysql.user | check | status   | OK       |
+------------+-------+----------+----------+
1 row in set (0.00 sec)

U ovom slučaju popravak ne treba (poruka je "OK"), no može se dogoditi da je oštećena indeksna datoteka, kao u ovom primjeru:

mysql> REPAIR TABLE vocabulary;
+-------------------+--------+----------+-----------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------------------+--------+----------+-----------------------------------+
| drupal.vocabulary | repair | error | Can't find file: 'vocabulary.MYI' |
+-------------------+--------+----------+-----------------------------------+

Naredba REPAIR ima nešto drugačije opcije nego opcija CHECK, ali je osnovna premisa ista. Postoje tri opcije: QUICK, EXTENDED i USE_FRM. Uobičajeno nećete rabiti nijednu opciju. Opciju QUICK ćete odabrati kod velikih baza kada jeimperativ da baza proradi čim prije. Opcija EXTENDED se rabi kada nemate drugog izbora, i može generirati lažne zapise ("garbage rows").

Opcija USE_FRM je najkorisnija kod gore navedenog primjera, kada nedostaje indeksna datoteka, ili je oštećena:

mysql> REPAIR TABLE vocabulary USE_FRM; 
+-------------------+--------+----------+------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------------------+--------+----------+------------------------------------+
| drupal.vocabulary | repair | warning | Number of rows changed from 0 to 3 |
| drupal.vocabulary | repair | status | OK |
+-------------------+--------+----------+------------------------------------+

2. način: "myisamchk"

Da bi alat myisamchk mogao raditi, potrebno je da MySQL ne radi, znači alat radi direktno nad datotekama baze:

# myisamchk vocabulary.MYI
Checking MyISAM file: vocabulary.MYI
Data records:       0  
Deleted blocks:       0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check record links

Ukoliko se pokaže neka greška, možete je pokušati popraviti s opcijom "--repair":

# myisamchk --repair vocabulary.MYI
- recovering (with sort) MyISAM-table 'vocabulary.MYI'
Data records: 95
- Fixing index 1
- Fixing index 2

Ukoliko dobijete poruku "clients are using or haven’t closed the table properly", to znači da su tablice još uvijek otvorene, pa zaustavite MySQL daemon prije ponovnog pokušaja.

Naredba myisamchk također može rabiti različite razine provjere i popravka tablica. Najbrža je --quick, a najtemeljitija je --extend-check. Kod zadnje opcije preporučljivo je rabiti opciju --backup, jer može generirati lažne podatke pa je dobro imati kopiju stare (makar i oštećene) datoteke.

Zanimljiva je opcija --description, koja će vam dati podatke o tablici, poput statusa ili kodne stranice. Za više informacija uporabite je uz opciju --verbose, koju možete staviti više puta za još više informacija.

Na kraju, možete istovremeno provjeriti ili popraviti više baza/tablica, jednostavno upotrijebite zvjezdicu:

# cd /var/lib/mysql/baza_koju_zelite_provjeriti
# myisamchk --repair *.MYI

Naredba myisamchk se nalazi u paketu "mysql-server-5.0", odnosno pripadajućoj aktualnoj inačici paketa MySQL.

3. način: "mysqlcheck"

Treći način opravka je moguć pomoću alata mysqlcheck. Za ovaj način, mysql poslužitelj mora biti pokrenut. Mysqlcheck može i optimizirati tablice, ali to ostavljamo vama za "domaću zadaću".

Sintaksa ove naredbe je:

mysqlcheck [opcije] ime_baze tablica [tablica2... ].

Uporaba je kao kod naredbi myqsl, mysqladmin i sličnih:

# mysqlcheck -u root -p<vasa_zaporka> --repair drupal
drupal.access                                      OK
drupal.accesslog                                   OK
drupal.aggregator_category                         OK
drupal.aggregator_category_feed                    OK
drupal.aggregator_category_item                    OK
drupal.aggregator_feed                             OK
drupal.aggregator_item                             OK
...

Ukoliko neka od tablica nije u redu, možemo je probati popraviti sa opcijom "--repair", kao u primjeru. Ukoliko želite samo provjeriti tablice, a ukoliko se pojavi greška odmah je probati i popraviti, upotrijebite opciju "--auto-repair".

Dostupne su vam iste opcije kao i kod naredbenog retka u mysql-u, pa su tako opcije "--check-only-changed", "--extended", "--fast", "--medium-check" i "--quick" ekvivalentne opcijama koje možete upotrijebiti sa "CHECK TABLE".

Naredba mysqlcheck se nalazi u paketu "mysql-client-5.0", odnosno pripadajućoj aktualnoj inačici paketa.

Došli smo do kraja, a nadamo se da nećete morati rabiti niti jedan od ovih alata, jer to potencijalno može značiti gubitak podataka i downtime, koji korisnici, naravno, ne vole. Zato još jednom napominjemo da je aktualan backup jedino što vas može izvući i iz najvećih problema.

Kuharice: 
Kategorije: 
Vote: 
5
Vaša ocjena: Nema Average: 5 (1 vote)