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?
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?
Jawaban:
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
mysql -u root -p < alldb.sql
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
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 if
dan fi
sepenuhnya. Dalam variabel ExcludeDatabases
Anda menyimpan nama-nama database yang tidak boleh dibuang [biasanya database sistem].
-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;"
U+200C U+200B
antara "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/...
Semua jawaban yang saya lihat pada pertanyaan ini dapat memiliki masalah dengan set karakter di beberapa database karena masalah pengalihan keluar mysqldump
ke 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;
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.cnf
memeriksa 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"
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.
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'
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 :)
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:
ExcludeDatabases
mysqldump -uroot -proot --all-database> allDB.sql
catatan: -u "nama pengguna Anda" -p "kata sandi Anda"