it-swarm-eu.dev

Proč dochází ke zhroucení tabulek MySQL? Jak tomu mohu zabránit?

Jsem administrátorem Moodle webu, který poškodil jeho tabulku Users a stal se nepoužitelný.

Naštěstí jednoduchý REPAIR TABLE mdl_user to znovu fungovalo. Jde o to, že nevím, proč to vlastně havarovalo a učinilo ho nepoužitelným, a chci se ujistit, že jsem příště lépe připraven.

Nejsem úplně zkušený DBA - jsem jen vývojář, který dělá spoustu věcí, takže prosím mějte se sebou.

Mohl bych obnovit zálohu, ale myslím, že existují způsoby, jak zabránit pádům.

Tyto tabulky jsou utf8_general_ci a používají MyISAM.

Proč dojde ke zhroucení tabulky MySQL? Co mohu udělat, abych tomu zabránil?

9
AeroCross

Je docela snadné, aby se tabulka MyISAM zhroutila.

V záhlaví každé tabulky MyISAM je čítač, který sleduje, kolik otevřených popisovačů souborů existuje proti tabulce.

Pokud spustíte mysql a číslo v záhlaví neodpovídá počtu skutečných popisovačů souborů proti, mysqld považuje tabulku za havarovanou.

Pokud je jednoduchý REPAIR TABLE mdl_user způsobí, že to bude fungovat pokaždé bez ztráty dat, může to znamenat, že máte velmi obchodovaný web, který zapisuje mdl_user.

Pokud to vyžadují desítky tabulek REPAIR TABLE, Převedl bych všechny tabulky na InnoDB. Pokud však mdl_user tabulka je jediná tabulka s tímto problémem, existuje něco, co můžete udělat (pro tento příklad řekněme, že databáze je moodle);

Pokud chcete, aby všechny tabulky zůstaly jako MyISAM

KROK 01: Vytvoření skriptu opravných tabulek

echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql

KROK 02: Prohlášení opravného skriptu jako spouštěcího souboru

Přidejte toto do /etc/my.cnf

[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql

KROK 03: Restartujte mysql

Každé restartování mysql spustí skript pro opravu tabulky

Pokud chcete, aby se všechny tabulky staly InnoDB

Spusťte tento kód a vytvořte hromadný konverzní skript tabulek MyISAM do InnoDB a zobrazte jej

MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql

Až budete spokojeni s obsahem konverzního skriptu, spusťte jej

mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql

AKTUALIZACE 2012-03-15 14:00 EDT

@ Kevin , při používání MyISAM, co když vám dojde nedostatek místa na disku?

Zde je něco, co je třeba zvážit: Podle MySQL 5.0 Certifikační studijní příručka ,

enter image description here

odrážka č. 11 na stránce 408 409, část 29.2 uvádí následující:

Pokud při přidávání řádků do tabulky MyISAM dojde nedostatek místa na disku, nedojde k žádné chybě. Server pozastaví operaci, dokud nebude k dispozici prostor, a poté operaci dokončí.

Když vám dojde nedostatek místa na disku, nejen vypněte nebo zabijte mysql. Počet otevřených popisovačů souborů v žádném aktuálně používaném MyISAMu nebude vymazán. Tabulka MyISAM je tedy označena jako havarovaná. Pokud můžete uvolnit místo na disku v datovém svazku se stále spuštěným mysqldem, mysqld bude vojákem, jakmile bude uvolněno místo na disku.

11
RolandoMySQLDBA

Spravuji také web moodle na mysql a nejčastější příčinou poškození tabulek pro nás je nedostatek místa na disku.

0
Kevin