Ekspor dan Impor semua database MySQL sekaligus

354

Saya ingin menyimpan cadangan semua database MySQL saya. Saya memiliki lebih dari 100 database MySQL. Saya ingin mengekspor semuanya sekaligus dan mengimpor semuanya ke server MySQL saya sekaligus. Bagaimana saya bisa melakukan itu?

Pengguna baru
sumber

Jawaban:

776

Ekspor:

mysqldump -u root -p --all-databases > alldb.sql

Cari dokumentasi untuk mysqldump . Anda mungkin ingin menggunakan beberapa opsi yang disebutkan dalam komentar:

mysqldump -u root -p --opt --all-databases > alldb.sql
mysqldump -u root -p --all-databases --skip-lock-tables > alldb.sql

Impor:

mysql -u root -p < alldb.sql
Shakti Singh
sumber
1
mysqldump -uroot -p --opt --all-databases> alldb.sql
a coder
7
mysqldump -uroot -p --all-databases --skip-lock-tables> alldb.sql
temple
12
Tambahkan opsi --verbose atau -v untuk melihat bagaimana dump berkembang.
bagonyi
4
@ HalilÖzgür dari halaman manual mysqldump: "mysqldump tidak membuang database INFORMATION_SCHEMA atau performance_schema secara default. Untuk membuang salah satu dari ini, beri nama secara eksplisit pada baris perintah dan juga gunakan opsi --skip-lock-tables."
mmalone
2
PERINGATAN , impor akan menimpa semua pengguna MySQL yang ada.
RousseauAlexandre
218

Solusi lain:

Ini mencadangkan setiap database menjadi file yang berbeda

#!/bin/bash

USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"

#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1

databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`

for db in $databases; do
    if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
        echo "Dumping database: $db"
        mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
       # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
    fi
done
jruzafa
sumber
3
Saya lebih suka pendekatan ini, karena ini membuat semua dump database sebagai file yang berbeda.
Arda
10
Anda dapat sedikit menyederhanakan / meningkatkan skrip: Ganti baris ke-9 [database = ...] dengan dua baris ini: ExcludeDatabases="Database|information_schema|performance_schema|mysql"[baris berikutnya] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`dan hapus baris ifdan fisepenuhnya. Dalam variabel ExcludeDatabasesAnda menyimpan nama-nama database yang tidak boleh dibuang [biasanya database sistem].
Peter VARGA
2
@ jruzafa Anda dapat menggunakan -Bse "show databases"untuk menghindari output format ekstra dan dengan demikian Anda dapat menghapus | tr -d "| " | grep -v Database. Dalam skrip ekspor saya, baris inidatabases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
miquel
6
Membuat skrip (impor) terbalik: gist.github.com/tenold/aa5e107d93c0f54436cb
Corey
1
PERINGATAN: Komentar yang sangat berguna oleh @AlBundy di atas berisi urutan karakter unicode U+200C U+200Bantara "c" dan "h" dari kata "skema" . Ini merusak salinan dan menempelkan bit itu. Diskusi lebih lanjut tentang masalah ini di sini: meta.stackexchange.com/questions/170970/...
billynoah
29

Semua jawaban yang saya lihat pada pertanyaan ini dapat memiliki masalah dengan set karakter di beberapa database karena masalah pengalihan keluar mysqldumpke file dalam operator shell >.

Untuk mengatasi masalah ini Anda harus melakukan backup dengan perintah seperti ini

mysqldump -u root -p --opt --all-databases -r backup.sql

Untuk melakukan yang baik BD mengembalikan tanpa masalah dengan rangkaian karakter. Jelas Anda dapat mengubah set karakter default yang Anda butuhkan.

mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;
NetVicious
sumber
Apa yang dilakukan -r?
Luca Reghellin
3
-r mengatur nama file tujuan di mana output akan ditulis.
NetVicious
Apakah lebih baik menggunakan utf8mb4 daripada utf8 untuk set karakter?
kojow7
1
Itu tergantung dari apa yang Anda simpan di tabel Anda. set karakter utf8 memiliki maksimal 3 byte untuk setiap karakter. utf8mb4 memiliki maksimal 4 byte untuk setiap karakter. Tentunya jika database Anda menggunakan utf8mb4 Anda harus menggunakan set karakter itu untuk mengembalikannya.
NetVicious
9

Berdasarkan jawaban-jawaban ini, saya telah membuat skrip yang mencadangkan semua basis data ke file terpisah, tetapi kemudian mengompresnya menjadi satu arsip dengan tanggal sebagai nama.

Ini tidak akan meminta kata sandi, dapat digunakan dalam cron. Untuk menyimpan kata sandi dalam .my.cnfmemeriksa jawaban ini https://serverfault.com/a/143587/62749

