Mysqldump के साथ कुछ तालिकाओं को छोड़ें


556

क्या mysqldump कमांड से कुछ तालिकाओं को प्रतिबंधित करने का कोई तरीका है?

उदाहरण के लिए, मैं केवल टेबल 1 और टेबल 2 को डंप करने के लिए निम्नलिखित सिंटैक्स का उपयोग करूंगा :

mysqldump -u username -p database table1 table2 > database.sql

लेकिन क्या टेबल 1 और टेबल 2 को छोड़कर सभी तालिकाओं को डंप करने का एक समान तरीका है ? मुझे mysqldump प्रलेखन में कुछ भी नहीं मिला है, इसलिए जानवर-बल (सभी तालिका नामों को निर्दिष्ट करना) जाने का एकमात्र तरीका है?

जवाबों:


939

आप --ignore-table विकल्प का उपयोग कर सकते हैं । तो आप कर सकते हैं

mysqldump -u USERNAME -pPASSWORD DATABASE --ignore-table=DATABASE.table1 > database.sql

इसके बाद कोई व्हाट्सएप नहीं है -p(यह टाइपो नहीं है)।

यदि आप कई तालिकाओं को अनदेखा करना चाहते हैं, तो आप इस तरह एक सरल स्क्रिप्ट का उपयोग कर सकते हैं

#!/bin/bash
PASSWORD=XXXXXX
HOST=XXXXXX
USER=XXXXXX
DATABASE=databasename
DB_FILE=dump.sql
EXCLUDED_TABLES=(
table1
table2
table3
table4
tableN   
)

IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
   IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
done

echo "Dump structure"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE} > ${DB_FILE}

echo "Dump content"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}

4
धन्यवाद! पूरी तरह से काम किया ... मुझे नहीं पता कि मैं कैसे चूक गया।
Zac

20
वहाँ सिर्फ तालिका सामग्री को छोड़ करने के लिए कोई रास्ता नहीं है? मैं बैकअप के लिए संरचना चाहते हैं।
एंड्रेस एसके

5
आप -no-data = true विकल्प का उपयोग कर सकते हैं, लेकिन मुझे नहीं पता कि आप प्रति तालिका स्तर पर ऐसा कर सकते हैं या नहीं।
ब्रायन फिशर

60
यदि डेटाबेस का नाम प्रत्येक --ignore-table के लिए सेट नहीं है, तो आपको विकल्प --ignore-table = <database> <table> 'त्रुटि का अवैध उपयोग मिलेगा। सुनिश्चित करें कि आप हमेशा डेटाबेस घोषित करते हैं!
23

26
यदि आप कुछ तालिकाओं के डेटा को अनदेखा करना चाहते हैं, लेकिन फिर भी उनकी संरचना को डंप करते हैं, तो आप उन तालिकाओं के लिए फिर से mysqldump चला सकते हैं, और आपके द्वारा अभी बनाए गए बैकअप पर इसे
संक्षिप्त कर सकते हैं

118

@ ब्रायन-फिशर के उत्तर पर निर्माण और इस पोस्ट पर कुछ लोगों की टिप्पणियों का उत्तर देते हुए, मेरे पास मेरे डेटाबेस में विशाल (और अनावश्यक) तालिकाओं का एक समूह है, इसलिए मैं नकल करते समय उनकी सामग्री को छोड़ना चाहता था, लेकिन संरचना को बनाए रखना :

mysqldump -h <host> -u <username> -p <schema> --no-data > db-structure.sql
mysqldump -h <host> -u <username> -p <schema> --no-create-info --ignore-table=schema.table1 --ignore-table=schema.table2 > db-data.sql

परिणामस्वरूप दो फाइलें संरचनात्मक रूप से ध्वनि हैं लेकिन डंप किया गया डेटा अब 9GB के बजाय ~ 500MB है, मेरे लिए बहुत बेहतर है। मैं अब इन दोनों फ़ाइलों को 9GB डेटा में हेरफेर करने या डिस्क स्थान से बाहर चलाने के बारे में चिंता किए बिना परीक्षण प्रयोजनों के लिए किसी अन्य डेटाबेस में आयात कर सकता हूं।


MySQL 5.5.43 (डेबियन-लिनुक्स-ग्नू (x86_64) के लिए परीक्षण और उपयोग किया गया) धन्यवाद
अब्देल

सरल और सुरुचिपूर्ण। एक महान समाधान।
ग्रेग ग्लनर

4
महान समाधान। मैं बाद में काम करने के लिए डंप के लिए दूसरा बयान करने वाली चलाता --skip जोड़ने के लिए (यह मानते हुए आप चलाता है) था, लेकिन अन्यथा: सही
रेनर मोहर

