LINUX.ORG.RU

Не запускается MySQL

 , ,


0

1

OC AlmaLinux 8.7 БД MySQL 8.0

Комп выключился, так как пропало электро питание, mysql не загружается, все стояло на vmware worksation.

Как проще всего восстановить базу? готов потерять записи хоть за сутки или больше, главное настройки бы вытащить. На сервере стоял zabbix постоянно что то писал в бд, видимо в процессе записи все оборвалось и что то повредилось.

логи mysql из /var/log/mysql

/usr/libexec/mysqld(my_print_stacktrace(unsigned char const*, unsigned long)+0x41) [0x55fbc0372d91]
0000/usr/libexec/mysqld(print_fatal_signal(int)+0x30b) [0x55fbbf3d095b]
00/usr/libexec/mysqld(my_server_abort()+0x76) [0x55fbbf3d0a86]
00/usr/libexec/mysqld(my_abort()+0xe) [0x55fbc036cd7e]
0000/usr/libexec/mysqld(ut_dbg_assertion_failed(char const*, char const*, unsigned long)+0x32a) [0x55fbc05c507a]
00/usr/libexec/mysqld(+0x2258a9d) [0x55fbc0489a9d]
00/usr/libexec/mysqld(recv_recover_page_func(bool, buf_block_t*)+0x607) [0x55fbc048cd67]
00/usr/libexec/mysqld(buf_page_io_complete(buf_page_t*, bool)+0x83c) [0x55fbc06310dc]
00/usr/libexec/mysqld(fil_aio_wait(unsigned long)+0x14b) [0x55fbc073679b]
00/usr/libexec/mysqld(+0x232fd08) [0x55fbc0560d08]
000000/usr/libexec/mysqld(std::thread::_State_impl<std::thread::_Invo ker<std::tuple<Detached_thread, void (*)(unsigned long), unsigned long> > >::_M_run()+0xc8) [0x55fbc0560f18]
00/lib64/libstdc++.so.6(+0xc2ba3) [0x7f696bb2fba3]
00/lib64/libpthread.so.0(+0x81cf) [0x7f69700d11cf]
00/lib64/libc.so.6(clone+0x43) [0x7f696b146e73]
000000000000000000The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.

Места вроде хватает

[root@appliance ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 17M 1.9G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda2 4.0G 1.2G 2.9G 30% /
/dev/sda5 4.5G 2.2G 2.4G 48% /var/lib/mysql
/dev/sda3 1014M 40M 975M 4% /tmp
/dev/sda1 488M 50M 403M 11% /boot
tmpfs 393M 0 393M 0% /run/user/0

И еще логи

[root@appliance ~]# systemctl status mysqld.service
● mysqld.service - MySQL 8.0 database server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/mysqld.service.d
└─override.conf
Active: failed (Result: exit-code) since Thu 2023-04-20 19:49:06 +07; 26s ago
Process: 2329 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS)
Process: 2307 ExecStart=/usr/libexec/mysqld --basedir=/usr (code=exited, status=2)
Process: 2270 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
Process: 2244 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
Main PID: 2307 (code=exited, status=2)
Status: "Server startup in progress"

Apr 20 19:49:06 appliance systemd[1]: mysqld.service: Service RestartSec=100ms expired, scheduling restart.
Apr 20 19:49:06 appliance systemd[1]: mysqld.service: Scheduled restart job, restart counter is at 5.
Apr 20 19:49:06 appliance systemd[1]: Stopped MySQL 8.0 database server.
Apr 20 19:49:06 appliance systemd[1]: mysqld.service: Start request repeated too quickly.
Apr 20 19:49:06 appliance systemd[1]: mysqld.service: Failed with result 'exit-code'.
Apr 20 19:49:06 appliance systemd[1]: Failed to start MySQL 8.0 database server.

Пробовал в конфиг файл Mysql прописать innodb_force_recovery = 1 (цифры ставил от 1 до 5) не помогло, но так как с Mysql не работал может что то не так делаю



