केवल कुछ उपसर्ग / मयस्कल्डम्प वाइल्डकार्ड्स के साथ माईसिक्लडंप?


84

मेरे पास यह विशाल, गन्दा डेटाबेस है जिसे मैं साफ कर रहा हूं। इसमें 500+ टेबल हैं, जो एक सिंगल DB में जूमला के साथ Magento Enterprise के संयोजन का परिणाम है।

चीजों को बदतर बनाने के लिए, 70+ जूमला तालिकाओं का एक सेट है जो उपयोग में नहीं हैं। ये सभी उपसर्ग हैं bak_

बस इन bak_तालिकाओं को हटाना आसान होगा, लेकिन मैं उन्हें पहले 'बेक' करना चाहता हूं (देखें कि मैंने वहां क्या किया?)। मेरे मन में मैं इस तरह से एक आदेश तस्वीर कर सकते हैं:

mysqldump -u username -p mydatabase bak_*

लेकिन यह काम नहीं करता है। क्या सबसे अच्छा तरीका होगा यह करने का? धन्यवाद!

संपादित करें: हां, मैं शामिल करने के लिए 70 तालिकाओं को स्पष्ट रूप से सूचीबद्ध कर सकता हूं, या बाहर करने के लिए ~ 430 तालिकाओं को शामिल कर सकता हूं, लेकिन यदि संभव हो तो मैं ऐसा करने के लिए बेहतर तरीके की तलाश कर रहा हूं।


उत्तर क्वेरी द्वारा उस तालिका का चयन करें और mysqldump के साथ उस प्रश्न को पास करें क्योंकि mysqldump regex का समर्थन नहीं करता है धन्यवाद शुभकामनाएं
Daric

1
मुझे लगता है कि आपके प्रश्न का उत्तर यहाँ है: stackoverflow.com/questions/2949330/…
raghu

@Minaz द्वारा दिया गया उत्तर स्पष्ट रूप से वर्तमान में सर्वश्रेष्ठ के रूप में चिह्नित उत्तर से बेहतर है। यदि आप निश्चित रूप से सहमत हैं तो उस बेहतर को चिह्नित करने में मदद करेंगे।
डैन डेस्केल्सस्कु

जवाबों:


121

आप कमांड लाइन पर टेबल नामों को एक के बाद एक निर्दिष्ट कर सकते हैं, लेकिन वाइल्डकार्ड के बिना। mysqldump databasename table1 table2 table3

यदि आप --ignore-tableकम उपयोग करेंगे।

एक अन्य विचार यह है कि तालिकाओं को किसी फ़ाइल में प्राप्त किया जाए जैसे कि कुछ

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

फ़ाइल को संपादित करें और सभी डेटाबेस को एक पंक्ति में प्राप्त करें। फिर करो

mysqldump dbname `cat tables.txt` > dump_file.sql

तालिकाओं को एक पंक्ति में छोड़ने के लिए (अनुशंसित नहीं) आप निम्न कार्य कर सकते हैं

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"

4
लेकिन किसी भी तरह से, मुझे अनदेखा करने के लिए 70 तालिकाओं को सूचीबद्ध करना होगा, या शामिल करने के लिए 430 तालिकाओं को सूचीबद्ध करना होगा। यही मैं करने से बचने की कोशिश कर रहा हूं। मुझे अपने प्रश्न में अधिक स्पष्ट होना चाहिए था, लेकिन उत्तर के लिए धन्यवाद। यह काम करेगा, हाँ;)
thaddeusmt

1
एक अन्य विचार यह है कि टेबल को फाइल में mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txtसंपादित करें जैसे कि फाइल को संपादित करें और सभी डेटाबेस को एक पंक्ति में प्राप्त करें। फिर करते हैंmysqldump dbname `cat tables.txt`
sreimer

मैंने केवल b__ टेबल को छोड़ दिया, लेकिन मैंने अभी भी तालिका की सूची प्राप्त करने के लिए इसका उपयोग किया है। फिर मैंने एक बड़ा DROP TABLE स्टेटमेंट बनाने के लिए कॉमा के साथ मिलकर उन्हें जगाया gawk '{print $1"," }' tables.txt > baktables.sql। धन्यवाद!
thaddeusmt

किसी एक लाइनर में ऐसा करने का कोई तरीका? यानी: एक मध्यस्थ के रूप में एक अस्थायी फ़ाइल का उपयोग किए बिना?
टॉम ऑस्टर

3
यह ऐसा करेगाmysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
sreimer

59

यहाँ एक आसान तरीका है:

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]

4
यह होना चाहिए show tables like "<prefix>\_%"क्योंकि _यह भी एक वाइल्डकार्ड है और बच जाना चाहिए ... अन्यथा आप तालिकाओं के साथ एक समस्या प्राप्त कर सकते हैं जिसमें एक ही उपसर्ग-उपसर्ग होता है जैसे कि bak_ और bak2_ दोनों का मिलान होगाbak_%
reox

5
आप -N को पास कर सकते हैं mysqlऔर पंक्ति grepको फ़िल्टर करने के लिए आपको चलाने की आवश्यकता नहीं होगी Tables_in
डैनस्केलस्क्यू

1
मेरे लिए काम किया लेकिन mysql -NB के साथ।
wesamly

यदि show tables like "bak\_%"कुछ नहीं लौटाता है, तो सभी डेटाबेस को डंप कर दिया जाता है। इसे रोकने का कोई तरीका?
Seb33300

57

मेरा मनपसंद:

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

सभी उत्तर लगभग समान दृष्टिकोण लेते हैं, लेकिन यह सबसे संक्षिप्त वाक्यविन्यास है।