धन्यवाद, यह काम कर रहा है और बहुत उपयोगी है।
हिमालय गर्ग

59

कई डेटाबेस के लिए:

mysqldump -u user -p --ignore-table=db1.tbl1 --ignore-table=db2.tbl1 --databases db1 db2 ..

5
इस थ्रेड का जवाब पहले से ही है जो कहता है कि, बेहतर है।
alxgb

19
यह सही है, लेकिन यह समाधान कई डेटाबेस के साथ काम करता है।
एलेक्स

दिलचस्प है - मैंने पहले सोचा था mysqldऔर mysqldumpवही कार्यक्रम होंगे।
मार्टिन थोमा

4
कि मैं क्या देख रहा हूँ - समाधान के साथ एक-लाइनर उत्तर जो मुझे 2-3mins के लिए कुछ पढ़ने के लिए मजबूर नहीं करता है: P
jebbie

43

कई तालिकाओं की अनदेखी करने के लिए एक और उदाहरण

/usr/bin/mysqldump -uUSER -pPASS --ignore-table={db_test.test1,db_test.test3} db_test> db_test.sql

--ignore-tableसिंटैक्स जैसे तालिकाओं के साथ सारणी का उपयोग करना और बनानाdatabase.table

--ignore-table={db_test.table1,db_test.table3,db_test.table4}

जानकारी के साथ लिंक जो आपकी मदद करेंगे

आउटपुट mysqldump को संपीड़ित करें

नोट: mysql Ver 14.14 Distrib 5.5.55 के साथ ubuntu सर्वर में परीक्षण किया गया

डेटाबेस आयात करें

 mysql -uUSER  -pPASS db_test < db_test.sql

तालिकाओं को अनदेखा करने के लिए सरल स्क्रिप्ट

#!/bin/bash

#tables to ignore
_TIGNORE=(
my_database.table1
my_database.table2
my_database.tablex
)

#create text for ignore tables
_TDELIMITED="$(IFS=" "; echo "${_TIGNORE[*]/#/--ignore-table=}")"

#don't forget to include user and password
/usr/bin/mysqldump -uUSER -pPASSWORD --events ${_TDELIMITED} --databases my_database | gzip -v > backup_database.sql.gz

जब आप कई तालिकाओं को अनदेखा करना चाहते हैं, तो स्क्रिप्ट का उपयोग करने से बचने का शानदार तरीका। उस उत्तर को
svfat

सही जवाब !!! +1 ने मेरा दिन बनाया :)
सागरपंचल

7

कुछ तालिका डेटा को बाहर करने के लिए , लेकिन तालिका संरचना को नहीं । यहाँ है मैं इसे कैसे करते हैं:

किसी भी डेटा के बिना, सभी तालिकाओं की डेटाबेस संरचना को डंप करें:

mysqldump -u user -p --no-data database > database_structure.sql

फिर डेटा को डेटाबेस से बाहर रखा मेज को छोड़कर, और संरचना को डंप न करें:

mysqldump -u user -p --no-create-info \
    --ignore-table=database.table1 \
    --ignore-table=database.table2 database > database_data.sql

फिर, इसे एक नए डेटाबेस में लोड करने के लिए:

mysql -u user -p newdatabase < database_structure.sql
mysql -u user -p newdatabase < database_data.sql

1

आप के mysqlpumpसाथ कमांड का उपयोग कर सकते हैं

--exclude-tables=name

आदेश। यह बाहर करने के लिए तालिकाओं की अल्पविराम से अलग सूची निर्दिष्ट करता है।

Mysqlpump का सिंटैक्स, mysqldump से बहुत मिलता-जुलता है, लेकिन इसका तरीका अधिक निष्पादक है। अपवर्जित विकल्प का उपयोग करने की अधिक जानकारी आप यहाँ पढ़ सकते हैं: https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#mysqlpump-filtering


0

सभी डेटाबेस को सभी तालिकाओं के साथ डंप करें लेकिन कुछ तालिकाओं को छोड़ दें

on github: https://github.com/rubo77/mysql-backup.sh/blob/master/mysql-backup.sh

#!/bin/bash
# mysql-backup.sh

if [ -z "$1" ] ; then
  echo
  echo "ERROR: root password Parameter missing."
  exit
fi
DB_host=localhost
MYSQL_USER=root
MYSQL_PASS=$1
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
#MYSQL_CONN=""

BACKUP_DIR=/backup/mysql/

mkdir $BACKUP_DIR -p

