Страница 1 из 1

Базы поломались после обновления

Добавлено: 03 май 2022, 04:46
HeavyLogic
Приветствую. Я обновился до версии 5.4.0 и не сделал бэкап (знаю, дурак). Я использую MySQL 5.7 и с базами произошёл какой-то косяк. Если я захожу в phpMyAdmin, то вижу это.

Изображение

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

Изображение

Проверил папку C:\Work\OpenServer\userdata\MySQL-5.7 - базы все на месте. Но наверно, перезаписалась какая-нибудь база MySQL, которая их описывала. Подскажите кто знает - что перезаписалось? Получится ли у меня это восстановить вручную? В целом, бэкапы всех баз у меня есть. Но есть одна, где проект был в разработке. И это залёт на месяц работы, если я не смогу её оживить.

Re: Базы поломались после обновления

Добавлено: 03 май 2022, 05:51
Максим
По идее, если вы просто сдуру "обновились поверх" и ничего не трогали, то у вас затёрлась только схема таблиц, а все данные скорее всего на месте. Полагаю что база была в формате хранения InnoDB.

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

1) Остановите сервер (если запущен), скопируйте папку C:\Work\OpenServer\userdata\MySQL-5.7 куда-либо, её резервная копия будет нужна нам на 4-ом шаге.
2) Заходим в папку C:\Work\OpenServer\userdata\MySQL-5.7\имя_базы и удаляем там все файлы кроме db.opt
3) Запускаем сервер, видим что база пустая (без таблиц) и теперь импортируем в базу sql файл-схему, после чего выполняем SQL запрос:
ALTER TABLE имя_таблицы_1 DISCARD TABLESPACE;
ALTER TABLE имя_таблицы_2 DISCARD TABLESPACE;
ALTER TABLE имя_таблицы_3 DISCARD TABLESPACE;
и так далее для всех таблиц что создались в базе
4) Останавливаем сервер и копируем в папку C:\Work\OpenServer\userdata\MySQL-5.7\имя_базы все файлы из \резервная копия\имя_базы (т.е. из бэкапа, который вы сохранили ранее на 1-ом шаге) с перезаписью файлов.
5) Запускаем сервер и выполняем SQL запрос:
ALTER TABLE имя_таблицы_1 IMPORT TABLESPACE;
ALTER TABLE имя_таблицы_2 IMPORT TABLESPACE;
ALTER TABLE имя_таблицы_3 IMPORT TABLESPACE;
и так далее для всех таблиц в базе
Перезапускаем сервер для верности и вуаля, все данные в таблицах на месте.

Специально сейчас испортил тестовую базу и восстановил, способ работает, надеюсь у вас всё получится.

В принципе способ простой, но тут вся сложность в ручном написании кучи строк ALTER TABLE для каждой таблицы, что может отнять ваше время если таблиц было много ;)

Re: Базы поломались после обновления

Добавлено: 03 май 2022, 09:37
HeavyLogic
Спасибо, принцип понял. Я правильно понимаю, что то что у меня потёрлось лежит где-то в sql-файлах в C:\Work\OpenServer\modules\database\MySQL-5.7\share?

Re: Базы поломались после обновления

Добавлено: 03 май 2022, 14:49
Максим
Нет, неправильно поняли. Перечитайте мой ответ, там написано с какой папкой нужно будет работать, соответственно в ней у вас всё и хранится.

Re: Базы поломались после обновления

Добавлено: 22 май 2022, 09:08
HeavyLogic
Оказалось, что у меня и старые бэкапы потеряны, так что структуры не осталось. Но мне удалось выгуглить как выковырять структуру из файлов. Помог этот ответ:
https://dba.stackexchange.com/a/71785
Может это ещё кому пригодится. Сижу восстанавливаю таблицы по одной - вроде работает.

//add
Да кстати, ещё была проблема что mysqlfrm генерировал немного кривые команды CREATE TABLE. Видимо, слишком старая тулза. Пришлось временно выключить в конфиге MySQL строгий режим. Вот это надо добавить в секцию [mysqld]: sql_mode = "NO_ENGINE_SUBSTITUTION". А то MySQL по-умолчанию ругается на отсутствие дефолтных значений при выполнении CREATE TABLE.