Ремонт и оптимизация базы данных в WordPress (WP_ALLOW_REPAIR)

C таблицами Базы Данных может случиться разное и есть много кейсов, когда ремонт (REPAIR TABLE) или оптимизация (OPTIMIZE TABLE) таблиц БД решает проблему.

Несколько примеров:

  1. У меня было такое, что при попытке получить какие-либо данные из БД их там просто не было, хотя при проверке они там есть.

  2. Другой пример, из практики моего коллеги. Таблица wp_options весит космические 11-17 ГБ, а при дампе всего 10-100 МБ. После запуска:

    OPTIMIZE TABLE wp_options;

    17 ГБ превратились в 311 КБ. Сделал так для всех сайтов, в итоге освободил около 100 ГБ места на сервере.

    Дело тут видимо в каком-то кэше, который передавался при копировании БД из одного сайта к другому.

  3. Большая крон задача на пересчет кол-ва записей в рубрике, для всех записей работала очень медленно. Однако после запуска OPTIMIZE TABLE {table} для всех таблиц БД, стала работать в 10 раз быстрее.

    Оптимизацию всех таблиц можно сделать через команду wp db optimize.

Скрипт WordPress для оптимизации БД

В WordPress есть родной скрипт для ремонта таблиц базы данных. Находится он в файле wp-admin/maint/repair.php. Обратиться можно по адресу: http://site.com/wp-admin/maint/repair.php это самодостаточный скрипт, но для обращения к этому файлу напрямую по URL, в wp-config.php должна быть установлена константа:

const WP_ALLOW_REPAIR = true;
// или так
define( 'WP_ALLOW_REPAIR', true );

Если такая константа есть, то при переходе по URL вы увидите такую страницу (диалоговое окно):

Немного об OPTIMIZE и REPAIR

OPTIMIZE TABLE

Данная операция реорганизует (дефрагминтирует) физическое пространство занимаемое таблицей и индексами, что обеспечивает уменьшение занимаемого места и ускорение операций ввода/вывода. Конкретно действия отличаются для разных движков (поддерживаются MyISAM, ARCHIVE и InnoDB).

Как автоматизировать данную операцию на сервере?

Для отдельной таблицы это можно сделать SQL-запросом:

OPTIMIZE TABLE table_name

Для всех таблиц в базе, с помощью утилиты mysqlcheck:

mysqlcheck --user=USER --password=PASS --optimize database_name

Или можно воспользоваться WP CLI командой wp db optimize:

$ wp db optimize
Success: Database optimized.

REPAIR TABLE

Восстанавливает поврежденную таблицу базы данных. Работает только для некоторых SQL движков, в частности это таблицы: MyISAM, ARCHIVE и CSV.

Или можно воспользоваться WP CLI командой wp db repair:

$ wp db repair
Success: Database repaired.