लाइव डेटाबेस से सावधान रहने के लिए आपका # 1 तरीका क्या है? [बन्द है]


80

अपने ग्राहक के लिए मैं कभी-कभार अपने लाइव डेटाबेस में काम करता हूं ताकि वे अपने लिए बनाई गई समस्या को ठीक कर सकें, या अपने उत्पाद के कीड़े के खराब डेटा को ठीक कर सकें। यूनिक्स रूट एक्सेस की तरह, यह सिर्फ खतरनाक है। मुझे समय से पहले क्या सबक सीखना चाहिए?

लाइव डेटा पर काम करने में सावधानी बरतने के लिए आप # 1 चीज़ क्या है?

जवाबों:


101

तीन चीजें मैंने वर्षों में कठिन तरीके से सीखी हैं ...

सबसे पहले, यदि आप लाइव डेटा पर अपडेट या डिलीट कर रहे हैं, तो पहले WHECT क्लॉज के साथ एक सेलेक्ट क्वेरी लिखें, जिसका आप उपयोग कर रहे हैं। सुनिश्चित करें कि यह काम करता है। सुनिश्चित करें कि यह सही है। फिर ज्ञात कार्य के लिए अद्यतन / संक्षिप्त विवरण प्रस्तुत करें।

आप कभी नहीं करना चाहते हैं

DELETE FROM Customers

आपके क्वेरी एनालाइज़र में बैठे हुए आप प्रतीक्षा कर रहे हैं कि आप WHERE क्लॉज़ कैसे लिखें ... गलती से "निष्पादित" हो गया और आपने अपनी ग्राहक तालिका को मार दिया है। उफ़।

इसके अलावा, अपने प्लेटफ़ॉर्म के आधार पर, यह पता करें कि टेबल का क्विक'डाइनहाइट बैकअप कैसे लिया जाए। SQL Server 2005 में,

SELECT *
INTO CustomerBackup200810032034
FROM Customer

ग्राहक की पूरी तालिका से प्रत्येक पंक्ति को एक नई तालिका में कॉपी कर देगा जिसे CustomerBackup200810032034 कहा जाता है, जिसे आप अपने अपडेट करने के बाद हटा सकते हैं और सुनिश्चित कर सकते हैं कि सब कुछ ठीक है। यदि सबसे खराब होता है, तो डिस्क या टेप से पिछली रात के बैकअप को पुनर्स्थापित करने की तुलना में इस तालिका से लापता डेटा को पुनर्स्थापित करना बहुत आसान है।

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


1
क्या आपका मतलब यह नहीं है कि ग्राहकों से केवल तकनीकी बात की जाए :-)
craigmoliver

5
या बेहतर अभी तक कुछ भी कैस्केडिंग का उपयोग न करें।
dkretz

108
BEGIN TRANSACTION;

इस तरह आप एक गलती के बाद रोलबैक कर सकते हैं।


हां, चेहरे-हथेली के पागलपन को रोकने का एकमात्र तरीका है।
19ay बजे

11
@Gememe, आपको उत्पादन डेटाबेस पर DDL नहीं करना चाहिए। आपको एक स्क्रिप्ट लिखना चाहिए, इसे अपने परीक्षण डेटाबेस पर चलाना चाहिए, और आपके परीक्षण डेटाबेस के QA पास होने के बाद, आप इसे उत्पादन सर्वर पर चलाते हैं।
पॉल टॉम्बलिन

1
@Paul: बिल्कुल। लेकिन यह तर्क दिया जा सकता है कि आपको अपने उत्पादन डेटाबेस, चाहे डीडीएल या डीएमएल, किसी भी प्रकार के संशोधनों के साथ ऐसा ही करना चाहिए, जिस स्थिति में यह पूरा प्रश्न निरर्थक है।
ग्रीम पेरो

3
एडुआर्डो, यह अब तक 45 वोट प्राप्त कर चुका है क्योंकि - ज्यादातर समय - आपकी ठंडी पसीना शुरू होती है इससे पहले कि आपकी उंगली कीबोर्ड पर सभी तरह से नीचे जा रही है - लेकिन उंगली को रोकने के लिए अभी बहुत देर हो चुकी है।
यूरो मिकेली

