Article ID: 6586, created on Feb 10, 2012, last review on Mar 31, 2016

  • Applies to:
  • Plesk

Симптомы

  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

56797cefb1efc9130f7c48a7d1db0f0c a914db3fdc7a53ddcfd1b2db8f5a1b9c caea8340e2d186a540518d08602aa065 e0aff7830fa22f92062ee4db78133079 400e18f6ede9f8be5575a475d2d6b0a6

Email subscription for changes to this article
Save as PDF