mysql - करन - फर्श की सफाई




माईएसक्ल डीबी को फिर से सिंक कैसे करें यदि मास्टर और दास के पास माइस्क्ल प्रतिकृति के विभिन्न डेटाबेस हैं? (8)

MySQL Server1 मास्टर के रूप में चल रहा है।
MySQL Server2 रूप में चल रहा है।

अब मास्टर से स्लेव तक डीबी प्रतिकृति हो रही है।

Server2 को नेटवर्क से हटा दिया गया है और इसे 1 दिन के बाद फिर से कनेक्ट किया गया है। इसके बाद मास्टर और गुलाम में डेटाबेस में मेल नहीं है।

मास्टर से स्लेव में ली गई डीबी को बहाल करने के बाद डीबी को फिर से सिंक कैसे करें, समस्या को हल नहीं करता है?


MySQL साइट पर इसके लिए प्रलेखन दुर्भाग्य से पुराना है और पैर-गन (जैसे इंटरएक्टिव_टाउटआउट) के साथ झुका हुआ है। मास्टर के निर्यात के हिस्से के रूप में पढ़ें लॉक के साथ फ्लश टैबलेट जारी करना आम तौर पर केवल तब समझ में आता है जब एक स्टोरेज / फाइल सिस्टम स्नैपशॉट जैसे एलवीएम या जेएफएस के साथ समन्वय किया जाता है।

यदि आप mysqldump का उपयोग करने जा रहे हैं, तो आपको मानव त्रुटि के खिलाफ सुरक्षा के लिए --मास्टर-डेटा विकल्प पर भरोसा करना चाहिए और जितनी जल्दी हो सके मास्टर पर ताले को छोड़ देना चाहिए।

मान लीजिए कि मास्टर 1 9 2.168.100.50 है और दास 1 9 2.168.100.51 है, प्रत्येक सर्वर के पास एक अलग सर्वर-आईडी कॉन्फ़िगर किया गया है, मास्टर पर बाइनरी लॉगिंग है और दास ने my.cnf में केवल-पढ़ने के लिए = 1 किया है

गुलाम को डंप आयात करने के बाद प्रतिकृति शुरू करने में सक्षम होने के लिए, एक चेंज मास्टर कमांड जारी करें लेकिन लॉग फ़ाइल नाम और स्थिति को छोड़ दें:

slaveserver> CHANGE MASTER TO MASTER_HOST='192.168.100.50', MASTER_USER='replica', MASTER_PASSWORD='asdmk3qwdq1';

गुलाम का उपयोग करने के लिए मास्टर पर अनुदान जारी करें:

masterserver> GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.100.51' IDENTIFIED BY 'asdmk3qwdq1';

संपीड़न का उपयोग करके मास्टर (स्क्रीन में) को निर्यात करें और सही बाइनरी लॉग निर्देशांक को स्वचालित रूप से कैप्चर करें:

mysqldump --master-data --all-databases --flush-privileges | gzip -1 > replication.sql.gz

Replication.sql.gz फ़ाइल को दास को कॉपी करें और फिर दास पर चल रहे MySQL के उदाहरण के लिए इसे zcat के साथ आयात करें:

zcat replication.sql.gz | mysql

दास को आदेश जारी करके प्रतिकृति शुरू करें:

slaveserver> START SLAVE;

वैकल्पिक रूप से मास्टर के समान रूट पासवर्ड को स्टोर करने के लिए दास पर /root/.my.cnf को अद्यतन करें।

यदि आप 5.1+ पर हैं, तो सबसे पहले मास्टर के binlog_format को MIXED या ROW पर सेट करना सबसे अच्छा है। सावधान रहें कि पंक्ति लॉग इवेंट टेबल के लिए धीमे हैं जिनमें प्राथमिक कुंजी की कमी है। यह आमतौर पर binlog_format = कथन (मास्टर पर) के वैकल्पिक (और डिफ़ॉल्ट) कॉन्फ़िगरेशन से बेहतर होता है, क्योंकि दास पर गलत डेटा उत्पन्न करने की संभावना कम होती है।

यदि आपको फ़िल्टर प्रतिकृति (लेकिन शायद नहीं) फ़िल्टर करना चाहिए, तो दास विकल्प दोहराने के साथ ऐसा करें- जंगली-do-table = dbname।% या दोहराना-जंगली-अनदेखा-तालिका = badDB।% और केवल binlog_format = पंक्ति का उपयोग करें

