Innodb_flush_log_at_trx_commit में गतिशील परिवर्तन


11

यह इस प्रश्न से संबंधित है । यह InnoDB तालिकाओं के लिए बेहतर प्रदर्शन प्राप्त करने में मदद करता है।

MySQL मैनुअल के अनुसार , innodb_flush_log_at_trx_commitएक वैश्विक गतिशील चर है। इस प्रकार, मैं इसे SET GLOBAL कमांड का उपयोग करके बदल सकता हूं और यह काम करने लगता है।

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected

mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set

लेकिन, इसने वास्तविक MySQL सेटिंग को परिवर्तित नहीं किया। जब मैंने my.cnf को अपडेट किया और MySQL सर्वर को पुनरारंभ किया, तो यह काम किया। इसलिए, मैं रन समय में वैश्विक चर को बदल नहीं सकता हूं?

मैं डिफ़ॉल्ट मान को पसंद करता हूं innodb_flush_log_at_trx_commit=1, लेकिन इससे पहले कि मैं तेजी से प्राप्त करने के लिए एक बड़े डेटाबेस के लिए एक पुनर्स्थापना प्रक्रिया चलाता हूं, मुझे इसे 2 में बदलना होगा। लेकिन जब प्रक्रिया पूरी हो जाती है, तो मैं मान को वापस 1 में बदलना चाहता हूं। क्या रन टाइम में ऐसा करना संभव है?

मेरे पास मेरे साझा होस्टिंग सर्वर पर my.cnf की पहुंच नहीं है ।

जवाबों:


12

जबकि मैं रोलांडो को बदलने की सिफारिश से सहमत हूं innodb_flush_method, मैं 100% स्पष्ट नहीं था कि आपका क्या मतलब है:

इसने वास्तविक MySQL सेटिंग को परिवर्तित नहीं किया

मैं यह बताना चाहता हूं कि वैश्विक चर में परिवर्तन करने से कोई नया कनेक्शन प्रभावित होता है, लेकिन वर्तमान सत्र (जोर मेरा) को संशोधित नहीं करता है:

वैश्विक चर परिवर्तन किसी भी क्लाइंट के लिए सत्र चर को प्रभावित नहीं करता है जो वर्तमान में जुड़ा हुआ है ( उस क्लाइंट का भी नहीं जो SET GLOBAL स्टेटमेंट जारी करता है )।

तो यह जाँचने के लिए:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)


mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> connect;
Connection id:    6
Current database: *** NONE ***

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

2
यह उत्तर समझ में आता है। प्रलेखन ( dev.mysql.com/doc/refman/5.5/en/… ) यह नहीं कहता है कि सत्र स्तर पर चर को केवल वैश्विक स्तर पर बदला जा सकता है। मैंने अनुभव किया कि कई बार SET GLOBAL max_connections = 1000;जब मैं अधिकतम मान बदलने के लिए दौड़ता हूं और जब मैं SHOW VARIABLES LIKE 'max_connections';पुराने मूल्य को देखने के लिए दौड़ता हूं, तो जब तक मैं लॉग इन करता हूं और वापस जाता हूं। इस दृष्टिकोण के लिए +1 और वापस ले लिया जाता है, जो अक्सर दिया जाता है।
रोलैंडमाइसीडीडीबीए

@ रोलैंडो मुझे भी! जब मुझे लगा कि मुझे 'कनेक्ट' मिल सकता है, तो भी खुशी हुई लॉग इन करने और वापस अंदर जाने के बजाय समय बचाता है!
डेरेक डाउनी

दौड़ने की वह अवधारणा connectवास्तव में MySQL में मेरे लिए नई है। मैंने PostgreSQL और Oracle में एक लाख बार किया है। मैंने एक बार MySQL के बारे में कभी नहीं सोचा था कि इसकी अनुमति देता है
RolandoMySQLDBA

@Dest, आपके उत्तर के लिए धन्यवाद। मेरे गहरे परीक्षण के अनुसार, इसने गतिशील रूप से काम किया। मेरी लोकलहोस्ट में, सत्र चर को बिना कनेक्ट किए चलाया गया (मुझे समस्या होने पर त्रुटि मिली connect)। मान 2 के साथ, 2,241,319 रिकॉर्ड आयात करते हुए 27 मिनट 43 सेकेंड का समय लगा, जबकि मूल्य 1 के साथ लगभग 1 दिन का समय लगा। वर्तमान सत्र में यह सेटिंग काम कर रही है, लेकिन इसने my.cnfपुनः आरंभ करने के बाद मूल सेटिंग (से ) को बहाल कर दिया ।
सिथू

