एक बार में सभी MySQL डेटाबेस को निर्यात और आयात करें


353

मैं अपने सभी MySQL डेटाबेस का बैकअप रखना चाहता हूं। मेरे पास 100 से अधिक MySQL डेटाबेस हैं। मैं एक ही समय में उन सभी को निर्यात करना चाहता हूं और एक बार में उन सभी को अपने MySQL सर्वर में आयात करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?

जवाबों:


774

निर्यात:

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

को फिर से देखें mysqldump के लिए दस्तावेज़ । आप टिप्पणियों में उल्लिखित कुछ विकल्पों का उपयोग करना चाह सकते हैं:

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

1
mysqldump -uroot -p --opt --all-database> alldb.sql
एक कोडर

7
mysqldump -uroot -p --all-database --skip-lock-tables> alldb.sql
मंदिर

12
Add --verbose या -v विकल्प देखें कि डंप कैसे आगे बढ़ रहा है।
बैगनी

4
@ Myqqldump मैन पेज से @ Halilldzgür: "mysqldump डिफ़ॉल्ट रूप से INFORMATION_SCHEMA या प्रदर्शन_schema डेटाबेस को डंप नहीं करता है। इन दोनों में से किसी को भी डंप करने के लिए, इसे कमांड लाइन पर स्पष्ट रूप से नाम दें और --skip- लॉक-टेबल विकल्प का भी उपयोग करें।"
mmalone

2
चेतावनी , आयात आपके सभी मौजूदा MySQL उपयोगकर्ता को अधिलेखित कर देगा।
रूसो

218

अन्य समाधान:

यह प्रत्येक डेटाबेस को एक अलग फाइल में बैकअप देता है

#!/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
मैं इस दृष्टिकोण को पसंद करूंगा, क्योंकि यह सभी डेटाबेस को अलग-अलग फ़ाइल के रूप में डंप करता है।
अरदा