1
इसमें भी उपयोगी है कि आप परिणामों को सत्यापित करने से पहले उसी लेन-देन के भीतर चयन का एक गुच्छा चला सकते हैं - यदि वे अप्रत्याशित हैं, तो कोई नुकसान नहीं हुआ है - बस वापस रोल करें।
डेव क्लैडराय

50

पहले एक बैकअप करें: यह वैसे भी sysadmining का नंबर 1 कानून होना चाहिए

संपादित करें : दूसरों ने जो कुछ भी कहा है उसे शामिल करते हुए, सुनिश्चित करें कि आपके अपडेट में उचित क्लॉज़ हैं।

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


25

एक कॉपी में अपने बदलाव करें, और जब आप संतुष्ट हों, तब लाइव पर फिक्स लागू करें।


अधिकांश समय, कॉपी डीबी अलग होता है और फिर सभी बदलाव कॉपी और लाइव के समान होते हैं।
बगबॉगर

अगर कॉपी डेटाबेस लाइव डेटाबेस से अलग है, तो क्या इसका मतलब यह नहीं है कि यह वास्तव में कॉपी डेटाबेस नहीं है? परीक्षण / qa / प्रतिलिपि डेटाबेस का संपूर्ण उद्देश्य लाइव / उत्पादन डेटाबेस पर लागू होने से पहले परिवर्तनों का परीक्षण करना है।
विल्को ऑक्ट

22

अक्सर मैं एक अद्यतन या DELETE करने से पहले, मैं बराबर चयन लिखता हूं।


एक त्वरित और सरल जाँच के रूप में मुझे यह तरीका भी पसंद है। परिणामों की संख्या के आधार पर यह काम नहीं कर सकता है लेकिन कम से कम यह UPDATES और DELETES के लिए एक शुरुआत है।
osp70 19

18

जब तक आप BEGIN TRAN t1 में नहीं होते हैं, तब तक कोई अपडेट न करें - एक देव डेटाबेस में, उत्पादन में नहीं, कहीं भी नहीं। हमेशा एक टिप्पणी के बाहर एक कमाना टी 1 चलाएं - हमेशा टाइप करें

--COMMIT TRAN t1

और फिर इसे चलाने के लिए कथन का चयन करें। (जाहिर है, यह केवल GUI क्वेरी क्लाइंट पर लागू होता है।) यदि आप इन चीजों को करते हैं, तो यह उन्हें करने के लिए दूसरा स्वभाव बन जाएगा और आप किसी भी समय शायद ही खो देंगे।

मेरे पास वास्तव में "अपडेट" मैक्रो है जो इस प्रकार का है। मैं हमेशा अपने अपडेट सेट करने के लिए इसे पेस्ट करता हूं। आप डिलीट और इन्सर्ट के लिए एक समान बना सकते हैं।

begin tran t1
update 
set 
where 
rollback tran t1
--commit tran t1

हाँ, यह ठीक है कि मैं क्या करता हूँ। बहुत से लोग कह रहे हैं "जहां मत भूलना खंड", लेकिन अगर यह गलत है तो क्या होगा? कभी भी, इस शुरू / रोलबैक / - प्रतिबद्ध पैटर्न के बिना एक लाइव डेटाबेस को अपडेट न करें।
एरिक जेड बियर्ड

एक अतिरिक्त सुधार यह है कि पहले "से" का चयन करें, जहां क्लॉज सुनिश्चित करने के लिए कि यह सही है, फिर अपडेट उसी क्लॉज के साथ चलाएं।
एरिक जेड बीयर्ड

एरिक सही है, हालांकि मैं गुंजाइश मैथुन से बचने के लिए अपने मैक्रो से इसे छोड़ देता हूं। मेरे पास एक और मैक्रो है जो सामान्य उपयोग के लिए "से" का चयन करता है।
पैट्रिक सज्जापस्की

इस तरह से ऐसा नहीं करने का कोई अच्छा कारण नहीं है। जब मुझे पिछली नौकरी में अपडेट स्क्रिप्ट लिखना था, तो मैंने इसे इस तरह से किया, अपडेट से पहले एक SELECT के साथ , और एक SELECT के बाद , ताकि मैं परिणाम देख सकूं। इसे कई बार चलाने और यह देखने के बाद कि परिणाम सही थे, मैंने रोलबैक को कमिट में बदल दिया।
रयान लुंडी

