किसी डेटाबेस को सुरक्षित रूप से हटाने के लिए सर्वोत्तम अभ्यास क्या हैं?


10

हमारे पास एक "जैविक" वातावरण है, जिसका अर्थ है कि लोग न्यूनतम निरीक्षण या प्रलेखन के साथ दस वर्षों के लिए कोड पर कोडित करते हैं। मेरे द्वारा उपयोग किए जाने वाले सर्वर में कई डेटाबेस हैं जो मेरा मानना ​​है कि अब उपयोग नहीं किए जा रहे हैं; मैं उन्हें हटाना पसंद करूंगा और सिर्फ उन तीनों को छोड़ दूंगा जिनका मैं वास्तव में उपयोग करता हूं।

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

इसके अलावा, आप यह सुनिश्चित करने के लिए किन कदमों की अनुशंसा करेंगे, जैसे कि सिस्टम को अक्षम करने में एक कदम आगे बढ़ता है, कि वे समय की अवधि के लिए सुविधाजनक रूप से प्रतिवर्ती रहते हैं (उदाहरण के लिए, वस्तुओं को एकमुश्त हटाने के बजाय उनका नाम बदलें)?

धन्यवाद!


1
यह युगों के लिए एक बहुत ही सूक्ष्म प्रश्न है। ऐसे प्रश्न के लिए +1। मुझे उम्मीद है कि यह प्रश्न DBAs के बाद से एक बड़ी प्रतिक्रिया प्राप्त करता है क्योंकि ओ.टी. को बाद में अपने करियर में इस स्थिति का सामना करना चाहिए।
RolandoMySQLDBA

वाह, चारों ओर महान अंक! और RolandoMySQLDBA ने पहले से ही मेरे लिए सभी को धन्यवाद देने का ख्याल रखा है :) मैं यह देखने के लिए थोड़ी देर खुला छोड़ दूंगा कि अगर अधिक सुझाव हैं, तो मेरे पास सबसे उपयोगी उत्तर चुनने का मुश्किल काम होगा।
जॉन ऑफ ऑल ट्रेड्स

जवाबों:


4

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

उदाहरण के लिए, MySQL 5.x में, आपके पास info_schema.tables है जो इस तरह दिखता है:

mysql> desc information_schema.tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field           | Type                | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG   | varchar(512)        | NO   |     |         |       |
| TABLE_SCHEMA    | varchar(64)         | NO   |     |         |       |
| TABLE_NAME      | varchar(64)         | NO   |     |         |       |
| TABLE_TYPE      | varchar(64)         | NO   |     |         |       |
| ENGINE          | varchar(64)         | YES  |     | NULL    |       |
| VERSION         | bigint(21) unsigned | YES  |     | NULL    |       |
| ROW_FORMAT      | varchar(10)         | YES  |     | NULL    |       |
| TABLE_ROWS      | bigint(21) unsigned | YES  |     | NULL    |       |
| AVG_ROW_LENGTH  | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_LENGTH     | bigint(21) unsigned | YES  |     | NULL    |       |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES  |     | NULL    |       |
| INDEX_LENGTH    | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_FREE       | bigint(21) unsigned | YES  |     | NULL    |       |
| AUTO_INCREMENT  | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_TIME     | datetime            | YES  |     | NULL    |       |
| UPDATE_TIME     | datetime            | YES  |     | NULL    |       |
| CHECK_TIME      | datetime            | YES  |     | NULL    |       |
| TABLE_COLLATION | varchar(32)         | YES  |     | NULL    |       |
| CHECKSUM        | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_OPTIONS  | varchar(255)        | YES  |     | NULL    |       |
| TABLE_COMMENT   | varchar(2048)       | NO   |     |         |       |
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.01 sec)

स्तंभ UPDATE_TIME ने पिछली बार किसी भी INSERT, UPDATE, या DELETE को अंतिम बार टेबल पर लागू किया गया था। जब प्रत्येक डेटाबेस अंतिम बार एक्सेस किया गया था, तो आप यह पता लगाने के लिए इन तरह के प्रश्नों को चला सकते थे:

पिछली बार प्रत्येक डेटाबेस में एक तालिका एक्सेस की गई थी:

SELECT table_schema,MAX(update_time) last_accessed
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND update_time IS NOT NULL
GROUP BY table_schema;

पिछली बार किसी भी डेटाबेस में एक टेबल एक्सेस की गई थी:

SELECT MAX(update_time) last_accessed FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql');

अंतिम 10 तारीखों को एक तालिका एक्सेस की गई:

SELECT * FROM
(SELECT * FROM
(SELECT last_accessed,COUNT(1) access_count
FROM (SELECT DATE(update_time) last_accessed
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND update_time IS NOT NULL) A
GROUP BY last_accessed) AA
ORDER BY last_accessed DESC) AAA
LIMIT 10;

