प्रतिनिधि इंटरव्यू विषय

डेटा इंजीनियरिंग इंटरव्यू: सुरक्षित स्कीमा इवोल्यूशन के लिए MySQL इनविजिबल कॉलम्स का उपयोग कैसे करें?

डेटामध्यम
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक पुरानी सर्विस ऐसे MySQL टेबल पर बड़े पैमाने पर SELECT * का उपयोग करती है जिसमें एक नए फ़ील्ड की आवश्यकता है। समझाएं कि एक इनविजिबल कॉलम कम्पैटिबिलिटी जोखिम को कैसे कम करता है, और आप राइट्स, इंडेक्स, बैकअप और रेप्लिकेशन को कैसे मान्य (validate) करेंगे।

प्रॉम्प्ट और संदर्भ

एक पुराना क्लाइंट SELECT * और पोजिशनल रिजल्ट डिकोडिंग पर निर्भर करता है, जबकि एक नई सर्विस को एक अतिरिक्त फ़ील्ड की आवश्यकता है। समझाएं कि MySQL 8.4 का INVISIBLE कॉलम पुराने और नए क्लाइंट्स को एक साथ काम करने की अनुमति कैसे देता है, जिसमें स्पष्ट रेफरेंस, राइट डिफॉल्ट्स, इंडेक्स, बैकअप और रोलबैक सीमाएं शामिल हैं।

इंटरव्यूअर क्या मूल्यांकन करता है

  • क्या आप समझते हैं कि इनविजिबिलिटी इम्प्लिसिट कॉलम एक्सपेंशन को बदलती है, स्टोरेज या कंस्ट्रेंट भागीदारी को नहीं।
  • क्या आप SELECT *, स्पष्ट सूचियों (explicit lists), INSERT सूचियों और CREATE TABLE ... SELECT के बीच अंतर करते हैं।
  • क्या आप प्राइमरी और यूनिक कीज, फॉरेन कीज, चेक्स, बाइनरी लॉगिंग और बैकअप रिस्टोर पर विचार करते हैं।
  • क्या आप चरणबद्ध रोलआउट, ऑब्जर्वेबिलिटी और VISIBLE प्रश्नों पर अंतिम बदलाव की योजना बना सकते हैं।

पूछने योग्य स्पष्टीकरण प्रश्न

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

30-सेकंड का उत्तर

एक इनविजिबल कॉलम अभी भी टेबल का हिस्सा होता है, लेकिन SELECT * और tbl.* इसे छोड़ देते हैं; स्पष्ट संदर्भ इसे पढ़ और लिख सकते हैं। फ़ील्ड को INVISIBLE के रूप में जोड़ें ताकि पुराने परिणाम का आकार स्थिर रहे, जबकि नए क्लाइंट पढ़ने और बैकफ़िल के लिए स्पष्ट सूचियों का उपयोग करते हैं। डिफॉल्ट्स, यूनिक इंडेक्स, फॉरेन कीज, CDC, बैकअप रिस्टोर और CREATE TABLE ... SELECT विजिबिलिटी का परीक्षण करें। प्रत्येक उपभोक्ता के माइग्रेट होने के बाद, विजिबिलिटी को VISIBLE में बदलें। यह एक कम्पैटिबिलिटी टूल है, ऑथराइजेशन या डेटा आइसोलेशन नहीं।

चरण-दर-चरण गहन विश्लेषण

1. इनविजिबल-कॉलम सिमेंटिक्स की पुष्टि करें

MySQL 8.4 में, जब तक स्पष्ट रूप से नामित न किया जाए, एक इनविजिबल कॉलम SELECT *, tbl.* और TABLE परिणामों में अनुपस्थित रहता है। यह स्टोरेज, इंडेक्स या कंस्ट्रेंट्स को नहीं छिपाता है, और यह कॉलम-स्तरीय एक्सेस कंट्रोल नहीं है।

2. कम्पैटिबल DDL डिज़ाइन करें

ALTER TABLE ... ADD COLUMN ... INVISIBLE का उपयोग करें और पुराने राइट्स के लिए एक सुरक्षित डिफॉल्ट या NULL व्यवहार चुनें। कम से कम एक विजिबल कॉलम रखें। नए क्लाइंट्स को * अनुबंध को जारी रखने के बजाय स्पष्ट सूचियों के साथ शुरुआत करनी चाहिए।

3. रीड्स, राइट्स और कंस्ट्रेंट्स को मान्य करें

पुराने क्लाइंट्स को मूल कॉलम सेट प्राप्त होना चाहिए। नए क्लाइंट स्पष्ट रूप से फ़ील्ड को पढ़ते और लिखते हैं; एक छोड़े गए इनविजिबल कॉलम को MySQL का इम्प्लिसिट डिफॉल्ट व्यवहार प्राप्त होता है। प्राइमरी, यूनिक, फॉरेन-की और चेक कंस्ट्रेंट्स अभी भी लागू होते हैं, इसलिए डुप्लिकेट्स, कैस्केड्स और असफल लेनदेन का परीक्षण करें।

4. रेप्लिकेशन और पाइपलाइनों का ध्यान रखें

रो इवेंट्स में इनविजिबल कॉलम्स को विजिबल कॉलम्स की तरह माना जाता है; उनका समावेश binlog_row_image जैसी सेटिंग्स पर निर्भर करता है। SELECT * से रेप्लिकेशन का अनुमान लगाने के बजाय वास्तविक कॉलम सूचियों के साथ CDC, ETL, ORM मैपिंग और डेटा-क्वालिटी जांच का परीक्षण करें।

5. सबसे छोटा माइग्रेशन स्क्रिप्ट लिखें