Последнее исправление: nilob (всего исправлений: 3)
Ответ на: комментарий от nilob

Я его вручную удалил

Кто тебя просил?

при первом запуске ругался на какой то файл mysql.sock и что его нужно удалить

Он не «нужно удалить» а «будет удалён автоматически».

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

добавил skip-grant-tables в конфиг /etc/my.cnf.d/mysql-server.cnf после запуска базы логин пароль все равно требует в браузере в админке заббикс

если имелось ввиду что skip-grant-tables нужен чтобы в саму базу не логинеться при дампе, так там и так пароля нет Но дамп происходит с ошибкой

запускаю так mysqldump -v -hlocalhost –quick zabbix > /tmp/dump211111111111.sql

и ошибка mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table history at row: 3131541

И вот вопрос если я щас удалю базу может я не смогу востановиться из дампа, а если переименовать страую базу, востановиться в новую, если что не так переименовать старую обратно ?

nilob
() автор топика
Ответ на: комментарий от firkax

Я это понял, но я этим что то нарушил безвозвратно или что? Было написано что этот файл должен быть удален, но по факту не удалялся.

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

и ошибка mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table history at row: 3131541

Есть мнение, что таблицы history* тебе не нужны и их можно пропустить

И вот вопрос если я щас удалю базу может я не смогу востановиться из дампа, а если переименовать страую базу, востановиться в новую, если что не так переименовать старую обратно ?

Можно и так

Кажется ты говорил, что сделал копию файлов на виндовый хост

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

Да копию всей паки /var/lib/mysql сделал она чем то пригодиться щас ?

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

Всё удалялось, а ты удалил уже другой (новый) файл с тем же именем. Врядли ты что-то этим испортил но всё равно это не надо было.

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

Есть мнение, что таблицы history* тебе не нужны и их можно пропустить

Когда-то (много лет назад) у меня получилось сдампить битую innodb таблицу (полный дамп крашил сервер) по частям (т.е. where такие чтобы не всю таблицу захватывали а её куски, за несколько запросов получилось всю покрыть в сумме).

