Како да ги поправите оштетените табели во MySQL
Вовед
Повремено, табелите на MySQL може да се оштетат, што значи дека се појавила грешка и податоците што се чуваат во нив се нечитливи. Обидите за читање од оштетена табела обично ќе доведат до паѓање на серверот.
Некои вообичаени причини за расипани табели се:
- Серверот MySQL застанува во средината на пишувањето.
- Надворешна програма менува табела која истовремено се менува од серверот.
- Машината е неочекувано исклучена.
- Хардверот на компјутерот не успева.
- Има софтверска грешка некаде во кодот на MySQL.
Ако се сомневате дека една од вашите табели е оштетена, треба да направите резервна копија од директориумот со податоци пред да ја решите или да се обидете да ја поправите табелата. Ова ќе помогне да се минимизира ризикот од губење на податоци.
Прво, запрете ја услугата MySQL:
- sudo systemctl stop mysql
Забелешка: на некои платформи како Rocky Linux, услугата MySQL може да се вика mysqld
.
Потоа копирајте ги сите ваши податоци во нов директориум за резервни копии. На Ubuntu системите, стандардниот директориум со податоци е /var/lib/mysql/
:
- cp -r /var/lib/mysql /var/lib/mysql_bkp
Откако ќе направите резервна копија, подготвени сте да започнете да истражувате дали табелата е всушност оштетена. Ако табелата го користи моторот за складирање MyISAM, можете да проверите дали е оштетен со рестартирање на MySQL и извршување на изјава CHECK TABLE
од промптот MySQL:
- sudo systemctl start mysql
- CHECK TABLE table_name;
На излезот од оваа изјава ќе се појави порака што ќе ве информира дали е оштетена или не. Ако табелата MyISAM е навистина оштетена, таа обично може да се поправи со издавање на изјава REPAIR TABLE
:
- REPAIR TABLE table_name;
Под претпоставка дека поправката е успешна, ќе видите ваква порака на вашиот излез:
Output+--------------------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status | OK |
+--------------------------+--------+----------+----------+
Меѓутоа, ако табелата е сè уште оштетена, документацијата MySQL предлага неколку алтернативни методи за поправка на оштетени табели.
Од друга страна, ако оштетената табела го користи моторот за складирање InnoDB, тогаш процесот за негова поправка ќе биде различен. InnoDB е стандардниот мотор за складирање во MySQL од верзијата 8.0 и има автоматизирани операции за проверка и поправка на корупција. InnoDB проверува за оштетени страници со вршење проверка на секоја страница што ја чита, и ако најде несовпаѓање на контролната сума, автоматски ќе го запре серверот MySQL.
Ретко има потреба да се поправаат табелите на InnoDB, бидејќи InnoDB има механизам за обновување на падови што може да ги реши повеќето проблеми кога серверот се рестартира. Меѓутоа, ако наидете на ситуација кога треба повторно да изградите оштетена табела InnoDB, документацијата MySQL препорачува користење на логичката резервна копија на табелата, која ќе ја задржи структурата на табелата и податоците во неа, и потоа повторно вчитување на табелата назад во базата на податоци.
Имајќи го тоа на ум, обидете се да ја рестартирате услугата MySQL за да видите дали тоа ќе ви овозможи пристап до серверот:
- sudo systemctl restart mysql
Ако серверот остане паднат или на друг начин недостапен, тогаш може да биде корисно да ја овозможите опцијата force_recovery
на InnoDB. Можете да го направите ова со уредување на датотеката mysqld.cnf
. На системите Ubuntu и Debian, оваа датотека обично е во etc/mysql
. На системите Red Hat и Rocky, оваа датотека обично е во /etc/my.cnf.d
.
- sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Во делот [mysqld]
, додајте ја следнава линија:
. . .
[mysqld]
. . .
innodb_force_recovery=1
Зачувајте ја и затворете ја датотеката, а потоа обидете се повторно да ја рестартирате услугата MySQL. Ако можете успешно да пристапите до оштетената табела, користете ја алатката mysqldump
за да ги фрлите податоците од вашата табела во нова датотека. Можете да ја именувате оваа датотека како што сакате, но овде ќе ја именуваме out.sql
:
- mysqldump database_name table_name > out.sql
Потоа исфрлете ја табелата од базата на податоци. За да избегнете повторно отворање на промптот за MySQL, можете да ја користите следнава синтакса:
- mysql -u user -p --execute="DROP TABLE database_name.table_name"
Следејќи го ова, вратете ја табелата со депонијата што штотуку ја создадовте:
- mysql -u user -p < out.sql
Забележете дека моторот за складирање InnoDB е генерално потолерантен на грешки од постариот мотор MyISAM. Табелите што користат InnoDB може сè уште да бидат оштетени, но поради неговите карактеристики за автоматско враќање, ризикот од оштетување и падови на табелата е значително помал.