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

Howto:एक mysql InnoDB स्टोरेज इंजन को साफ करें?

यहाँ InnoDB के संबंध में अधिक संपूर्ण उत्तर दिया गया है। यह थोड़ी लंबी प्रक्रिया है, लेकिन प्रयास के लायक हो सकती है।

ध्यान रखें कि /var/lib/mysql/ibdata1 InnoDB अवसंरचना में सबसे व्यस्त फ़ाइल है। इसमें आम तौर पर छह प्रकार की जानकारी होती है:

InnoDB आर्किटेक्चर

बहुत से लोग अनेक ibdata बनाते हैं बेहतर डिस्क-स्पेस प्रबंधन और प्रदर्शन की उम्मीद करने वाली फाइलें, हालांकि यह विश्वास गलत है।

क्या मैं OPTIMIZE चला सकता हूं टेबल ?

दुर्भाग्य से, चल रहा है टेबल को ऑप्टिमाइज़ करें कोड> साझा तालिका-स्थान फ़ाइल ibdata1 . में संग्रहीत एक InnoDB तालिका के विरुद्ध दो काम करता है:

  • तालिका के डेटा और अनुक्रमणिका को ibdata1 . के अंदर सन्निहित बनाता है
  • ibdata1 बनाता है बढ़ो क्योंकि सन्निहित डेटा और अनुक्रमणिका पृष्ठ संलग्न . हैं करने के लिए ibdata1

हालांकि, आप टेबल डेटा और टेबल इंडेक्स को ibdata1 . से अलग कर सकते हैं और उन्हें स्वतंत्र रूप से प्रबंधित करें।

क्या मैं OPTIMIZE चला सकता हूं टेबल साथ innodb_file_per_table ?

मान लीजिए आपको innodb_file_per_table<जोड़ना है /कोड> करने के लिए /etc/my.cnf (my.ini) . तो क्या आप बस OPTIMIZE TABLE चला सकते हैं सभी InnoDB टेबल्स पर?

खुशखबरी :जब आप चलाते हैं टेबल को ऑप्टिमाइज़ करें साथ innodb_file_per_table सक्षम होने पर, यह एक .ibd उत्पन्न करेगा उस तालिका के लिए फ़ाइल। उदाहरण के लिए, यदि आपके पास टेबल है mydb.mytable /var/lib/mysql . के डेटादिर के साथ , यह निम्नलिखित का उत्पादन करेगा:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

.ibd उस तालिका के लिए डेटा पेज और इंडेक्स पेज होंगे। बढ़िया।

बुरी खबर :आपने केवल mydb.mytable के डेटा पेज और इंडेक्स पेज को एक्सट्रेक्ट किया है। ibdata . में रहने से . mydb.mytable . सहित प्रत्येक तालिका के लिए डेटा डिक्शनरी प्रविष्टि , अभी भी डेटा डिक्शनरी में बनी हुई है (देखें ibdata1 ) आप केवल ibdata1 को केवल मिटा नहीं सकते इस बिंदु पर !!! कृपया ध्यान दें कि ibdata1 बिल्कुल भी सिकुड़ा नहीं है।

InnoDB इंफ्रास्ट्रक्चर क्लीनअप

ibdata1 को सिकोड़ने के लिए एक बार और सभी के लिए आपको निम्न कार्य करने होंगे:

  1. डंप (जैसे, mysqldump . के साथ) ) सभी डेटाबेस को .sql . में टेक्स्ट फ़ाइल (SQLData.sql नीचे प्रयोग किया जाता है)

  2. सभी डेटाबेस ड्रॉप करें (mysql . को छोड़कर) और सूचना_स्कीमा ) चेतावनी :एहतियात के तौर पर, कृपया यह सुनिश्चित करने के लिए इस स्क्रिप्ट को चलाएं कि आपके पास सभी उपयोगकर्ता अनुदान हैं:

    mkdir /var/lib/mysql_grants
    cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
    chown -R mysql:mysql /var/lib/mysql_grants
    
  3. mysql में लॉग इन करें और SET GLOBAL innodb_fast_shutdown =0; चलाएं। (यह ib_logfile0 . से सभी शेष लेन-देन संबंधी परिवर्तनों को पूरी तरह से हटा देगा और ib_logfile1 )

  4. MySQL को शट डाउन करें

  5. निम्नलिखित पंक्तियों को /etc/my.cnf में जोड़ें (या my.ini विंडोज़ पर)

    [mysqld]
    innodb_file_per_table
    innodb_flush_method=O_DIRECT
    innodb_log_file_size=1G
    innodb_buffer_pool_size=4G
    

    (सिडेनोट:innodb_buffer_pool_size . के लिए आपका जो भी सेट है , सुनिश्चित करें कि innodb_log_file_size innodb_buffer_pool_size . का 25% है ।

    साथ ही:innodb_flush_method=O_DIRECT विंडोज़ पर उपलब्ध नहीं है)

  6. ibdata*मिटाएं और ib_logfile* , वैकल्पिक रूप से, आप /var/lib/mysql . में सभी फ़ोल्डर हटा सकते हैं , /var/lib/mysql/mysql . को छोड़कर ।

  7. MySQL प्रारंभ करें (यह ibdata1 को फिर से बनाएगा [10MB डिफ़ॉल्ट रूप से] और ib_logfile0 और ib_logfile1 प्रत्येक 1G पर)।

  8. आयात SQLData.sql