इस प्रक्रिया में mysqldump कमांड की अवधि के लिए मास्टर पर वैश्विक लॉक होगा लेकिन अन्यथा मास्टर को प्रभावित नहीं करेगा।

यदि आप mysqldump --master-data --all-डेटाबेस - सिंगल-लेन-देन (क्योंकि आप केवल इनओडीबी टेबल का उपयोग कर रहे हैं) का उपयोग करने के लिए लुभाने वाले हैं, तो शायद आप MySQL एंटरप्राइज़ बैकअप या ओपन सोर्स कार्यान्वयन का उपयोग करके बेहतर सेवा कर सकते हैं जिसे xtrabackup (सौजन्य Percona)


इस त्रुटि को शामिल करने के लिए लोकप्रिय उत्तर में जोड़ना:

"ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO",

दास से एक शॉट में प्रतिकृति:

एक टर्मिनल विंडो में:

mysql -h <Master_IP_Address> -uroot -p

कनेक्ट करने के बाद,

RESET MASTER;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

स्थिति नीचे दिखाई देती है: ध्यान दें कि स्थिति संख्या भिन्न होती है!

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      98  | your_DB      |                  |
+------------------+----------+--------------+------------------+

इस तरह के डंप को निर्यात करें कि उन्होंने " दूसरे टर्मिनल का उपयोग करके " कैसे वर्णन किया है!

बाहर निकलें और अपने स्वयं के डीबी से कनेक्ट करें (जो दास है):

mysql -u root -p

नीचे दिए गए आदेश टाइप करें:

STOP SLAVE;

जैसा कि उल्लेख किया गया है डंप आयात करें (निश्चित रूप से किसी अन्य टर्मिनल में!) और नीचे दिए गए आदेश टाइप करें:

RESET SLAVE;
CHANGE MASTER TO 
  MASTER_HOST = 'Master_IP_Address', 
  MASTER_USER = 'your_Master_user', // usually the "root" user
  MASTER_PASSWORD = 'Your_MasterDB_Password', 
  MASTER_PORT = 3306, 
  MASTER_LOG_FILE = 'mysql-bin.000001', 
  MASTER_LOG_POS = 98; // In this case

एक बार लॉग इन करने के बाद, server_id पैरामीटर सेट करें (आमतौर पर, नए / गैर-प्रतिकृति डीबी के लिए, यह डिफ़ॉल्ट रूप से सेट नहीं होता है),

set global server_id=4000;

अब, दास शुरू करो।

START SLAVE;
SHOW SLAVE STATUS\G;

आउटपुट जैसा वर्णन किया गया वही होना चाहिए।

  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes

नोट: एक बार दोहराने के बाद, मास्टर और गुलाम एक ही पासवर्ड साझा करते हैं!


जब तक आप सीधे दास (सर्वर 2) पर लिख रहे हों, केवल एक ही समस्या यह होनी चाहिए कि सर्वर 2 में डिस्कनेक्ट होने के बाद से होने वाले किसी भी अपडेट को याद किया जा रहा है। बस दास को "स्टार्ट स्लेव" के साथ पुनरारंभ करना; सबकुछ वापस गति से प्राप्त करना चाहिए।


डेविड के जवाब पर पीछा किया ...

SHOW SLAVE STATUS\G का उपयोग मानव-पठनीय आउटपुट देगा।


मुझे लगता है, मातकिट उपयोग आपके लिए मदद करता है! आप एमके-टेबल-सिंक का उपयोग कर सकते हैं। कृपया यह लिंक देखें: http://www.maatkit.org/doc/mk-table-sync.html


मैंने इस समस्या को जल्दी हल करने के लिए एक स्क्रिप्ट के साथ एक गिटहब रेपो बनाया है। बस कुछ चर बदलें और इसे चलाएं (सबसे पहले, स्क्रिप्ट आपके डेटाबेस का बैकअप बनाता है)।

मुझे उम्मीद है कि यह आपकी मदद करेगा (और अन्य लोग भी)।

रीसेट (री-सिंक) कैसे MySQL मास्टर-स्लेव प्रतिकृति


यहां एक पूरा उत्तर दिया गया है जो उम्मीद है कि दूसरों की मदद करेगा ...

