Kembalikan database mysql dengan nama berbeda

41

Bagaimana cara mengembalikan database mysql dengan nama berbeda dari file mysqldump. Saya tidak ingin membuka file dump dan mengeditnya. Adakah metode lain yang lebih baik?

Praveen Prasannan
sumber

Jawaban:

58

Anda dapat membiarkan mysqldump membuat dump sedemikian rupa sehingga tidak membuat atau memilih database.

CONTOH: Anda membuang basis data db1 dan memuatnya ke basis data db2

Ini akan dimasukkan ke dalam CREATE DATABASE dan perintah USE di dump

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

Ini tidak akan dimasukkan ke dalam CREATE DATABASE dan perintah USE di dump ( inilah yang Anda inginkan )

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

Anda dapat memuatnya ke database lain (seperti db2) dengan salah satu dari empat (4) cara:

PILIHAN 1

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

PILIHAN 2

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

OPSI 3

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

OPSI 4

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

Cobalah !!!

RolandoMySQLDBA
sumber
Kalau-kalau ada orang lain yang kesulitan dengan ini, -Ddb2seharusnya tidak memiliki tanda hubung di depannya. Setidaknya, saya mendapat kesalahan sintaksis MySQL ketika saya memasukkannya.
gwg
Ini sepertinya tidak berhasil. Dump saya tidak memiliki database BUAT atau GUNAKAN, tetapi masih ada ALTER DATABASE ... CHARACTER SET ...di dalamnya yang melanggar impor saya. Sunting: Oracle pada dasarnya mengabaikan bug .
mpen
5

Saya penggemar berat dump, edit, dan masukkan. tetapi Anda tidak perlu membuka file teks (dump file) untuk mengubahnya (ini sangat berguna ketika panjangnya beberapa milion). jika Anda ingin membuang database MYDATABASE.

mysqldump MYDATABASE > mydump.sql

kemudian gunakan sed untuk mengganti nama database lama dengan yang baru seperti ini

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

maka Anda cukup membuat database baru dan mengimpornya lagi, dan itu akan membuat semua tabel dengan di databae baru MYNEWDATABASE '

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

Sunting: Seperti yang ditunjukkan oleh beberapa orang baik di bagian komentar, ini bisa berbahaya, jika beberapa data juga diubah oleh ini di atas, jadi, untuk menggabungkan cara untuk menghindari ini.

1) Grep untuk ini di dump, sebelum Anda mengubahnya, seperti ini.

cat mydump.sql | grep "MYDATABASE"

dan

2) kita dapat menambahkan beberapa `untuk membuatnya lebih aman seperti ini:

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

jika ada yang punya saran konkret, saya senang mengedit jawaban saya dalam 4 tahun ke depan.

Sverre
sumber
Saya pikir pertanyaannya adalah tentang mengembalikan database enitre tetapi dengan nama yang berbeda, tidak hanya menyalin satu tabel dalam DB yang ada.
Michael Green
3
bagian sed diperlukan
Steve Buzonas
10
Perintah ini adalah ide yang buruk dan saya akan memilih jika saya bisa. Jika Anda akan mengganti string, setidaknya cocokkan baris CREATE TABLE dan USE agar Anda tidak mengganti data lainnya.
bksunday
1
sebelum menjalankan perintah sed ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql) periksa semua kemunculan MYDATABASE dengan cat mydump.sql | grep "MYDATABASE"untuk memastikan hanya nama database yang diubah, data lain tetap tidak tersentuh.
Rafaf Tahsin
1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # sunting uap yang berpotensi lebih aman. dump database saya tidak mengandung pernyataan USE atau CREATE DATABASE, tetapi nama db ada di dalam sql comments, views and triggers (MySQL 5.7) Ini TIDAK menggantikan nama database dalam komentar, tetapi mereka tidak berpengaruh pada database yang dihasilkan. Ini bekerja dengan baik untuk saya.
Jonathan
3

Saya telah melakukan ini sekali, dulu sekali.

Ketika Anda mengekspor semua data Anda, ada opsi untuk mengatur nama database di awal file, sesuatu seperti: "menggunakan database x"

Jadi, Anda dapat mengubah deklarasi ini.

Pemenang
sumber
3

Jika file adalah apa yang Anda miliki di tangan dan Anda memanipulasi dari shell / console, saya akan menggunakan seduntuk melakukan penggantian string pada baris yang dimulai dengan CREATE DABATASE, CREATE TABLE, USEdan optionnally --(mysqldump komentar)

Mengganti nama db pada baris yang cocok dengan Buat Database, Buat Tabel, Gunakan dan mysqldump komentar

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


Tentu saja seperti banyak jawaban di sini yang disebutkan, lebih mudah jika cadangan mysqldump tidak mengandung CREATE DATABASE dan baris PENGGUNAAN. Berarti opsi --all-databases, --databasesatau versi singkatnya -Aatau -Btidak digunakan.

bksunday
sumber
Di MySQL 5.7, mysqldump menyertakan nama basis data dalam pemicu dan tampilan, bahkan dengan --no-create-dbdan tanpa --databaseatau --databases.
Jonathan
2

Jika Anda melakukan dump menggunakan dua aturan berikut:

  1. Jangan menggunakan pilihan seperti --databases, --database, dan hanya hanya menempatkan nama database pada akhir perintah tanpa opsi ini.
  2. Sertakan opsi --no-create-db

Jika Anda melakukan hal berikut ini maka mysqldump akan membuat SQL tanpa mereferensikan database, maka Anda dapat menggunakan nama database baru di akhir perintah mysql Anda selama impor!

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
Neo
sumber
Di MySQL 5.7, mysqldump menyertakan nama basis data dalam pemicu dan tampilan, bahkan dengan --no-create-dbdan tanpa --databaseatau --databases.
Jonathan
1

Berikut ini adalah skrip shell yang memungkinkan Anda untuk menambahkan suffix / affix ke semua nama skema dengan cepat.

http://snippets.dzone.com/posts/show/13749

shantanuo
sumber
Tautan kode yang tersedia sudah mati.
Michael Minter