А вообще, конечно, эта идеология «наша innodb настолько крута, что никогда не ломается, а значит и чинить её не надо» видимо и по сей день живёт. Жду не дождусь когда наконец эту гадость выкинут отовсюду. Но скорее таки не дождусь :( Не пойму зачем её везде суют.

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

А вообще, конечно, эта идеология «наша innodb настолько крута, что никогда не ломается, а значит и чинить её не надо» видимо и по сей день живёт.

Я не DBA, но для восстановления таблицы после краша нужны redo логи. А их нужно явно включать и бекапить вместе с базой

Иначе будет очередная история про суровых сибирских лесорубов и японскую пилораму

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

Это всё теоретически прекрасно, но на практике в очередной раз видим тему про развалившееся innodb (redo логи видимо покрашились вместе с таблицами) и падающий без внятной диагностики сервер (сколько лет?). В случае с myisam (да и aria, подозреваю, тоже) проблема была бы решена за меньше часа тупо вводом repair table (а в новых версиях даже не вводом, оно само его делает при обнаружении проблем), без всего этого дроча с полуработающим innodb-force-recovery, крашами и перезапусками сервера.

Остаются только рассказы про acid и сохранность данных, но автор прямым текстом пишет что готов потерять за последние сутки (и так у большинства, думаю, и это при том что repair table теряет максимум за последние минуты).

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Значит, на практике в очередной раз поставили базу методом тыка. Забыв про бекапы, redo логи и про бесперебойник

В таких условиях не поможет ни оракл, ни db2. Просто их обычно админят профессионалы, которые помнят про бекапы и таких косяков не допускают. Тут не в базе дело

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

Да нет, в базе.

Есть базы крупных предприятий с профессионалами итд, а есть базы каких-нить форумов или домашних страничек (да даже пусть интернет-магазинов, если не крупных). Так вот, вторым нафиг не сдалась сохранность каждой секунды апдейтов после краша сервера, и так же у них обычно не предусмотрен штат админов. Но зачем на все эти штуки стало модно innodb ставить? Там с какой стороны ни посмотри, myisam будет лучше. А ещё оно меньше жрёт проц и хранилище, тоже полезно.

Что же касается крупных предприятий, то там возможно и не mysql будет вообще.

Про redo-логи кстати забыть нельзя, они у innodb всегда есть. Но реализация, как и всё остальное в innodb, на серьёзные поломки не рассчитана.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от router

Создать базу или востановить из бекапа на старый сервер нельзя innodb_force_recovery = 6 Это Read Only mod

Запустил новый сервер хочу востановить из бекапа

[root@appliance ~]# mysql -uzabbix -p zabbix< /tmp/dump211111111111.sql
Enter password: 
ERROR 1045 (28000): Access denied for user 'zabbix'@'localhost' (using password: YES)

Как этот пасс или переустановить или вообще отключить на mysq ?

nilob
() автор топика
Ответ на: комментарий от firkax

Случайно не в курсе на Postgres такой фигни не будет ? если аварийная перезагрузка в момент записи, полагаю именно она и произошла у меня

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

Какую бы базу ты ни выбрал, не забудь настроить бекап

Хотя бы ежедневный на локальный диск

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

/usr/share/zabbix/conf/zabbix.conf.php.example

<?php
// Zabbix GUI configuration file.

$DB['TYPE']				= 'MYSQL';
$DB['SERVER']			= 'localhost';
$DB['PORT']				= '0';
$DB['DATABASE']			= 'zabbix';
$DB['USER']				= 'zabbix';
$DB['PASSWORD']			= '';

нету тут пароль и mysql в консоле заходит без пароля, а вот для восстановления из бекапа уже нужен пароль

nilob
() автор топика
Ответ на: комментарий от router

нету такого файла вот содержание папки https://clip2net.com/s/4imUrTD

нашел /etc/zabbix/web/zabbix.conf.php там

<?php
// Zabbix GUI configuration file.
global $DB, $HISTORY;

$DB['TYPE']             = 'MYSQL';
$DB['SERVER']           = 'localhost';
$DB['PORT']             = '0';
$DB['DATABASE']         = 'zabbix';
$DB['USER']             = 'zabbix_web';
$DB['PASSWORD']         = '55oGmylmHtmwfbUOG7Y=';
[root@appliance ~]# mysql -uzabbix_web -p zabbix< /tmp/dump211111111111.sql
Enter password: 
ERROR 1142 (42000) at line 25: REFERENCES command denied to user 'zabbix_web'@'localhost' for table 'zabbix.users'

пароль вроде правильный но прав нет для mysql пользователей где то можно посмотреть пароли ? и каким пользователям разрешенно делать рестор бекапа?

root и zabbix (пасс для рута) не подходит Admin и zabbix это логин и пароль для веб админки неподходит

nilob
() автор топика
Ответ на: комментарий от slowpony

ну и для какого пользователя этот пароль ? я же все перепробовал

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

Если запустить mysql в режиме skip-grant-tables (прописать в командной строке или в конфиге) то оно будет пускать всех и везде безо всяких паролей. Только потом не забудь назад в нормальный режим перевести.

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

Сделал skip-grant-tables теперь не ругаеться

[root@appliance ~]# mysql -uroot -p zabbix< /tmp/dump211111111111.sql
Enter password: 
[root@appliance ~]# 

Но и никаких следов старой базы я не вижу при заходе в веб админку, может что то не так восстанавливается? почему процесс не пишет что идет и что завершен ?

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

Ну это уже надо смотреть что у тебя там в дампе и куда внеслось. Может там имя базы другое. А писать он и правда ничего не пишет, когда так запускается (кроме ошибок, вроде). Чтобы писал лог - можно зайти интерактивно и применить дамп командой source /path/to/dump.sql (это команда для консольного mysql-клиента). Только сначала лучше посмотри что там сделалось и что делает дамп. Может он не в ту базу всё развернул.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax
-- MySQL dump 10.13  Distrib 8.0.30, for Linux (x86_64)
--
-- Host: localhost    Database: zabbix
-- ------------------------------------------------------
-- Server version	8.0.30

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

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

nilob
() автор топика
Ответ на: комментарий от firkax

Что значит зайти интерактивно ?

и можно всю строку для того чтобы писались логи source /path/to/dump.sql это куда ?

nilob
() автор топика
Ответ на: комментарий от router

Вобщем удалил полностью базу zabbix и только тогда смог востановить в нее бекап, проверил все таблицы появились, но теперь при заходе в веб админку ошибка 500

вот логи nginx

2023/04/22 22:39:26 [error] 1163#0: *46 FastCGI sent in stderr: "PHP message: PHP Warning:  Error in query [SELECT sessionid,userid,lastaccess FROM sessions WHERE sessionid='236cd85e5d4b8373a321ad02612f0131' AND status=0] [Table 'zabbix.sessions' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248PHP message: PHP Warning:  Error in query [SELECT userid,username,name,surname,passwd,url,autologin,autologout,lang,refresh,theme,attempt_failed,attempt_ip,attempt_clock,rows_per_page,timezone,roleid FROM users WHERE username='guest'] [Table 'zabbix.users' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248PHP message: PHP Warning:  Error in query [SELECT md.moduleid,md.id,md.relative_path,md.config FROM module md WHERE md.status=1 ORDER BY md.relative_path] [Table 'zabbix.module' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248PHP message: PHP Warning:  Error in query [SELECT NULL FROM users u WHERE u.userid IS NULL FOR UPDATE] [Table 'zabbix.users' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248PHP message: PHP Warning:  Error in query [SELECT type,value_id,value_int,value_str,idx2 FROM profiles WHERE userid=0 AND idx='web.sidebar.mode'] [Table 'zabbix.profiles' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248PHP message: PHP Warning:  Error in query [SELECT p.idx,p.source,p.value_str FROM profiles p WHERE p.userid=0 AND p.idx='web.messages'] [Table 'zabbix.profiles' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248" while reading response header from upstream, client: 192.168.0.197, server: , request: "POST /zabbix.php?action=notifications.get&sid=4c258abc92ed7fcb&output=ajax HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/zabbix.sock:", host: "192.168.0.25", referrer: "http://192.168.0.25/zabbix.php?action=service.list"
2023/04/22 22:39:26 [error] 1163#0: *24 FastCGI sent in stderr: "PHP message: PHP Warning:  Error in query [SELECT sessionid,userid,lastaccess FROM sessions WHERE sessionid='236cd85e5d4b8373a321ad02612f0131' AND status=0] [Table 'zabbix.sessions' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248PHP message: PHP Warning:  Error in query [SELECT userid,username,name,surname,passwd,url,autologin,autologout,lang,refresh,theme,attempt_failed,attempt_ip,attempt_clock,rows_per_page,timezone,roleid FROM users WHERE username='guest'] [Table 'zabbix.users' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248PHP message: PHP Warning:  Error in query [SELECT md.moduleid,md.id,md.relative_path,md.config FROM module md WHERE md.status=1 ORDER BY md.relative_path] [Table 'zabbix.module' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248PHP message: PHP Warning:  Error in query [SELECT NULL FROM users u WHERE u.userid IS NULL FOR UPDATE] [Table 'zabbix.users' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248PHP message: PHP Warning:  Error in query [SELECT type,value_id,value_int,value_str,idx2 FROM profiles WHERE userid=0 AND idx='web.sidebar.mode'] [Table 'zabbix.profiles' doesn't exist] in /usr/share/zabbix/include/db.inc.php on line 248" while reading response header from upstream, client: 192.168.0.197, server: , request: "GET /zabbix.php?action=service.list.refresh HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/zabbix.sock:", host: "192.168.0.25", referrer: "http://192.168.0.25/zabbix.php?action=service.list"
nilob
() автор топика
Ответ на: комментарий от router

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

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

и при ресторе я же имя бд и так указывал

Не указывал. Оно указывается через -D. И даже указанное может быть переопределено в дампе. То что ты прислал из дампа - это комментарии и всякие бесполезные настройки, сам дамп ниже начинается.

Что значит зайти интерактивно ?

mysql -u root -p
firkax ★★★★★
()
Ответ на: комментарий от nilob

судя по всему в бекапе нет кучи таблиц

Судя по всему, бекапа у тебя нет и не было ;)

