Можно ли восстановить базу данных mysql из папки /var/lib/mysql/database?

Вопрос или проблема

ИЗМЕНЕНИЕ: Я нашел решение, оно в моем ответе ниже. Вопрос оставлен здесь для контекста, но если у вас та же проблема, решение в ответе.

Из-за ночного кошмара, который каким-то образом стал реальным, моя установка mysql оказалась поврежденной и была переустановлена. Я не мог запустить mysql до переустановки, поэтому не смог использовать mysqldump для полноценной резервной копии. Однако я скопировал /var/lib/mysql в безопасное место. Пытаться rsync вернуть папки базы данных на их старые места не работает — ну, в некотором смысле работает, но потом wordpress выходит из строя, даже с исправленными правами. Если я создаю эту базу данных вручную, а затем rsync, mysql не запускается.

Можно ли как-то восстановить эту папку?

ИЗМЕНЕНИЕ: Теперь я вижу эту папку, находясь в приглашении mysql. Я могу использовать эту базу данных, но попытка SELECT * FROM wp_posts; выдает мне

 mysql> SELECT * FROM wp_posts;
 ERROR 1146 (42S02): Table 'alfheimwp.wp_posts' doesn't exist

Несмотря на то что

mysql> SHOW TABLES;
+-------------------------------------------------+
| Tables_in_alfheimwp                             |
+-------------------------------------------------+
| wp_bp_activity                                  |
| wp_bp_activity_meta                             |
| wp_bp_friends                                   |
| wp_bp_groups                                    |
| wp_bp_groups_groupmeta                          |
| wp_bp_groups_members                            |
| wp_bp_messages_messages                         |
| wp_bp_messages_meta                             |
| wp_bp_messages_notices                          |
| wp_bp_messages_recipients                       |
| wp_bp_notifications                             |
| wp_bp_notifications_meta                        |
| wp_bp_user_blogs                                |
| wp_bp_user_blogs_blogmeta                       |
| wp_bp_xprofile_data                             |
| wp_bp_xprofile_fields                           |
| wp_bp_xprofile_groups                           |
| wp_bp_xprofile_meta                             |
| wp_commentmeta                                  |
| wp_comments                                     |
| wp_links                                        |
| wp_options                                      |
| wp_postmeta                                     |
| wp_posts                                        |
| wp_sg_action                                    |
| wp_sg_config                                    |
| wp_sg_schedule                                  |
| wp_signups                                      |
| wp_term_relationships                           |
| wp_term_taxonomy                                |
| wp_termmeta                                     |
| wp_terms                                        |
| wp_ucare_logs                                   |
| wp_usermeta                                     |
| wp_users                                        |
| wp_woocommerce_api_keys                         |
| wp_woocommerce_attribute_taxonomies             |
| wp_woocommerce_downloadable_product_permissions |
| wp_woocommerce_log                              |
| wp_woocommerce_order_itemmeta                   |
| wp_woocommerce_order_items                      |
| wp_woocommerce_payment_tokenmeta                |
| wp_woocommerce_payment_tokens                   |
| wp_woocommerce_sessions                         |
| wp_woocommerce_shipping_zone_locations          |
| wp_woocommerce_shipping_zone_methods            |
| wp_woocommerce_shipping_zones                   |
| wp_woocommerce_tax_rate_locations               |
| wp_woocommerce_tax_rates                        |
| wp_wpsp_agent_settings                          |
| wp_wpsp_attachments                             |
| wp_wpsp_canned_reply                            |
| wp_wpsp_catagories                              |
| wp_wpsp_custom_fields                           |
| wp_wpsp_custom_priority                         |
| wp_wpsp_custom_status                           |
| wp_wpsp_faq                                     |
| wp_wpsp_faq_catagories                          |
| wp_wpsp_panel_custom_menu                       |
| wp_wpsp_ticket                                  |
| wp_wpsp_ticket_thread                           |
+-------------------------------------------------+
61 rows in set (0.00 sec)

Так что, очевидно, есть что-то в этой базе данных, что mysql не распознает, однако это точно та же версия mysql, что я использовал ранее.

ИЗМЕНЕНИЕ 2: Наконец, начинаю понимать, что происходит, но я запутался и мне нужен помощник для innodb… теперь mysql не запускается с этим:

2017-10-13T01:55:16.625761Z 0 [ERROR] [FATAL] InnoDB: Tablespace id is 1121 in the data dictionary but in file ./mysql/help_relation.ibd it is 6!

Причина, по которой я не мог читать из таблиц, заключалась в том, что я не восстановил файлы innodb в главную папку /var/lib/mysql. Теперь, когда я это сделал, идентификаторы tablespace не совпадают. У меня нет представления, как их редактировать или является ли это вообще способом решения. Жаль, что нет автоматизированного способа их исправить!

Хорошо, поехали. Итак, вам нужно полностью очистить mysql. Не тратьте время на попытки перейти на mariadb на этом этапе, это просто не сработает (не удается сменить пароль root, несмотря на удаление всех файлов, связанных с mysql).

[ИЗМЕНЕНИЕ: Позже я понял, что это было потому, что я не запускал mariadb от имени root. По какой-то причине, если у вас установлен mariadb, вы должны запустить приглашение с sudo mysql -u root -p. Так что в теории mariadb должен работать и для этого процесса.]

Вам нужно сделать чистую установку mysql-server. Начните с удаления всего, что связано с mysql, с помощью

sudo apt-get purge mysql-server* mariadb*

Затем удалите все папки, связанные с mysql (убедитесь, что у вас уже есть безопасная резервная копия всей папки /var/lib/mysql).

sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
sudo rm -rf /var/log/mysql