Dibuat juga dengan komentar untuk mereka yang tidak terlalu terbiasa dengan skrip bash.

#!/bin/bash

# This script will backup all mysql databases into 
# compressed file named after date, ie: /var/backup/mysql/2016-07-13.tar.bz2

# Setup variables used later

# Create date suffix with "F"ull date format
suffix=$(date +%F)
# Retrieve all database names except information schemas. Use sudo here to skip root password.
dbs=$(sudo mysql --defaults-extra-file=/root/.my.cnf --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema")
# Create temporary directory with "-d" option
tmp=$(mktemp -d)
# Set output dir here. /var/backups/ is used by system, 
# so intentionally used /var/backup/ for user backups.
outDir="/var/backup/mysql"
# Create output file name
out="$outDir/$suffix.tar.bz2"

# Actual script

# Check if output directory exists
if [ ! -d "$outDir" ];then
  # Create directory with parent ("-p" option) directories
  sudo mkdir -p "$outDir"
fi

# Loop through all databases
for db in $dbs; do
  # Dump database to temporary directory with file name same as database name + sql suffix
  sudo mysqldump --defaults-extra-file=/root/.my.cnf --databases "$db" > "$tmp/$db.sql"
done

# Go to tmp dir
cd $tmp

# Compress all dumps with bz2, discard any output to /dev/null
sudo tar -jcf "$out" * > "/dev/null"

# Cleanup
cd "/tmp/"
sudo rm -rf "$tmp"
PeterM
sumber
1
Baguslah bahwa Anda kembali untuk menyumbangkan tambahan Anda. suara dari saya
Fr0zenFyr
7

Mengapa parsing output terformat sementara perintah mysql dapat melakukan secara langsung apa yang Anda inginkan?

databases=`mysql -u $USER -p$PASSWORD --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema"`

Daftar nama-nama basis data dan hanya ini.

msn
sumber
3

Hati-hati saat mengekspor dari dan mengimpor ke versi MySQL yang berbeda karena tabel mysql mungkin memiliki kolom yang berbeda. Berikan hak istimewa mungkin gagal bekerja jika Anda kurang beruntung. Saya membuat skrip ini (mysql_export_grants.sql) untuk membuang hibah untuk mengimpor ke database baru, untuk berjaga-jaga:

#!/bin/sh
stty -echo
printf 'Password: ' >&2
read PASSWORD
stty echo
printf "\n"
if [ -z "$PASSWORD" ]; then
        echo 'No password given!'
        exit 1
fi
MYSQL_CONN="-uroot -p$PASSWORD"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g'
Kesalahan server dari dalam
sumber
3

Ketika Anda membuang semua basis data. Jelas itu memiliki data yang besar. Jadi, Anda dapat memilih di bawah ini untuk yang lebih baik:

Membuat Cadangan:

mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz

Jika kesalahan

- Peringatan: Melewati data tabel mysql.event. Tentukan opsi --events secara eksplisit.

Menggunakan:

mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz

Memulihkan Cadangan:

gunzip < alldb.sql.gz | mysql -u [user] -p[password]

Semoga ini akan membantu :)

ashikpatel
sumber
3

Saya menulis komentar ini sudah lebih dari 4 tahun yang lalu dan memutuskan sekarang untuk memberikan jawaban.

The Script dari jruzafa dapat sedikit disederhanakan:

#!/bin/bash

USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"

#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1

ExcludeDatabases="Database|information_schema|performance_schema|mysql"
databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`

for db in $databases; do
    echo "Dumping database: $db"
    mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
    # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
done

catatan:

  1. Database yang dikecualikan - biasanya tabel sistem - disediakan dalam variabel ExcludeDatabases
  2. Perlu diketahui bahwa kata sandi disediakan di baris perintah. Ini dianggap tidak aman. Pelajari pertanyaan ini .
Peter VARGA
sumber
0

mysqldump -uroot -proot --all-database> allDB.sql

catatan: -u "nama pengguna Anda" -p "kata sandi Anda"

Majutharan Majutharan
sumber
Jawaban Anda tidak benar-benar menyelesaikan masalah, karena ia meminta untuk mengekspor semua database sekaligus. Mungkin Anda bisa meningkatkan sedikit: mysqldump -uroot -proot --all-databases> allDB.sql catatan: -u "nama pengguna Anda" -p "kata sandi Anda"
Marwan Salim
0

Ekspor semua basis data di Ubuntu

1 - mysqldump -u root -p --databases database1 database2 > ~/Desktop/databases_1_2.sql

ATAU

2 - mysqldump -u root -p --all_databases > ~/Desktop/all_databases.sql

masukkan deskripsi gambar di sini

Indal Raj
sumber