Gandakan Seluruh Database MySQL

92

Apakah mungkin untuk menduplikasi seluruh database MySQL di server linux?

Saya tahu saya dapat menggunakan ekspor dan impor tetapi database aslinya> 25MB jadi itu tidak ideal.

Apakah mungkin menggunakan mysqldump atau dengan langsung menggandakan file database?

Adam Dempsey
sumber

Jawaban:

177

Pertama buat database duplikat:

CREATE DATABASE duplicateddb;

Pastikan semua pengguna dan izin ada dan:

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 
Vincent Ramdhanie
sumber
29
Saya rasa tidak boleh ada spasi antara "-p" dan "password" di bagian kedua dari baris perintah ke-2 Anda
16
tidak ada ruang yang seharusnya tidak ada! Jawabannya benar seperti ini. Halaman manual mysql mengatakan: --password [= password], -p [password] Kata sandi yang akan digunakan saat menghubungkan ke server. Jika Anda menggunakan formulir opsi pendek (-p), Anda tidak boleh memiliki spasi antara opsi dan kata sandi. Jika Anda menghilangkan nilai kata sandi setelah opsi --password atau -p pada baris perintah, mysql akan meminta satu. Menentukan kata sandi pada baris perintah harus dianggap tidak aman. Lihat Bagian 6.1.2.1, "Pedoman Pengguna Akhir untuk P ...
nils petersohn
2
Perhatikan bahwa mysqldump mencadangkan secara default pemicu tetapi bukan prosedur yang tersimpan, tambahkan --routinessebagai opsi untuk kasus ini.
LinuxDevOps
1
Jika Anda melakukannya seperti ini dan Anda tidak ingin kata sandi MySQL pengguna ini tersedia di riwayat bash, edit dari ~/.bash_historyfile Anda setelah menjalankannya. Atau Anda juga dapat menampilkan hasil dari perintah pertama ke file sementara dan menjalankan perintah berikut setelahnya (yang akan meminta Anda dengan kata sandi) mysql -p -u admin duplicatedb < temporaryfile.sql.
Mike
1
Jawaban ini pasti berfungsi, tetapi pertanyaannya menyatakan "Saya tahu saya dapat menggunakan ekspor dan impor tetapi database aslinya> 25MB jadi itu tidak ideal" dan jawaban ini menyarankan pada dasarnya adalah ekspor dan impor.
el.pescado
17

Ke server jauh

mysqldump mydbname | ssh host2 "mysql mydbcopy"

Ke server lokal

mysqldump mydbname | mysql mydbcopy
Peter Lindqvist
sumber
ERROR 1064 (42000): Anda memiliki kesalahan dalam sintaks SQL Anda ;, hai menunjukkan kesalahan saat menggunakan perintah di server lokal, tolong bantu
amit_game
5

Saya terkadang melakukan mysqldump dan menyalurkan output ke perintah mysql lain untuk mengimpornya ke database yang berbeda.

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup
Paul Tomblin
sumber
Saya mendapatkan pesan kesalahan bahwa database tujuan tidak ada saat saya menggunakan ini. Jadi, Anda juga membutuhkan baris BUAT DATABASE.
blak3r
3

Buat file mysqldump di sistem yang memiliki data dan gunakan pipa untuk memberikan file mysqldump ini sebagai input ke sistem baru. Sistem baru dapat dihubungkan menggunakan perintah ssh.

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

tidak ada spasi di antara -p [sandi]

TheNormalGuy
sumber
1
Bisakah Anda menambahkan penjelasan tentang cara kerjanya, misalnya penggunaan pipa?
kalyfe
1

Berikut file windows bat yang saya tulis yang menggabungkan saran Vincent dan Pauls. Ini meminta pengguna untuk nama sumber dan tujuan.

Cukup ubah variabel di bagian atas untuk menyetel jalur yang tepat ke port executable / database Anda.

:: 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

Output sampel:

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!!!
blak3r
sumber
1

Ini tidak akan berfungsi untuk InnoDB. Gunakan solusi ini hanya jika Anda mencoba menyalin database MyISAM.

Jika mengunci tabel selama pencadangan, dan, mungkin, menghentikan sementara MySQL selama pengimporan basis data dapat diterima, mysqlhotcopy dapat bekerja lebih cepat.

Misalnya

Cadangan:

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

Mengembalikan:

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

mysqlhotcopy juga dapat mentransfer file melalui SSH (scp), dan, mungkin, langsung ke direktori database duplikat.

Misalnya

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

Membuat Salinan Database

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

Ini berfungsi untuk saya dengan command prompt, dari OUTSIDE mysql shell:

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

Bagiku ini adalah cara terbaik. Jika membuat zip "dump.sql" Anda dapat menyimpannya secara simpel sebagai cadangan terkompresi. Keren! Untuk database 1GB dengan tabel Innodb, sekitar satu menit untuk membuat "dump.sql", dan sekitar tiga menit untuk membuang data ke DB db2 baru.

Langsung menyalin direktori hole db (mysql / data / db1) tidak berfungsi untuk saya, saya kira karena tabel InnoDB.

Dengung
sumber
-2

Sekali waktu di MySQL Anda bisa menyalin semua file tabel ke direktori lain di pohon mysql

mysql cli - buat database db2

linux cli - cp db1 db2

DM
sumber
Itu hanya berfungsi dengan MyISAM, bukan? Baik hari-hari tua yang buruk itu hilang.
Laurenz Meskipun
Bagus untuk buku sejarah, tapi tidak terlalu berguna lagi.
JJJ