нет кучи таблиц

Насколько я понял, ты делал дамп всей базы в один файл. Скорее всего, когда дамп прерывался из-за ошибки базы history, ты на этом и закончил. И что не успело попасть в дамп, в нём и отсутствует

Лучше получить список таблиц и делать дамп отдельных таблиц. Как уже говорил, history* тебе не нужны

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от router

Получилось все решить)

Подытожу: Дамп сделал игнорируя таблицу history

1) На серваке со старым заббикс

mysqldump -v -hlocalhost -p –ignore-table=zabbix.history zabbix > /tmp/dump311111111111.sql

В конфиге /etc/my.cnf.d/mysql-server.cnf Были добавлены строки

innodb_force_recovery = 6
skip-grant-tables

innodb_force_recovery = 6 чтобы вообще Mysql запускался с другой цифрой кроме 6 не запускался, я думал что их всего 5, а потом нашел статью где еще и про 6 говорят, вот так мне повезло. skip-grant-tables чтобы под любым пользователем делался дамп, не знаю какой пользователь нужен но ни под каким не получалось сделать дамп без этой опции в конфиге.

В конфиге /etc/my.cnf Обязательно добавить новую строку после !includedir /etc/my.cnf.d

Чтобы весь файл выглядел например так

#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
#

Иначе не работает, mysql не стартует Так же добавил пустой файл my.cnf. С точкой в конце в каталог etc в логе ошибок что то про него писало, но возможно это и не надо.