@DerekDowney, क्या यह कुछ सेटिंग्स की तरह है innodb_flush_log_at_trx_commit? या यह है कि सभी सेटिंग्स के लिए, सेटिंग globalवर्तमान सत्र को प्रभावित नहीं करेगी?
पचेरियर

7

Innodb_flush_log_at_trx_commit की स्थापना करके , आप mysqld / OS के साथ अस्थिरता का जोखिम उठाते हैं। मैं यह कहता हूं क्योंकि ओएस पर फ्लश करने के लिए भरोसा किया जा रहा है।

MySQL प्रलेखन से सावधानी में ध्यान दें

कई ऑपरेटिंग सिस्टम और कुछ डिस्क हार्डवेयर फ्लश-टू-डिस्क ऑपरेशन को मूर्ख बनाते हैं। वे mysqld को बता सकते हैं कि फ्लश हुआ है, भले ही यह नहीं हुआ है। तब सेटिंग की स्थायित्व की सेटिंग 1 के साथ भी गारंटी नहीं दी जाती है, और सबसे खराब स्थिति में एक बिजली आउटेज भी InnoDB डेटाबेस को दूषित कर सकता है। SCSI डिस्क कंट्रोलर या डिस्क में ही बैटरी-समर्थित डिस्क कैश का उपयोग करने से फ़ाइल फ्लश की गति बढ़ जाती है, और ऑपरेशन सुरक्षित हो जाता है। आप हार्डवेयर कैश में लिखी गई डिस्क की कैशिंग को अक्षम करने के लिए यूनिक्स कमांड एचडीपीआर का उपयोग करने का भी प्रयास कर सकते हैं, या हार्डवेयर विक्रेता के लिए कुछ अन्य कमांड का उपयोग कर सकते हैं।

यह जो बताता है वह निम्न है: ओएस एक धोखा देने वाले पति की तरह झूठ बोल सकता है। ओएस का कहना है कि यह डिस्क को फ्लश करेगा और बस ऐसा नहीं करता है। इसलिए, भले ही आप innodb_flush_log_at_trx_commit सेट करते हैं, आपको mysqld के फ्लशिंग से डिस्क पर डिस्क में फ्लश करने वाले ओएस को तलाक देना होगा।

यदि आपने पहले से ऐसा नहीं किया है तो O_DIRECT में innodb_flush_method सेट करने का प्रयास करें। आपको एक अंतर दिखाई दे सकता है क्योंकि फ्लश विधि बहुत भिन्न होती है ( MySQL innodb_flush_method वैरिएबल पर मेरी Mar 04, 2011पोस्ट स्पष्ट करें )।

चेतावनी

जैसा कि आपने उल्लेख किया है, आपके पास पहुंच नहीं है my.cnf। कृपया अपने प्रदाता पर SysAdmin से संपर्क करें और innodb_flush_method परिवर्तित करें।

UPDATE 2012-12-10 12:45 EDT

मैं अपने पीसी पर MySQL 5.5.12 चला रहा हूं। जब मैं कनेक्ट होता हूं और show variables like 'innodb_flush_method';मुझे मिलता है

mysql> show variables like 'innodb_flush_method';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_flush_method |       |
+---------------------+-------+
1 row in set (0.05 sec)

mysql>

चूंकि यह रिक्त है, यह केवल इंगित करता है कि डिफ़ॉल्ट सेटिंग का उपयोग किया जाता है। कृपया MySQL innodb_flush_method वैरिएबल पर स्पष्टीकरण के लिए मेरी Mar 04, 2011 पोस्ट पढ़ें


मैंने पहले अपने लोकलहोस्ट में परीक्षण किया। मैं (नहीं ) innodb_flush_methodमें नहीं मिला । सर्वर जानकारी - Apache 2.4.1, PHP 5.4.4, MySQL 5.5my.inimy.cnf
Sithu

मैंने देखा कि सर्वर संस्करण या ini / cnf की परवाह किए बिना, कॉन्फ़िगरेशन फ़ाइल में innodb_flush_methodसेटिंग नहीं है और SHOW VARIABLESयह नहीं दिखाता है।
Sithu

आपके अद्यतन के लिए धन्यवाद, मुझे यह भी मिला, मुझे आश्चर्य हुआ कि हम इसका मूल्य क्यों नहीं देख सकते हैं। चूंकि मुझे यह नहीं मिला my.iniया my.cnfयह एक गतिशील चर नहीं है, मुझे यकीन नहीं है कि मैं इसे कैसे कॉन्फ़िगर कर सकता हूं।
Sithu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.