Відновлення бази даних mysql з іншою назвою


41

Як ми можемо відновити базу даних mysql з іншим ім'ям від файлу mysqldump. Я не хочу відкривати дамп-файл і редагувати його. Будь-які інші кращі методи?

Відповіді:


58

Ви можете дозволити mysqldump створити дамп таким чином, щоб він не створював і не вибирав базу даних.

ПРИКЛАД: Ви скидаєте базу даних db1 і завантажуєте її в базу даних db2

Це додасть команди CREATE DATABASE та USE на дамп

mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql

Це не буде містити команди CREATE DATABASE та USE на дамп ( це те, що ви хочете )

mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql

Ви можете завантажити його в іншу базу даних (наприклад, db2) одним із чотирьох (4) способів:

ВАРІАНТ 1

$ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2

ВАРІАНТ 2

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql

ВАРІАНТ 3

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql

ВАРІАНТ 4

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql

Спробувати !!!


У випадку, якщо хтось із цим боровся, -Ddb2не повинен перед собою бути дефіс. Принаймні, я отримав помилку синтаксису MySQL, коли я включив її.
gwg

Це, здається, не працює. Мій дамп не має бази даних CREATE або USE, але він все ще має ALTER DATABASE ... CHARACTER SET ...в ньому, що порушує мій імпорт. Редагувати: Oracle в основному ігнорує помилку .
18-18

5

Я великий шанувальник дампа, редагування та вставки. але вам не потрібно відкривати текстовий файл (dump-файл), щоб змінити його (це особливо корисно, коли він має кілька мільйонів рядків). якщо ви хочете скинути базу даних MYDATABASE.

mysqldump MYDATABASE > mydump.sql

потім використовуйте sed для заміни старої назви бази даних на нову подібну

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql

тоді ви можете просто створити нову базу даних та імпортувати її знову, і вона створить усі таблиці в новій базі даних MYNEWDATABASE '

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

Редагувати: Як наголосили деякі приємні люди в розділі коментарів, це може бути небезпечно, якщо деякі дані також будуть змінені цим вище, тож, щоб визначити способи цього уникнути.

1) Майте за це на смітнику, перш ніж змінити його, як це.

cat mydump.sql | grep "MYDATABASE"

і

2) ми можемо додати кілька `, щоб зробити це безпечнішим:

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql

якщо хтось ще має конкретні пропозиції, я радий відредагувати свою відповідь ще через 4 роки.


Я думаю, що питання стосувалося відновлення бази даних enitre, але з іншою назвою, а не просто копіювання однієї таблиці в існуючий БД.
Майкл Грін

3
частина
седу

10
Ця команда - це погана ідея, і я б голосував, якби міг. Якщо ви збираєтесь замінити рядок, принаймні відповідайте рядку CREATE TABLE та USE, щоб не замінювати жодних інших даних.
бксунда

1
перед тим, як запустити команду sed ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql), перевірте всі значення MYDATABASE, cat mydump.sql | grep "MYDATABASE"щоб переконатися, що змінено лише ім'я бази даних, інші дані залишаються недоторканими.
Рафаф Тахсін

1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # потенційно безпечніше редагування пари. мій дамп бази даних не містить жодних операцій USE або CREATE DATABASE, але ім'я db міститься в sql коментарях, переглядах та тригерах (MySQL 5.7). Це НЕ замінює ім'я бази даних у коментарях, але вони не впливають на отриману базу даних. Це добре спрацювало для мене.
Джонатан

3

Я робив це колись, давно.

Коли ви експортуєте всі свої дані, є можливість встановити ім’я бази даних на початку файлу, наприклад: "використовувати базу даних x"

Отже, ви можете змінити цю декларацію.


3

Якщо файл , що ви маєте на руці , і ви маніпулюєте його з оболонки / консолі, я хотів би використовувати , sedщоб зробити рядок заміни на лінії , починаючи з CREATE DABATASE, CREATE TABLE, USEі optionnally --(MySQLDump коментарів)

Заміна імені db на лінії, що відповідають створенню бази даних, створення таблиці, використання та mysqldump коментарів

dbfile="yoursqldumpfile.sql";
dbname="current_db_name";
dbnewname="new_db_name";
dbnewfile="/tmp/$dbnewname.sql";
cat $dbfile | sed "/^CREATE DATABASE/ s=$dbname=$dbnewname=" | sed "/^CREATE TABLE/ s=$dbname=$dbnewname=" | sed "/^USE / s=$dbname=$dbnewname=" | sed "/^-- / s=$dbname=$dbnewname=" > $dbnewfile


Звичайно, як і багато згаданих тут відповідей, простіше, якщо резервна копія mysqldump не містила CREATE DATABASE та рядок USE. Значення варіантів --all-databases, --databasesабо їх короткі версії -Aабо -Bне використовувалися.


У MySQL 5.7 mysqldump включає ім'я бази даних у тригерах та видах, навіть із --no-create-dbта без --databaseабо --databases.
Джонатан

2

Якщо ви робите дамп, використовуючи такі два правила:

  1. Не використовуйте такі параметри, як --databases, --databaseа просто покладіть ім'я бази даних в кінці команди без цих параметрів.
  2. Включіть опцію --no-create-db

Якщо ви зробите наступне, то mysqldump створить SQL без посилання на базу даних, тоді ви можете використовувати нове ім'я бази даних наприкінці вашої команди mysql під час імпорту!

mysqldump  --no-create-db old_db_name --single-transaction --compress --order-by-primary --host old_db_host -u old_db_user -pOld_db_password | mysql --host new_host -u new_user -pnewpassword new_db_name

У MySQL 5.7 mysqldump включає ім'я бази даних у тригерах та видах, навіть із --no-create-dbта без --databaseабо --databases.
Джонатан

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