Восстановление таблиц MariaDB для пользователей SQL Server
Восстановление таблиц в MariaDB отличается от восстановления таблиц в SQL Server.
В первую очередь нужно понять, что каждая таблица MariaDB обрабатывается движком хранения. Движки хранения — это плагины, которые знают, как физически читать и записывать таблицу, поэтому каждый движок хранения позволяет восстанавливать таблицы различными способами. По умолчанию используется движок хранения InnoDB.
MariaDB предоставляет специфические SQL-команды для работы с поврежденными таблицами:
- CHECK TABLE проверяет, повреждена ли таблица;
- REPAIR TABLE восстанавливает таблицу, если она повреждена.
Как общее правило, нет причин, по которым таблица, поврежденная на главном сервере, также будет повреждена на подчиненных. Поэтому REPAIR обычно используется с опцией NO_WRITE_TO_BINLOG, чтобы избежать её репликации на подчиненных серверах.
Разделенные таблицы
Разделенные таблицы обычно разбиваются на несколько физических файлов (по одному на разбиение). Даже если одно из разбиений повреждено, в большинстве случаев другие разбиения остаются неповрежденными.
По этой причине CHECK TABLE и REPAIR TABLE не работают с разделенными таблицами. Вместо этого используйте ALTER TABLE для проверки или восстановления отдельного разбиения.
Например:
ALTER TABLE orders CHECK PARTITION p_2019, p_2020; ALTER TABLE orders REPAIR PARTITION p_2019, p_2020;
Индексы
Индексы могут быть повреждены. Однако, если данные не повреждены, индексы всегда можно удалить и пересоздать с помощью ALTER TABLE:
ALTER TABLE customer DROP INDEX idx_email; ALTER TABLE customer ADD INDEX idx_email (email);
Проверка и восстановление таблиц
Здесь мы обсуждаем, как восстановить таблицы в зависимости от движка хранения.
InnoDB
InnoDB следует философии «немедленного отказа». Если обнаружено повреждение таблицы, по умолчанию InnoDB намеренно вызывает сбой MariaDB, чтобы предотвратить распространение повреждений, записывая ошибку в журнал ошибок. Это происходит даже если повреждение обнаружено с помощью CHECK TABLE оператора. Это поведение можно изменить с помощью переменной сервера innodb_corrupt_table_action.
Чтобы восстановить таблицу InnoDB после сбоя:
- Перезапустите MariaDB с опцией
--innodb-force-recoveryустановленной в низкое, но отличное от нуля значение. - Если MariaDB не удается запустить, повторите попытку с более высоким значением. Повторяйте, пока не добьётесь успеха.
На этом этапе можно придерживаться двух разных процедур, в зависимости от того, можно ли использовать резервную копию или нет. При наличии работоспособной резервной копии это часто лучший вариант для быстрого запуска базы данных. Но если вы хотите минимизировать потерю данных, вы предпочитаете следовать второму методу.
Восстановление резервной копии:
- Удалите всю базу данных с помощью DROP DATABASE.
- Восстановите резервную копию базы данных. Точная процедура зависит от типа резервной копии.
Восстановление существующих данных:
- Выгрузите данные из поврежденной таблицы, упорядочив их по первичному ключу. MariaDB может выйти из строя при обнаружении поврежденных данных. Повторите процесс, пропуская поврежденные данные.
- Сохраните структуру таблицы с помощью SHOW CREATE TABLE.
- Перезапустите MariaDB.
- Удалите таблицу с помощью DROP TABLE.
- Пересоздайте таблицу и восстановите выгрузку.
Для получения более подробной информации см. Режимы восстановления InnoDB.
Aria и MyISAM
MyISAM не поддерживает безопасную работу при сбоях. В случае сбоя MariaDB, изменения, внесенные в таблицы MyISAM, но ещё не записанные на диск, будут потеряны.
Aria по умолчанию поддерживает безопасную работу при сбоях, что означает, что в случае сбоя после восстановления повреждённых таблиц изменения не теряются. Однако таблицы Aria не являются безопасными при сбоях, если созданы с TRANSACTIONAL=0 или ROW_FORMAT установленным на FIXED или DYNAMIC.
Системные таблицы используют движок хранения Aria и являются безопасными при сбоях.
Чтобы проверить, повреждена ли таблица MyISAM/Aria, можно использовать CHECK TABLE. Для восстановления таблицы MyISAM/Aria можно использовать REPAIR TABLE. Перед запуском REPAIR TABLE на больших таблицах, рассмотрите возможность увеличения myisam_repair_threads или aria_repair_threads.
Таблицы MyISAM и Aria также могут быть автоматически восстановлены при обнаружении повреждений. Это особенно полезно для Aria, если поврежденные системные таблицы препятствуют запуску MariaDB. См. myisam_recover_options и aria_recover_options. По умолчанию Aria выполняет самый быстрый тип восстановления. Иногда для восстановления системной таблицы нам нужно запустить MariaDB таким образом:
mysqld --aria-recover-options=BACKUP,FORCE
Также возможно остановить MariaDB и восстановить таблицы MyISAM с помощью myisamchk, а таблицы Aria с помощью aria_chk. С настройками по умолчанию восстановление может быть чрезмерно медленным. Перед запуском этих инструментов обязательно ознакомьтесь со страницей Использование памяти и диска с myisamchk.
Другие движки хранения
Примечания по разным движкам хранения:
- Для MyRocks см. MyRocks и CHECK TABLE.
- С ARCHIVE
REPAIR TABLEтакже повышает коэффициент сжатия. - Для CSV см. Проверка и восстановление таблиц CSV.
- Некоторые специальные движки хранения, такие как MEMORY или BLACKHOLE, не поддерживают никакой формы проверки и восстановления.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/repairing-mariadb-tables-for-sql-server-users/