sql
ALTER TABLE orders
  ADD COLUMN risk_score DECIMAL(5, 2) NULL INVISIBLE;

SELECT order_id, status, risk_score
FROM orders
WHERE order_id = ?;

ALTER TABLE orders
  MODIFY COLUMN risk_score DECIMAL(5, 2) NULL VISIBLE;

पहले DDL चलाएं, स्पष्ट रीड्स और बैकफ़िल तैनात करें, पुराने-क्लाइंट त्रुटियों और CDC लैग का निरीक्षण करें, और केवल तभी विजिबिलिटी स्विच करें। प्रोडक्शन योजना में लॉक्स, ऑनलाइन-DDL समर्थन और रोलबैक विंडो का भी आकलन किया जाना चाहिए।

6. बैकअप, टेबल निर्माण और रिस्टोर की जांच करें

mysqldump और SHOW CREATE TABLE इनविजिबिलिटी मेटाडेटा को सुरक्षित रखते हैं। किसी ऐसे पुराने सर्वर पर रिस्टोर करना जो इस सुविधा का समर्थन नहीं करता है, कॉलम को विजिबल बना सकता है क्योंकि संस्करण टिप्पणियों (version comments) को अनदेखा कर दिया जाता है। CREATE TABLE ... SELECT में एक स्पष्ट इनविजिबल कॉलम लक्ष्य में विजिबल हो सकता है जब तक कि परिभाषा INVISIBLE को दोहराती नहीं है।

उच्च-गुणवत्ता वाला नमूना उत्तर

मैं एक इनविजिबल कॉलम को कम्पैटिबिलिटी टूल के रूप में मानूंगा, सुरक्षा सीमा के रूप में नहीं। पहले सत्यापित करें कि क्या पुराने क्लाइंट वास्तव में SELECT * पर निर्भर हैं, फिर ऑनलाइन DDL पथ के माध्यम से न्यूलेबल या सुरक्षित-डिफॉल्ट सिमेंटिक्स के साथ एक INVISIBLE कॉलम जोड़ें। पुराने क्लाइंट अपने मूल परिणाम आकार को बनाए रखते हैं; नए क्लाइंट्स को रीड्स, बैकफ़िल और राइट्स के लिए स्पष्ट सूचियों का उपयोग करना चाहिए। परीक्षणों में डिफॉल्ट्स, स्पष्ट अपडेट, प्राइमरी और यूनिक टकराव, फॉरेन कीज और चेक्स, ORM मैपिंग, binlog_row_image के तहत CDC व्यवहार, बैकअप रिस्टोर और CREATE TABLE ... SELECT विजिबिलिटी शामिल हैं। माइग्रेशन के दौरान, त्रुटि दर, रेप्लिकेशन लैग और डेटा अखंडता की निगरानी करें। प्रत्येक उपभोक्ता द्वारा एक स्थिर स्पष्ट अनुबंध का उपयोग करने के बाद, फ़ील्ड को VISIBLE में स्विच करें। रोलबैक कॉलम और डेटा को बनाए रखते हुए एप्लिकेशन संस्करण को पुनर्स्थापित कर सकता है; क्रॉस-वर्जन रिस्टोर के लिए समर्थन और डंप मेटाडेटा की जांच की आवश्यकता होती है। लंबी अवधि में, SELECT * को हटा दें ताकि परिणाम अनुबंध स्पष्ट हो।

सामान्य गलतियाँ

  • यह मान लेना कि इनविजिबल कॉलम्स कीज, चेक्स, फॉरेन कीज या बाइनरी लॉगिंग में भाग नहीं लेते हैं।
  • केवल SELECT * का परीक्षण करना और स्पष्ट रीड्स, राइट्स और ORM मैपिंग को छोड़ देना।
  • इनविजिबिलिटी को कॉलम अनुमतियों, गोपनीयता या डेटा आइसोलेशन के रूप में मानना।
  • CREATE TABLE ... SELECT, डंप रिस्टोर और पुराने-सर्वर व्यवहार की अनदेखी करना।
  • नए क्लाइंट्स में SELECT * का उपयोग जारी रखना और बाद में कम्पैटिबिलिटी समस्या को फिर से पैदा करना।

फॉलो-अप प्रश्न और उत्तर

क्या एक इनविजिबल कॉलम हर SELECT * कम्पैटिबिलिटी समस्या को हल करता है?

नहीं। यह लौटाए गए सेट को स्थिर करता है, लेकिन पोजिशनल डिकोडिंग, ORM रिफ्लेक्शन, रिपोर्ट्स और CDC को अभी भी व्यक्तिगत सत्यापन की आवश्यकता होती है। दीर्घकालिक समाधान स्पष्ट कॉलम सूचियां हैं।

जब इनविजिबल कॉलम को छोड़ दिया जाता है तो इन्सर्ट पर क्या होता है?

यह MySQL का इम्प्लिसिट डिफॉल्ट व्यवहार प्राप्त करता है। एक विशिष्ट मान लिखने के लिए, कॉलम को स्पष्ट रूप से नामित करें और NOT NULL, यूनिक और चेक कंस्ट्रेंट्स का परीक्षण करें।

आपको इसे वापस VISIBLE में कब बदलना चाहिए?

रीड्स, राइट्स, CDC, बैकअप और रिपोर्ट्स द्वारा एक स्थिर स्पष्ट अनुबंध का उपयोग करने और मॉनिटरिंग व रोलबैक अभ्यास पास होने के बाद। फिर एक चरणबद्ध रोलआउट में विजिबिलिटी बदलें।

सार्वजनिक स्रोत

संबंधित प्रश्न