मैं MySQL डंप में इन टिप्पणियों से कैसे छुटकारा पा सकता हूं?


82

मैं एक सरल संरचना बनाने की कोशिश कर रहा हूं जो केवल मेरे डेटाबेस को डंप करता है। उपयोग करने mysqldumpसे मुझे परिणाम मिलता है जैसे:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

DROP TABLE IF EXISTS `foo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;

कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं, मैं सिर्फ उन टिप्पणियों से छुटकारा नहीं पा सकता हूं।

मैं वर्तमान में उपयोग कर रहा हूं: mysqldump -p -d --add-drop-table --skip-tz-utc --skip-set-charset -h 127.0.0.1 -u foo bar --result-file=dumpfile.sql

संपादित करें: मैं हालांकि अन्य टिप्पणियों को बनाए रखना चाहता हूं, जैसे कि-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)


सीधा जवाब नहीं है - लेकिन मैंने सीधे mysqldump को पूरी तरह से mk-समानांतर-डंप के लिए खोद लिया है - यह तेज़ है (कई प्रक्रियाएँ पैदा करता है) और इस पर निर्भर करता है कि आप डंप आउटपुट के साथ क्या करने जा रहे हैं, अधिक लचीला क्योंकि यह प्रभावी ढंग से mysqldump और 'select' आउटफिट में 'सिंटैक्स एक साथ।
zznate

2
मुझे आश्चर्य है कि ओरेकल ने ऐसे महत्वपूर्ण विकल्प mysqdump में क्यों नहीं जोड़े?
PHPst

जवाबों:


162

WHOA! ये वास्तव में टिप्पणी नहीं हैं भले ही वे इस तरह से देखें। वे सशर्त-निष्पादन टोकन हैं।

यह लाइन लें:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

यदि mySQL का संस्करण 4.00.14 है या उच्चतर है , तो MySQL सर्वर इस कथन को चलाएगा।

यह जादू टिप्पणी वाक्य-विन्यास में दर्ज है टिप्पणी सिंटेक्स मैनुअल सेक्शन ।

आप शायद इस सामान से छुटकारा नहीं चाहते हैं।


2
एक अन्य प्रश्न जो विशेष रूप से MySQL में टिप्पणियों के बारे में पूछता है जिसे निष्पादन योग्य SQL (मेरे द्वारा पोस्ट किया गया) के रूप में माना जाता है: stackoverflow.com/questions/25614919/…
Dan Nissenbaum

1
कुछ मामले हैं जब टिप्पणियों को हटाने से मदद मिल सकती है। यानी Bugs.mysql.com/bug.php?id=48972 जब - इनकी वजह से इन्टर्न-इग्नोर काम नहीं करता है
varela

+1 मैं कभी नहीं जानता था। मैंने सोचा था कि वे सिर्फ आदेश थे कि mysql डंप निर्यात के रूप में चल रहा था। बहुत ही ज्ञानवर्धक उत्तर।
कैप्टन हाइपरटेक्स्ट

1
माना कि इसका मतलब यह होना चाहिए कि संगतता अपेक्षित विकल्प हों, यह निर्दिष्ट करें कि क्या आप पुराने mysql संस्करणों पर sql चलाने की अपेक्षा करते हैं, और यदि नहीं, तो इसे सशर्त टिप्पणी में लपेटने की आवश्यकता है।
CMCDragonkai

40

मुझे पता है कि यह एक प्राचीन प्रश्न है, लेकिन यहाँ कम से कम एक उत्तर है। मैं सशर्त टिप्पणियों को हटाने के लिए mysqldump में एक ध्वज नहीं ढूंढ सका, या इन टिप्पणियों के प्रकट होने के लिए न्यूनतम mysql संस्करण सेट करने के लिए वास्तव में एक बेहतर विकल्प। यदि आप बस उन सभी को nuke करना चाहते हैं, तो आप ऐसा कर सकते हैं grep या sed (sed छोड़ देता है खाली लाइनों, grep नहीं):

mysqldump ... | grep -v '^\/\*![0-9]\{5\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-9]\{5\}.*\/;$//g'

Mysql संस्करण पर निर्भर सशर्त रूप से हटाने वाली टिप्पणियों की मेरी स्वयं की इच्छा का उत्तर देने के लिए, इनमें से किसी एक का उपयोग करें (किसी भी चीज़ के लिए कोई टिप्पणी निकालता है <mysql5):

mysqldump ... | grep -v '^\/\*![0-4][0-9]\{4\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-4][0-9]\{4\}.*\/;$//g'

1
Rsnapshot बैकअप के लिए यह अंतिम पंक्ति से छुटकारा पाने के लिए उपयोगी है, इसलिए एक डेटाबेस, जो एक ही फाइल में परिणाम नहीं बदलता है:mysqldump ... | grep -v '^-- Dump completed on .*$'
rubo77

हाँ, लेकिन समस्या यह है कि आप DROP DATABASE IF EXISTS OR को खो सकते हैं IGNORING YOUR CURRENT SESSION VARIABLES । जब तक आप नहीं जानते कि आपका क्या करना है: तब तक उन्हें हटा न दें जब तक कि बेहतर परिणाम प्राप्त करने वाले सदस्य / HOSTS। परिणामी आउटपुट किसी भी कारण से अपेक्षित नहीं हो सकता है। आपकी सुरक्षा के लिए उन्हें वहां रखा गया था। लेकिन अगर आप अपना सीटबेल्ट नहीं लगाना चाहते हैं तो यह आपकी पसंद है।
JayRizzo

1
@ rubo77 आप इस mysql डंप पैरामीटर को भी इस्तेमाल कर सकते हैं:--skip-dump-date
dehart

33

कोशिश करो --skip-comments?

धन्यवाद

संपादित करें:

मैं देख रहा हूँ .. यह कोशिश करो

--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

वांछित परिणाम प्राप्त करने तक कुछ विकल्पों को निकालने के लिए चारों ओर खेलें, मूल रूप से यह --compactबिना के समान है--skip-comments

--skip-comments संस्करण और सामान से संबंधित टिप्पणियों को हटा देता है।


5
दुर्भाग्य से यह उन सभी टिप्पणियों को हटा देता है जो मैं चाहता हूं, उन सभी को छोड़कर जो मैं बरकरार नहीं रखता हूं।
ईथर 19

@ अथारोस मैं कंसर्ट करता हूं, लेकिन हमें विस्तृत होना चाहिए। मेरा उपयोग-मामला स्रोत-नियंत्रित संरचनात्मक डेटा से संबंधित है। मुझे हर टेबल के लिए कोई गैर-जरूरी चैटर नहीं चाहिए। मुझे वह SET NAMESकॉल पसंद है --skip-set-charset, जैसा कि इस उत्तर में सुझाया गया है, हटाता है; यह केवल एक बार डंप फ़ाइल की शुरुआत में होता है, और डेटा बहाली को एक भौतिक तरीके से प्रभावित कर सकता है। मैं --skip-add-locks --skip-disable-keysअपने उपयोग-मामले के लिए पसंद करता हूं। लेकिन कुछ सशर्त टिप्पणियां, जैसे कि /*!40101 SET character_set_client = @saved_cs_client */;और /*!40101 SET character_set_client = utf8 */... उपयोगी, या नहीं?
बेन जॉनसन

1
@BenJohnson नहीं वे नहीं हैं। character_set_clientबग या किसी चीज़ के कारण 5.6 में सेट नहीं किया जा सकता है, इसलिए जब आप उदाहरण utf8mb4डेटा के लिए mysqldumping कर रहे हैं, तो आपको ये सशर्त टिप्पणियां मिलती हैं, जहां आप उन्हें नहीं चाहते हैं।
स्लाव


12

तकनीकी रूप से आप जिन लाइनों से छुटकारा पाने की कोशिश कर रहे हैं, वे टिप्पणी नहीं हैं। वे शुरुआत में कुछ चर को अस्थायी रूप से संशोधित करते हैं, और फिर अंत में उन्हें पिछले मूल्य पर रीसेट करते हैं।

वे आपके मामले में बहुत उपयोगी नहीं हैं (लेकिन वे भी हानिरहित हैं) - चूंकि आप डेटा का उपयोग नहीं कर रहे हैं, लेकिन मैंने सोचा कि यह ध्यान देने योग्य है कि लाइनें एक उद्देश्य की सेवा करती हैं, और केवल टिप्पणियां नहीं हैं।


4

वे टिप्पणियां नहीं हैं, स्क्रिप्ट के उस हिस्से का निष्पादन आपके mysql के संस्करण पर निर्भर करता है।

आप "टिप्पणी भाग" को हटा सकते हैं, जैसे

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */

सेवा

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

पढ़ने के लिए स्क्रिप्ट को और अधिक "आरामदायक" बनाना।

यदि आप "टिप्पणी" में निर्दिष्ट संस्करण की तुलना में नए संस्करण में "आरामदायक" स्क्रिप्ट चलाने का प्रयास करते हैं, तो आपको एक त्रुटि मिलेगी।


2
हम "टिप्पणी भाग को कैसे हटा सकते हैं"? क्या इसके लिए कोई डंप विकल्प है? मैं हाथ से कुछ टमटम फ़ाइल के माध्यम से जाना नहीं चाहता।
एमपीएन

वास्तव में यह होना चाहिए: यदि आप "टिप्पणी" में निर्दिष्ट से पुराने संस्करण में "आरामदायक" स्क्रिप्ट चलाने का प्रयास करते हैं , तो आपको एक त्रुटि मिलेगी।
डैनियल

1

सशर्त-निष्पादन टिप्पणियों को रखना वास्तव में महत्वपूर्ण है। लेकिन अगर आप पूरी तरह से जानते हैं कि डंप लोड करने वाला MySQL संस्करण इसे बनाने वाले के बराबर या उससे अधिक है, तो आप इसके साथ "टिप्पणी" भाग को हटा सकते हैं:

sed -r  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g

यह लाइनों को ऐसे रूपांतरित करेगा

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

सेवा

SET SQL_MODE=@OLD_SQL_MODE ;

क्योंकि यह लाइन होनी ही चाहिए किसी भी MySQL> = 4.1.1 पर चलना

ध्यान दें कि यह मल्टी-लाइन सशर्त-निष्पादन टिप्पणियों को नहीं हटाएगा, जैसे कि ट्रिगर को डंप करते समय।

चूंकि भविष्य की भविष्यवाणी करना असंभव है, इसलिए डंप को टिप्पणियों पर संग्रहीत करना बेहतर है, और केवल उन्हें हटा दें जब आप इसे कल्पना करना चाहते हैं।

mysqldump ... > dump.sql
cat dump.sql | sed -E  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g > dump.no-comments.sql


0

जब से आप विंडोज पर हैं, यदि कोई भी बेहतर समाधान नहीं ढूंढता है, तो आप इसके बजाय एक पायथन स्क्रिप्ट का उपयोग कर सकते हैं:

import re, sys
sql = sys.stdin.read()
regex = re.compile(r'/\*![^\n]* \*/;\n', re.M)
print regex.sub('', sql)

कमांड लाइन से उपयोग:

python program.py < your.sql > output.sql

यह इस तरह सभी लाइनों को हटा देता है:

/*!....... */;

0

यदि आप इस संरचना पर अपनी संरचना को शामिल करने की कोशिश कर रहे उत्तर पर ठोकर खा चुके हैं। git / github में अपनी ssll फ़ाइल शामिल करने की कोशिश कर रहे हैं, तो आप निम्न कोड के साथ स्वत: वेतन वृद्धि को रोक सकते हैं db: संरचना: डंप

# Remove beginning auto increments to prevent merge conflicts
filename = 'db/structure.sql'
File.atomic_write(filename) do |output|
  File.open(filename, 'rb').each do |input|
    output.write(input.gsub(/\s+AUTO_INCREMENT=\d+\s+/, ' '))
  end
end

1
"रेगेक्सपी के साथ लाइनों को पट्टी" उत्तर पर सभी डाउनवोट्स के साथ क्या है? ये पूरी तरह से वैध हैं। यह विशेष रूप से पूरी तरह से मेरी स्थिति पर लागू होता है। + 1 आप सभी के लिए।
सादेजिमबो

0

मैंने इस स्क्रिप्ट को डंप को सामान्य बनाने के लिए बनाया, जिसमें सशर्त टिप्पणियां शामिल हैं: https://github.com/luissquall/dbdump

बस तुम्हें यह करना होगा:

npm install -g @luissquall/dbdump

# Redirect output to a file
dbdump -u user -p -d database > struct.sql

0

उपयोग --dump-date=FALSE

वही करता है जो ओपी पूछता है। (बिल्कुल नहीं, मैं देख रहा हूँ)

स्रोत: mysqldump विकल्प सारांश

संपादित करें: एक मिनट के बाद मुझे एहसास हुआ, यह वही है जो मैं ओपी के लिए नहीं बल्कि यहां छोड़ रहा था ... आशा है कि कोई इसका उपयोग कर सकता है: यह तिथि रेखा जो स्रोत नियंत्रण को बर्बाद कर देती है, क्योंकि यह हमेशा एक बदलाव होता है ...


1
वास्तव में मैं क्या देख रहा था, लोग भी इसे क्यों कम करते हैं? मुझसे बड़ा अपवित्र।
कुंगफोमन

-1

मुझे नहीं पता कि यह वही है जो आप खोज रहे हैं, मैं बस एक वाक्यविन्यास हाइलाइटर का उपयोग करने में सक्षम होने के लिए सभी mysql टिप्पणियों के सामान से छुटकारा पाना चाहता था, मैंने एक साधारण रेगेक्स का उपयोग किया और सभी को "/ \ * के साथ बदल दिया!" 0-9] {५} | \ * / "और वॉइला! कोड में अच्छे रंग)


-1

जैसा कि @ ओली और कुछ अन्य लोगों ने बताया, ये सशर्त-क्रियान्वयन टोकन हैं जो टिप्पणी शैली में लिखे गए हैं लेकिन एक उद्देश्य है। उनके बिना, आप भारी लागू विदेशी कुंजी बाधा के साथ तालिकाओं को फिर से बनाने के मुद्दों में भाग सकते हैं। उदाहरण के लिए, टेबल ए में टेबल बी के लिए एफके है और इस तरह टेबल ए को तब तक नहीं बनाया जा सकता है जब तक कि बी आगे और इतने पर न हो। प्रमुख चेकों को अक्षम किए बिना, आप कभी भी उनके तालिका क्रम को समाप्त करने के आधार पर उन्हें फिर से बनाने में सक्षम नहीं हो सकते हैं।

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