MySQL
प्रतिकृति
खोज…
टिप्पणियों
प्रतिकृति का उपयोग एक MySQL डेटाबेस सर्वर से एक या एक से अधिक MySQL डेटाबेस सर्वरों में [बैकअप] डेटा को कॉपी करने के लिए किया जाता है।
मास्टर - MySQL डेटाबेस सर्वर, जो कॉपी किए जाने वाले डेटा की सेवा कर रहा है
गुलाम - MySQL डेटाबेस सर्वर, डेटा की प्रतिलिपि बनाता है जिसे मास्टर द्वारा परोसा जाता है
MySQL के साथ, प्रतिकृति डिफ़ॉल्ट रूप से अतुल्यकालिक है। इसका मतलब है कि दास को मास्टर से अपडेट प्राप्त करने के लिए स्थायी रूप से कनेक्ट होने की आवश्यकता नहीं है। उदाहरण के लिए, यदि आपके गुलाम को स्विच ऑफ किया गया है या मास्टर से कनेक्ट नहीं किया गया है और आप स्लेव को बाद में स्विच कर रहे हैं या मास्टर के साथ कनेक्ट कर रहे हैं, तो यह स्वचालित रूप से मास्टर के साथ सिंक्रनाइज़ हो जाएगा।
कॉन्फ़िगरेशन के आधार पर, आप डेटाबेस के भीतर सभी डेटाबेस, चयनित डेटाबेस या यहां तक कि चयनित तालिकाओं को दोहरा सकते हैं।
प्रतिकृति प्रारूप
प्रतिकृति स्वरूपों के दो मुख्य प्रकार हैं
स्टेटमेंट बेस्ड रेप्लीकेशन (SBR) - जो पूरे SQL स्टेटमेंट को दोहराता है। इसमें, मास्टर बाइनरी लॉग में SQL स्टेटमेंट लिखते हैं। गुलाम पर उस एसक्यूएल बयान को निष्पादित करके स्वामी के दास के लिए काम करता है।
पंक्ति आधारित प्रतिकृति (RBR) - जो केवल बदली हुई पंक्तियों की प्रतिकृति बनाती है। इसमें, मास्टर द्विआधारी लॉग की घटनाओं को लिखते हैं जो इंगित करते हैं कि व्यक्तिगत तालिका पंक्तियों को कैसे बदला जाता है। गुलाम के लिए तालिका की पंक्तियों में परिवर्तन का प्रतिनिधित्व करने वाली घटनाओं की प्रतिलिपि बनाकर मास्टर के दास के लिए काम करता है।
आप एक तीसरी किस्म, मिश्रित आधारित प्रतिकृति (MBR) का भी उपयोग कर सकते हैं। इसमें स्टेटमेंट-आधारित और पंक्ति-आधारित लॉगिंग का उपयोग किया जाता है। लॉग बनाया जाएगा जिसके आधार पर परिवर्तन के लिए सबसे उपयुक्त है।
कथन-आधारित प्रारूप 5.7.7 से अधिक पुराने MySQL संस्करणों में डिफ़ॉल्ट था। MySQL 5.7.7 और बाद में, पंक्ति-आधारित प्रारूप डिफ़ॉल्ट है।
मास्टर - गुलाम प्रतिकृति सेटअप
प्रतिकृति सेटअप के लिए 2 MySQL सर्वर पर विचार करें, एक मास्टर है और दूसरा गुलाम है।
हम मास्टर को कॉन्फ़िगर करने जा रहे हैं कि उसे उस पर किए गए प्रत्येक कार्य का एक लॉग रखना चाहिए। हम स्लेव सर्वर को कॉन्फ़िगर करने जा रहे हैं कि इसे मास्टर पर लॉग को देखना चाहिए और जब भी मास्टर में लॉग में परिवर्तन होता है, तो उसे वही काम करना चाहिए।
मास्टर कॉन्फ़िगरेशन
सबसे पहले, हमें मास्टर पर एक उपयोगकर्ता बनाने की आवश्यकता है। यह उपयोगकर्ता स्लेव द्वारा मास्टर के साथ संबंध बनाने के लिए उपयोग किया जा रहा है।
CREATE USER 'user_name'@'%' IDENTIFIED BY 'user_password';
GRANT REPLICATION SLAVE ON *.* TO 'user_name'@'%';
FLUSH PRIVILEGES;
बदलें user_name
और user_password
अपने उपयोगकर्ता नाम और पासवर्ड के अनुसार।
अब my.inf
(लिनक्स में my.cnf) फ़ाइल को संपादित किया जाना चाहिए। [Mysqld] अनुभाग में निम्नलिखित पंक्तियों को शामिल करें।
server-id = 1
log-bin = mysql-bin.log
binlog-do-db = your_database
पहली लाइन का उपयोग इस MySQL सर्वर पर एक आईडी असाइन करने के लिए किया जाता है।
दूसरी पंक्ति MySQL को निर्दिष्ट लॉग फ़ाइल में लॉग लिखना शुरू करने के लिए कहती है। लिनक्स में इसे log-bin = /home/mysql/logs/mysql-bin.log
तरह कॉन्फ़िगर किया जा सकता है। यदि आप एक MySQL सर्वर में प्रतिकृति शुरू कर रहे हैं जिसमें प्रतिकृति का उपयोग पहले से ही किया गया है, तो सुनिश्चित करें कि यह निर्देशिका सभी प्रतिकृति लॉग से खाली है।
तीसरी पंक्ति का उपयोग उस डेटाबेस को कॉन्फ़िगर करने के लिए किया जाता है जिसके लिए हम लॉग लिखने जा रहे हैं। आपको अपने डेटाबेस नाम के साथ your_database
को बदलना चाहिए।
सुनिश्चित करें कि skip-networking
सक्षम नहीं किया गया है और MySQL सर्वर (मास्टर) को पुनरारंभ करें
दास विन्यास
my.inf
फ़ाइल को स्लेव में भी संपादित किया जाना चाहिए। [Mysqld] अनुभाग में निम्नलिखित पंक्तियों को शामिल करें।
server-id = 2
master-host = master_ip_address
master-connect-retry = 60
master-user = user_name
master-password = user_password
replicate-do-db = your_database
relay-log = slave-relay.log
relay-log-index = slave-relay-log.index
पहली लाइन का उपयोग इस MySQL सर्वर पर एक आईडी असाइन करने के लिए किया जाता है। यह आईडी अद्वितीय होनी चाहिए।
दूसरी पंक्ति मास्टर सर्वर का आईपी पता है। इसे अपने मास्टर सिस्टम आईपी के अनुसार बदलें
तीसरी पंक्ति सेकंड में एक रिट्री सीमा निर्धारित करने के लिए उपयोग की जाती है।
अगली दो पंक्तियाँ स्लाव को उपयोगकर्ता नाम और पासवर्ड बताती हैं, जिसके उपयोग से यह मास्टर को जोड़ता है।
अगली पंक्ति डेटाबेस को दोहराने के लिए आवश्यक है।
अंतिम दो लाइनें relay-log
और relay-log-index
फ़ाइल नामों को असाइन करने के लिए उपयोग की जाती हैं।
सुनिश्चित करें कि skip-networking
सक्षम नहीं किया गया है और MySQL सर्वर (स्लेव) को पुनरारंभ करें
डेटा को स्लेव में कॉपी करें
यदि डेटा को लगातार मास्टर में जोड़ा जा रहा है, तो हमें मास्टर पर सभी डेटाबेस एक्सेस को रोकना होगा, इसलिए कुछ भी नहीं जोड़ा जा सकता है। यह मास्टर में निम्नलिखित कथन को चलाकर प्राप्त किया जा सकता है।
FLUSH TABLES WITH READ LOCK;
यदि सर्वर में कोई डेटा नहीं जोड़ा जा रहा है, तो आप उपरोक्त चरण को छोड़ सकते हैं।
हम mysqldump
का उपयोग करके मास्टर का डेटा बैकअप लेने जा रहे हैं
mysqldump your_database -u root -p > D://Backup/backup.sql;
अपने सेटअप के अनुसार your_database
और बैकअप निर्देशिका को बदलें। अब आपके पास दिए गए स्थान में backup.sql
नामक एक फाइल backup.sql
।
यदि आपका डेटाबेस आपके दास में मौजूद नहीं है, तो निम्नलिखित को निष्पादित करके बनाएं
CREATE DATABASE `your_database`;
अब हमें Slave MySQL सर्वर में बैकअप आयात करना होगा।
mysql -u root -p your_database <D://Backup/backup.sql
--->Change `your_database` and backup directory according to your setup
प्रतिकृति शुरू करें
प्रतिकृति शुरू करने के लिए, हमें मास्टर में लॉग फ़ाइल नाम और लॉग पोजीशन खोजने की आवश्यकता है। तो, मास्टर में निम्नलिखित चलाएँ
SHOW MASTER STATUS;
यह आपको नीचे जैसा आउटपुट देगा
+---------------------+----------+-------------------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001 | 130 | your_database | |
+---------------------+----------+-------------------------------+------------------+
फिर स्लेव में निम्नलिखित को चलाएं
SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='user_name',
MASTER_PASSWORD='user_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=130;
SLAVE START;
सबसे पहले हम दास को रोकते हैं। फिर हम यह बताते हैं कि मास्टर लॉग फ़ाइल में कहाँ देखना है। MASTER_LOG_FILE
नाम और MASTER_LOG_POS
, उन मूल्यों का उपयोग करें जो हमें SHOW MASTER STATUS
पर SHOW MASTER STATUS
कमांड चलाने से मिला है।
आपको MASTER_HOST
में मास्टर के आईपी को बदलना चाहिए, और तदनुसार उपयोगकर्ता और पासवर्ड को बदलना चाहिए।
गुलाम अब इंतजार कर रहा होगा। स्लेव की स्थिति को निम्नलिखित चलाकर देखा जा सकता है
SHOW SLAVE STATUS;
यदि आपने पहले मास्टर में FLUSH TABLES WITH READ LOCK
अंजाम दिया है, तो निम्न को चलाकर तालिकाओं को लॉक से मुक्त करें
UNLOCK TABLES;
अब मास्टर उस पर किए गए प्रत्येक कार्य के लिए एक लॉग रखता है और स्लेव सर्वर मास्टर पर लॉग को देखता है। जब भी परिवर्तन मास्टर पर लॉग में होता है, गुलाम उसे दोहराता है।
प्रतिकृति त्रुटियां
जब भी गुलाम पर क्वेरी चलाते समय कोई त्रुटि होती है, तो समस्या की पहचान करने और उसे ठीक करने के लिए MySQL प्रतिकृति स्वचालित रूप से बंद हो जाती है। यह मुख्य रूप से एक घटना के कारण एक डुप्लिकेट कुंजी या एक पंक्ति नहीं मिली और इसे अपडेट या डिलीट नहीं किया जा सकता है। आप ऐसी त्रुटियों को छोड़ सकते हैं, भले ही यह अनुशंसित न हो
गुलाम को लटकाने वाली सिर्फ एक क्वेरी को छोड़ने के लिए, निम्नलिखित सिंटैक्स का उपयोग करें
SET GLOBAL sql_slave_skip_counter = N;
यह कथन मास्टर से अगले एन घटनाओं को छोड़ देता है। यह कथन केवल तभी मान्य होता है जब दास धागे नहीं चल रहे हों। अन्यथा, यह एक त्रुटि पैदा करता है।
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;
कुछ मामलों में यह ठीक है। लेकिन अगर बयान एक बहु-बयान लेनदेन का हिस्सा है, तो यह अधिक जटिल हो जाता है, क्योंकि त्रुटि उत्पन्न करने वाले बयान को छोड़ देने से पूरे लेनदेन को छोड़ दिया जाएगा।
यदि आप अधिक प्रश्नों को छोड़ना चाहते हैं जो समान त्रुटि कोड का उत्पादन कर रहे हैं और यदि आप सुनिश्चित हैं कि उन त्रुटियों को छोड़ना आपके दास को असंगत नहीं लाएगा और आप उन सभी को छोड़ना चाहते हैं, तो आप अपने my.cnf
में उस त्रुटि कोड को छोड़ने के लिए एक पंक्ति जोड़ेंगे। ।
उदाहरण के लिए आप अपने द्वारा की जा रही सभी डुप्लिकेट त्रुटियों को छोड़ना चाह सकते हैं
1062 | Error 'Duplicate entry 'xyz' for key 1' on query
फिर निम्नलिखित को अपने my.cnf
जोड़ें
slave-skip-errors = 1062
आप अन्य प्रकार की त्रुटियों या सभी त्रुटि कोडों को भी छोड़ सकते हैं, लेकिन सुनिश्चित करें कि उन त्रुटियों को छोड़ना आपके दास को असंगत नहीं लाएगा। निम्नलिखित वाक्य रचना और उदाहरण हैं
slave-skip-errors=[err_code1,err_code2,...|all]
slave-skip-errors=1062,1053
slave-skip-errors=all
slave-skip-errors=ddl_exist_errors