13

हमेशा सुनिश्चित करें कि आपके UPDATE और DELETE में उचित WHERE क्लॉज़ हो।


हाँ, मैं इस पर पहले जला दिया है।
इयान याकूब

मैं भी। जब से मैंने चाहा है कि एसक्यूएल को डिजाइन किया गया है ताकि क्लॉज पहले आए।
ग्रेग हेविगेल

एक प्यार है कि एक त्वरित अद्यतन चल रहा है और यह कहते हैं कि प्यार "1279209394 रिकॉर्ड (ओं) को प्रभावित करता है।" उह ओह। ;)
केविन फेयरचाइल्ड

13

मेरे अपने प्रश्न का उत्तर देने के लिए:

अपडेट स्टेटमेंट लिखते समय, इसे क्रम से लिखें।

  1. लिखो UPDATE [table-name]
  2. लिखो WHERE [conditions]
  3. वापस जाओ और लिखो SET [columns-and-values]

उन पंक्तियों को चुनना जिन्हें आप अपडेट करना चाहते हैं, यह कहने से पहले कि आप किन मूल्यों को बदलना चाहते हैं, दूसरे क्रम में करने से ज्यादा सुरक्षित है। यह update person set email = 'bob@bob.com'आपकी क्वेरी विंडो में बैठे होने के लिए असंभव बनाता है , गलत तरीके से कीस्ट्रोके द्वारा चलाने के लिए तैयार है, तालिका में हर पंक्ति को गड़बड़ करने के लिए तैयार है।

संपादित करें: जैसा कि दूसरों ने कहा है, लिखने से WHEREपहले अपने हटाए जाने के लिए खंड लिखें DELETE


11

एक उदाहरण के रूप में, मैं इस तरह SQL बनाता हूं

--Update P Set
--Select ID, Name as OldName, 
    Name='Jones'
From Person P
Where ID = 1000

मैं टेक्स्ट को अंत से चुनकर हाइलाइट करता हूं और उस एसक्यूएल को चलाता हूं। एक बार जब मैं यह सत्यापित कर लेता हूं कि यह उस रिकॉर्ड को खींच रहा है जिसे मैं अपडेट करना चाहता हूं, तो मैंने अपडेट स्टेटमेंट को हाईलाइट करने के लिए शिफ्ट-अप मारा और उसे चलाया।

ध्यान दें कि मैंने एक उपनाम का उपयोग किया है। मैं कभी भी तालिका नाम की खोज को अद्यतन नहीं करता। मैं हमेशा एक उपनाम का उपयोग करता हूं।

यदि मैं लेन-देन और रोलबैक / कमिट्स के साथ मिलकर ऐसा करता हूं, तो मैं वास्तव में, वास्तव में सुरक्षित हूं।


मैं एक चुनिंदा चेक का भी उपयोग करता हूं - मैंने कई ऐसे तरीके पकड़े हैं जहां क्लॉज त्रुटियां इस तरह से हैं। यह एक अच्छा विवेक जांच है, खासकर जब बयान जटिल होते हैं।
बॉब प्रोबस्ट

दिन के मध्य में उत्पादन में एक महत्वपूर्ण तालिका को हटाने के बाद मेरे पर्यवेक्षक को देखने के बाद इस पद्धति को एक छोटी अवधि में सम्मानित किया गया।
wcm

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

11

लाइव डेटाबेस से सावधान रहने के लिए मेरा # 1 तरीका? इसे मत छुओ। :)

बैकअप नुकसान को नष्ट कर सकता है जिसे आप डेटाबेस में डालते हैं, लेकिन आप उस समय के दौरान नकारात्मक दुष्प्रभावों को पेश करने की संभावना रखते हैं।

कोई फर्क नहीं पड़ता कि आप जो स्क्रिप्ट के साथ काम कर रहे हैं वह कितना ठोस है, इसे एक परीक्षण चक्र के माध्यम से चलाएं। यहां तक ​​कि अगर एक "परीक्षण चक्र" का अर्थ है डेटाबेस के अपने उदाहरण के खिलाफ स्क्रिप्ट को चलाना, सुनिश्चित करें कि आप इसे करते हैं। उत्पादन परिवेश की तुलना में अपने स्थानीय बॉक्स पर दोषों को लागू करना बेहतर है।


