Новости

Инструкция: Аварийное восстановление баз данных Битрикс24

Блог
Система управления базами данных (СУБД) в CRM Битрикс24, как и другие СУБД, не защищена от неожиданной остановки сервиса. Это может как вызвать сбой в работе самого сервиса, так и повлиять на дальнейшую целостность и работоспособность баз и отдельно взятых таблиц.

Рассмотрим, что делать в ситуации, когда мы видим ошибку, связанную с работой базы данных:
Случайно повредилась таблица b_iblock

  1. Проверить сервис mysql\mysqld

На данном этапе необходимо узнать текущий статус сервиса и попробовать его перезапустить. В большинстве случаев проблема не критична и решается простым перезапуском. Чтобы пройти этот шаг, нужно:

  1. Зайти в консоль управления сервером.
  2. Ввести команду service mysql status.
  3. Ввести команду service mysql restart.

Если сервис так и не смог стартовать, можно будет увидеть команды для просмотра логов:
2.Попытка аварийного включения сервиса БД

Если после шага 1 запустить сервис не удалось – необходимо включить его в аварийном режиме.

  • Для этого нужно зайти в директорию, где содержится конфигурация mysql, найти файл my.cnf (/etc/my.cnf), и вписать туда innodb_force_recovery = n, где n – число от 1 до 7.

С увеличением числа сервис будет игнорировать всё больший объём ошибок.
  • После чего нужно сохранить файл и попытаться запустить БД:
Service mysql start
3.Попытка экспортировать резервную копию при аварийном режиме БД
Далее нам нужно попытаться «вытянуть» всю информацию из базы.
  • Для этого воспользуемся стандартной командой mysqldump:
mysqldump –u %user% -p %database_name% > %directory%/file.sql
Логин, пароль и название базы можно найти в файле .settings.php в директории bitrix/.
  • На этом шаге может произойти ошибка экспорта, в нашем случае – это как раз та самая «битая» таблица. Можно прибегнуть к её пропуску при экспорте, для этого необходимо ввести:
mysqldump -u %user% -p %database_name% --ignore-table=%database_name%.%table_name% > %directory%/file.sql
  • Чтобы пропустить несколько таблиц, просто повторяйте опцию столько раз, сколько потребуется:
mysqldump -u %user% -p %database_name% --ignore-table=%database_name%.%table1 % --ignore-table=%database_name%.%table2 % > %directory%/file.sql
В итоге дамп базы будет создан.
null
4.Попытка импорта бэкапа
После того, как мы сделали бэкап, его нужно закачать обратно в базу.
Для этого нужно ввести команду:
mysql -u %user% -p %database_name% < %directory%/file.sql
Результатом будет восстановленная (лишь на часть) база.
null
Все недостающие таблицы необходимо будет создать вручную.
5.Как быть, если импорт заканчивается с ошибкой?
В этом случае поможет полная переустановка сервиса MySQL
Чтобы выполнить её, необходимо:
  1. Удалить всё, что находится в папке mysqld:
rm -rf /var/lib/mysqld
2.Инициализируем новую БД (параметр force_recovery должен быть предварительно убран из my.cnf):
mysqld --initialize-insecure --basedir=/usr --datadir=/var/lib/mysql
null
3.Создаём сокет и даём права на файл пользователю MySQL
mkfifo /var/lib/mysqld/mysqld.sock
chown -R mysql /var/lib/mysqld/mysqld.sock
4.Запускаем mysql
systemctl start mysqld mysql -u root
5.Меняем root-пароль
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
Далее необходимо заново пройти шаг №4, после чего выключить аварийный режим mysql и после чего перезагрузить сервис. Недостающие таблицы (если они не были созданы вручную при кастомизации системы) можно перенести с аналогичных проектов. Важно перенести именно структуру таблицы, без содержания.