2008-09-04 6 views
24

उदाहरण के लिए, मैंने एक इनओडीबी तालिका में एक MEDIUMTEXT फ़ील्ड पर एक इंडेक्स बनाने के लिए एक अल्टर टेबल स्टेटमेंट जारी किया जिसमें 134k पंक्तियां हैं जहां इंडेक्स का आकार 255 बाइट था और फ़ील्ड में डेटा का औसत आकार 30k है। यह आदेश पिछले 15 मिनट या उससे भी अधिक समय तक चल रहा है (और डेटाबेस पर चलने वाली एकमात्र चीज है)। क्या यह निर्धारित करने के लिए कोई तरीका है कि यह 5 मिनट, 5 घंटे या 5 दिनों के करीब खत्म होने जा रहा है?क्या MySQL में एक वैकल्पिक तालिका कथन की प्रगति को देखने का कोई तरीका है?

उत्तर

3

यह स्पष्ट रूप से एक बहुत ही आम अनुरोध है - 2005 तक bugs.mysql.com पर अनुरोध किया गया था। यह ओरेकल में पहले से मौजूद है, और इसे उपयोगी के रूप में सूचीबद्ध किया गया है, लेकिन "it is not a simple thing to do, so don't expect it to be implemented soon."। हालांकि वह 2005 था :)

यह कहा गया है कि मूल प्रश्न पूछने वाले चैप ने बाद में patch को MySQL 5.0 के लिए जारी किया, जो 4.1 में बैकपोर्ट किया गया था, जो आपकी मदद कर सकता है।

18

मैं इन 2 प्रश्नों को निष्पादित करने में सक्षम था और पता लगाता हूं कि कितनी पंक्तियां स्थानांतरित की जा रही हैं।

select count(*) from `myoriginalrable`; 
select count(*) from `#sql-1e8_11ae5`; 
इस

, डिस्क पर फ़ाइल के आकार की तुलना से रास्ता अधिक उपयोगी था MyISAM से बदल रहा है InnoDB क्योंकि आदि पंक्ति आकार बदल जाता है।

+3

देखें कैसे आप अस्थायी तालिका कि बदलने आदेश बनाता है के नाम पर मिला? – fixxxer

+2

अस्थायी तालिका का नाम फाइल सिस्टम में शेष तालिकाओं के साथ पाया जा सकता है। – carillonator

+0

उन सभी से सबसे अच्छा जवाब, धन्यवाद! – Enerccio

11

इनो डीबी टेबल के मामले में, कोई भी अल्टर टेबल करने वाले लेनदेन को खोजने के लिए SHOW ENGINE INNODB STATUS का उपयोग कर सकता है और जांच सकता है कि TX कितनी पंक्ति लॉक रखती है। यह संसाधित पंक्तियों की संख्या है। यहाँ विस्तार से समझाया:

http://gabrielcain.com/blog/2009/08/05/mysql-alter-table-and-how-to-observe-progress/

इसके अलावा MariaDB 5.3 और बाद (ALTER तालिका सहित) कुछ कार्यों के लिए प्रगति रिपोर्ट करने के लिए सुविधा है। देखें:

http://kb.askmonty.org/en/progress-reporting/

+0

मारियाडीबी 5.3+ और पर्कोना सर्वर – Go4It

+1

एफवाईआई कि ब्लॉग पोस्ट इंगित करता है कि 'शो इंजन इननोड स्टेटस' चाल केवल MySQL 5.0 के लिए काम करती है। – cbmanica

1

pt-ऑनलाइन-स्कीमा परिवर्तन Percona द्वारा शेष समय अनुमान दिखाता है। डिफ़ॉल्ट रूप से यह शेष समय अनुमान और हर 30 सेकंड में प्रगति प्रतिशत प्रिंट करता है।

इसमें एल्टर कमांड को चलाने के बजाए अतिरिक्त फ़ंक्शन भी हैं।

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

3

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

select 
beginsd now, qRuns, qTime, tName, trxStarted, trxTime, rows, modified, locked, hoursLeftL, estimatedEndL, modifiedPerSecL, avgRows, estimatedEndG, modifiedPerSecG, hoursLeftG 
from (
select 
    (@tname:='<table>') tName, 
    @beginsd:=sysdate() beginsd, 
    @trxStarted:=(select trx_started from information_schema.innodb_trx where trx_query like concat('alter table %', @tname, '%')) trxStarted, 
    @trxTime:=timediff(@beginsd, @trxStarted) trxTime, 
    @rows:=(select table_rows from information_schema.tables where table_name like @tname) rows, 
    @runs:=(ifnull(@runs, 0)+1) qRuns, 
    @rowsSum:=(ifnull(@rowsSum, 0)[email protected]), 
    round(@avgRows:=(@rowsSum/@runs)) avgRows, 
    @modified:=(select trx_rows_modified from information_schema.innodb_trx where trx_query like concat('alter table %', @tname, '%')) modified, 
    @rowsLeftL:=(cast(@rows as signed) - cast(@modified as signed)) rowsLeftL, 
    round(@rowsLeftG:=(cast(@avgRows as signed) - cast(@modified as signed)), 2) rowsLeftG, 
    @locked:=(select trx_rows_locked from information_schema.innodb_trx where trx_query like concat('alter table %', @tname, '%')) locked, 
    @endsd:=sysdate() endsd, 
    -- 
    time_to_sec(timediff(@endsd, @beginsd)) qTime, 
    @modifiedInc:=(cast(@modified as signed) - cast(@p_modified as signed)) modifiedInc, 
    @timeInc:=time_to_sec(timediff(@beginsd, @p_beginsd)) timeInc, 
    round(@modifiedPerSecL:=(@modifiedInc/@timeInc)) modifiedPerSecL, 
    round(@modifiedPerSecG:=(@modified/time_to_sec(@trxTime))) modifiedPerSecG, 
    round(@minutesLeftL := (@rowsLeftL/@modifiedPerSecL/60)) minutesLeftL, 
    round(@minutesLeftG := (@rowsLeftG/@modifiedPerSecG/60)) minutesLeftG, 
    round(@hoursLeftL := (@minutesLeftL/60), 2) hoursLeftL, 
    round(@hoursLeftG := (@minutesLeftG/60), 2) hoursLeftG, 
    (@beginsd + INTERVAL @minutesLeftL MINUTE) estimatedEndL, 
    (@beginsd + INTERVAL @minutesLeftG MINUTE) estimatedEndG, 
    -- 
    @p_rows:[email protected], 
    @p_modified:[email protected], 
    @p_beginsd:[email protected] 
) sq; 
0

Percona Server, कुछ संवर्द्धन के साथ MySQL के एक शाखायुक्त संस्करण है, यह सुविधा है।

आप ROWS_SENT और ROWS_EXAMINED के लिए SHOW PROCESSLIST में अतिरिक्त कॉलम देख सकते हैं। उदाहरण के लिए, यदि आपकी तालिका में 1000000 पंक्तियां हैं, और आप 650000 के ROWS_EXAMINED देखते हैं, तो यह 65% समाप्त हो गया है।

http://www.percona.com/doc/percona-server/5.6/diagnostics/process_list.html