मैं मास्टर और गुलाम का उपयोग करके mysql प्रतिकृति सेट करना चाहता हूं, और चूंकि मुझे पता था कि एकमात्र चीज यह थी कि यह सिंक्रनाइज़ करने के लिए लॉग फ़ाइल का उपयोग करता है, अगर दास ऑफ़लाइन हो जाता है और सिंक से बाहर हो जाता है, तो सिद्धांत में इसे केवल कनेक्ट करने की आवश्यकता होनी चाहिए उपयोगकर्ता के मैलोनो के रूप में, इसके मास्टर के लिए और जहां से यह छोड़ा गया था, लॉग फ़ाइल को पढ़ते रहें।

तो मास्टर और दास को कॉन्फ़िगर करने के बाद परीक्षण परिणाम यहां दिए गए हैं: http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html ...

बशर्ते आप अनुशंसित मास्टर / गुलाम कॉन्फ़िगरेशन का उपयोग करें और दास को न लिखें, वह और मैं कहां सही (जहां तक ​​mysql-server 5.x संबंधित है)। मुझे "स्टार्ट स्लेव" का उपयोग करने की भी आवश्यकता नहीं थी, यह सिर्फ अपने गुरु को पकड़ा गया। लेकिन प्रत्येक 60 सेकेंड में एक डिफ़ॉल्ट 88000 कुछ रिट्रीज़ होता है, इसलिए मुझे लगता है कि अगर आप निकास करते हैं तो आपको दास को शुरू करना या पुनरारंभ करना पड़ सकता है। वैसे भी, मेरे जैसे लोगों के लिए जो जानना चाहते थे कि क्या दास ऑफ़लाइन जा रहा है और फिर बैक अप लेने के लिए मैन्युअल हस्तक्षेप की आवश्यकता है .. नहीं, ऐसा नहीं है।

शायद मूल पोस्टर लॉग-फाइल में भ्रष्टाचार था? लेकिन संभवतया एक सर्वर सिर्फ एक दिन के लिए ऑफ़लाइन नहीं जा रहा है।

/usr/share/doc/mysql-server-5.1/README.Debian.gz से खींचा गया जो शायद गैर डेबियन सर्वरों को भी समझ में आता है:

* FURTHER NOTES ON REPLICATION
===============================
If the MySQL server is acting as a replication slave, you should not
set --tmpdir to point to a directory on a memory-based filesystem or to
a directory that is cleared when the server host restarts. A replication
slave needs some of its temporary files to survive a machine restart so
that it can replicate temporary tables or LOAD DATA INFILE operations. If
files in the temporary file directory are lost when the server restarts,
replication fails.

आप कुछ एसक्यूएल का उपयोग कर सकते हैं जैसे: 'tmpdir' जैसे चर दिखाएं; पता लगाने के लिए।


स्क्रैच से मास्टर-गुलाम प्रतिकृति को पुनर्वितरण करने के लिए यह पूर्ण चरण-दर-चरण प्रक्रिया है:

मास्टर में:

RESET MASTER;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

और कहीं भी अंतिम आदेश के परिणाम के मूल्यों की प्रतिलिपि बनाएँ

क्लाइंट से कनेक्शन बंद किए बिना (क्योंकि यह रीड लॉक जारी करेगा) मास्टर का डंप प्राप्त करने के लिए कमांड जारी करें:

mysqldump -u root -p --all-databases > /a/path/mysqldump.sql

अब आप लॉक जारी कर सकते हैं, भले ही डंप अभी तक समाप्त नहीं हुआ हो। ऐसा करने के लिए, MySQL क्लाइंट में निम्न आदेश करें:

UNLOCK TABLES;

अब डंप फ़ाइल को एसपीपी या अपने पसंदीदा टूल का उपयोग करके गुलाम को कॉपी करें।

दास पर:

Mysql से कनेक्शन खोलें और टाइप करें:

STOP SLAVE;

इस कंसोल कमांड के साथ लोड मास्टर का डेटा डंप करें:

mysql -uroot -p < mysqldump.sql

सिंक गुलाम और मास्टर लॉग:

RESET SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;

जहां उपरोक्त फ़ील्ड के मान हैं जिन्हें आपने पहले कॉपी किया था।

अंत में, टाइप करें:

START SLAVE;

यह जांचने के लिए कि टाइपिंग के बाद सब कुछ फिर से काम कर रहा है:

SHOW SLAVE STATUS;

तुम्हे देखना चाहिए:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

बस!







database-replication