अब, ibdata1 अभी भी बढ़ेगा लेकिन केवल तालिका मेटाडेटा होगा क्योंकि प्रत्येक InnoDB तालिका ibdata1 . के बाहर मौजूद होगी . ibdata1 अब अन्य तालिकाओं के लिए InnoDB डेटा और अनुक्रमणिका शामिल नहीं होगी।

उदाहरण के लिए, मान लें कि आपके पास mydb.mytable . नाम की एक InnoDB तालिका है . अगर आप /var/lib/mysql/mydb . में देखें तो , आप तालिका का प्रतिनिधित्व करने वाली दो फाइलें देखेंगे:

  • mytable.frm (स्टोरेज इंजन हैडर)
  • mytable.ibd (तालिका डेटा और अनुक्रमणिका)

innodb_file_per_table . के साथ /etc/my.cnf . में विकल्प , आप OPTIMIZE TABLE mydb.mytable run चला सकते हैं और फ़ाइल /var/lib/mysql/mydb/mytable.ibd वास्तव में सिकुड़ जाएगा।

मैंने अपने करियर में कई बार MySQL DBA के रूप में ऐसा किया है। वास्तव में, जब मैंने पहली बार ऐसा किया, तो मैंने 50GB . को छोटा कर दिया ibdata1 केवल 500MB तक फ़ाइल करें!

कोशिश तो करो। यदि आपके पास इस पर और प्रश्न हैं, तो बस पूछें। मुझ पर भरोसा करें; यह अल्पावधि के साथ-साथ लंबी अवधि में भी काम करेगा।

चेतावनी

चरण 6 पर, यदि mysql mysql के कारण पुनरारंभ नहीं हो सकता है स्कीमा शुरू हो गया है, चरण 2 पर वापस देखें। आपने mysql . की भौतिक प्रतिलिपि बनाई है स्कीमा। आप इसे इस प्रकार पुनर्स्थापित कर सकते हैं:

mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql

चरण 6 पर वापस जाएं और जारी रखें

अपडेट 2013-06-04 11:13 EDT

innodb_log_file_size सेट करने के संबंध में

03 जुलाई, 2006 पर वापस जाएं , पेरकोना के पास एक अच्छा लेख था एक उचित innodb_log_file_size क्यों चुनें ए> . बाद में, नवंबर 21, 2008 . को , Percona ने एक घंटे के परिवर्तनों को ध्यान में रखते हुए अधिकतम कार्यभार के आधार पर उचित आकार की गणना कैसे करें

तब से मेरे पास लॉग आकार की गणना के बारे में डीबीए स्टैक एक्सचेंज में लिखित पोस्ट हैं और जहां मैंने उन दो पेरकोना लेखों का संदर्भ दिया है।

व्यक्तिगत रूप से, मैं अभी भी प्रारंभिक सेटअप के लिए 25% नियम के साथ जाऊंगा। फिर, चूंकि उत्पादन में समय के साथ कार्यभार अधिक सटीक रूप से निर्धारित किया जा सकता है, आप आकार बदल सकते हैं लॉग्स रखरखाव चक्र के दौरान कुछ ही मिनटों में।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मूडल MySQL डेटाबेस के लिए स्वचालित विफलता को कैसे सेटअप करें

  2. SQL DELETE के साथ WHERE कंडीशन के लिए एक और टेबल में शामिल हों

  3. MySQL में स्टोरेज के लिए IPv6 को बाइनरी से कैसे कन्वर्ट करें

  4. SQL INSERT कथन के लिए Python dict का उपयोग करना

  5. Neo4j - Cypher . का उपयोग करके एक इंडेक्स बनाएं

© कॉपीराइट http://hi.sqldat.com सर्वाधिकार सुरक्षित