Імпорт однієї бази даних із дампа --all-databases


80

Чи можна імпортувати одну базу даних із --all-databases mysqldump? Я думаю, я можу змінити файл вручну, але цікаво, чи є для цього параметри командного рядка.

Я переміщую сервери і маю багато баз даних, більшість з яких мені наразі не потрібні або не потрібні, але я хотів би мати можливість відновити одну, якщо потрібно.

Відповіді:


83

mysqldumpвихід - це лише набір SQLтверджень.

Ви можете надати потрібну базу даних у командному рядку та пропустити команди проти інших баз даних, використовуючи:

mysql -D mydatabase -o mydatabase < dump.sql

Це буде виконувати команди лише тоді, коли mydatabaseвона використовується


Дякую за швидку відповідь! Приголомшливо
savageguy

2
Дуже корисно для мене, дякую !! Ви можете додати --disable-keys, щоб уникнути помилок зовнішніх ключів;) mysql -u user -D --disable-keys database -o <dump.sql
davidselo

25
Це відповідь дуже необдумана і неймовірно небезпечна. Якщо ви запустите mysqldump --all-databases, вихідні дані mysqldump будуть містити DROP DATABASE IF EXISTS dbname; CREATE DATABASE dbname; USE dbname;кожну базу даних у екземплярі MySQL, включаючи схему mysql. Будь ласка, перегляньте документацію mysqldump: dev.mysql.com/doc/refman/5.5/en/… . Це означає, що кожна база даних буде нещадно перезаписана. Чи можете ви надати доказ того, що він буде пропускати всі бази даних, крім однієї ??? ПРИМІТКА. Ви можете зробити це для двійкових журналів, використовуючи mysqlbinlog.
RolandoMySQLDBA

4
Для параноїка я спочатку створив користувача, який мав права лише на певну базу даних, а потім запустив цю команду з обліковими даними цього користувача. Під час спроби переключення баз даних з’явилася помилка, але дані для конкретної бази даних були збережені.
topher

11
Ця відповідь неправильна. Параметр -D не впливає на читання операторів MySQL з файлу, створеного mysqldump --all-databases. Крім того, він буде ВНИЗАТИ та СТВОРИТИ таблиці у схемі mysql, включаючи таблицю користувачів.
Джа

99

Ви можете використовувати таку команду:

mysql -u root -p --one-database destdbname < alldatabases.sql

Де destdbnameзнаходиться ваша бажана база даних, яку ви хочете відновити.

Інший варіант, який є набагато безпечнішим для IMHO, - це витягнення БД із --all-databasesдампа. Приклад:

sed -n '/^-- Current Database: `dbname`/,/^-- Current Database: `/p' alldatabases.sql > output.sql

Замініть dbnameна потрібну назву бази даних. alldatabases.sqlце ім'я вашого файлу sql-dump. Таким чином ви матимете окрему БД у файлі, а потім зможете відновити за допомогою простої команди mysql.

(Подяки йде: Даррен Матерселе - див. Його сторінку )


5
Чудове рішення! Це означало, що мені довелося додати оригінальний заголовок дампа, щоб уникнути деяких помилок ...
neuro

1
Це має бути прийнята відповідь
Бісандр

Зверніть увагу , що це не працює в Powershell, але працює в ЦМД
Somnium

Річ sed дуже корисна!
Shougo Makishima

2
Як ви кажете, що ще один варіант, який є IMHO набагато безпечнішим ? Чи є ризики у використанні --one-database?
Абдулл

0

При використанні sedпідходу, запропонованого Hetzbh, обов’язково скопіюйте початковий та кінцевий рядки з оригінального дампа, наприклад, наприклад

/*!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 */;
/*!40101 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 */;

і

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

на початок і кінець відповідно видаленого файлу, створеного sed. В іншому випадку імпорт може не вдатися через іноземні обмеження, які не дотримуються в алфавітному порядку таблиць у дампі (тобто errno: 150 "Foreign key constraint is incorrectly formed").

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.