INT से BIGINT के उत्पादन में प्राथमिक कुंजी स्तंभ (MySQL 5.6.19a)


20

हमारे उत्पादन डेटाबेस में कुछ INNODB टेबल 2147483647 के INT AUTO_INCREMENT की सीमा से टकराने वाले हैं और हमें उन्हें BIGINT में बदलने की आवश्यकता है अन्यथा लिखना विफल होना शुरू हो जाएगा।

तालिकाओं में एक उत्पादन MySQL 5.6.19a डेटाबेस अमेज़न आरडीएस पर चल रहा है।

हम हर समय हो रहे उत्पादन रीड्स और आवेषण को बाधित किए बिना इस तरह से कैसे कर सकते हैं?

अतिरिक्त तालिका MYTABLEबदलें पूरी तरह से id idस्वचालित नहीं है;

यहाँ तालिका के लिए DDL है:

CREATE TABLE `MYTABLE` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `siteId` int(11) NOT NULL,
  `filter` varchar(10) NOT NULL DEFAULT 'ALL',
  `date` varchar(10) NOT NULL,
  `cards` varchar(250) NOT NULL,
  `apples` varchar(45) NOT NULL,
  `carrots` varchar(45) NOT NULL,
  `corn` varchar(45) NOT NULL,
  `peas` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique` (`siteId`,`filter`,`date`,`cards`),
  KEY `date_k` (`date`),
  KEY `cards_k` (`cards`),
  KEY `apples_k` (`apples`),
  KEY `siteId_k` (`siteId`)
) ENGINE=InnoDB AUTO_INCREMENT=1748961482 DEFAULT CHARSET=utf8

जवाबों:


22

यदि आपके पास पर्याप्त जगह है, तो आप वास्तविक तालिका की एक प्रति बना सकते हैं और उस पर काम कर सकते हैं:

CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;

फिर आप कॉलम को इच्छानुसार बदल सकते हैं:

ALTER TABLE tbl_name MODIFY COLUMN col_name BIGINT AUTO_INCREMENT;

एक बार प्रक्रिया पूरी हो जाने के बाद, आप तालिकाओं का नाम बदल सकते हैं:

RENAME TABLE tbl_name TO new_tbl_name, tbl_name2 TO new_tbl_name2;

फिर मूल तालिका को छोड़ दें, और आपके पास बीजाणु परिणाम होना चाहिए।


मैंने इस दृष्टिकोण का उपयोग किया क्योंकि मैं कॉपी करते समय तालिका (जो सभी बैच मोड हैं) को बंद करने में सक्षम था। लगभग 36 घंटे लगे।
मार्क हैनसेन

और आप इन तीनों को एक लेन-देन में रखना चाहते हैं। (लॉक / अनलॉक)
स्लावोमिर लेनार्ट

4

percona टूलकिट जाने का तरीका है, कम से कम यदि आप समय में सुपर शॉर्ट नहीं हैं। रूपांतरण ने हमारी तालिका (500Gb, मास्टर-स्लेव सेटअप) पर ले लिया जब हमने इसे 24h से थोड़ा अधिक परीक्षण किया, उत्पादन में इसे (बेहतर हार्डवेयर के साथ) लगभग 1 महीने (अजीब सिदेनोट हमारे पास लगभग 30 दिन पहले था जब हम बाहर निकलेंगे। आईडी, इसलिए हमने पहले से ही योजना बी और सी की योजना शुरू की, ऑफ़लाइन बैकअप के साथ काम करना, दासों को दूर करना, ...)। देरी मुख्य रूप से दासों की ओर हो रही प्रतिकृति के इंतजार के कारण हुई (हमने अधिकतम 50 सेकंड के अंतराल की अनुमति दी)। समवर्ती धागे की संख्या को सीमित करना भी सुनिश्चित करें। हमारे पास 2M आवेषण / दिन और कई मिलियन रीड्स हैं।

यह भी जान लें कि एक बार कोवेशन शुरू होने के बाद आप इसे रोक नहीं सकते हैं (या कम से कम हमें इसे पुनः आरंभ करने का कोई तरीका नहीं मिला) :-(


1

कुंआ....

KEY TOP_QUERIES_LAST_30DAYS_fk (siteId) प्राथमिक कुंजी के साथ निरर्थक है, इसलिए आप इसे भी छोड़ सकते हैं।

INT UNSIGNED आपको 4 बिलियन में मिलेगा, क्या यह पर्याप्त होगा?

बदलने पर विचार filterएक करने के लिए ENUM

क्या आपके पास 1.75 बिलियन पंक्तियाँ हैं? या आपने बहुत सारे आईडी जलाए हैं? यदि हां, तो शायद हम इसे ठीक कर सकते हैं? उदाहरण के लिए REPLACEऔर INSERTआईडी के टॉस के कुछ जायके । INSERT...ON DUPLICATE KEYआमतौर पर बदल सकते हैं REPLACE। 2-चरणीय प्रक्रिया INSERT IGNOREआईडी के जलने से बच सकती है ।

सवाल पर वापस ...

देखें कि क्या पीटी-ऑनलाइन-स्कीमा-परिवर्तन चाल चलेगा: http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html


क्या मैं अमेज़न आरडीएस के साथ पेरकोना का उपयोग कर सकता हूं? हां, हमने बहुत सी आईडी "जला दी" है, तालिका में वास्तव में लगभग 330 मिलियन पंक्तियाँ हैं।
मार्क हैनसेन

मैं pt और RDS के बारे में नहीं जानता। यदि आप जलने को खत्म कर सकते हैं, तो कमरे से बाहर निकलने से पहले आपके पास एक और ~ 330M आईडी है।
रिक जेम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.