В современном мире компании не полагаются исключительно на определенную платформу базы данных. Существует множество платформ баз данных, которые адекватны для обработки средних нагрузок и требований к высокой доступности и восстановлению после катастроф. MySQL является одной из этих платформ баз данных, которая предоставляет множество функций и высокую производительность.
Как и у других RDBMS, у MySQL также есть тенденция к порче базы данных и таблиц. Последняя неплановая остановка, вызванная Microsoft и CrowdStrike, также повлияла на сервера баз данных MySQL. Вследствие сбоев операционной системы таблицы базы данных или вся база данных могут быть повреждены.
В этой статье я покажу, как мы можем портить и исправить таблицу базы данных MySQL. Эта статья помогает DBAs для имитации сбоев и помогает им определить лучший возможный способ восстановления или ремонта поврежденной таблицы MySQL.
Общее понимание порчи базы данных MySQL
Поражение базы данных MySQL может проявляться по-различным способам, включая:
Недоступные таблицы
Вся таблица или определенный подмножество таблицы становится недоступным. когда вы пытаетесь получить доступ к поврежденной таблице, вы столкнетесь с ошибками, указывающими на потерю индексного файла или данных файла таблицы.
Ошибки несогласованности данных
Если таблица повреждена, вместо смысловых данных ваш запрос может возвращать какие-либо мусорные значения или непоследовательные или неполные результаты.
Неожиданные остановки
В некоторых случаях MySQL может вылететь при обращении к таблице или во время выполнения резервных копий с помощью mysqldump
. Однажды я встретил этот ошибку во время имитации сценария повреждения. Я порчил файл данных таблицы. После запуска службы, когда я попытался получить доступ к таблице с помощью запроса SELECT
, служба MySQL автоматически вылетела.
Ошибки во время операций с базой данных
При обращении к поврежденной таблице можете встретить следующие ошибки:
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
Эти ошибки указывают на то, что файл данных или связанные файлы индексов повреждены.
Очень важно понять root cause of the corruption, чтобы предотвратить будущие вспышки и обеспечить целостность данных.
Предварительные условия ремонта таблиц MySQL
Перед выполнением каких-либо ремонтных работ убедитесь, что у вас есть:
- Полная резервная копия базы данных MySQL
- Достаточно дискового пространства
- Административный доступ к серверу MySQL
Теперь посмотрим, как имитировать повреждение таблицы.
Поврежденная таблица MySQL
Перед тем как мы узнаем о процессе исправления базы данных, нам нужно понять, как можно портить ее. Для демонстрации я создал базу данных под названием “CorruptDB” на сервере MySQL. Также я создал таблицу corrupt_table
в базе данных CorruptDB.
Вот код для создания базы данных и таблицы.
Create database corruptDB;
Use corruptdb;
CREATE TABLE corrupt_table (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(100)
) ENGINE=MyISAM;
Я добавил миллион записей в таблицу, выполнив следующий запрос.
INSERT INTO corrupt_table (data)
SELECT CONCAT('RandomData-', FLOOR(1000 + (RAND() * 9000)))
FROM corrupt_table;
Обратите внимание, что имитация порчи таблицы осуществляется на моем ноутбуке. Не попробуйте этого на производстве, разработке или в других средах. Таблица, которую я использую в этой демонстрации, создана с использованием движка базы данных MyISAM. Вы можете прочитать о альтернативных Storage Engines, чтобы leaned more about the database engines of MySQL Server.
Я выполнил следующие шаги, чтобы портить таблицу.
Шаг 1: Остановите услуги MySQL Server
вам нужно остановить сервер MySQL. Для этого запустите PowerShell с правами администратора и выполните следующийCOMMAND.
net stop MySQL
Alternately, you can also stop it from Services.
Шаг 2: Порче Index File of the Table
Теперь мы должны портить index файл таблицы. Когда вы создаете любую таблицу в движке базы данных MyISAM, три файла создаются, когда вы создаете таблицу с использованием движка базы данных MyISAM.
- MYD files: This file contains actual data.
- MYI files: This is an index file.
- Файлы Frm: Файл содержит структуру таблицы.
Мы будем портить индексный файл. Данные файлы находятся в default-позиции, что является “C:\ProgramData\MySQL\MySQL Server 8.0\Data\corruptdb.” Чтобы портить, мы используем шестый редактор.
Скачайте и установите шестый редактор. Откройте MYI файлы с его помощью. Файл выглядит следующим образом:
Замените первые 5 байт на какие-то случайные значения. Сохраните файл и закройте редактор.
Теперь, начнем службу и попробуем получить доступ к таблице.
Шаг 3: Запустите MySQL Службы и Получите доступ к Таблице
Сначала, запустите MySQL Службы с помощью следующего команды в PowerShell.
net start MySQL
После запуска служб, выполните следующий запрос на MySQL командной строке.
mysql> use corruptdb;
Database changed
mysql> select count(1) from corrupt_table;
Запрос вернул следующий ошибку:
Ошибка указывает, что индекс corrupt_table
был порчен и должен быть исправлен.
Ручные методы исправления MySQL Таблиц
Есть несколько методов, которые можно использовать для исправления поврежденной MySQL таблицы. Первый метод – это использование команд CHECK TABLE
и REPAIR TABLE
.
Команды CHECK TABLE и REPAIR TABLE
Вы можете восстановить таблицу с помощью встроенных команд CHECK TABLE
и REPAIR TABLE
MySQL. Эти команды используются для диагностики и исправления любой таблицы MyISAM.
команда проверки таблицы проверяет целостность таблицы. Она проверяет структуру таблицы, индексы и данные на наличие повреждений и показывает подробности. Syntax is below:
CHECK TABLE [option]
You can specify the different options.
QUICK
: This option quickly checks and identifies issues like corrupted indexes.FAST
: It checks tables that are not closed properly.CHANGED
: This option checks only those tables that are changed after the lastCHECK TABLE
execution.MEDIUM
: This option checks the records and verifies that the links between the table and data are correct.EXTENDED
: This option thoroughly scans and verifies the table structure and contents.
Here in this demo, we will perform a quick scan. Here is the command.
CHECK TABLE corrupt_table
Screenshot:
As you can see in the above screenshot, the error indicates that the index of the corrupt_table
is corrupted and needs to be fixed.
We will use the REPAIR TABLE
command to fix the corruption in the table. The REPAIR TABLE
command is used to recover the table structure and data from corruption, especially the table that has the MyISAM database engine. In case the index of the table is corrupted, the REPAIR TABLE
command rebuilds the indexes.
The syntax of REPAIR TABLE
is as follows:
REPAIR TABLE [option]
You can specify the following options:
QUICK
: It repairs only the index file of a table. It does not access the data file of a table.EXTENDED
: При использовании этой опции команда выполнит полное восстановление. Она также восстанавливает или создает файл индекса, просматривая все записи таблицы.
В этой демонстрации мы испортили индекс таблицы; поэтому мы будем использовать опцию QUICK
. Выполните следующую команду.
REPAIR TABLE corrupt_table
Скриншот:
Как видно на скриншоте выше, таблица corrupt_table
успешно восстановлена. Чтобы проверить, выполните следующий запрос в MySQL Workbench:
use corruptdb;
select count(1) from corrupt_table;
Результат запроса:
Как видно, таблица теперь доступна.
Восстановление таблицы с помощью команды mysqldump
Второй метод заключается в восстановлении всей таблицы из резервной копии. Этот метод может быть использован, когда таблица сильно повреждена и не может быть восстановлена с помощью команды REPAIR TABLE
.
Для восстановления таблицы MySQL из резервной копии мы можем использовать команду mysqldump
. Вы можете прочитать статью “mysqldump — программа резервного копирования баз данных” для более подробной информации о том, как использовать команду mysqldump. Синтаксис для восстановления таблицы приведен ниже.
mysql -u [username] -p [database_name] < [table_dump.sql]
В синтаксисе:
Username
: Введите имя пользователя, которое вы используете для подключения к базе данных MySQL.-p
: Укажите пароль. Если оставить поле пустым, MySQL запросит пароль.[database_name]
: Укажите имя базы данных, в которой вы пытаетесь восстановить таблицу.Tablica_dump.sql
: указать полное имя файла备份.
Для демонстрации я сделал резервную копию базы данных CorruptDB, которая находится в каталоге C:\MySQLData\Backup.
Чтобы восстановить corrupt_table
, мы можем использовать следующий командный запрос.
mysql -u root -p corruptdb < C:\MySQLData\Backup\corrupt_table.sql
После успешного выполнения команды, вы сможете получить доступ к таблице. Выполните следующий запрос для проверки.
use corruptdb;
select count(1) from corrupt_table;
Вывод запроса:
Как вы можете видеть на приведенном выше скриншоте, таблица успешно восстановлена.
Использование phpMyAdmin
Вы также можете использовать инструмент phpMyAdmin для исправления любой поврежденной базы данных MySQL. phpMyAdmin это графический интерфейс для управления и обслуживания MySQL и MariaDB. Для демонстрации я установил его на моем ноутбуке.
- Чтобы исправить таблицу, запустите phpMyAdmin и перейдите к базе данных, в которой создана поврежденная таблица.
- В правом pane вы можете увидеть список таблиц, созданных в базе данных CorruptDB.
- Выберите
Corrupt_table
из списка и выберите опцию Исправить таблицу из выпадающего списка.
Вот скриншот для сравнения:
После исправления таблицы, статус corrupt_table
сможете увидеть, что он стал OK. Вот скриншот:
Заключение
В этой статье мы узнали о возможных причинах повреждения базы данных MySQL и о том, как их исправить. Я объяснил пошаговый процесс повреждения таблиц MySQL с использованием шестнадцатеричного редактора. Я также рассмотрел, как их исправить с помощью команды CHECK TABLE
и REPAIR TABLE
. Мы также узнали, как восстановить таблицу с помощью утилиты mysqldump
.
Восстановление поврежденной таблицы MySQL может быть сложной задачей, но с правильными инструментами и методами это возможно. Ручные методы предоставляют базовое решение, в то время как phpMyAdmin предлагает всесторонний и надежный вариант восстановления. Всегда обеспечивайте регулярное создание резервных копий и поддерживайте здоровье вашей базы данных, чтобы минимизировать риск повреждения.
Source:
https://dzone.com/articles/repair-corrupt-mysql-database-tables-step-by-step