2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
सामान्यतया MySQL द्वयोः स्तरयोः विभक्तुं शक्यते
mysql -h$ip -P$port -u$user -p
संयोजनादेशे mysql इति क्लायन्ट्-उपकरणं सर्वरेण सह संयोजनं स्थापयितुं उपयुज्यते ।क्लासिक TCP हस्तप्रहारं सम्पन्नं कृत्वा, संयोजकः
भवतः परिचयस्य प्रमाणीकरणं आरभ्यतुं प्रवृत्तम् अस्ति अस्मिन् समये भवता प्रविष्टं उपयोक्तृनाम गुप्तशब्दं च उपयुज्यते ।
यदि क्लायन्ट् बहुकालं यावत् निष्क्रियः अस्ति तर्हि संयोजकः स्वयमेव तस्य संयोजनं विच्छिन्दति । एषः समयः wait_timeout इति पैरामीटर् द्वारा नियन्त्रितः भवति, पूर्वनिर्धारितं मूल्यं च 8 घण्टाः अस्ति ।
यदि ग्राहकः संयोजनस्य विच्छेदनानन्तरं पुनः अनुरोधं प्रेषयति तर्हि सः त्रुटिस्मरणं प्राप्स्यति: Lost connection to MySQL server during query
. यदि भवान् अस्मिन् समये निरन्तरं कर्तुम् इच्छति तर्हि पुनः संयोजयितुं ततः अनुरोधं निष्पादयितुं आवश्यकम् ।
दत्तांशकोशे दीर्घकालं यावत् संयोजनस्य अर्थः अस्ति यत् संयोजनस्य सफलतायाः अनन्तरं यदि क्लायन्ट् अनुरोधं निरन्तरं करोति तर्हि सदैव समानं संयोजनं उपयुज्यते । लघुसंयोजनस्य अर्थः अस्ति यत् कतिपयानां प्रश्नानां निष्पादनानन्तरं संयोजनं विच्छिन्नं भवति, अग्रिमप्रश्नानां कृते नूतनं पुनः स्थापितं भवति ।
संयोजनस्थापनस्य प्रक्रिया प्रायः जटिला भवति, अतः अहं सुझावमिदं ददामि यत् भवन्तः उपयोगकाले संयोजनस्थापनस्य क्रियाः न्यूनीकर्तुं प्रयतन्ते अर्थात् दीर्घसंयोजनानां उपयोगं कर्तुं प्रयतन्ते
परन्तु सर्वेषां दीर्घकालीनसंयोजनानां उपयोगानन्तरं भवान् पश्यति यत् कदाचित् MySQL द्वारा आकृष्टा स्मृतिः अतीव शीघ्रं वर्धतेनिष्पादनकाले MySQL द्वारा अस्थायीरूपेण प्रयुक्ता स्मृतिः संयोजनवस्तुनि प्रबन्धिता भवति । . यदा संयोजनं विच्छिन्नं भवति तदा एते संसाधनाः मुक्ताः भविष्यन्ति ।अतः यदिदीर्घसंयोजनानां सञ्चयेन अत्यधिकं स्मृतिप्रयोगः भवितुम् अर्हति ।, प्रणाल्याः (OOM) बलात् मारितः आसीत् ।
एतस्याः समस्यायाः समाधानं कथं करणीयम् ? भवन्तः निम्नलिखितविकल्पद्वयं विचारयितुं शक्नुवन्ति ।
mysql_reset_connection
संयोजनसंसाधनानाम् पुनः आरम्भं कर्तुं। अस्याः प्रक्रियायाः पुनः संयोजनस्य अनुमतिसत्यापनस्य च आवश्यकता नास्ति, परन्तु यदा एतत् एव निर्मितम् आसीत् तदा एव स्थितिं प्रति संयोजनं पुनः स्थापयिष्यति ।MySQL इत्यनेन क्वेरी-अनुरोधं प्राप्तस्य अनन्तरं प्रथमं क्वेरी-सञ्चयं गमिष्यति यत् एतत् स्टेट्मेण्ट् पूर्वं निष्पादितम् अस्ति वा इति । पूर्वं निष्पादितानि कथनानि तेषां परिणामानि च प्रत्यक्षतया स्मृतौ कील-मूल्ययुग्मरूपेण संग्रहीतुं शक्यन्ते । कुञ्जी प्रश्नकथनम्, मूल्यं च प्रश्नपरिणामम् । यदि भवतः प्रश्नः अस्मिन् संग्रहे प्रत्यक्षतया कुञ्जीम् अन्वेष्टुं शक्नोति, तर्हि मूल्यं प्रत्यक्षतया क्लायन्ट् प्रति प्रत्यागमिष्यति ।
यदि कथनं प्रश्नसञ्चये नास्ति तर्हि निष्पादनचरणं निरन्तरं भवति । निष्पादनस्य समाप्तेः अनन्तरं निष्पादनपरिणामाः प्रश्नसञ्चये संगृहीताः भविष्यन्ति । भवान् द्रष्टुं शक्नोति यत् यदि प्रश्नः संग्रहणं मारयति तर्हि MySQL पश्चात् जटिलक्रियाः न कृत्वा प्रत्यक्षतया परिणामं प्रत्यागन्तुं शक्नोति, यत् अतीव कुशलम् अस्ति ।
परन्तु अधिकांशतः अहं करिष्यामिभवन्तः query caching इत्यस्य उपयोगं न कुर्वन्तु इति अनुशंसितम् ,किमर्थम्? यतः प्रश्नसञ्चयेन प्रायः लाभात् अधिकं हानिः भवति ।
प्रश्नसञ्चयः बहुवारं अमान्यः भवति यावत् सारणीयाः अद्यतनं भवति तावत् अस्मिन् सारणीयां सर्वे प्रश्नसञ्चयः स्वच्छाः भविष्यन्ति । अतः सम्भवति यत् भवान् परिणामान् रक्षितुं कष्टं गृहीतवान्, अपि च भवता तेषां उपयोगात् अपि पूर्वं, ते अद्यतनेन निर्मूलिताः अभवन् । भारी अपडेट् दबावयुक्तानां दत्तांशकोशानां कृते प्रश्नसञ्चयस्य हिट् रेट् अतीव न्यूनः भविष्यति । यावत् भवतः व्यवसाये स्थिरसारणी नास्ति यत् केवलं एकवारं दीर्घकालं यावत् अद्यतनं भविष्यति। यथा, यदि एतत् प्रणालीविन्याससारणी अस्ति, तर्हि अस्मिन् सारणीयां प्रश्नः प्रश्नसञ्चयस्य कृते उपयुक्तः अस्ति ।
सौभाग्येन MySQL इत्येतत् "use on demand" इति पद्धतिम् अपि प्रदाति । भवान् query_cache_type पैरामीटर् DEMAND इत्यत्र सेट् कर्तुं शक्नोति येन पूर्वनिर्धारित SQL कथनानां कृते क्वेरी कैशे इत्यस्य उपयोगः न भवति । येषां कथनानां कृते भवान् निश्चितः अस्ति यत् भवान् क्वेरी-सञ्चयस्य उपयोगं कर्तुम् इच्छति, तत् स्पष्टतया निर्दिष्टुं SQL_CACHE इत्यस्य उपयोगं कर्तुं शक्नोति, यथा निम्नलिखित-कथनम्:
select SQL_CACHE * from T where ID=10;
have to be aware of अस्ति, .MySQL 8.0 संस्करणं प्रत्यक्षतया सम्पूर्णं क्वेरी कैश फंक्शन् विलोपयति, यस्य अर्थः अस्ति यत् 8.0 तः आरभ्य एतत् कार्यं पुनः उपलब्धं न भविष्यति ।
यदि क्वेरी कैशे न हिट् भवति तर्हि स्टेट्मेण्ट् इत्यस्य वास्तविकं निष्पादनं आरभ्यते । प्रथमं MySQL इत्यनेन ज्ञातव्यं यत् भवान् किं कर्तुम् इच्छति, अतः तस्य SQL स्टेट्मेण्ट् पार्स् करणीयम् ।
अहं न जानामि यत् भवन्तः अद्यापि "Kong Yiji" इति लेखं स्मर्यन्ते वा। यदि ऋणं दत्तवन्तः जनाः बहवः न सन्ति तर्हि सः ग्राहकस्य नाम खातं च फलकस्य उपरि लिखितुं शक्नोति। परन्तु यदि ऋणलेखायुक्ताः जनाः बहु सन्ति तर्हि सदैव एतादृशाः समयाः भविष्यन्ति यदा प्रशंसकमण्डलं तेषां निरीक्षणं कर्तुं न शक्नोति अस्मिन् समये दुकानदारस्य ऋणलेखानां अभिलेखनार्थं विशेषरूपेण एकं लेजरं भवितुमर्हति।
यदि कोऽपि ऋणं दातुम् इच्छति वा ऋणं दातुम् इच्छति तर्हि सामान्यतया दुकानदारस्य विकल्पद्वयं भवति ।
यदा व्यापारः प्रफुल्लितः भवति, काउण्टरः व्यस्तः भवति तदा दुकानदारः अवश्यमेव चयनं करिष्यतिउत्तरम् , यतः पूर्वक्रिया अतीव कष्टप्रदः अस्ति। प्रथमं भवद्भिः अस्य व्यक्तिस्य कुलऋणलेखस्य अभिलेखः अन्वेष्टव्यः । चिन्तयतु, तत्र दशकशः सघनरूपेण सङ्गृहीताः पृष्ठाः सन्ति, नाम अन्वेष्टुं दुकानदारस्य पठनचक्षुषः उपरि शनैः शनैः अन्वेषणं कर्तव्यं भवेत्, ततः परं सः गणनां कर्तुं एबाकसं बहिः आनयिष्यति, अन्ते च परिणामं पुनः लिखिष्यति लेजर इति ।
एषा समग्रप्रक्रिया चिन्तयितुं कष्टप्रदा अस्ति। तदपेक्षया प्रथमं गुलाबीफलके लिखितुं सुकरं भवति । चिन्तयतु, यदि दुकानदारस्य गुलाबीफलकस्य साहाय्यं नास्ति तर्हि प्रत्येकं लेखालेखनं कृत्वा लेजरं परिवर्तयितव्यं भवति किं कार्यक्षमता असह्यरूपेण न्यूना नास्ति?
तथैव MySQL इत्यत्र अपि एषा समस्या विद्यते यदि प्रत्येकं अपडेट्-सञ्चालनं डिस्क-मध्ये लिखितुं आवश्यकं भवति, तथा च डिस्क-इत्यनेन अपि अपडेट्-करणात् पूर्वं तत्सम्बद्धं अभिलेखं अन्वेष्टव्यम्, तर्हि सम्पूर्ण-प्रक्रियायाः IO-व्ययः, अन्वेषण-व्ययः च अतीव अधिकः भविष्यति एतस्याः समस्यायाः समाधानार्थं MySQL इत्यस्य डिजाइनरः अद्यतनदक्षतां सुधारयितुम् होटेलस्य दुकानदारस्य गुलाबीफलकस्य सदृशस्य विचारस्य उपयोगं कृतवन्तः ।
गुलाबीफलकस्य लेजरस्य च सहकार्यस्य सम्पूर्णा प्रक्रिया वस्तुतः MySQL मध्ये प्रायः उल्लिखिता एव । WAL
तन्त्रज्ञान,WAL
पूर्णं नाम अस्तिWrite-Ahead Logging
, मुख्यविषयः अस्तिप्रथमं लॉग् लिखन्तु, ततः डिस्क मध्ये लिखन्तु, अर्थात् प्रथमं गुलाबीफलकं लिखन्तु, ततः यदा भवन्तः व्यस्ताः न सन्ति तदा खातापुस्तकं लिखन्तु।
विशेषतः यदा अभिलेखस्य अद्यतनीकरणस्य आवश्यकता भवति तदा InnoDB इञ्जिन् प्रथमं अभिलेखं redo log (pink board) इत्यत्र लिखति तथा च स्मृतिः अद्यतनं करिष्यति । तस्मिन् एव काले InnoDB इञ्जिन् समुचितसमये संचालन-अभिलेखं डिस्क-मध्ये अद्यतनं करिष्यति, तथा च एतत् अद्यतनं प्रायः तदा क्रियते यदा प्रणाली तुल्यकालिकरूपेण निष्क्रियं भवति, यथा दुकानदारः बन्दीकरणानन्तरं करोति
यदि अद्यत्वे बहवः ऋणलेखाः न सन्ति तर्हि दुकानदारः वस्तुनां क्रमणं कर्तुं समापनसमयपर्यन्तं प्रतीक्षितुं शक्नोति । परन्तु यदि कस्मिन्चित् दिने ऋणलेखाः बहु सन्ति तथा च गुलाबीफलकं पूर्णं भवति तर्हि अस्माभिः किं कर्तव्यम्? अस्मिन् समये दुकानदारेन स्वकार्यं स्थापयित्वा गुलाबीफलके केचन क्रेडिट्-अभिलेखाः लेजर्-पत्रे अद्यतनं कर्तव्यम् आसीत्, ततः गुलाबी-फलकात् एतान् अभिलेखान् मेटयित्वा नूतनानां खातानां कृते स्थानं कल्पयितुम् अभवत्
तथैव InnoDB इत्यस्य redo log इत्यस्य नियतः आकारः अस्ति उदाहरणार्थं, एतत् 4 सञ्चिकानां समुच्चयरूपेण विन्यस्तुं शक्यते, प्रत्येकं सञ्चिकायाः आकारः 1GB भवति ततः एषा "pink board" कुलम् 4GB कार्याणि अभिलेखयितुं शक्नोति । आरम्भादेव लेखनं आरभत, ततः लूप् मध्ये लेखनार्थं आरम्भं प्रति आगच्छन्तु, यथा अधोलिखिते चित्रे दर्शितम् अस्ति ।
write pos इत्येतत् वर्तमानस्य अभिलेखस्य स्थितिः अस्ति । चेकपॉइण्ट् वर्तमानं मेटनीयं स्थानम् अस्ति, अपि च अग्रे गच्छति, लूप् अपि करोति, अभिलेखं मेटयितुं पूर्वं, अभिलेखं दत्तांशसञ्चिकायां अद्यतनं कर्तव्यम् ।
write pos तथा checkpoint इत्येतयोः मध्ये यः स्थानं भवति सः "pink board" इत्यस्य रिक्तः भागः अस्ति यस्य उपयोगेन नूतनानां कार्याणां अभिलेखनं कर्तुं शक्यते । यदि write pos चेकपोस्ट् गृह्णाति तर्हि तस्य अर्थः अस्ति यत् "pink board" पूर्णः अस्ति, तथा च अस्मिन् समये कोऽपि नूतनः अपडेट् कर्तुं न शक्यते भवद्भिः प्रथमं चेकपोस्ट् अग्रे सारयितुं केचन अभिलेखाः स्थगितव्याः, मेटयितव्याः च
redo log इत्यनेन InnoDB इत्यनेन सुनिश्चितं कर्तुं शक्यते यत् यदि दत्तांशकोशः असामान्यरूपेण पुनः आरभते तथापि पूर्वं प्रदत्ताः अभिलेखाः न नष्टाः भविष्यन्तिcrash-safe
。
दुर्घटना-सुरक्षितस्य अवधारणां अवगन्तुं अस्माकं पूर्वस्य क्रेडिट्-अभिलेखस्य उदाहरणं चिन्तयन्तु । यावत् यावत् ऋण-अभिलेखः गुलाबी-फलके अथवा लेजर-पत्रे लिखितः भवति, यद्यपि पश्चात् दुकानदारः तत् विस्मरति, यथा सहसा कतिपयान् दिनानि यावत् व्यापारं स्थगयति, तथापि सः लेजर-मध्ये विद्यमानस्य दत्तांशस्य माध्यमेन ऋण-लेखं स्पष्टीकर्तुं शक्नोति तथा च पुनः व्यापारं प्रारभ्य गुलाबी फलकम्।
यथा वयं पूर्वं उक्तवन्तः, समग्ररूपेण MySQL इत्यस्य वस्तुतः द्वौ भागौ स्तः: एकः सर्वर-स्तरः, यः मुख्यतया MySQL इत्यस्य कार्यात्मक-स्तरस्य कार्याणि करोति, अन्यः इञ्जिन-स्तरः, यः भण्डारण-सम्बद्धानां विशिष्टानां विषयाणां उत्तरदायी भवतिउपरि वयं यस्य गुलाबीफलकस्य विषये चर्चां कृतवन्तःredo log इति InnoDB इञ्जिनस्य अद्वितीयः लॉग् अस्ति,तथा Server स्तरस्य स्वकीयः log अपि अस्ति, यत् binlog (archive log) इति कथ्यते ।。
अहं मन्ये भवन्तः पृच्छन्ति, किमर्थं द्वौ लकौ स्तः ?
यतः आरम्भे MySQL मध्ये InnoDB इञ्जिन् नासीत् । MySQL इत्यस्य स्वकीयं इञ्जिनं MyISAM अस्ति, परन्तु MyISAM इत्यस्य दुर्घटना-सुरक्षितक्षमता नास्ति, तथा च binlog logs केवलं संग्रहणार्थं उपयोक्तुं शक्यते । InnoDB इत्यस्य परिचयः MySQL इत्यत्र अन्येन कम्पनीना प्लग-इन्-रूपेण कृतः यतः केवलं binlog इत्यस्य उपरि अवलम्ब्य क्रैश-सुरक्षितक्षमता नास्ति, अतः InnoDB अन्यस्य लॉग्-प्रणाल्याः अर्थात् redo log इत्यस्य उपयोगं करोति, क्रैश-सुरक्षित-क्षमताम् प्राप्तुं
एतयोः लॉगयोः निम्नलिखित त्रयः भेदाः सन्ति ।
एतयोः लॉगयोः अवधारणात्मकं अवगमनेन सह, एतत् सरलं अपडेट् स्टेट्मेण्ट् निष्पादयन्ते सति एक्जीक्यूटिव् इत्यस्य InnoDB इञ्जिन् इत्यस्य च आन्तरिकप्रक्रियाः पश्यामः ।
अत्र अहम् अस्य update statement इत्यस्य execution flow chart ददामि चित्रे प्रकाशपेटिका InnoDB इत्यस्य अन्तः निष्पादितम् इति सूचयति, तथा च dark box इत्यनेन executor मध्ये निष्पादितम् इति सूचयति ।
update कथन निष्पादन प्रक्रिया
भवान् अवलोकितवान् स्यात् यत् अन्तिमत्रयपदार्थाः किञ्चित् "वृत्ताकाराः" दृश्यन्ते redo log इत्यस्य लेखनं द्वयोः चरणयोः विभक्तम् अस्ति: prepare and commit इति
किमर्थं आवश्यकं "द्विचरणीयं निवेदनम्" ?एतेन द्वयोः लॉगयोः भेदः अनुमन्यतेतार्किकरूपेण सुसंगतः . एतस्याः समस्यायाः व्याख्यानार्थं लेखस्य आरम्भे यः प्रश्नः अस्ति तस्मात् आरम्भः करणीयः यत् अर्धमासस्य अन्तः दत्तांशकोशं कस्यापि सेकण्डस्य अवस्थायां कथं पुनः स्थापयितव्यम्?
यथा वयं पूर्वं उक्तवन्तः, binlog सर्वाणि तार्किकक्रियाणि अभिलेखयिष्यति, "लेखनं योजयतु" इति रूपं च स्वीकुर्यात् । यदि भवतः DBA प्रतिज्ञायते यत् अर्धमासस्य अन्तः पुनः स्थापयितुं शक्यते, तर्हि बैकअप-प्रणाली निश्चितरूपेण गत-अर्ध-मासे सर्वाणि binlogs रक्षिष्यति, तथा च प्रणाली सम्पूर्णस्य दत्तांशकोशस्य नियमित-बैकअपं करिष्यति अत्र "नियमितः" व्यवस्थायाः महत्त्वे निर्भरं भवति, यत् दिवसे एकवारं सप्ताहे एकवारं वा भवितुम् अर्हति ।
यदा भवद्भिः निर्दिष्टसेकेण्ड् मध्ये पुनःस्थापनीयं भवति, उदाहरणार्थं, एकस्मिन् दिने अपराह्णे द्वौ वादने, तदा भवन्तः पश्यन्ति यत् मध्याह्ने अकस्मात् सारणी विलोपिता अभवत्, तथा च भवन्तः दत्तांशं पुनः प्राप्तुं प्रवृत्ताः सन्ति, तदा भवन्तः एतत् कर्तुं शक्नुवन्ति:
ठीकम्, दत्तांशपुनर्प्राप्तिप्रक्रियायाः विषये चर्चां कृत्वा पुनः आगत्य वृत्तान्तस्य "द्विचरणप्रतिबद्धतायाः" आवश्यकता किमर्थम् इति चर्चां कुर्मः । अत्र वयं व्याख्यानार्थं विरोधाद् प्रमाणं अपि प्रयोक्तुं शक्नुमः।
यतः redo log तथा binlog द्वौ स्वतन्त्रौ तर्कौ स्तः, यदि द्विचरणीय-प्रतिबद्धता न उपयुज्यते तर्हि redo log प्रथमं लिखितव्यं ततः binlog लिखितव्यं, अथवा विपरीतक्रमः स्वीक्रियताम् एतयोः विधियोः काः समस्याः सन्ति इति पश्यामः ।
अद्यापि पूर्वस्य अपडेट् स्टेट्मेण्ट् उदाहरणरूपेण उपयुज्यताम् । ID=2 इत्यनेन सह वर्तमानपङ्क्तौ c क्षेत्रस्य मूल्यं 0 इति कल्पयतु, अपि च कल्पयतु यत् अद्यतनकथनस्य निष्पादनकाले प्रथमस्य लॉगस्य लेखनस्य अनन्तरं परन्तु द्वितीयस्य लॉगस्य लेखनात् पूर्वं किं भविष्यति?
भवान् वदिष्यति, किम् एषा संभावना अतीव न्यूना?
वस्तुतः न, एतस्याः प्रक्रियायाः आवश्यकता केवलं दुर्व्यवहारस्य अनन्तरं दत्तांशं पुनः प्राप्तुं न भवति । यदा भवन्तः क्षमतां विस्तारयितुं प्रवृत्ताः सन्ति, अर्थात् यदा भवन्तः प्रणाल्याः पठनक्षमतां वर्धयितुं अधिकानि बैकअप-दत्तांशकोशानि निर्मातुं प्रवृत्ताः सन्ति, तदा इदानीं सामान्या अभ्यासः अस्ति यत् एतत् प्राप्तुं पूर्ण-बैकअप-उपयोगं कृत्वा binlog-इत्येतत् प्रयोक्तुं शक्यते इति मुख्य-दास-दत्तांशकोशयोः ऑनलाइन-रूपेण असङ्गतिः अस्ति ।
सरलतया वक्तुं शक्यते यत्, redo log तथा binlog इत्येतयोः उपयोगः व्यवहारस्य commit स्थितिं प्रतिनिधितुं शक्यते, andद्विचरणीयं निवेदनं राज्यद्वयं तार्किकरूपेण सुसंगतं स्थापयितुं भवति।。