Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL ALTER TABLE छोटी तालिका में अधिक समय ले रहा है

मुझे लगता है कि ALTER TABLE मेटाडेटा लॉक पर प्रतीक्षा कर रहा है, और इसने वास्तव में कुछ भी बदलना शुरू नहीं किया है।

मेटाडेटा लॉक क्या है?

जब आप किसी तालिका के विरुद्ध SELECT/INSERT/UPDATE/DELETE जैसी कोई क्वेरी चलाते हैं, तो उसे मेटाडेटा लॉक प्राप्त करना होगा। वे प्रश्न एक दूसरे को अवरुद्ध नहीं करते हैं। उस प्रकार की कितनी भी क्वेरीज़ में मेटाडेटा लॉक हो सकता है।

लेकिन डीडीएल स्टेटमेंट जैसे क्रिएट/ऑल्टर/ड्रॉप/ट्रंकेट/रीनेम या इवेंट क्रिएट ट्रिगर या लॉक टेबल्स, को एक एक्सक्लूसिव हासिल करना होगा। मेटाडेटा लॉक। यदि कोई लेन-देन अभी भी मेटाडेटा लॉक रखता है, तो DDL स्टेटमेंट प्रतीक्षा करता है।

आप इसे प्रदर्शित कर सकते हैं। दो टर्मिनल विंडो खोलें और प्रत्येक विंडो में mysql क्लाइंट खोलें।

  • विंडो 1:CREATE TABLE foo ( id int primary key );
  • विंडो 1:START TRANSACTION;
  • विंडो 1:SELECT * FROM foo; -- इससे कोई फ़र्क नहीं पड़ता कि तालिका में कोई डेटा नहीं है

  • विंडो 2:DROP TABLE foo; -- ध्यान दें कि यह इंतज़ार कर रहा है

  • विंडो 1:SHOW PROCESSLIST;

    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    | Id  | User | Host      | db   | Command | Time | State                           | Info             | Rows_sent | Rows_examined |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    | 679 | root | localhost | test | Query   |    0 | starting                        | show processlist |         0 |             0 |
    | 680 | root | localhost | test | Query   |    4 | Waiting for table metadata lock | drop table foo   |         0 |             0 |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    

आप ड्रॉप टेबल को टेबल मेटाडेटा लॉक की प्रतीक्षा करते हुए देख सकते हैं। बस इंतज़ार कर रहा हूं। यह कब तक इंतजार करेगा? जब तक विंडो 1 में लेनदेन पूरा नहीं हो जाता। अंततः lock_wait_timeout . के बाद यह समय समाप्त हो जाएगा सेकंड (डिफ़ॉल्ट रूप से, यह 1 वर्ष . पर सेट है )।

  • विंडो 1:COMMIT;

  • विंडो 2:ध्यान दें कि यह प्रतीक्षा करना बंद कर देता है, और यह तुरंत तालिका को छोड़ देता है।

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysqli कनेक्शन समारोह के अंदर काम नहीं कर रहा?

  2. 15 मिनट के अंतराल से समूह mysql क्वेरी

  3. इनर जॉइन स्टेटमेंट में अस्पष्ट कॉलम

  4. MySQL ड्रॉप डेटाबेस विशेषाधिकार?

  5. ONLY_FULL_GROUP_BY को अक्षम क्यों नहीं करना चाहिए