Tüm MySQL Veritabanını Çoğaltın


92

MySQL veritabanının tamamını bir linux sunucusunda çoğaltmak mümkün müdür?

Dışa aktarma ve içe aktarımı kullanabileceğimi biliyorum, ancak orijinal veritabanı 25MB'nin üzerinde, bu yüzden bu ideal değil.

Mysqldump kullanarak veya veritabanı dosyalarını doğrudan çoğaltarak mümkün müdür?

Yanıtlar:


177

İlk olarak yinelenen veritabanını oluşturun:

CREATE DATABASE duplicateddb;

Kullanıcı ve izinlerin tamamının yerinde olduğundan emin olun ve:

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 

29
2. komut satırınızın 2. bölümünde "-p" ve "şifre" arasında bir boşluk olması gerektiğini düşünmüyorum

16
boşluk orada olmamalı! Cevap şu şekilde doğrudur. Mysql man sayfası şunu söyledi: --password [= parola], -p [parola] Sunucuya bağlanırken kullanılacak parola. Kısa seçenek formunu (-p) kullanırsanız, seçenek ve şifre arasında boşluk bırakamazsınız. Komut satırında --password veya -p seçeneğinden sonra parola değerini atlarsanız, mysql bir tane ister. Komut satırında bir parola belirtmenin güvensiz olduğu düşünülmelidir. Bkz. Bölüm 6.1.2.1, "P ... için Son Kullanıcı Yönergeleri
nils petersohn

2
Mysqldump'ın varsayılan olarak tetikleyicileri yedeklediğini, ancak saklı yordamları yedeklemediğini, --routinesbu durum için bir seçenek olarak eklendiğini unutmayın .
LinuxDevOps

1
Bunu bu şekilde yapıyorsanız ve bu kullanıcının MySQL şifresinin bash geçmişinde bulunmasını istemiyorsanız, ~/.bash_historyçalıştırdıktan sonra dosyanızdan düzenleyin . Ya da ilk komutun sonucunu geçici bir dosyaya yazdırabilir ve ardından aşağıdakini çalıştırabilirsiniz (bu size şifreyi soracaktır) mysql -p -u admin duplicatedb < temporaryfile.sql.
Mike

1
Bu cevap kesinlikle işe yarıyor, ancak soru "Dışa aktarımı ve ithalatı kullanabileceğimi biliyorum, ancak orijinal veri tabanı> 25MB, bu yüzden ideal değil" ve bu cevabın önerdiği şey temelde ihracat ve ithalat.
el.pescado


5

Bazen bir mysqldump yapıyorum ve çıktıyı farklı bir veritabanına aktarmak için başka bir mysql komutuna aktarıyorum.

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup

Bunu kullandığımda dest veritabanının bulunmadığına dair bir hata alıyorum. Yani, CREATE DATABASE satırına da ihtiyacınız var.
blak3r

3

Sistemde verilere sahip bir mysqldump dosyası oluşturun ve bu mysqldump dosyasını yeni sisteme bir girdi olarak vermek için boruyu kullanın. Yeni sistem ssh komutu kullanılarak bağlanabilir.

mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name

-p [şifre] arasında boşluk yok


1
Borunun kullanımı gibi bunun nasıl çalıştığına dair bir açıklama ekleyebilir misiniz?
kalyfe

1

İşte Vincent ve Pauls'un önerilerini birleştiren yazdığım bir windows bat dosyası. Kullanıcıdan kaynak ve hedef adları ister.

Çalıştırılabilir dosyalarınıza / veritabanı bağlantı noktalarınıza uygun yolları ayarlamak için üstteki değişkenleri değiştirin.

:: Creates a copy of a database with a different name.
:: User is prompted for Src and destination name.
:: Fair Warning: passwords are passed in on the cmd line, modify the script with -p instead if security is an issue.
:: Uncomment the rem'd out lines if you want script to prompt for database username, password, etc.

:: See also: http://stackoverflow.com/questions/1887964/duplicate-entire-mysql-database