2) На серваке с новым заббикс

Восстановил дамп на виртуалке с работающим заббиксом, только версия была чуть новее, моя исчезла с офф сайта и не понятно где бы я ее искал Моя старая виртуалка zabbix_appliance-6.2.7-vmx Восстановил все в zabbix_appliance-6.2.9-vmx Вывод надо сохранять архив с чистой виртуалкой заббикс)

**mysql -uzabbix -p zabbix< /tmp/dump311111111111.sql **

В конфиге /etc/my.cnf.d/mysql-server.cnf Так же добавить строку skip-grant-tables

[mysqld]
skip-grant-tables

Не знаю важно это делать под [mysqld] или нет, пишу как у меня получилось

Потом все восстановилось сразу, кроме истории показаний с датчиков так как таблицу history я не восстанавливал и мониторинг сразу заработал опять Была ошибка с русским языком, надо было в консоле поставить dnf install glibc-langpack-ru И сделать Reboot

А потом я еще подумал и востановил таблицу History из первого дампа который я делал не игнорируя эту таблицу Там сначала идет дроп тейбл и потом инсерт, то есть текущие записи теряются, по идее может можно сделать просто инсерт без дропа таблицы mysql -uzabbix -p zabbix< /tmp/dump.sql Пасс ввел zabbix хотя по моему такого пользователя и пароля вообще нет, но skip-grant-tables полагаю решает)

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

@router Большое спасибо за ответы по делу, без вас я бы не справился

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

А ну да еще innodb_force_recovery = 6 переводит mysql в режим read only, то есть нельзя просто дропнуть таблицу history и потом ее восстановить на этом же серваке как это обойти я без понятия, кроме того что mysql крашится при пропадании питания, так еще и восстановиться нормально не дает.

Может кто то знает postgres тоже может крашится при пропадании питания и постоянной записи в бд ?

nilob
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.