6
  1. अद्यतनों की जाँच करें, पुन: जाँचें और पुन: जाँच करें। यहां तक ​​कि अगर आपको लगता है कि आप बस एक सरल, एकल कॉलम अपडेट कर रहे हैं, तो जल्द ही या बाद में आपके पास पर्याप्त कॉफी नहीं होगी और एक 'जहां' क्लॉज को भूल जाएं, एक पूरी तालिका को nuking।

कुछ अन्य चीजें जो मुझे मददगार लगी हैं:

  • यदि MySQL का उपयोग कर रहे हैं, तो सुरक्षित अपडेट सक्षम करें

  • यदि आपके पास एक डीबीए है, तो उन्हें ऐसा करने के लिए कहें।

मैंने पाया है कि इन 3 चीजों ने मुझे कोई गंभीर नुकसान नहीं पहुंचाया है।


हाँ, क्लासिक: अद्यतन TABLE_NAME सेट FIELD_X = 'जो भी हो' [कहां = गायब है]
स्टीफन स्टीगर

6
  • कोई भी बैकअप नहीं चाहता है, लेकिन हर कोई रिकवरी के लिए रोता है
  • विदेशी कुंजी संदर्भों के साथ अपना DB बनाएं, क्योंकि आपको चाहिए:
  • डेटा को अपडेट / डिलीट करने और उसके साथ संरचनात्मक अखंडता / कुछ और को नष्ट करने के लिए इसे जितना संभव हो उतना कठिन बनाएं
  • यदि संभव हो, तो एक ऐसी प्रणाली पर चलें, जहाँ आपको परिवर्तनों को स्थायी रूप से संग्रहीत करने से पहले उन्हें करना होगा (यानी db की मरम्मत करते समय ऑटोोकॉम को निष्क्रिय करें)
  • अपनी समस्या की कक्षाओं को पहचानने की कोशिश करें ताकि आपको समझ में आए कि बिना परेशानी के कैसे ठीक किया जाए
  • एक डेटाबेस में बैकअप खेलने में एक रूटीन प्राप्त करें, हमेशा परीक्षण सर्वर पर एक दूसरा डेटाबेस हाथ में रखें ताकि आप बस उस पर काम कर सकें
  • क्योंकि याद रखें: यदि कुछ पूरी तरह से विफल हो जाता है, तो आपको किसी भी संभव के रूप में तेजी से फिर से उठने और चलने की आवश्यकता है

खैर, यह अब मैं सोच सकता हूं। साहसिक मार्ग अपनाएं और आप मेरे लिए # 1 देखें। ;-)


मैं ऑटोकॉमिट के उल्लेख को जोड़ना चाहूंगा, क्योंकि यह एक महत्वपूर्ण सुरक्षा तंत्र है। यदि आप डेटाबेस से सीधे कनेक्ट हो रहे हैं, तो आप आमतौर पर db कनेक्शन पैरामीटर में स्वतः पूर्णता बंद कर सकते हैं। अन्यथा (डीबी फ्रंट-एंड उत्पाद), आपको एप्लिकेशन सेटिंग की तलाश करनी पड़ सकती है।
माइक मोनेट ऑक्ट

3

शायद किसी भी डिलीट या ड्रॉप का उपयोग न करने पर विचार करें। या शायद उपयोगकर्ता अनुमतियों को कम करें ताकि केवल एक विशेष DB उपयोगकर्ता चीजों को हटा / छोड़ सके।


3

यदि आप Oracle या किसी अन्य डेटाबेस का उपयोग कर रहे हैं, जो COMMIT करने से पहले अपने परिवर्तनों को सत्यापित करता है।


आपके लेन-देन के लंबित रहने के दौरान रिकॉर्ड लॉक होने की वजह से आपको सावधान रहना चाहिए।
ग्रेग ओगल

मैं आमतौर पर ओरेकल के लिए SQL डेवलपर का उपयोग करता हूं और इसके निष्पादन के बाद भी स्वचालित रूप से कभी भी प्रतिबद्ध नहीं होता। इसलिए हमारे पास एक पूर्वावलोकन है और फिर प्रतिबद्ध है। शांत सुविधा !!
lakshminb7 14