@set MYSQL_HOME="C:\sugarcrm\mysql\bin"
@set mysqldump_exec=%MYSQL_HOME%\mysqldump
@set mysql_exec=%MYSQL_HOME%\mysql
@set SRC_PORT=3306
@set DEST_PORT=3306
@set USERNAME=TODO_USERNAME
@set PASSWORD=TODO_PASSWORD

:: COMMENT any of the 4 lines below if you don't want to be prompted for these each time and use defaults above.
@SET /p USERNAME=Enter database username: 
@SET /p PASSWORD=Enter database password: 
@SET /p SRC_PORT=Enter SRC database port (usually 3306): 
@SET /p DEST_PORT=Enter DEST database port: 

%MYSQL_HOME%\mysql --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="show databases;"
@IF NOT "%ERRORLEVEL%" == "0" GOTO ExitScript

@SET /p SRC_DB=What is the name of the SRC Database:  
@SET /p DEST_DB=What is the name for the destination database (that will be created):  

%mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="create database %DEST_DB%;"
%mysqldump_exec% --add-drop-table --user=%USERNAME% --password=%PASSWORD% --port=%SRC_PORT% %SRC_DB% | %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% %DEST_DB%
@echo SUCCESSFUL!!!
@GOTO ExitSuccess

:ExitScript
@echo "Failed to copy database"
:ExitSuccess

Örnek çıktı:

C:\sugarcrm_backups\SCRIPTS>copy_db.bat
Enter database username: root
Enter database password: MyPassword
Enter SRC database port (usually 3306): 3308
Enter DEST database port: 3308

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sugarcrm_550_pro   |
| sugarcrm_550_ce    |
| sugarcrm_640_pro   |
| sugarcrm_640_ce    |
+--------------------+
What is the name of the SRC Database:  sugarcrm
What is the name for the destination database (that will be created):  sugarcrm_640_ce

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="create database sugarcrm_640_ce;"

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysqldump --add-drop-table --user=root --password=MyPassword --port=3308 sugarcrm   | "C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 sugarcrm_640_ce
SUCCESSFUL!!!

1

Bu InnoDB için işe yaramaz. Bu geçici çözümü yalnızca MyISAM veritabanlarını kopyalamaya çalışıyorsanız kullanın.

Yedekleme sırasında tabloların kilitlenmesi ve muhtemelen veritabanı içe aktarımı sırasında MySQL'in duraklatılması kabul edilebilirse, mysqlhotcopy daha hızlı çalışabilir.

Örneğin

Destek olmak:

# mysqlhotcopy -u root -p password db_name /path/to/backup/directory

Onarmak:

cp /path/to/backup/directory/* /var/lib/mysql/db_name

mysqlhotcopy , dosyaları SSH (scp) üzerinden ve muhtemelen doğrudan yinelenen veritabanı dizinine aktarabilir.

Örneğin

# mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name

1

Bir Veritabanının Kopyasını Yapmak

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

0

Bu, OUTSIDE mysql kabuğundan komut istemi ile benim için çalıştı:

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

Bu benim için en iyi yolu arıyor. "Dump.sql" sıkıştırılırsa, onu sıkıştırılmış bir yedek olarak saklayabilirsiniz. Güzel! Innodb tabloları içeren 1 GB'lık bir veritabanı için, "dump.sql" oluşturmak için yaklaşık bir dakika ve verileri yeni DB db2'ye dökmek için yaklaşık üç dakika.

Delik db dizinini (mysql / data / db1) doğrudan kopyalamak benim için işe yaramadı, sanırım InnoDB tabloları yüzünden.


-2

MySQL'de bir zamanlar tüm tablo dosyalarını mysql ağacındaki başka bir dizine kopyalayabilirsiniz.

mysql cli - veritabanı db2 oluştur

linux cli - cp db1 db2


Bu sadece MyISAM ile çalışır, değil mi? Güzel, o eski kötü günler geride kaldı.
Laurenz Albe

Tarih kitapları için iyi ama artık pek kullanışlı değil.
JJJ
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.