MYSQLPATH=/var/lib/mysql/

IGNORE="database1.table1, database1.table2, database2.table1,"

# strpos $1 $2 [$3]
# strpos haystack needle [optional offset of an input string]
strpos()
{
    local str=${1}
    local offset=${3}
    if [ -n "${offset}" ]; then
        str=`substr "${str}" ${offset}`
    else
        offset=0
    fi
    str=${str/${2}*/}
    if [ "${#str}" -eq "${#1}" ]; then
        return 0
    fi
    echo $((${#str}+${offset}))
}

cd $MYSQLPATH
for i in */; do
    if [ $i != 'performance_schema/' ] ; then 
    DB=`basename "$i"` 
    #echo "backup $DB->$BACKUP_DIR$DB.sql.lzo"
    mysqlcheck "$DB" $MYSQL_CONN --silent --auto-repair >/tmp/tmp_grep_mysql-backup
    grep -E -B1 "note|warning|support|auto_increment|required|locks" /tmp/tmp_grep_mysql-backup>/tmp/tmp_grep_mysql-backup_not
    grep -v "$(cat /tmp/tmp_grep_mysql-backup_not)" /tmp/tmp_grep_mysql-backup

    tbl_count=0
    for t in $(mysql -NBA -h $DB_host $MYSQL_CONN -D $DB -e 'show tables') 
    do
      found=$(strpos "$IGNORE" "$DB"."$t,")
      if [ "$found" == "" ] ; then 
        echo "DUMPING TABLE: $DB.$t"
        mysqldump -h $DB_host $MYSQL_CONN $DB $t --events --skip-lock-tables | lzop -3 -f -o $BACKUP_DIR/$DB.$t.sql.lzo
        tbl_count=$(( tbl_count + 1 ))
      fi
    done
    echo "$tbl_count tables dumped from database '$DB' into dir=$BACKUP_DIR"
    fi
done

Https://stackoverflow.com/a/17016410/1069083 की थोड़ी मदद से

यह lzop का उपयोग करता है जो बहुत तेज़ है, देखें: http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


आपके द्वारा साझा किया गया दस्तावेज़ कहता है कि gzip lzop से अधिक तेज़ है।
जॉसपेल

0

मुझे Rubo77 का समाधान पसंद है, मैंने पॉल के संशोधित होने से पहले इसे नहीं देखा था। यह एक एकल डेटाबेस को बैकअप करेगा, जिसे आप नहीं चाहते हैं। यह तब इसे gzip करेगा, और 8 दिनों से अधिक पुरानी किसी भी फ़ाइल को हटा देगा। मैं शायद इसके 2 संस्करणों का उपयोग करूंगा जो दिन में एक बार एक पूर्ण (माइनस लॉग्स टेबल) करते हैं, और एक और जो सबसे महत्वपूर्ण तालिकाओं का समर्थन करता है जो युगल क्रोन नौकरियों का उपयोग करके हर घंटे सबसे अधिक बदलते हैं।

#!/bin/sh
PASSWORD=XXXX
HOST=127.0.0.1
USER=root
DATABASE=MyFavoriteDB

now="$(date +'%d_%m_%Y_%H_%M')"
filename="${DATABASE}_db_backup_$now"
backupfolder="/opt/backups/mysql"
DB_FILE="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt

EXCLUDED_TABLES=(
logs
)
IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
   IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
done

echo "Dump structure started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE}  > ${DB_FILE} 
echo "Dump structure finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "Dump content"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}
gzip ${DB_FILE}

find "$backupfolder" -name ${DATABASE}_db_backup_* -mtime +8 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0

0

संपूर्णता के लिए, यहां एक स्क्रिप्ट है जो वास्तव में एक डेटाबेस से बैकअप प्राप्त करने के लिए एक-लाइनर हो सकती है, सभी विचारों को छोड़कर (अनदेखी)। Db नाम को कर्मचारी माना जाता है:

ignore=$(mysql --login-path=root1 INFORMATION_SCHEMA \
    --skip-column-names --batch \
    -e "select 
          group_concat(
            concat('--ignore-table=', table_schema, '.', table_name) SEPARATOR ' '
          ) 
        from tables 
        where table_type = 'VIEW' and table_schema = 'employees'")

mysqldump --login-path=root1 --column-statistics=0 --no-data employees $ignore > "./backups/som_file.sql"   

आप क्वेरी के तर्क को अपडेट कर सकते हैं। सामान्य उपयोग में group_concatऔर concatआप लगभग किसी भी वांछित स्ट्रिंग या शेल कमांड को उत्पन्न कर सकते हैं।

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