Как устранить неисправность InnoDB в базе данных MySQL

Создана:

2016-11-16 13:08:52 UTC

Изменена:

2017-08-24 02:12:45 UTC

36

Помогла ли вам статья?


Есть вопросы?

Отправить запрос

Как устранить неисправность InnoDB в базе данных MySQL

Applicable to:

  • Plesk
  • Odin Business Automation Standard
  • Plesk Automation

Симптомы

  1. В Parallels Plesk Panel показывается следующее сообщение об ошибке:

    ERROR: PleskMainDBException
    MySQL query failed: Incorrect information in file: './psa/misc.frm'
    
  2. При работе mysqldump и mysqlcheck появляется сообщение о несуществующей таблице (для проверки используйте учетную запись администратора MySQL):

    ~# mysqlcheck -uadmin -p****** db_example
    db_example.BackupTasks
    error    : Can't find file: 'BackupTasks.MYD' (errno: 2)
    
  3. Невозможно выполнить запрос таблицы с оператором "SELECT" :

    mysql> select * from db_example.misc;
    ERROR 1033 (HY000): Incorrect information in file: './db_example/misc.frm'
    
  4. Таблица не может быть восстановлена, так как ядро InnoDB не поддерживает восстановление.

    mysql> repair table misc;
    +-------------------------+--------+----------+---------------------------------------------------------+
    | Table                   | Op     | Msg_type | Msg_text                                                |
    +-------------------------+--------+----------+---------------------------------------------------------+
    | psa.APSApplicationItems | repair | note     | The storage engine for the table doesn't support repair |
    +-------------------------+--------+----------+---------------------------------------------------------+
    

Причина

Повреждения InnoDB часто связаны с неисправностью оборудования. Сохранение поврежденных страниц происходит в результате сбоев питания или повреждений памяти. Также эта проблема может возникать, если вы храните базы данных InnoDB в сетевом хранилище (NAS).

Решение

Существует несколько способов восстановить MySQL:

I. Принудительное восстановление InnoDB

  1. Остановите mysqld и сохраните резервную копию всех файлов, расположенных в папке /var/lib/mysql/ :

    ~# /etc/init.d/mysqld stop
    ~# mkdir /root/mysql_backup
    ~# cp -r /var/lib/mysql/* /root/mysql_backup/
    
  2. Добавьте опцию innodb_force_recovery в раздел [mysqld] в /etc/my.cnf . Эта опция позволит вам запустить mysqld и создать дамп базы данных.

    ~#/etc/my.cnf
    [mysqld]
    innodb_force_recovery = 4
    

    ПРИМЕЧАНИЕ. Вы можете увеличить эту опцию до 5 или 6 - пока не получите оптимальный дамп. Более подробную информацию смотрите здесь .

  3. Запустите службу mysqld :

    ~# /etc/init.d/mysqld start
    
  4. Создайте дамп всех баз данных:

    ~# mysqldump -uadmin -p`cat /etc/psa/.psa.shadow` -A > /root/dumpall.sql
    

    Если при создании дампа возникла следующая ошибка:

    Incorrect information in file: './psa/APSApplicationItems.frm' when using LOCK TABLES"`
    

    увеличьте значение innodb_force_recovery и повторите попытку. Если вы не можете создать дамп баз данных, попробуйте использовать способ II (скопировать содержимое таблицы) или III (восстановить из резервной копии).

  5. Остановите mysqld и удалите поврежденные данные:

    ~# /etc/init.d/mysqld stop
    ~# rm -rf /var/lib/mysql/*
    
  6. Удалите опцию innodb_force_recovery из файла /etc/my.cnf и запустите mysqld :

    ~# /etc/init.d/mysqld start
    

    В результате этого будет восстановлена главная база данных "mysql" и движок баз данных InnoDB.

  7. Восстановите базы данных из дампа:

    ~# mysql -uadmin -p`cat /etc/psa/.psa.shadow` < dumpall.sql
    

II. Копирование содержимого таблицы

  1. Остановите mysqld и сохраните резервную копию всех файлов, расположенных в папке /var/lib/mysql/ :

    ~# /etc/init.d/mysqld stop
    ~# mkdir /root/mysql_backup
    ~# cp -r /var/lib/mysql/* /root/mysql_backup/
    
  2. Добавьте опцию innodb_force_recovery в раздел [mysqld] в /etc/my.cnf . Эта опция позволит вам запустить mysqld и создать дамп базы данных.

    ~#/etc/my.cnf
    [mysqld]
    innodb_force_recovery = 1
    
  3. Попробуйте создать копию:

    CREATE TABLE <новая таблица> LIKE <поврежденная таблица>;
    INSERT INTO <новая таблица> SELECT * FROM <поврежденная таблица>;
    
  4. Если получилось, удалите поврежденную таблицу и присвойте ее имя новой.

    DROP TABLE <поврежденная таблица>;
    RENAME TABLE <новая таблица> TO <поврежденная таблица>;
    

III. Восстановление из резервной копии

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

Ежедневная копия базы данных Parallels Plesk Panel сохраняется в папку DUMP_D :

~# ls -l /var/lib/psa/dumps
-rw------- 1 root   root   141960 Aug  8 01:03 mysql.daily.dump.0.gz
-rw------- 1 root   root   141925 Aug  7 01:03 mysql.daily.dump.1.gz

Чтобы восстановить последнюю резервную копию базы данных ( mysql.daily.dump.0.gz ), используйте следующую команду:

~# zcat /var/lib/psa/dumps/mysql.daily.dump.0.gz | mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa

ПРИМЕЧАНИЕ. При восстановлении баз данных может возникать превышение времени ожидания. Добавьте опцию wait_timeout в /etc/my.cnf и перезапустите службу mysqld:

/etc/my.cnf
[mysqld]
wait_timeout = 1800
~# /etc/init.d/mysqld restart
Была ли эта статья полезной?
Пользователи, считающие этот материал полезным: 36 из 145
Еще есть вопросы? Отправить запрос
Войдите в службу, чтобы оставить комментарий.