Tüm MySQL veritabanlarını tek seferde dışa ve içe aktarma


354

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:


777

İhracat:

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

İthalat:

mysql -u root -p < alldb.sql

1
mysqldump -uroot -p --opt --all-databases> alldb.sql
bir kodlayıcı

7
mysqldump -uroot -p --all-databases --kip-lock-tables> alldb.sql
tapınak

12
Dökümün nasıl ilerlediğini görmek için --verbose veya -v seçenekleri ekleyin.
bagonyi

4
@ HalilÖzgür mysqldump man sayfasından: "mysqldump varsayılan olarak BİLGİ_SCHEMA veya performans_semaları veritabanını dökmez. Bunlardan herhangi birini dökmek için, komut satırında açıkça adlandırın ve --skip-lock-tables seçeneğini kullanın."
mmalone

2
UYARI , içe aktarma işlemi mevcut tüm MySQL kullanıcınızın üzerine yazacaktır.
RousseauAlexandre

219

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

3
Bu yaklaşımı tercih ederim, çünkü bu tüm veritabanlarının dökümünü farklı bir dosya olarak yapar.
Arda

10
Betiği basitleştirebilir / geliştirebilirsiniz: 9. satırı [databases = ...] şu iki satırla değiştirin: ExcludeDatabases="Database|information_schema|performance_schema|mysql"[sonraki satır] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`ve ifve fisatı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ı].
Peter VARGA

2
@jruzafa -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;"
betiğimde

6
Ters (içe aktarma) komut dosyası oluşturdu: gist.github.com/tenold/aa5e107d93c0f54436cb
Corey

1
UYARI: Yukarıdaki @AlBundy'nin çok yararlı yorumu, "şema" kelimesinin " c" ve "h"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/…
billynoah

29

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;

-R ne yapar?
Luca Reghellin

3
-r çıktının üzerine yazılacağı hedef dosyanın adını belirler.
NetVicious

Karakter kümesi için utf8 yerine utf8mb4 kullanmak daha iyi olur mu?
kojow7

1
Tablolarınızda neleri sakladığınıza bağlıdır. utf8 karakter kümesi her karakter için maksimum 3 bayta sahiptir. utf8mb4 her karakter için maksimum 4 bayta sahiptir. Açıkçası veritabanınız utf8mb4 üzerindeyse, geri yüklemek için bu karakter kümesini kullanmalısınız.
NetVicious

9

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.cnfbu 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"

1
Eklemelerinize katkıda bulunmak için geri gelmeniz iyi oldu. benden bir oy
Fr0zenFyr

7

Neden mysql komutu doğrudan istediğinizi yapabilirken biçimlendirilmiş çıktıyı ayrıştırma?

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

Veritabanı adlarını ve yalnızca bunu listeler.


3

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'

3

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


3

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:

  1. Dışlanan veritabanları - yaygın olarak sistem tabloları - değişkente sağlanır ExcludeDatabases
  2. Parolanın komut satırında sağlandığını lütfen unutmayın. Bu güvensiz olarak kabul edilir. Bu soruyu inceleyin .

0

mysqldump -uroot -proot --tüm veritabanları> allDB.sql

not: -u "kullanıcı adınız" -p "şifreniz"


Cevabınız sorunu gerçekten çözmüyor, çünkü tüm veritabanlarını bir kerede dışa aktarmak istiyor. Belki biraz geliştirebilirsiniz: mysqldump -uroot -proot --all-databases> allDB.sql not: -u "kullanıcı adınız" -p "şifreniz"
Marwan Salim

0

Ubuntu'daki tüm veritabanlarını dışa aktar

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

VEYA

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

resim açıklamasını buraya girin

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.