मैं अपने सभी MySQL डेटाबेस का बैकअप रखना चाहता हूं। मेरे पास 100 से अधिक MySQL डेटाबेस हैं। मैं एक ही समय में उन सभी को निर्यात करना चाहता हूं और एक बार में उन सभी को अपने MySQL सर्वर में आयात करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?
मैं अपने सभी MySQL डेटाबेस का बैकअप रखना चाहता हूं। मेरे पास 100 से अधिक MySQL डेटाबेस हैं। मैं एक ही समय में उन सभी को निर्यात करना चाहता हूं और एक बार में उन सभी को अपने MySQL सर्वर में आयात करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?
जवाबों:
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
अन्य समाधान:
यह प्रत्येक डेटाबेस को एक अलग फाइल में बैकअप देता है
#!/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"
[अगली पंक्ति] और लाइनों को पूरी तरह से databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`
हटा दें । चर में आप उन डेटाबेस के नाम संग्रहीत करते हैं जिन्हें डंप नहीं किया जाना चाहिए [सामान्य रूप से सिस्टम डेटाबेस]। if
fi
ExcludeDatabases
-Bse "show databases"
अतिरिक्त स्वरूपण आउटपुट से बचने के लिए उपयोग कर सकते हैं और इस प्रकार आप निकाल सकते हैं | tr -d "| " | grep -v Database
। मेरी एक्सपोर्ट स्क्रिप्ट में यह लाइन हैdatabases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
U+200C U+200B
में "सी" और शब्द "योजना" के "एच" के बीच यूनिकोड वर्ण अनुक्रम है । यह उस बिट को कॉपी और पेस्ट करता है। इस मुद्दे पर अधिक चर्चा यहाँ: meta.stackexchange.com/questions/170970/…
इस प्रश्न पर मेरे द्वारा देखे गए सभी उत्तर शेल संचालक के भीतर एक फ़ाइल से बाहर निकलने को पुनर्निर्देशित करने की समस्या के कारण कुछ डेटाबेस में वर्ण सेट के साथ समस्या हो सकती है ।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;
इन उत्तरों के आधार पर मैंने स्क्रिप्ट बनाई है जो सभी डेटाबेस को अलग-अलग फ़ाइलों में बैकअप देती है, लेकिन फिर उन्हें नाम के रूप में दिनांक के साथ एक संग्रह में संपीड़ित करता है।
यह पासवर्ड नहीं मांगेगा, क्रोन में इस्तेमाल किया जा सकता है। .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"
जब 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'
जब आप सभी डेटाबेस डंप कर रहे हैं। जाहिर है कि इसमें बड़ा डेटा है। तो आप बेहतर के लिए नीचे पसंद कर सकते हैं:
बैकअप बनाना:
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]
आशा है कि यह मदद करेगा :)
मैंने यह टिप्पणी 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
ध्यान दें:
ExcludeDatabases
mysqldump -uroot -proot --all-database> allDB.sql
ध्यान दें: -u "आपका उपयोगकर्ता नाम" -p "आपका पासवर्ड"