it-swarm.com.ru

Клонирование базы данных MySQL в том же экземпляре MySql

Я хотел бы написать скрипт, который копирует мою текущую базу данных sitedb1 в sitedb2 в том же экземпляре базы данных mysql. Я знаю, что могу сбросить SitedB1 в сценарий SQL:

mysqldump -u root -p sitedb1 >~/db_name.sql

а затем импортируйте его в sitedb2. Есть ли более простой способ, без выгрузки первой базы данных в файл sql?

103
uclajatt

Как сказано в руководстве в Копирование баз данных вы можете направить дамп непосредственно в клиент mysql:

mysqldump db_name | mysql new_db_name

Если вы используете MyISAM, вы могли скопировать файлы, но я бы не рекомендовал это делать. Это немного хитроумно.

Интегрировано из различных хороших других ответов

Обе команды mysqldump и mysql принимают параметры для настройки сведений о соединении (и многое другое), например:

mysqldump -u <user name> --password=<pwd> <original db> | mysql -u <user name> -p <new db>

Кроме того, если новая база данных еще не существует, вы должны создать ее заранее (например, с помощью echo "create database new_db_name" | mysql -u <dbuser> -p).

215
Greg

Использование MySQL Utilities

Утилиты MySQL содержат инструмент Nice mysqldbcopy , который по умолчанию копирует БД, включая все связанные объекты («таблицы, представления, триггеры, события, процедуры, функции и предоставления на уровне базы данных») и данные с одного сервера БД на то же самое или на другой сервер БД. Есть много вариантов для настройки того, что на самом деле копируется.

Итак, чтобы ответить на вопрос ОП:

mysqldbcopy \
    --source=root:[email protected] \
    --destination=root:[email protected] \
    sitedb1:sitedb2
51
Chriki
$ mysqladmin create DB_name -u DB_user --password=DB_pass && \
    mysqldump -u DB_user --password=DB_pass DB_name | mysql -u DB_user --password=DB_pass -h DB_Host DB_name
16
Peru

Вам нужно запустить команду из терминала/командной строки. 

mysqldump -u <user name> -p <pwd> <original db> | mysql -u <user name> <pwd> <new db>

например: mysqldump -u root test_db1 | mysql -u root test_db2

Это копирует test_db1 в test_db2 и предоставляет доступ к «root» @ «localhost»

12
Srikanth Gurram

Вы можете использовать (в псевдокоде):

FOREACH tbl IN db_a:
    CREATE TABLE db_b.tbl LIKE db_a.tbl;
    INSERT INTO db_b.tbl SELECT * FROM db_a.tbl;

Причина, по которой я не использую синтаксис CREATE TABLE ... SELECT ..., заключается в сохранении индексов. Конечно, это только копии таблиц. Представления и процедуры не копируются, хотя это можно сделать таким же образом.

Смотрите CREATE TABLE .

7
Emil H

Лучший и простой способ - ввести эти команды в свой терминал и установить права доступа для пользователя root. Работает для меня..! 

:~$> mysqldump -u root -p db1 > dump.sql
:~$> mysqladmin -u root -p create db2
:~$> mysql -u root -p db2 < dump.sql
5
Naseer-shaik

Сначала создайте дубликат базы данных:

CREATE DATABASE duplicateddb;

Убедитесь, что разрешения и т.д. Все на месте и:

mysqldump -u admin -p originaldb | mysql -u backup -p password duplicateddb;
4
svg

Вы можете сделать что-то вроде следующего:

mysqldump -u[username] -p[password] database_name_for_clone 
 | mysql -u[username] -p[password] new_database_name
2
Digambar Patil

Это утверждение было добавлено в MySQL 5.1.7, но было признано опасным и было удалено в MySQL 5.1.23. Он был предназначен для обновления баз данных до 5.1 для использования кодировки, реализованной в 5.1, для сопоставления имен баз данных с именами каталогов баз данных. Однако использование этого оператора может привести к потере содержимого базы данных, поэтому оно было удалено. Не используйте RENAME DATABASE в более ранних версиях, в которых она присутствует.

Чтобы выполнить задачу обновления имен базы данных с помощью новой кодировки, используйте вместо этого ALTER DATABASE db_name ОБНОВИТЬ ИМЯ КАТАЛОГА ДАННЫХ ОБНОВЛЕНИЯ: http://dev.mysql.com/doc/refman/5.1/en/alter-database.html

1
zacheusz

Лучше использовать команду mysqldbcopy для копирования базы данных с одного на другой сервер или на тот же сервер.

mysqldbcopy --source=root:[email protected] --destination=root:[email protected] database-name:database-name-clone

[MySQL]

1
Rakesh C

Простой способ сделать это, если вы установили phpmyadmin :

Перейдите в свою базу данных, выберите вкладку «Операция», и вы увидите блок «Копировать базу данных в». Используйте его, и вы можете скопировать базу данных.

0
fzyzcjy

В дополнение к ответу Грега.
Самый простой и быстрый способ, если new_db_name еще не существует. 

echo "create database new_db_name" | mysql -u <user> -p <pwd> 
mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_name
0
rayphi

Если у вас есть триггеры в исходной базе данных, вы можете избежать ошибки «Триггер уже существует», отправив замену перед импортом:

mysqldump -u olddbuser -p -d olddbname | sed "s/`olddbname`./`newdbname`./" | mysql -u newdbuser -p -D newdbname
0
zeusstl

Я не думаю, что есть способ сделать это. Когда PHPMyAdmin делает это, он сбрасывает базу данных, а затем повторно вставляет ее под новым именем.

0
UnkwnTech

Используйте «mysqldbcopy» на терминале. Этот случай хорошо упоминается здесь . Пример: Запустите командную строку. Перейдите в папку bin сервера MySql. Запустите следующий запрос:

C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqldbcopy --source=root:[email protected] --destination=root:[email protected] master:master_clone

здесь я пытаюсь скопировать мою «master» db в «master_clone» на localhost.

0
Rajneesh