11
जो लोग जिज्ञासु हैं, उनके लिए ये झंडे हैं -B बैच -e निष्पादित -s साइलेंट मोड (कम आउटपुट) dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
ji

मुझे यह पसंद है। मैं इस स्निपेट को हथियाने के लिए कई बार यहां आ चुका हूं!
जेसन गैलुटेन

थोड़ा गोचर: आपको mysqldump और mysql कमांड दोनों के लिए उपयोगकर्ता नाम और पासवर्ड पैरामीटर भरना होगा। और अगर mysql कॉल विफल हो जाता है, तो mysqldump पूरे डेटाबेस को डंप करने में चूक जाता है, जो कि बहुत बड़ा हो सकता है, खासकर उन मामलों में जहां आप डेटा के केवल सबसेट को डंप करने के लिए इच्छुक हैं।
गिदमैन

यह काम नहीं कर रहा हैmysql -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" -N -e 'show databases like "auth\_%"' | xargs mysqldump -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" > test
क्लाउडबड

2

किसी अन्य ऑनलाइनर के साथ तालिकाओं के नाम की सूची निकालने के लिए mysql -sN …और फिर उन्हें ड्रॉप करने के लिए "... में ..." शेल लूप में प्रत्येक आइटम का उपयोग करें:

for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

या (विस्तारित संस्करण)

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

या "group_concat" का उपयोग तालिकाओं के नाम को संक्षिप्त करने के लिए करें, यदि वे पर्याप्त रूप से छोटे हैं:

tables=`mysql dbname -srN -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'  AND TABLE_NAME LIKE 'bak\_%' "`; mysql dbname -rsN -e "DROP TABLE $tables"

* "group_concat_max_len" (आम तौर पर 1024 के बराबर, अपने 70 तालिकाओं के बराबर) के मूल्य की कुछ सीमाएं हस्तक्षेप कर सकती हैं।


समान सिद्धांत, लेकिन "bak_" से शुरू होने वाले को छोड़कर सभी तालिकाओं को डंप करने के लिए:

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND NOT(TABLE_NAME LIKE 'bak\_%') "` ; do mysqldump -u [u] -p dbname "$f" >> dump_dbname.sql; done

2

पहले से ही बहुत सारे अच्छे उत्तर हैं, लेकिन मैं यहां इतनी भिन्नता लेकर आया हूं:

mysql MY_DATABASE -N -u MY_MYSQLUSER -p -e 'show tables like "%MY_LIKE_CODE%";' |
xargs mysqldump MY_DATABASE -u MY_MYSQLUSER -p |
gzip > ~/backup/`date +%Y%m%d:::%H:%M:%S-MY_DAMP.sql.gz`

इस क्रिया द्वारा मैंने डेटाबेस से % सिंगल मास्क जैसे एक फ़ाइल में मास्क द्वारा टेबल डंप बनाया । उम्मीद है कि कोई इसे उपयोगी पाएगा।


2

MySQL 5.7 के रूप में, द mysqlpump टूल पैटर्न के साथ टेबल नेम फ़िल्टरिंग का समर्थन करता है।

ध्यान दें कि यह एक अर्ध-बेक्ड टूल है, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि यह आवश्यक कार्यक्षमताओं का समर्थन करता है, और यह सही ढंग से निष्पादित करता है (जैसे कि MySQL 5.7.12 के रूप में, ट्रिगर निर्यात टूट गया है)।


3
यह बताता है कि "mysqlpump" टाइपो नहीं है। dev.mysql.com/doc/refman/5.7/en/mysqlpump.html । हां, --include-tables abc% विकल्प वाइल्डकार्ड का उपयोग करके डंपिंग टेबल को निर्दिष्ट करने की अनुमति देता है। लेकिन लगता है कि विचारों को बाहर करने के लिए mysqlpump प्राप्त करने का कोई तरीका नहीं है। हाँ, वास्तव में आधा बेक्ड।
gwideman

1

यहाँ कुछ अन्य अच्छे उत्तरों के साथ, मैंने इसे और भी आसान बनाने के लिए शेल स्क्रिप्ट बनाई। यह स्क्रिप्ट आउटपुट में 3 फाइलें उत्पन्न करती है - सभी तालिकाओं के लिए संरचना के साथ एक, सभी गैर-अपवर्जित तालिकाओं के लिए एक डेटा के साथ, और सभी "बहिष्कृत" तालिकाओं के लिए एक डेटा के साथ (आप इस पर टिप्पणी कर सकते हैं यदि आप वास्तव में डॉन करते हैं ' t) इसकी आवश्यकता है। तब आप अपनी आवश्यकता के अनुसार कौन सा उपयोग कर सकते हैं।

#!/bin/bash

echo -n "DB Password: "
read -s PASSWORD

HOST=yourhostname.com
USER=youruser
DATABASE=yourdatabase

MAIN_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES WHERE Tables_in_dashboard NOT LIKE 'bigtable_%';")
STATS_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES LIKE 'bigtable_%';")

echo "Dumping structure..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-data | gzip > structure.sql.gz

echo "Dumping main data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $MAIN_TABLES | gzip > data.sql.gz

echo "Dumping big table data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $STATS_TABLES | gzip > big_table_data.sql.gz

0

मेरा समाधान:

mysqldump -u username -p mydatabase `mysql -B --disable-column-names -u username -p mydatabase -e "SHOW TABLES LIKE 'bak\_%'" | sed ':a;N;$!ba;s/\n/ /g'`

0

mysql DATABASE -u USERNAME -p -e 'शो टेबल जैसे "PREFIX%"' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p> DUMP.sql

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