3

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




2

@ वेन ने जो कहा, उस पर जोड़ने के लिए , WHEREकिसी तालिका DELETEया UPDATEविवरण में तालिका नाम से पहले अपना लिखें ।


2

वापस अपने डेटा। सीखा कि नियमित आधार पर ग्राहक डेटाबेस के साथ काम करने का एक कठिन तरीका।


2

हमेशा एक प्रयोग करने वाला क्लॉज जोड़ें।


2

मेरा नियम (एक ऐप डेवलपर के रूप में): इसे मत छुओ! यही कारण है कि प्रशिक्षित DBAs हैं। बिल्ली, मैं भी इसे छूने की अनुमति नहीं चाहता। :)


2

पर्यावरण के अनुसार अलग-अलग रंग: हमने अपने PL \ SQL डेवलपर (Oracle के लिए IDE) को सेटअप किया है ताकि जब आप उत्पादन DB में लॉगऑन करें तो सभी विंडो चमकीले लाल रंग में हों। कुछ लोग देव और परीक्षण के लिए एक अलग रंग प्रदान करने के लिए भी गए हैं।



1

हमेशा यह सुनिश्चित करने के लिए कि यह सही प्रभाव है, विकास डेटा पर चयन से परे किसी भी प्रश्न का परीक्षण करें।


1
  1. यदि संभव हो, किसी के साथ जोड़ी बनाने के लिए कहें
  2. हमेशा एंटर दबाए जाने से पहले 3 तक गिनती करें (यदि अकेला हो, क्योंकि यह आपके जोड़ीदार को संक्रमित कर देगा! "

1

यदि मैं किसी स्क्रिप्ट के साथ डेटाबेस को अपडेट कर रहा हूं, तो मैं हमेशा सुनिश्चित करता हूं कि मैंने अपनी स्क्रिप्ट की शुरुआत में एक ब्रेकपॉइंट या दो लगाए, बस अगर मैं रन से टकराता / दुर्घटना को अंजाम देता।


1

मैं आपके UPDATE से पहले BEGIN TRAN करने की सिफारिशों को जोड़ूंगा, बस वास्तव में COMMIT करना न भूलें; अगर आप अपने अनकमिज्ड ट्रांजैक्शन को खुला छोड़ देते हैं तो आप उतना ही नुकसान कर सकते हैं। अपडेट के बीच में फोन, सह-कार्यकर्ता, दोपहर के भोजन आदि से विचलित न हों या आप पाएंगे कि जब तक आप कमिट या रोलबैक नहीं करेंगे, तब तक आप सभी को लॉक किया जाएगा।


1

क्वेरी विश्लेषक में एडहॉक क्वेरीज़ लिखते समय मैं हमेशा किसी भी विनाशकारी प्रश्नों (सम्मिलित करना, अद्यतन करना, हटाना, बदलना) पर टिप्पणी करता हूं। इस तरह, उन्हें चलाने का एकमात्र तरीका है, उन्हें उजागर करना, बिना टिप्पणी किए हुए भाग का चयन करना, और F5 दबाएं।

मुझे यह भी लगता है कि यह एक अच्छा विचार है, जैसा कि पहले ही उल्लेख किया गया है, जहां आपके कथन को पहले लिखने के लिए, एक चयन के साथ, और यह सुनिश्चित करें कि आप सही डेटा को बदल रहे हैं।


1
  1. हमेशा बदलने से पहले बैक अप लें।
  2. स्क्रिप्ट के माध्यम से हमेशा मोड (जैसे। टेबल) बनाएं।
  3. हमेशा संग्रहीत प्रक्रिया के माध्यम से डेटा (जैसे। DELETE) को संशोधित करें।

1

केवल पढ़ने वाला उपयोगकर्ता बनाएं (या इसे करने के लिए DBA प्राप्त करें) और केवल DB को देखने के लिए उस उपयोगकर्ता का उपयोग करें। स्कीमा में उचित अनुमतियाँ जोड़ें ताकि आप संग्रहीत प्रक्रियाओं / विचारों / ट्रिगर / आदि की सामग्री देख सकें। लेकिन उन्हें बदलने की क्षमता नहीं है।

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