10
आप स्क्रिप्ट को थोड़ा सरल कर सकते हैं / सुधार सकते हैं: इन दो पंक्तियों के साथ 9 वीं पंक्ति [डेटाबेस = ...] को प्रतिस्थापित करें: ExcludeDatabases="Database|information_schema|performance_schema|mysql"[अगली पंक्ति] और लाइनों को पूरी तरह से databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`हटा दें । चर में आप उन डेटाबेस के नाम संग्रहीत करते हैं जिन्हें डंप नहीं किया जाना चाहिए [सामान्य रूप से सिस्टम डेटाबेस]। iffiExcludeDatabases
पीटर वर्गा

2
@jruzafa आप -Bse "show databases"अतिरिक्त स्वरूपण आउटपुट से बचने के लिए उपयोग कर सकते हैं और इस प्रकार आप निकाल सकते हैं | tr -d "| " | grep -v Database। मेरी एक्सपोर्ट स्क्रिप्ट में यह लाइन हैdatabases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
mikel

6
रिवर्स (आयात) स्क्रिप्ट बनाई
कोरी

1
चेतावनी: ऊपर @AlBundy द्वारा बहुत उपयोगी टिप्पणी U+200C U+200Bमें "सी" और शब्द "योजना" के "एच" के बीच यूनिकोड वर्ण अनुक्रम है । यह उस बिट को कॉपी और पेस्ट करता है। इस मुद्दे पर अधिक चर्चा यहाँ: meta.stackexchange.com/questions/170970/…
billynoah

29

इस प्रश्न पर मेरे द्वारा देखे गए सभी उत्तर शेल संचालक के भीतर एक फ़ाइल से बाहर निकलने को पुनर्निर्देशित करने की समस्या के कारण कुछ डेटाबेस में वर्ण सेट के साथ समस्या हो सकती है ।mysqldump>

इस समस्या को हल करने के लिए आपको इस तरह से कमांड के साथ बैकअप करना चाहिए

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

चरित्र सेट के साथ किसी भी समस्या के बिना एक अच्छा बीडी बहाल करने के लिए । जाहिर है आप डिफ़ॉल्ट-चरित्र-सेट को बदल सकते हैं जैसे आपको ज़रूरत है।

mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;

क्या करता है -r?
लुका रीगलिन

3
-r डेस्टिनेशन फाइल का नाम सेट करता है, जहां आउटपुट राइट किया जाएगा।
NetVicious

चरित्र सेट के लिए utf8 के बजाय utf8mb4 का उपयोग करना बेहतर होगा?
kojow7

1
यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। utf8 वर्ण सेट में प्रत्येक वर्ण के लिए अधिकतम 3 बाइट्स हैं। utf8mb4 में प्रत्येक वर्ण के लिए अधिकतम 4 बाइट्स हैं। जाहिर है अगर आपका डेटाबेस utf8mb4 पर है, तो आपको इसे पुनर्स्थापित करने के लिए उस वर्ण का उपयोग करना चाहिए।
नेटव्यूस

9

इन उत्तरों के आधार पर मैंने स्क्रिप्ट बनाई है जो सभी डेटाबेस को अलग-अलग फ़ाइलों में बैकअप देती है, लेकिन फिर उन्हें नाम के रूप में दिनांक के साथ एक संग्रह में संपीड़ित करता है।

यह पासवर्ड नहीं मांगेगा, क्रोन में इस्तेमाल किया जा सकता है। .my.cnfइस उत्तर की जांच में पासवर्ड स्टोर करने के लिए https://serverfault.com/a/143587/62749

उन लोगों के लिए भी टिप्पणी की गई जो बैश स्क्रिप्ट से बहुत परिचित नहीं हैं।

#!/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
अच्छा है कि आप अपने परिवर्धन में योगदान करने के लिए वापस आए। मुझ से एक वोट
Fr0zenFyr

7

क्यों पार्सिंग स्वरूपित आउटपुट जबकि mysql कमांड सीधे वही कर सकता है जो आप चाहते हैं?

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

डेटाबेस के नाम और केवल यह सूचीबद्ध करता है।


3

जब Mysql तालिकाओं के अलग-अलग कॉलम हो सकते हैं तो विभिन्न MySQL संस्करणों से निर्यात और आयात करते समय सावधान रहें। यदि आप भाग्य से बाहर हैं तो अनुदान विशेषाधिकार काम करने में विफल हो सकते हैं। मैंने इस स्क्रिप्ट (mysql_export_grants.sql) को नए डेटाबेस में आयात करने के लिए अनुदान डंप करने के लिए बनाया है, बस मामले में:

#!/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

जब आप सभी डेटाबेस डंप कर रहे हैं। जाहिर है कि इसमें बड़ा डेटा है। तो आप बेहतर के लिए नीचे पसंद कर सकते हैं:

बैकअप बनाना:

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

अगर त्रुटि

- चेतावनी: तालिका mysql.event के डेटा को छोड़ना। --Events विकल्प स्पष्ट रूप से निर्दिष्ट करें।

उपयोग:

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

बैकअप बहाल:

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

आशा है कि यह मदद करेगा :)


3

मैंने यह टिप्पणी 4 साल पहले ही लिखी थी और अब इसका जवाब देने का फैसला किया है।

स्क्रिप्ट से jruzafa थोड़ा सरल किया जा सकता:

#!/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

ध्यान दें:

  1. बहिष्कृत डेटाबेस - प्रचलित रूप से सिस्टम टेबल - चर में प्रदान किए जाते हैं ExcludeDatabases
  2. कृपया ध्यान रखें कि पासवर्ड कमांड लाइन में प्रदान किया गया है। इसे असुरक्षित माना जाता है। इस सवाल का अध्ययन करें ।

0

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

ध्यान दें: -u "आपका उपयोगकर्ता नाम" -p "आपका पासवर्ड"


आपका जवाब वास्तव में समस्या को हल नहीं करता है, क्योंकि वह एक ही बार में सभी डेटाबेस को निर्यात करने के लिए कह रहा है। शायद आप थोड़ा सुधार कर सकते हैं: mysqldump -uroot -proot --all-डेटाबेस> allDB.sql नोट: -u "आपका उपयोगकर्ता नाम" -p "अपना पासवर्ड"
मारवान सलीम

0

Ubuntu में सभी डेटाबेस निर्यात करें

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

या

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

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.