LINUX.ORG.RU

Проблемы с MySQL

 , ,


1

3

Здравствуйте. В общем возник ряд проблем с MySQL, которые я уже не в состоянии решить. Дело обстояло так, одним прекрасным утром упали все сайты. По ошибке я понял, что проблема с сокетом mysqld.sock (При ребуте пропадал, и т.д.), пробовал решать ручным созданием файла, и задаванием ему прав, но не помогло. Спасло добавление строки

innodb_force_recovery = 4
в файл /etc/mysql/my.cnf Всё, сокет пересоздался после ребута, сайты поднялись, но кое-где повредилась база. Хотел её восстановить из бэкапа, но происходила ошибка
Got error -1 from storage engine
И вот нашёл я в гугле, что причина сей проблемы - нехватка места на жёстком диске. Но на нём у меня было ещё порядка 30Гб, и вот, самое интересное, решил я почистить «мусор», руководствуясь одной статьей (Да, дурак). Несмотря на то, что у меня Debian 7, я решил воспользоваться мануалом для Debain 8 (Вот ссылка: https://losst.ru/ochistka-sistemy-debian-8) Значит ввёл я команду
dpkg --list | grep '^rc '
И получил в ответ http://pastebin.com/V4KWYJHM (Ссылка специально на пастебин, для более удобного просмотра) И разумеется следующей командой я решил попробовать очистить эти «ненужные конфиги»
dpkg --list | grep '^rcb' | awk '{ print $2 }' | xargs dpkg -P
Но тут я получил ошибку, что надо указывать имя пакета для --purge. Ну и я такой радостный поехал по списочку, примерно в этом духе
dpkg --list | grep '^rcb' | awk '{ print $2 }' | xargs dpkg -P php5-mysqlnd
И вот таким макаром я «почистил» весь список. Результат - опять часть сайтов навернулась (И тут уже на 70% опять этот mysql, т.к. рухнули только сайты имеющие БД (не все)) Я попробовал установить заново эти пакеты, но их «зависимости» предлагают снос других достаточно важных для системы пакетов. «Не принятие» решения приводит к отмене установки. Что делать - я уже просто не знаю. После того, как отсмеётесь, надеюсь кто-нибудь сможет помочь, ибо сам вариантов уже ну просто не имею.. Кстати, лог MySQL выглядить примерно так
170111 22:35:09 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
170111 22:35:23 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
170111 22:35:23 [Note] /usr/sbin/mysqld (mysqld 5.5.53-0+deb7u1) starting as process 2856 ...
170111 22:35:23 [Note] Plugin 'FEDERATED' is disabled.
170111 22:35:23 InnoDB: The InnoDB memory heap is disabled
170111 22:35:23 InnoDB: Mutexes and rw_locks use GCC atomic builtins
170111 22:35:23 InnoDB: Compressed tables use zlib 1.2.7
170111 22:35:23 InnoDB: Using Linux native AIO
170111 22:35:23 InnoDB: Initializing buffer pool, size = 192.0M
170111 22:35:23 InnoDB: Completed initialization of buffer pool
170111 22:35:23 InnoDB: highest supported file format is Barracuda.
170111 22:35:23  InnoDB: Error: page 3 log sequence number 39811694329
InnoDB: is in the future! Current system log sequence number 258420.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.
170111 22:35:23  InnoDB: Error: page 2 log sequence number 43924952081
InnoDB: is in the future! Current system log sequence number 258420.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.
Ну и дальше копируется последняя секция, только с разной цифрой page.

Может правда будут какие-то дельные советы, только без «псевдотроллинга», пожалуйста, уже почти двое суток из-за этого не сплю, и не до шуток особо. Заранее спасибо за любую помощь!

По ссылке сходил-то, в логе которая, попробовал, что там пишут? innodb_force_recovery = 1 > /etc/my.cnf, запустить мускул и попробовать снять дамп?

Что-то похожее описано тут.

garik_keghen ★★★★★ ()
Последнее исправление: garik_keghen (всего исправлений: 1)

Но на нём у меня было ещё порядка 30Гб

Значит, либо айноды кончились, либо для рута зарезервированы, либо ФС сломалась. Следует глянуть df -i / и, если ФС ext — tune2fs -l имя_раздела|grep Res.

Несмотря на то, что у меня Debian 7

Чистка справедлива и для более ранних версий. Но проку с неё мало, вероятнее, что логами забилось. logrotate стоит хотя бы? Нотисы с сайтов по умолчанию в браузер падают или засоряют логи?

Я попробовал установить заново эти пакеты

А смысл их устанавливать, если они уже удалены были — не нужны, значит? Деинсталляционные скрипты в каждом пакете писаны руками, и могли повести себя в условиях забитого раздела непредсказуемым образом; повторная установка пакетов вряд ли чем-то поможет.

Кстати, лог MySQL выглядить примерно так

Ну на эти сломанные базы и ругается, восстановление из бэкапа должно помочь, когда будет куда его лить.

b-adblack- ()
Ответ на: комментарий от garik_keghen

Пробовал. При

innodb_force_recovery = 1
MySQL даже не поднимается

Статья не очень помогла. А вот такой вопрос, если имеются копии всех баз до повреждения, можно ли мне удалить вообще все базы текущие, а потом пересоздать их, и закинуть те дампы?

Night_FoX ()

Ну и по дисковой подсистеме желательно больше данных: что используется, как размечено, что SMART кажет. Ибо что-то нечисто, раз ошибка записи. dd if=/dev/urandom of=/tmp/test bs=1 count=1M отрабатывает под юзером и под рутом?

b-adblack- ()
Ответ на: комментарий от b-adblack-
root@extreme-host:~# df -h
Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
/dev/simfs          60G          37G   24G           61% /
none               512M         4,0K  512M            1% /dev
none               103M         1,2M  102M            2% /run
none               5,0M            0  5,0M            0% /run/lock
none               205M            0  205M            0% /run/shm
none               100M            0  100M            0% /run/user

Почему-то везде none, раньше такого не было...

Night_FoX ()
Ответ на: комментарий от b-adblack-

Да, конечно. По названиям .sql файла понятно что куда. Уточнение, а вот если в дампе БД bdtest указано CREATE TABLE 'test' То нужно удалить

/var/lib/mysql/bdtest/test.frm
/var/lib/mysql/bdtest/test.MYD
/var/lib/mysql/bdtest/test.MYI
Но db.opt никак не трогать. А потом просто залить дамп БД, допустим, через phpMyAdmin?

Night_FoX ()
Ответ на: комментарий от Night_FoX

Ну раз всё целое, то дело остаётся за малым — ручками восстановить. Потом отоспаться и думать, почему произошёл сбой. Это не та часом система, на которую systemd вкрячили?

b-adblack- ()
Ответ на: комментарий от Night_FoX

Ну я поступаю в случае проблем радикально -

Останавливаю mysql

удаляю содержимое папки баз mysql(кажись /var/lib/mysql)

Запускаю mysql

Дефолтная структура базы создается, а далее можно восстанавливать. Но это годится только если данных не жалко и есть бэкапы

ism ()

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

ism ()
Ответ на: комментарий от b-adblack-

В общем поудалял эти таблицы, не помогло. Психанул, удалил всё содержимое папки /var/lib/mysql. Начались ошибки в логах из-за отсутствия таблицы БД mysql (Кстати, ошибки вот эти от InnoDB ушли). Окей, вернул папку mysql из бэкапа. Затем пошли ошибки от performance_schema, вернул и эту папку. Теперь наблюдаю в логах следующее (Жалобы на таблицу events)

170112 20:07:26 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
170112 20:07:27 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
170112 20:07:27 [Note] /usr/sbin/mysqld (mysqld 5.5.53-0+deb7u1) starting as process 12508 ...
170112 20:07:27 [Note] Plugin 'FEDERATED' is disabled.
170112 20:07:27 InnoDB: The InnoDB memory heap is disabled
170112 20:07:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins
170112 20:07:27 InnoDB: Compressed tables use zlib 1.2.7
170112 20:07:27 InnoDB: Using Linux native AIO
170112 20:07:27 InnoDB: Initializing buffer pool, size = 192.0M
170112 20:07:27 InnoDB: Completed initialization of buffer pool
170112 20:07:27 InnoDB: highest supported file format is Barracuda.
170112 20:07:27  InnoDB: Waiting for the background threads to start
170112 20:07:28 InnoDB: 5.5.53 started; log sequence number 1595675
170112 20:07:28 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
170112 20:07:28 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
170112 20:07:28 [Note] Server socket created on IP: '0.0.0.0'.
170112 20:07:28 [Warning] 'user' entry 'root@extreme-hostserver.com' ignored in --skip-name-resolve mode.
170112 20:07:28 [Warning] 'proxies_priv' entry '@ root@extreme-hostserver.com' ignored in --skip-name-resolve mode.
170112 20:07:28 [ERROR] Event Scheduler: Failed to open table mysql.event
170112 20:07:28 [ERROR] Event Scheduler: Error while loading from disk.
170112 20:07:28 [Note] Event Scheduler: Purging the queue. 0 events
170112 20:07:28 [ERROR] Aborting

170112 20:07:28  InnoDB: Starting shutdown...
170112 20:07:31  InnoDB: Shutdown completed; log sequence number 1595675
170112 20:07:31 [Note] /usr/sbin/mysqld: Shutdown complete

170112 20:07:31 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

А как решить вопрос с этой таблицей event - догнать не могу, гугл даёт только англоязычные форумы, и способы решения на каждом разные. Может знаете?

Night_FoX ()
Ответ на: комментарий от b-adblack-

Я так понял, команда

apt-get --reinstall install mysql-server mysql-client
Но как тут принудительно задать версию пакета, как скажем при
apt-get install packet=version
Т.к. нужна версия MySQL именно 5.5.53-0+deb7u1

Night_FoX ()
Ответ на: комментарий от Night_FoX

Таким же образом, просто дописать ключ --reinstall. Если пакет остался в кэше, он оттуда и переустановится; если нет ни в кэше, ни в репозитории — ставить из другого места через dpkg.

b-adblack- ()
Ответ на: комментарий от b-adblack-
root@extreme-host:~# apt-get --reinstall install mysql-server=5.5.53-0+deb7u1 mysql-client=5.5.53-0+deb7u1
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
обновлено 0, установлено 0 новых пакетов, переустановлено 2 переустановлено, для удаления отмечено 0 пакетов, и 5 пакетов не обновлено.
Необходимо скачать 0 B/147 kB архивов.
После данной операции, объём занятого дискового пространства возрастёт на 0 B.
(Чтение базы данных … на данный момент установлено 86379 файлов и каталогов.)
Подготовка к замене пакета mysql-client 5.5.53-0+deb7u1 (используется файл …/mysql-client_5.5.53-0+deb7u1_all.deb) …
Распаковывается замена для пакета mysql-client …
Подготовка к замене пакета mysql-server 5.5.53-0+deb7u1 (используется файл …/mysql-server_5.5.53-0+deb7u1_all.deb) …
Распаковывается замена для пакета mysql-server …
Настраивается пакет mysql-client (5.5.53-0+deb7u1) …
Настраивается пакет mysql-server (5.5.53-0+deb7u1) …

Результат не поменялся, логи такие же (Рестарт MySQL/Ребут делал), что и выше.

Night_FoX ()
Ответ на: комментарий от b-adblack-

В общем методом тыка дал права 0777 на эти 3 файла, после чего возникла вновь ошибка с сокетом. Я пересоздал его вручную, задал права 0777, и mysql завёлся (без recovery). Но после того как я решил зайти в phpmyadmin я увидел следующее

Расширение mysqli не найдено. Пожалуйста, проверьте ваши настройки PHP. <a href="Documentation.html#faqmysql" target="documentation"><img class="icon" src="./themes/pmahomme/img/b_help.png" width="11" height="11" alt="Документация" title="Документация" /></a>
Как установить это расширение? Вроде ж php5-mysql стоит...

Night_FoX ()
Ответ на: комментарий от Night_FoX

А эти значения пока просто мониторить мне нужно?

Да, стоит. На pastebin каша какая-то вышла, но не важно. Видно, что в колонке failcnt нули. Но проверить надо в момент проблем или после, но до перезагрузки, когда счётчики сбрасываются.

Значения, как мне кажется, достаточно большие...

Вообще да. Странно. И ещё что странно:

resource   held   maxheld barrier limit  failcnt
physpages  193818 262583  0       262144 0
maxheld явно вышел за limit, но failcnt 0. При этом barrier 0 - это надо почитать, можно ли так. По идее, если barrier не нужен, он делается равным limit, но, может, это и одно и тоже. Я бы конфиг этой VPS-ки проверил посредством vzcfgvalidate на всякий случай... Доступ в хост-систему есть, или это хостинг чей-то ?

AS ★★★★★ ()
Ответ на: комментарий от Night_FoX

удалил всё содержимое папки /var/lib/mysql. Начались
ошибки в логах из-за отсутствия таблицы БД mysql

Вообще-то странно. У меня всегда всё воссоздавалось в девственном виде и без ошибок после такого.

AS ★★★★★ ()
Ответ на: комментарий от anonymous

Почитаю. Тем временем, нам помогли в Технической Поддержке хостинга, за что им огромное спасибо.

Вероятнее всего, проблема была вызвана повреждением логов innodb. Выполнили запуск mysql с параметром innodb_force_recovery = 6.

После этого создали бэкап всех баз данных:
mysqldump --all-databases > alldb.sql

Переместили директорию mysql в mysql_restored_badly, запустили пустой mysql и восстановили в него то базы данных из бэкапа:
mysql -q -f < alldb.sql

На данный момент проблем в работе Mysql не наблюдается.

P.S. Спасибо всем, кто пытался помочь, особенно b-adblack.

Night_FoX ()