MySQL से ऐसे मेटाडेटा कैसे प्राप्त करें, ये कुछ उदाहरण हैं। मुझे यकीन है कि Oracle और SQL सर्वर के समान या बेहतर तरीके हैं।

एक बार जब आप निश्चित रूप से कितनी बार या शायद ही कभी किसी डेटाबेस (या स्कीमा) को एक्सेस करते हैं, तो आपको डेटा के अलावा स्कीमा की प्रतियों के साथ-साथ पुराने डेटाबेस को मैन्युअल रूप से डंप / एक्सपोर्ट करना चाहिए। कृपया क्षमा करें कि मेरा उत्तर डीबी अज्ञेयवादी नहीं है। SQLServer और Oracle DBAs को अपने उत्तर यहां भी देने चाहिए, क्योंकि स्कीमा की अवधारणा MySQL में डेटाबेस संग्रह में संग्रहित की जाती है, लेकिन SQLServer और Oracle में बहुत सख्ती से पालन किया जाता है।


एक बहुत अच्छी टिप। मैं अपडेट पर नज़र रखने के लिए प्रश्नों का एक साथ रखूँगा। भावी पीढ़ियों के लाभ के लिए, एमएस SQL ​​के लिए स्कीमा स्तर पर इस तरह की एक क्वेरी है:SELECT S.name, MAX(T.modify_date) AS MostRecentDataModification FROM sys.schemas AS S INNER JOIN sys.tables AS T ON S.schema_id = T.schema_id GROUP BY S.name
जॉन ऑफ ऑल ट्रेड्स

6

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

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

मैं आपकी सभी नौकरियों के बारे में भी पूछूंगा और सुनिश्चित करूंगा कि कोई भी उस डीबी की ओर इशारा न करे

यदि आप SQL (2008 R2 एंटरप्राइज़) का सही संस्करण है, तो आप SQL ऑडिट का भी उपयोग कर सकते हैं।

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


बहुत अच्छा जवाब, विशेष रूप से लॉगिन ट्रिगर के विषय में !!! MySQL के पास ऐसा कुछ नहीं है, हालांकि मैं इसे सामान्य लॉग को सक्रिय करने और निर्दिष्ट आईपी पते और डेटाबेस की जांच कर सकता हूं। तुम्हारा एक +1 है !!!
रोलैंडमाइसीडीडीबीए

4

साथ ही, यह सुनिश्चित करने के लिए कि आप क्या कदम उठाएंगे, जैसे कि सिस्टम को अक्षम करने में एक कदम आगे बढ़ता है, कि वे समय की अवधि के लिए सुविधाजनक रूप से प्रतिवर्ती रहते हैं

SQL सर्वर में, आप डेटाबेस " ऑफ़लाइन " ले सकते हैं जो डेटाबेस को मौजूद छोड़ देता है, लेकिन संभव कोड के माध्यम से इसे कनेक्ट करना संभव बनाता है। यदि एक डेटाबेस "ऑफ़लाइन" है, तो यह अभी भी उपलब्ध है और मिनटों के भीतर प्रतिवर्ती है।

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

उस कंपनी में, हमारे पास डेटाबेस के "मालिक" के साथ एक स्प्रेडशीट थी - उत्पाद के लिए जिम्मेदार एक व्यक्ति। जबकि अन्य लोग तालिकाओं की संरचना के लिए अपडेट कर सकते थे, "स्वामी" एक व्यक्ति था जब किसी भी प्रश्न को पूछा जाना था। यदि मालिक ने कंपनी को छोड़ दिया (पिछले साल तक दुर्लभ), किसी को उनके जाने से पहले नए मालिक के रूप में सौंपा जाएगा।

अन्य कंपनियों में, हमने डेटाबेस को एक चौथाई के लिए ऑफ़लाइन ले लिया है, अगर वे बिना किसी ब्रेकिंग (जैसे कि महीने / त्रैमासिक रिपोर्टिंग) के साथ ऑफ़लाइन रहते हैं, तो वे एक अंतिम बार बैकअप लेते हैं और हटाए जाते हैं। यह किसी को बाद में वापस आने और डेटाबेस को पुनर्स्थापित करने की अनुमति देता है (जिसमें कुछ मिनट लगते हैं) उन स्थितियों के लिए जिनके पास "ओह जैसी कहानियां हैं, जो कि जोंस प्रोजेक्ट के लिए थी जिसे हमें अलग सेट करना पड़ा था जब तक कि हम फ्रेड प्रोजेक्ट समाप्त हो गए।"


अच्छा मिनी केस स्टडी, +1 !!!
रोलैंडमाइसीडीडीबीए

@ भाषा: मुझे लगता है कि मैंने कई साल पहले इस सुविधा का उपयोग किया था, लेकिन यह इस तरह की भूमिका के लिए एकदम सही है, इसलिए मुझे याद दिलाने के लिए बहुत धन्यवाद।
जॉन ऑफ ऑल ट्रेड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.