In het moderne wereld zijn bedrijven niet langer afhankelijk van een specifieke database server platform. Er zijn veel databaseplatforms beschikbaar die voldoende zijn om gematigde workloads en klantvereisten voor hoge beschikbaarheid en katastrofherstel te verwerken. MySQL is een van die databaseplatforms die veel functionaliteit biedt en hoge prestaties.
Net als andere RDBMS is MySQL ook gevoelig voor database- en tabelcorruptie. De recente uitgaande van Microsoft en CrowdStrike had ook impact op MySQL database servers. Door operating system fouten raakt de tabel van de database of zelfs de hele database corrupt.
In dit artikel zal ik u laten zien hoe we een tabel van de MySQL database kunnen corrompreinden en repareren. Dit artikel helpt DBAs om de fouten te simuleren en hen helpt de best mogelijke manier te bepalen om de corruptie van de MySQL tabel te herstellen of te repareren.
Inzicht in MySQL Database Corruptie
MySQL database corruptie kan zich manifesteren in verschillende manieren, inclusief:
Niet toegankelijke Tabelen
De gehele tabel of een specifieke subgroep van de tabel wordt ontoegankelijk. Als u probeert toegang tot de beschadigde tabel te krijgen, zult u fouten tegenkomen die verwijzen naar de corruptie van het indexbestand of het gegevensbestand van de tabel.
Fouten van Data Inconsistentie
Als de tabel beschadigd is, zal uw query in plaats van betekenisvolle data misschien wat ongepaste waarden of onconsistente of onvolledige resultaten teruggeven.
Onverwachte afsluitingen
In sommige gevallen kan MySQL crashen terwijl de tabel wordt aangetoond of terwijl back-ups worden uitgevoerd met behulp van mysqldump
. Eenmaal had ik dit foutmelding bij het simuleren van het beschadigingsscenario. Ik had de gegevensbestand van een tabel beschadigd. Nadat ik de dienst had gestart, crashte de MySQL-dienst automatisch als ik probeerde de tabel te bereiken met een SELECT
-opdracht.
Foutmeldingen tijdens databaseoperaties
Bij het toegangscontrole tot de beschadigde tabel kun je soms de volgende fouten tegenkomen:
ERROR 1016: Can't open file: 'table_name.MYI' (errno: 145)
Table ‘table_name’ is marked as crashed and should be repaired
Got error 28 from storage engine
ERROR 1030: Got error 127 from storage engine
Deze foutmeldingen geven aan dat het gegevensbestand of de geassocieerde indexbestanden beschadigd zijn.
Het is cruciaal om de oorsprong van de beschadiging te begrijpen om toekomstige optredens te voorkomen en de dataintegriteit te waarborgen.
Vereisten voor het herstellen van MySQL-tabellen
Voordat u probeert de tabellen te herstellen, zorg ervoor dat u de volgende beschikt:
- Complete back-up van uw MySQL-database
- Voldoende schijfruimte
- Administratieve toegang tot de MySQL-server
Nu laten we de beschadiging van de tabel simuleren.
Beschadigde MySQL-tabel
Voordat we leren hoe de database wordt gerepareerd, zal eerst uitleg geven over hoe de database kan worden beschadigd. Voor de demonstratie heb ik een database genaamd “CorruptDB” op een MySQL database server gemaakt. Ik heb ook een tabel genaamd corrupt_table
in de CorruptDB database gemaakt.
Hier is het code om een database en tabel aan te maken.
Create database corruptDB;
Use corruptdb;
CREATE TABLE corrupt_table (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(100)
) ENGINE=MyISAM;
Ik heb een miljoen records aan de tabel toegevoegd door de volgende query uit te voeren.
INSERT INTO corrupt_table (data)
SELECT CONCAT('RandomData-', FLOOR(1000 + (RAND() * 9000)))
FROM corrupt_table;
Merk op dat de simulatie van tabelbeschadiging op mijn laptop is uitgevoerd. Probeer dit niet op productie, ontwikkelings- of enige andere omgeving. De tabel die ik in deze demonstratie gebruik maakte is aangemaakt met de MyISAM databaseengine. U kunt lezen over Alternatieve opslagmotoren om meer te leren over de database motoren van MySQL Server.
Ik heb de volgende stappen uitgevoerd om de tabel te beschadigen.
Stap 1: Stop MySQL Server Services
U moet de MySQL server stoppen. Om dat te doen, voer PowerShell als beheerder uit en voer de volgende commando uit.
net stop MySQL
Als alternatief, kunt u het ook vanuit Services stoppen.
Stap 2: Beschadig de indexbestand van de tabel
Nu moeten we het indexbestand van de tabel beschadigen. Wanneer u elke tabel maakt in de MyISAM databaseengine, worden er drie bestanden aangemaakt als u een tabel maakt met de MyISAM databaseengine.
- MYD bestanden: Dit bestand bevat de echte data.
- MYI bestanden: Dit is een indexbestand.
- Frm bestanden: Het bestand bevat een tabelstructuur.
We zullen de indexbestanden corrompelen. De gegevensbestanden zijn gelegen op de standaardlocatie, namelijk “C:\ProgramData\MySQL\MySQL Server 8.0\Data\corruptdb.” Om de corrosie te bewerkstelligen, gebruiken we een hex-editor.
Download en installeer de hex-editor. Open de MYI-bestanden ermee. Het bestand lijkt op de volgende afbeelding:
Vervang de eerste 5 bytes door enkele willekeurige waarden. Sla het bestand op en sluit de editor.
Nu starten we de dienst en proberen we toegang tot de tabel te krijgen.
Stap 3: Start de MySQL-diensten en krijg toegang tot de tabel
Start eerst de MySQL-diensten door de volgende opdracht uit te voeren in PowerShell.
net start MySQL
Zodra de diensten zijn gestart, voer u de volgende query uit op de MySQL commandolijn.
mysql> use corruptdb;
Database changed
mysql> select count(1) from corrupt_table;
De query gaf de volgende foutmelding weer:
De foutmelding duidt erop dat de index van de corrupt_table
is corrompeld en moet worden hersteld.
Handmatige methodes om MySQL-tabellen te repareren
Er zijn bepaalde methodes die u kunt gebruiken om de corrompelde MySQL-tabel te repareren. De eerste methode is het gebruik van de check table en repair table commando’s.
Check Table and Repair Table Commands
U kunt de tabel herstellen met behulp van de ingebouwde MySQL-commando’s CHECK TABLE
en REPAIR TABLE
. Deze commando’s worden gebruikt om diagnose en herstel van elke MyISAM-tabel uit te voeren.
De ‘CHECK TABLE’-opdracht controleert de integriteit van de tabel. Hij controleert de tabelstructuur, indexen en gegevens op mogelijke corruptie en toont de details. De syntaxis is als volgt:
CHECK TABLE [option]
U kunt verschillende opties specificeren.
QUICK
: Deze optie controleert snel en identificeert problemen zoals beschadigde indexen.FAST
: Hij controleert tabellen die niet correct zijn afgesloten.CHANGED
: Deze optie controleert alleen die tabellen die zijn aangepast na de laatsteCHECK TABLE
-uitvoering.MEDIUM
: Deze optie controleert de records en controleert of de koppelingen tussen de tabel en de gegevens correct zijn.EXTENDED
: Deze optie doet een uitgebreid scan en controleert de tabelstructuur en inhoud.
In deze demo zal we een snel scan uitvoeren. Hier is de opdracht.
CHECK TABLE corrupt_table
Screenshot:
Als u ziet in de bovenstaande screenshot, duidt de foutmelding op dat de index van de corrupt_table
beschadigd is en moet worden gerepareerd.
We zullen de REPAIR TABLE
-opdracht gebruiken om de corruptie in de tabel te repareren. De REPAIR TABLE
-opdracht wordt gebruikt om de tabelstructuur en gegevens te herstellen van corruptie, vooral de tabellen met de MyISAM databaseengine. Indien de index van de tabel beschadigd is, herbouwt de REPAIR TABLE
-opdracht de indexen.
De syntaxis van REPAIR TABLE
is als volgt:
REPAIR TABLE [option]
U kunt de volgende opties specificeren:
QUICK
: Het herstelt alleen de indexbestanden van een tabel. Het accesses niet het gegevensbestand van een tabel.UITGEREED
: Wanneer we deze optie gebruiken, zal de opdracht een grondige reparatie uitvoeren. Hij repareert of herbouwt ook de indexbestanden door alle records van de tabel te scannen.
In deze demo hebben we de index van de tabel beschadigd; daarom zullen we de QUICK
optie gebruiken. Voer het volgende commando uit.
REPAIR TABLE corrupt_table
Screenshot:
Zoals u in het bovenstaande scherm ziet, is de corrupt_table
succesvol gerepareerd. Om te verifiëren, voer u het volgende query uit op MySQL Workbench:
use corruptdb;
select count(1) from corrupt_table;
Query uitvoer:
Als u ziet, is de tabel nu toegankelijk.
Tabel herstellen met de mysqldump-opdracht
Het tweede methoden is om de gehele tabel vanuit een back-up te herstellen. Deze methode kan worden gebruikt als de tabel erg beschadigd is en niet kan worden gerepareerd met behulp van de REPAIR TABLE
-opdracht.
Om een MySQL-tabel vanuit een back-up te herstellen, kunnen we de mysqldump
-opdracht gebruiken. U kunt het artikel “mysqldump — Een database back-up programma” lezen om meer te leren over hoe u de mysqldump-opdracht kunt gebruiken. Het syntaxis voor het herstellen van de tabel is hieronder.
mysql -u [username] -p [database_name] < [table_dump.sql]
In de syntaxis:
Gebruikersnaam
: Voer de gebruikersnaam in die u gebruikt om verbinding te maken met de MySQL-database.-p
: Specificeer het wachtwoord. Als u het leeg laat, zal MySQL u om een wachtwoord vragen.[database_name]
: Specificeer de naam van de database waarin u probeert de tabel terug te halen.Table_dump.sql
: Geef de volledige gekwalificeerde naam van het back-upbestand op.
Voor de demonstratie heb ik een back-up gemaakt van de CorruptDB-database, die zich in de map C:\MySQLData\Backup bevindt.
Om de corrupt_table
te herstellen, kunnen we het volgende commando gebruiken.
mysql -u root -p corruptdb < C:\MySQLData\Backup\corrupt_table.sql
Nadat het commando succesvol is uitgevoerd, kun je de tabel benaderen. Voer het volgende query uit om dit te verifiëren.
use corruptdb;
select count(1) from corrupt_table;
Query-uitvoer:
Zoals je in het bovenstaande schermafbeelding ziet, is de tabel succesvol hersteld.
Met phpMyAdmin
U kunt ook de phpMyAdmin-tool gebruiken om elke beschadigde MySQL-database te repareren. phpMyAdmin is een grafische gebruikersinterface om MySQL en MariaDB te beheren en te onderhouden. Voor de demonstratie heb ik het op mijn laptop geinstalleerd.
- Om de tabel te repareren, start phpMyAdmin en navigeer naar de database waarin de beschadigde tabel zit.
- In het rechterpaneel kun je de lijst zien van de tabellen die zijn aangemaakt in de CorruptDB-database.
- Selecteer
Corrupt_table
van de lijst en kies de optie Tabel repareren uit het dropdownmenu.
Hier is een schermafbeelding voor referentie:
Zodra de tabel is gerepareerd, zie je dat de status van de corrupt_table
OK wordt. Hier is het schermafbeelding:
Conclusie
In dit artikel hebben we geleerd over de mogelijke redenen voor MySQL databasecorruptie en hoe deze te verhelpen. Ik heb een stapsgewijs proces uitgelegd om MySQL-tabellen te beschadigen met behulp van een hex-editor. Ik heb ook behandeld hoe ze te repareren met de CHECK TABLE
en REPAIR TABLE
commando’s. We hebben ook geleerd hoe de tabel te herstellen met behulp van het mysqldump
hulpprogramma.
Het repareren van een beschadigde MySQL-databasetabel kan uitdagend zijn, maar met de juiste tools en methoden is het beheersbaar. Handmatige methoden bieden een basisoplossing, terwijl phpMyAdmin een uitgebreide en betrouwbare hersteloptie biedt. Zorg altijd voor regelmatige back-ups en onderhoud de gezondheid van uw database om het risico op corruptie te minimaliseren.
Source:
https://dzone.com/articles/repair-corrupt-mysql-database-tables-step-by-step