Затем переустановите mysql-server. Если не удается, получите глупую ошибку зависимости, сделайте

ln -s /etc/mysql/mysql.conf.d /etc/mysql/conf.d

(или наоборот, не помню сейчас), затем запустите

sudo apt-get install mysql-server 

снова и дайте ему завершить настройку. Остановите mysql сервер с

sudo systemctl stop mysql

Затем просто скопируйте папки базы данных (и все их содержимое) обратно в /var/lib/mysql. Затем также скопируйте ib* в /var/lib/mysql (это файлы словаря innodb и другие).

sudo rsync -r <backedupfolder>/ib* /var/lib/mysql/

Убедитесь, что сделали

sudo chown -R mysql:mysql /var/lib/mysql 

Отредактируйте /etc/mysql/my.cnf и добавьте innodb_force_recovery=5 в секцию [mysqld] (возможно, нужно добавить [mysqld]). Теперь снова запустите mysql с systemctl start mysql. Если вы заглянете в /var/log/mysql/error.log, вы все равно можете увидеть ошибки, но попробуйте войти в приглашение с

mysql -u root -p

Если вам удалось его запустить, здорово. Если нет, посмотрите еще раз на статус systemctl mysql.service и посмотрите, что там написано. Возможно, это проблема с правами. Если вы наконец смогли зайти в приглашение, немедленно сделайте

mysqldump -u root -p <databasename> > database.sql 

чтобы получить чистый дамп этой базы данных. Теперь, когда у нас есть чистый дамп важных баз данных, нам нужно заново пройти первые несколько шагов (по крайней мере, я это сделал, чтобы быть уверенным… Я смог запустить WordPress в этот момент, но не мог войти). Итак, повторите первые несколько очистительных шагов, удалите все каталоги mysql после удаления mysql-server. Переустановите, но на этот раз просто выполните

 mysql -u root -p <databasename> < database.sql

И у вас все получится! Возможно, вам нужно будет воссоздать базы данных (CREATE DATABASE databasename;) Не забудьте восстановить пользователя, который владел этой базой данных ранее (если вы забыли, загляните в свой /var/www/html/wp-config.php или где угодно еще ваш wp-config.php для подробностей).

Ответ или решение

Восстановление базы данных MySQL из каталога /var/lib/mysql: пошаговое руководство

Восстановление базы данных MySQL из каталога /var/lib/mysql может быть технически сложной задачей, особенно после коренной переустановки MySQL или MariaDB. В этом руководстве мы рассмотрим возможные шаги для успешного восстановления базы данных, основываясь на случае, когда данный каталог был скопирован перед переустановкой системы.

Шаг 1: Подготовка к восстановлению

Перед началом восстановления важно сделать резервное копирование всех данных, чтобы избежать их потери. Если вы уже скопировали старые данные, убедитесь, что у вас есть полная резервная копия баз данных и конфигураций.

  1. Удаление старых установок:
    Удалите все установленные пакеты MySQL и MariaDB для полной очистки:

    sudo apt-get purge mysql-server* mariadb*
  2. Очистка каталогов:
    Удалите каталоги, связанные с MySQL:

    sudo rm -rf /var/lib/mysql
    sudo rm -rf /etc/mysql
    sudo rm -rf /var/log/mysql

Шаг 2: Установка MySQL

  1. Переустановка MySQL:
    Установите новый экземпляр MySQL:

    sudo apt-get install mysql-server
  2. Корректировка конфигурации:
    Остановите MySQL-сервер, прежде чем продолжить:

    sudo systemctl stop mysql

Шаг 3: Восстановление данных

  1. Копирование баз данных:
    Скопируйте обратно только каталоги баз данных и сопутствующие файлы:

    sudo rsync -r /path/to/backup/mysql/* /var/lib/mysql/
    sudo rsync -r /path/to/backup/mysql/ib* /var/lib/mysql/
  2. Настройка прав:
    Убедитесь, что каталоги и файлы имеют правильные права доступа:

    sudo chown -R mysql:mysql /var/lib/mysql

Шаг 4: Исправление ошибок InnoDB

Если после восстановления базы данных возникают ошибки, связанные с InnoDB, установите параметр для принудительного восстановления:

  1. Редактирование конфигурационного файла:
    Откройте файл /etc/mysql/my.cnf и добавьте следующие строки в секцию [mysqld]:

    innodb_force_recovery = 5
  2. Запуск MySQL:
    Запустите MySQL-сервер:

    sudo systemctl start mysql
  3. Проверка статуса:
    Обратите внимание на ошибки в логах:

    sudo tail -f /var/log/mysql/error.log

Шаг 5: Создание дампа базы данных

Если MySQL успешно запустился и вы можете получить доступ к базе данных, немедленно создайте дамп для большей безопасности:

mysqldump -u root -p <databasename> > database.sql

Шаг 6: Финальная переустановка (по необходимости)

Если все еще возникают проблемы, вы можете повторить процесс с полной переустановкой MySQL и восстановлением дампов. В этом случае:

  1. Удалите все директории MySQL снова, как указано в шаге 1.
  2. Установите MySQL, создайте базу данных:
    CREATE DATABASE <databasename>;
  3. Импортируйте дамп базы данных:
    mysql -u root -p <databasename> < database.sql

Заключение

Восстановление базы данных MySQL из каталога /var/lib/mysql возможно, но требует тщательной работы и внимания к деталям. Вышеописанные шаги помогут вам в восстановлении даже после серьезного повреждения или переустановки MySQL. В случае возникновения трудностей рекомендуется обратиться к сообществу или профессиональным администраторам баз данных для получения дальнейшей помощи.

Оцените материал
Добавить комментарий

Капча загружается...