Tüm MySQL veritabanlarının bir yedeğini tutmak istiyorum. 100'den fazla MySQL veritabanım var. Hepsini aynı anda dışa aktarmak ve hepsini aynı anda MySQL sunucuma aktarmak istiyorum. Bunu nasıl yapabilirim?
Tüm MySQL veritabanlarının bir yedeğini tutmak istiyorum. 100'den fazla MySQL veritabanım var. Hepsini aynı anda dışa aktarmak ve hepsini aynı anda MySQL sunucuma aktarmak istiyorum. Bunu nasıl yapabilirim?
Yanıtlar:
mysqldump -u root -p --all-databases > alldb.sql
MySQL için belgelere bakın . Yorumlarda belirtilen seçeneklerden bazılarını kullanmak isteyebilirsiniz:
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
Diğer çözüm:
Her veritabanını farklı bir dosyaya yedekler
#!/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"
[sonraki satır] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`
ve if
ve fi
satırlarını tamamen kaldırın . Değişkende ExcludeDatabases
, dökülmemesi gereken veritabanlarının adlarını saklarsınız [normalde sistem veritabanları].
-Bse "show databases"
Ek biçimlendirme çıktısını önlemek için kullanabilirsiniz ve böylece kaldırabilirsiniz | tr -d "| " | grep -v Database
. Benim ihracat databases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
U+200C U+200B
arasındaki unicode karakter dizisini içerir . Bu, bu biti kopyalayıp yapıştırarak keser. Bu konu hakkında daha fazla tartışma burada: meta.stackexchange.com/questions/170970/…
Bu soruda gördüğüm tüm yanıtlar , kabuk işlecindeki bir dosyaya çıkışın yeniden yönlendirilmesi sorunu nedeniyle bazı veritabanlarındaki karakter kümelerinde sorun yaşayabilir .mysqldump
>
Bu sorunu çözmek için yedeklemeyi böyle bir komutla yapmalısınız
mysqldump -u root -p --opt --all-databases -r backup.sql
İyi bir BD geri yükleme yapmak için karakter kümeleri ile sorunsuz. Açıkçası varsayılan karakter setini istediğiniz gibi değiştirebilirsiniz.
mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;
Bu yanıtlara dayanarak, tüm veritabanlarını ayrı dosyalara yedekleyen bir komut dosyası hazırladım, ancak bunları ad olarak tarih içeren bir arşive sıkıştırdım.
Bu şifre istemeyecek, cron'da kullanılabilir. Şifreyi saklamak için .my.cnf
bu cevabı kontrol edin https://serverfault.com/a/143587/62749
Ayrıca bash senaryolarına çok aşina olmayanlar için yorumlarla yapılmıştır.
#!/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"
MySQL tabloları farklı sütunlara sahip olabileceğinden, farklı MySQL sürümlerinden dışa ve içe aktarırken dikkatli olun. Eğer şansınız yoksa hibe ayrıcalıkları işe yaramayabilir. Bu senaryoyu (mysql_export_grants.sql), her ihtimale karşı yeni veritabanına aktarmak için hibeleri dökümü için oluşturdum:
#!/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'
Ne zaman tüm veritabanı damping. Açıkçası büyük veriye sahip. Böylece daha iyi için aşağıda tercih edebilirsiniz:
Yedek Oluşturma:
mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz
Hata varsa
- Uyarı: mysql.event tablosundaki verilerin atlanması. --Events seçeneğini açıkça belirtin.
kullanın:
mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz
Yedeği Geri Yükleme:
gunzip < alldb.sql.gz | mysql -u [user] -p[password]
Umarım yardımcı olur :)
Bu yorumu 4 yıldan fazla bir süre önce yazdım ve şimdi bir cevap vermeye karar verdim.
Komut gelen jruzafa biraz basitleştirilmiş olabilir:
#!/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
Not:
ExcludeDatabases
mysqldump -uroot -proot --tüm veritabanları> allDB.sql
not: -u "kullanıcı adınız" -p "şifreniz"