Farklı adla mysql veritabanını geri yükle


41

Mysql veritabanını mysqldump dosyasından farklı adlarla nasıl geri yükleyebiliriz. Dökümü dosyasını açmak ve düzenlemek istemiyorum. Başka daha iyi yöntemler var mı?

Yanıtlar:


58

Mysqldump öğesinin veritabanını oluşturmayacağı veya seçmeyeceği şekilde dökümü oluşturmasına izin verebilirsiniz.

ÖRNEK: db1 veritabanını atıyor ve db2 veritabanına yüklüyorsunuz

Bu, CREATE DATABASE ve USE komutlarını çöplüğe koyuyor

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

Bu olmaz (CREATE DATABASE ve çöplükte KULLANIM komutları koymak istediğini budur )

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

Dört (4) yoldan biriyle başka bir veritabanına (db2 gibi) yükleyebilirsiniz:

SEÇENEK 1

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

SEÇENEK 2

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

SEÇENEK 3

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

SEÇENEK 4

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

Bir şans ver !!!


Bununla başkası mücadele -Ddb2etmişse, önünde bir tire olmamalıdır. En azından, eklediğimde bir MySQL sözdizimi hatası aldım.
gwg

Bu işe yaramadı. Dökümü, bir CREATE veya USE veritabanına sahip değil, ancak yine de ALTER DATABASE ... CHARACTER SET ...içeri aktarımı engelleyen bir içeriğe sahip . Düzenleme: Oracle temelde hatayı görmezden geliyor .
18'de

5

Ben büyük bir çöplük hayranıyım, kurgula ve yerleştir. ancak bunu değiştirmek için metin dosyasını (döküm dosyası) açmak zorunda değilsiniz (bu birkaç milyon satır uzunluğunda olduğunda özellikle yararlıdır). veritabanını boşaltmak istiyorsanız MYDATABASE.

mysqldump MYDATABASE > mydump.sql

sonra eski veritabanının adını bunun gibi yenisiyle değiştirmek için sed komutunu kullanın.

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

o zaman basitçe yeni veritabanını oluşturabilir ve tekrar içe aktarabilir ve tüm veri tablolarını MYNEWDATABASE içindeki yeni veri tablolarında yaratacaktır.

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

Düzenleme: Yorumlar bölümündeki bazı hoş insanlar, işaret ettikleri gibi, bazı veriler yukarıdakilerle de değiştirildiyse, bu tehlikeli olabilir;

1) Çöpte bunun için Grep'i, değiştirmeden önce, böyle yapın.

cat mydump.sql | grep "MYDATABASE"

ve

2) bazılarını bu şekilde daha güvenli hale getirmek için ekleyebiliriz:

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

Başka birinin somut önerileri varsa, cevabımı başka bir 4 yılda düzenlemekten memnuniyet duyarım.


Ben soru enitre veritabanını geri yükleme hakkında ama farklı bir adla ilgili olduğunu düşünüyorum, sadece varolan bir DB içindeki bir tablo kopyalamak değil.
Michael Green,

3
sed kısım gerekli
Steve Buzonas

10
Bu emir kötü bir fikirdir ve yapabilseydim oyu düşürürdüm. Dize değişimi yapacaksanız, en azından CREATE TABLE ve USE satırlarını eşleştirin, böylece başka bir veriyi değiştirmeyin.
bksunday,

1
sed komutunu ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql) çalıştırmadan önce, cat mydump.sql | grep "MYDATABASE"yalnızca veritabanı adının değiştirildiğinden emin olmak için MYDATABASE'in tüm oluşumlarını kontrol edin , diğer veriler dokunulmadan kalır.
Rafaf Tahsin

1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # potansiyel olarak daha güvenli buhar düzenleme. veritabanı dökümü, USE veya CREATE DATABASE deyimlerini içermiyor, ancak db adı sql yorumlarında, görünümlerinde ve tetikleyicilerinde bulunuyor (MySQL 5.7). Bu, yorumlarda veritabanı adını değiştirmez, ancak sonuçta ortaya çıkan veritabanı üzerinde etkisi yoktur. Bu benim için iyi çalıştı.
Jonathan

3

Bunu uzun zaman önce bir kere yaptım.

Tüm verilerinizi dışa aktardığınızda, veritabanının adını dosyanın başında ayarlama seçeneği vardır: "use database x"

Yani, bu bildirimi değiştirebilirsiniz.


3

Elinizde ne varsa dosyasıdır ve bir kabuk / konsoldan manipüle ediyorlar, ben kullanırım sedile başlayan hatları üzerinde dize değiştirmeler yapmak CREATE DABATASE, CREATE TABLE, USEve optionnally --(Mysqldump yorum)

Db adını, Veritabanı Oluştur, Tablo Oluştur, Kullan ve mysqldump açıklamalarıyla eşleşen satırlara yerleştirme

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


Elbette buradaki cevapların çoğunda olduğu gibi, mysqldump yedeklemesinin bir CREATE DATABASE ve bir USE satırı içermemesi daha kolay. Seçeneklerin --all-databases, --databaseskısa sürümlerin -Aveya -Bkullanılmadığı anlamına gelir.


MySQL 5.7'de, mysqldump, hatta --no-create-dbolsun --databaseya da olmasın , tetikleyici ve görünümlerde veritabanı adını içerir --databases.
Jonathan,

2

Aşağıdaki iki kuralı kullanarak bir dökümü yaparsanız:

  1. --databases, Gibi seçenekleri kullanmayın --databaseve sadece bu seçenek olmadan komutun sonuna veritabanı adını koymanız yeterlidir.
  2. Seçeneği dahil et --no-create-db

Aşağıdakileri yaparsanız, mysqldump veritabanına başvurmadan SQL'i yaratacaktır, daha sonra içe aktarma sırasında mysql komutunuzun sonunda yeni veritabanı adını kullanabilirsiniz!

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'de, mysqldump, hatta --no-create-dbolsun --databaseya da olmasın , tetikleyici ve görünümlerde veritabanı adını içerir --databases.
Jonathan,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.