Восстановить базу данных 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 в основном игнорирует ошибку .
mpen

5

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

mysqldump MYDATABASE > mydump.sql

затем используйте sed для замены старого имени базы данных новым

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

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

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

Редактировать: Как отметили некоторые приятные люди в разделе комментариев, это может быть опасно, если некоторые из данных также изменены этим выше, поэтому, чтобы найти конкретные способы избежать этого.

1) Grep для этого в дампе, прежде чем его менять, вот так.

cat mydump.sql | grep "MYDATABASE"

а также

2) мы можем добавить `, чтобы сделать его более безопасным, например:

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

если у кого-то есть конкретные предложения, я с удовольствием отредактирую свой ответ еще через 4 года.


Я думаю, что вопрос был о восстановлении базы данных enitre, но с другим именем, а не просто о копировании одной таблицы в существующей базе данных.
Майкл Грин

3
нужна
седь-

10
Эта команда - плохая идея, и я бы проголосовал против, если бы мог. Если вы собираетесь заменить строки, по крайней мере, сопоставьте строку CREATE TABLE и USE, чтобы не заменять другие данные.
bksunday

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 # потенциально безопаснее редактировать Steam. мой дамп базы данных не содержит никаких операторов USE или CREATE DATABASE, но имя базы данных находится в комментариях, представлениях и триггерах sql (MySQL 5.7). Это НЕ заменяет имя базы данных в комментариях, но они не влияют на результирующую базу данных. Это хорошо сработало для меня.
Джонатан

3

Я сделал это однажды, давным-давно.

Когда вы экспортируете все свои данные, есть возможность установить имя базы данных в начале файла, что-то вроде: «использовать базу данных x»

Таким образом, вы можете изменить эту декларацию.


3

Если файл , что вы имеете в руке , и вы манипулируете его из оболочки / консоли, я хотел бы использовать , sedчтобы сделать строку замены на линии , начиная с CREATE DABATASE, CREATE TABLE, USEи optionnally --(MySQLDump комментариев)

Замена имени БД в строках, которые соответствуют комментариям Create Database, Create Table, Use и 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.