INT से BIGINT तक 600GB तालिका अनुक्रमित कुंजी डेटाटाइप को बदलने का सबसे तेज़ तरीका


13

मुझे एक डेटाटाइप को INT से BIGINT में 600GB MySQL टेबल में बदलना होगा। कॉलम में एक अद्वितीय सूचकांक है। मैं अहस्ताक्षरित INT के साथ अच्छा हो सकता है, लेकिन मुझे लगता है कि उस या BIGINT को बदलने से बहुत अधिक दर्द होगा। तालिका का इंजन InnoDB है। क्या आसान होगा:

  1. तालिका में परिवर्तन
  2. नकल संरचना और INSERT INTO (SELECT *)
  3. डंपिंग टेबल और डंप फ़ाइल टेबल परिभाषाओं को बदलना
  4. और कुछ?

अद्यतन: अनुरोध के अनुसार, MySQL ver 5.5.15, कोई विदेशी कुंजी नहीं है और तालिका बनाएँ:

 CREATE TABLE `tbl` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) NOT NULL,
    `created_at` datetime NOT NULL,
    `tid` bigint(20) NOT NULL,
    `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `f` tinyint(1) NOT NULL,
    `i_id` bigint(20) NOT NULL,
    `ir_id` int(11) NOT NULL,
    `r_c` int(11) NOT NULL,
    `r` tinyint(1) NOT NULL,
    `e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `t` varchar(5) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `user` (`user_id`,`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1657146169 DEFAULT CHARSET=utf8

दर्द को परिभाषित करें, कम से कम समय लें ....? सबसे तेज परिणाम?

@AlecTeal सबसे कम समय लें
Noam

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

1
MySQL का कौन सा संस्करण? यह कुछ संस्करणों के रूप में मायने रखता है ALTER TABLE ONLINE। क्या आपके पास इस कॉलम को संदर्भित करने वाली विदेशी कुंजियाँ हैं? यदि आप SHOW CREATE TABLE tablename;आउटपुट दिखाते हैं तो यह मदद करेगा ।
ypercube y

2
यदि छोटे क्षेत्र के नामों ने तालिका आकार को कम करने में मदद की, तो यह 600 एमबी होगा
जॉन ऑफ ऑल ट्रेड्स

जवाबों:


2

मान लें कि आपकी तालिका में कोई ट्रिगर नहीं है, तो आपको pt-online-schema-changeइसका उपयोग करने पर विचार करना चाहिए क्योंकि यह आपको तालिका को लॉक किए बिना बदल देगा।

तालिका के आकार को देखते हुए इसमें अभी भी काफी समय लगेगा।

इसके अलावा, इस विधि के साथ या ALTER TABLEआपको यह सुनिश्चित करने की आवश्यकता होगी कि आपके पास तालिका के दो प्रतियों का समर्थन करने के लिए 600 जीबी अतिरिक्त डिस्क स्थान है, जबकि इसे फिर से बनाया जा रहा है।


किसी भी समय अनुमान है? (मुझे पता है कि यह कई कारकों पर निर्भर करता है, लेकिन अगर यू का अनुमान लगाना था, तो सीमा क्या होगी)
नोम

@ नहीं, आपको तालिका की प्रतिलिपि बनाने की आवश्यकता नहीं है। यदि आप ऑल्टर टेबल का उपयोग करते हैं तो WORST CASE यह है कि यह कॉपी करता है, यदि आप एक परिपक्व इंजन का उपयोग कर रहे हैं, तो यह अपने आप में एक नोट बना देगा कि कुछ भी पहले (फ़ाइल में कुछ स्थान या कुछ रिकॉर्ड) int का उपयोग करता है, कुछ भी पोस्ट पोस्ट का उपयोग नहीं करता है, जब तक कि बिगिन का उपयोग नहीं करता है आप अनुकूलन करते हैं।

@AlecTeal क्या आपके पास इसका कोई औपचारिक संदर्भ है?
नोआम

@ नोम मेरा जवाब देखिए।

1
@Noam मुझे लगता है कि ALTER TABLEचलाने के लिए 24 - 96 घंटे लग सकते हैं। परीक्षण परिवेश में ALTER TABLE चलाकर आप एक बेहतर अनुमान प्राप्त कर सकते हैं।
आईके वाकर

2

उपयोग pt-online-schema-changeको प्रभावित किए बिना उत्पादन पर पर्कोना टूलकिट का उपयोग करना मेरी पसंद होगी। यह आपके डेल्टास और एक लौकिक तालिका प्राप्त करने के लिए कुछ ट्रिगर जोड़ देगा जो कि ऐसा होने के बाद नाम बदल देगा।

उदाहरण:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE

पीटी जाने का रास्ता है। @Noam FYI: INT-> BIGINT माइग्रेशन ~ ~ 270GB टेबल पर बहुत सी भारी भरकम लेखन गतिविधि के साथ EC2 इंस्टेंस पर बहुत सारी पंक्तियों के साथ pt-online-स्कीमा-चेंज का उपयोग कर 64 घंटे ले लिया गया।
जकूब गोलज़िक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.