Вопрос: знает ли кто-нибудь, как извлечь базы данных MySQL из дампа (архива) сайта, созданного с помощью ISP manager? (файл 2021-02-14.mysite.tar.gz).
В распакованном архиве базы лежат в дир. .system и выглядят так:
db.mysql.cswiki 3171 955
db.mysql.skforum 5 122 237
db.mysql.skwiki 17 257 537
db.mysql.mysite 314 748 752
Пробовал переименовать, изменяя расширение на sql, импорт идет с ошибками .
Комментарии
файл 2021-02-14.mysite.tar.gz - это архив, как zip.
Войдите в архив и извлеките оттудова .sql файл. Если он там есть.
Спасибо, но я перечислил файлы, которые там есть. Но называются они неправильно для MySQL.
В начале этих файлов вот такая запись:
-- MySQL dump 10.13 Distrib 5.7.33, for Linux (x86_64)
--
-- Host: localhost Database: cswiki
-- ------------------------------------------------------
-- Server version 5.7.33-0ubuntu0.16.04.1
Что говорит мне (я не спец в ДБ), что это просто переименованные базы.
Но при попытке их импортировать в ISP получаю ошибку. Что-то насчет невозможности использовать ключ.
Завтра скопирую сообщение.
Mysql клиенту не важно какое там расширение, важно содержимое. И оно похоже на дампы.
Надо конкретную ошибку при импорте, тогда будет с чем разбираться.
Возможно версии сервера отличаются.
У меня так было с SQL, не хотел кушать дамб более старой версии сервера.
Проблем совместимости на уровне дампов практически не бывает между версиями. Иногда бывают с длинной ключа, но они вызваны не разными версиями как таковыми, а скорее разным набором настроек по умолчанию в разных версиях.
Лучше создай bash скрипт с mysqldump и настрой на него крон, можно так же сжатие поставить сразу. Будет просто и стабильно!
Вы верены, что там нет *.sql файлов? Техподдержка хостинга что-то говорит? А спросите их.
С какими?
Название (да и расширение) - это не более чем условность, неправильных названий не бывает.
Да ну конечно же нет. Текстовый файл, в начале которого английским по белому написано dump не может являться ничем иным как дампом.
Вот тогда всё и прояснится.
При попытке импорта базы через ISP manager выдает ошибку:
Не удалось восстановить базу данных из резервной копии. Процесс завершился с ошибкой: 'mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1062 (23000) at line 2136: Duplicate entry 'км²-12-ru-node_search' for key 'search_index.PRIMARY' '
Нашел в и-нете много ответов, в основном, что надо импортировать из MySQL с параметром, требующим ввод логина и пароля. Завтра попробую, админ и пароль от базы у меня записаны.
По ошибке ERROR 1062 - наверно, нужно было предварительно очистить таблицу, куда импортирую дамп. Она сначала была пустая, потом импортировал старый дамп, созданный в начале работы восстанавливаемого сайта (27 мб), который импортировался без ошибок, потом стал пробовать последний по времени имеющийся дамп (315 мб), и забыл (чайник) очистить базу.
"'mysql: [Warning] Using a password on the command line interface can be insecure." Это просто предупреждение, на него не надо обращать особого внимания. Оно не мешает импорту.
Ошибка это "Duplicate entry 'км²-12-ru-node_search' for key 'search_index.PRIMARY' '.
Да, надо чистить базу перед импортом этого дампа - в нём вероятно нет DROP IF EXISTS.
Пытался восстановить сайт или его базу через ISP по разным сценариям: предварительно создавая пустую базу с администратором и паролем такими, какие были в импортируемых дампах, и удалив все одноименные базы перед восстановлением. В общем и целом, бесполезно.
Взялся за MySQL, и вот с его помощью база восстановилась. Итак, подключаемся к терминалу хостинга через SSH. Заходим в MySQL как root
mysql -p (попросит пароль)
Сначала смотрю, что за пользователи есть в MySQL:
mysql> SELECT user FROM mysql.user;
+--------------------+
| user |
+--------------------+
| skrwikiadmin |
| coremgr |
| cs-admin |
| cs-wiki-admin |
| csw-admin |
| debian-sys-maint |
| mysql.infoschema |
| mysql.session |
| mysql.sys |
| phpmyadmin |
| root |
| roundcube |
| skr-db-admin |
| skradmin |
| skrwikiadmin |
+---------------------+
15 rows in set (0.01 sec)
Вижу, что там хранятся многочисленные администраторы баз, созданных за время аренды хостинга. При этом в ISP их не видно.
Проверяем привилегии администратора
mysql> SHOW GRANTS FOR 'skradmin'@'localhost' (иначе не даст ему базу импортировать)
+--------------------------------------------------------------------------------------+
| Grants for skradmin@localhost |
+--------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `skradmin`@`localhost` |
| GRANT ALL PRIVILEGES ON `basename`.* TO `skradmin`@`localhost` WITH GRANT OPTION |
+--------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
Теперь надо перезайти в MySQL как skradmin и можно импортировать базу, заранее закачанную на хостинг:
Переключаем базу данных:
USE basename;
Начинаем импорт:
SOURCE /var/www/www-root/data/sql/basename.sql;
Пошел импорт:
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected (0.10 sec)
Ну, и так далее.
Не знаю, в чем тут проблема взаимодействия ISP и MySQL, но при работе с MySQL напрямую, все работает. База восстановилась, но вот беда: ISP ее не видит. Оказывается, известная проблема.
На этом пока застрял.
Нет, не надо. Можно прямо под root импортировать.
Ну и не обязательно всё это делать в интерактивном режиме.
"База восстановилась, но вот беда: ISP ее не видит" - а сайт видит?
экспорт в файл дампа
mysqldump -u USER -pPASSWORD DATABASE > dump.sql
импорт из файла дампа (можно того, что есть)
mysql -u USER -pPASSWORD -f DATABASE < dump.sql
Надо ли перед импортом удалять содержимое из БД? Вот не знаю. Некоторые говорят, что нет, но мне кажется что да.
Делается это либо через
drush sql-drop
либо через удаление и повторное создание самой БД.
Если глупость написал поправьте меня. Весна. Солнышко. Где-то.
Никакой магии в дампах нет, и слово "кажется" неприменимо к точным наукам
Файл дампа БД представляет собой обычную последовательность обычных команд SQL, которые выполняются по порядку как если бы Вы их вводили вручную. Выполняются все эти команды и ничего кроме этих команд.
Если в файле дампа перед созданием каждой таблицы прописана команда DROP TABLE xxx, то предварительно очищать базу данных не надо - таблицы (если они есть) будут удалены перед созданием новых. Если команды DROP TABLE не прописаны - значит базу надо почистить перед импортом.
Если дамп сформирован панелью типа ISPmanager или cPanel, то обычно там уже прописаны команды DROP TABLE IF EXISTS. Если дамп делается вручную, то тут уж надо самому озаботиться либо не забыть опцию --add-drop-table при создании дампа, либо не забыть почистить базу перед импортом.
Уточню: Опция "--add-drop-table" входит в --opt (вместе с --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset), и является умолчанием.
Именно поэтому, чаще всего, ничего чистить не приходится.
А как узнать эта опция в SQL файле включена или нет?
Например:
head -n 100 dump.sql | grep "drop table"
Смысл примерно такой:
Обычно, в дампе везде либо есть, либо нет drop table, так что можно посмотреть перед первой же табличкой.
Head нужен тут чтобы не смотреть весь дамп, который может быть большим.
Обычно, в начале дампа есть некоторое количество заголовков и комментариев, так что надо взять побольше строк, так на всякий.
В случае если будет - будут выведены строки с drop table, Если нет, будет пустой результат.
Извините, я плюнул на это дело, решил восстанавливать все по частям. Все тексты и картинки, которые были на сайте, хранятся отдельно, а многое все равно нужно переделывать.
ПиЭс: понял, что если бы сохранял базы MySQL отдельно, помимо дампов ISP (а также имена админов и пароли), все было бы проще. Да и сам сайт затарить в tar.