จะซิงค์ Mysql DB ใหม่ได้อย่างไรถ้า Master และ Slave มีฐานข้อมูลที่แตกต่างจากการจำลองแบบ Mysql


139

mysql Server1ทำงานเป็นMASTER
Mysql Server2ทำงานเป็นSLAVEทาส

ตอนนี้การจำลองแบบ DB ที่เกิดขึ้นจากMASTERเพื่อSLAVE

Server2ถูกลบออกจากเครือข่ายและเชื่อมต่อใหม่อีกครั้งหลังจาก 1 วัน หลังจากนี้มีไม่ตรงกันในฐานข้อมูลในต้นแบบและทาส

วิธีซิงค์ฐานข้อมูลอีกครั้งอีกครั้งหลังจากกู้คืนฐานข้อมูลที่นำมาจาก Master ไปยัง Slave แล้วยังไม่สามารถแก้ปัญหาได้?

คำตอบ:


287

นี่เป็นกระบวนการทีละขั้นตอนเต็มรูปแบบในการซิงค์การจำลองแบบต้นแบบทาสจากศูนย์:

ที่อาจารย์:

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

และคัดลอกค่าของผลลัพธ์ของคำสั่งสุดท้ายที่ใดที่หนึ่ง

โดยไม่ต้องปิดการเชื่อมต่อกับลูกค้า (เพราะมันจะปล่อยล็อคการอ่าน) ออกคำสั่งเพื่อรับการถ่ายโอนข้อมูลของต้นแบบ:

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

ตอนนี้คุณสามารถปลดล็อคแม้ว่าการถ่ายโอนข้อมูลยังไม่สิ้นสุด โดยทำตามคำสั่งต่อไปนี้ในไคลเอนต์ MySQL:

UNLOCK TABLES;

ตอนนี้คัดลอกไฟล์การถ่ายโอนไปยังทาสโดยใช้ scp หรือเครื่องมือที่คุณต้องการ

ที่ทาส:

เปิดการเชื่อมต่อกับ 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

แค่นั้นแหละ!


8
ด้วย INNODB พิมพ์ dabatase และประเภทคอลัมน์ที่ซับซ้อนอื่น ๆ เช่น BLOB และ DATE ที่กำหนดไว้ฉันขอแนะนำให้ใช้สวิตช์ต่อไปนี้:--opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases
Ken Pega

4
คือRESET_SLAVEจำเป็น? โปรดทราบว่าคำแนะนำเหล่านี้รีเซ็ตผู้ใช้การจำลองแบบและรหัสผ่านดังนั้นคุณจะต้องป้อนใหม่ด้วยCHANGE MASTER TO...
Mike S.

25
หากคุณใช้แฟล็ก --master-data เมื่อเรียก mysqldump บนมาสเตอร์คำสั่ง CHANGE MASTER TO จะถูกเขียนลงในไฟล์ดัมพ์และบันทึกขั้นตอนในการเรียกใช้งานหลังจากนำเข้าดัมพ์ไฟล์ไปยังสลาฟ
udog

3
ไม่ล็อคต้นแบบ (ไม่ต้องใช้ Percona) plusbryan.com/mysql-replication-without-downtimeประโยชน์อีกอย่างของการทำเช่นนี้คือ SQL dump ยังมาพร้อมกับบรรทัด "CHANGE MASTER" ที่จำเป็น (แสดงความคิดเห็น)
mahemoff

2
มีวิธีอัตโนมัติหรือไม่
Metafaniel

26

เอกสารสำหรับสิ่งนี้ที่ไซต์ MySQL นั้นล้าสมัยและเต็มไปด้วยปืนยาว (เช่น interactive_timeout) การออกตารางล้างด้วย READ LOCK ซึ่งเป็นส่วนหนึ่งของการส่งออกต้นแบบโดยทั่วไปจะเหมาะสมเมื่อประสานงานกับสแน็ปช็อตที่เก็บข้อมูล / ระบบไฟล์เช่น LVM หรือ zfs

หากคุณกำลังจะใช้ mysqldump คุณควรพึ่งพาตัวเลือก --master-data แทนเพื่อป้องกันข้อผิดพลาดของมนุษย์และปลดล็อคตัวต้นแบบโดยเร็วที่สุด

สมมติว่าต้นแบบคือ 192.168.100.50 และสลาฟคือ 192.168.100.51 แต่ละเซิร์ฟเวอร์มีการกำหนดค่ารหัสเซิร์ฟเวอร์ที่แตกต่างกันต้นแบบมีการเข้าสู่ระบบแบบไบนารีและสลาฟมีการอ่านอย่างเดียว = 1 ใน my.cnf

หากต้องการจัดเลเบลให้สามารถเรพลิเคตหลังจากอิมพอร์ตดัมพ์ให้ออกคำสั่ง CHANGE MASTER แต่ไม่ต้องใส่ชื่อและตำแหน่งของล็อกไฟล์:

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

ออก GRANT ให้กับมาสเตอร์เพื่อให้ทาสใช้:

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 ไปยังสลาฟจากนั้นอิมพอร์ตด้วย zcat ไปยังอินสแตนซ์ของ MySQL ที่รันบนสลาฟ:

zcat replication.sql.gz | mysql

เริ่มการจำลองแบบโดยออกคำสั่งไปยังสลาฟ:

slaveserver> START SLAVE;

อัพเดตทางเลือก /root/.my.cnf บนสเลฟเพื่อเก็บรหัสผ่านรูทเดียวกับมาสเตอร์

หากคุณใช้ระบบ 5.1+ คุณควรตั้งค่า binlog_format ของต้นแบบเป็น MIXED หรือ ROW ก่อน ระวังว่าเหตุการณ์ที่บันทึกแถวจะช้าสำหรับตารางที่ไม่มีคีย์หลัก โดยปกติแล้วจะดีกว่าการกำหนดค่าทางเลือก (และค่าเริ่มต้น) ของ binlog_format = คำสั่ง (บนต้นแบบ) เนื่องจากมีโอกาสน้อยที่จะสร้างข้อมูลที่ไม่ถูกต้องบนสลาฟ

หากคุณต้อง (แต่อาจไม่ควร) การจำลองแบบตัวกรองให้ทำเช่นนั้นด้วยตัวเลือกสเลปแบบ replicate-wild-do-table = dbname.% หรือ replicate-wild-ละเว้น-table = badDB.% และใช้เฉพาะ binlog_format = แถว

กระบวนการนี้จะระงับการล็อกโกลบอลบนมาสเตอร์ในช่วงเวลาของคำสั่ง mysqldump แต่จะไม่ส่งผลกระทบต่อมาสเตอร์

หากคุณถูกล่อลวงให้ใช้ mysqldump - master-data - all-database --single-transaction (เพราะคุณใช้ตาราง InnoDB เท่านั้น) คุณอาจจะได้รับบริการที่ดีกว่าโดยใช้ MySQL Enterprise Backup หรือการใช้โอเพ่นซอร์สที่เรียกว่า xtrabackup Percona)


3
หากคุณต้องการสร้างทาสที่มีอยู่ใหม่คุณสามารถทำตามขั้นตอนด้านบนโดยข้ามขั้นตอนสองขั้นตอน: คำสั่ง GRANT และคู่มือเปลี่ยนหลักด้วยตนเอง
ล้าสมัยแล้ว

คำถามที่ 1: บน Windows, zcatสิ่งที่จะเทียบเท่า คำถามที่ 2: mysqldumpค่าโดยสารนี้มีฐานข้อมูลขนาดใหญ่ในแง่ของประสิทธิภาพได้อย่างไร มีวิธีใดที่จะใช้SELECT INTO OUTFILEและLOAD DATAราบรื่นในกระบวนการที่คุณแนะนำ? (เนื่องจากโดยทั่วไปจะทำงานได้เร็วขึ้น)
Ifedi Okonkwo

ไม่จำเป็นต้องSTOP SLAVEอยู่ที่ไหนสักแห่งในกระบวนการ?
David V.

16

หากคุณไม่ได้เขียนโดยตรงไปที่ slave (Server2) ปัญหาเดียวที่ควรจะเป็นคือ Server2 ขาดการอัพเดทใด ๆ ที่เกิดขึ้นตั้งแต่ถูกตัดการเชื่อมต่อ เพียงเริ่มทาสใหม่ด้วย "START SLAVE;" ควรสำรองข้อมูลทุกอย่างไว้ด้วยความเร็ว


2
คุณสามารถตรวจสอบบันทึกถังขยะและดูว่าครอบคลุมช่วงเวลาที่ระบบของคุณไม่ซิงค์หรือไม่ หากคุณหายไปหลายวันอาจเป็นปัญหาใหญ่และคุณต้องทำการถ่ายโอนข้อมูลเต็มรูปแบบเพื่อกู้คืนข้อมูลที่หายไป
nelaaro

7

ฉันคิดว่า Maatkit utilits ช่วยคุณได้! คุณสามารถใช้ mk-table-sync โปรดดูลิงค์นี้: http://www.maatkit.org/doc/mk-table-sync.html


ฉันคิดว่าเขาจะต้องหยุดเขียนชั่วคราวในขณะที่เรียกใช้สคริปต์
Ztyx

ยังคงใช้งานได้ดี มีการเปลี่ยนชื่อเครื่องมือแล้วและตอนนี้เรียกว่า pt-table-sync แม้ว่าที่จริงแล้วฉันพบว่าเครื่องมือ pt-slave-restart ของพวกเขาทำงานเหมือนเวทมนต์
mlerley

7

ฉันสายไปคำถามนี้ แต่ฉันพบปัญหานี้และหลังจากค้นหามากฉันพบข้อมูลนี้จาก Bryan Kennedy: http://plusbryan.com/mysql-replication-without-downtime

เมื่อ Master ทำการสำรองข้อมูลเช่นนี้:
mysqldump --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data = 2 -A> ~ / dump.sql

ตอนนี้ตรวจสอบส่วนหัวของไฟล์และจดค่าสำหรับ MASTER_LOG_FILE และ MASTER_LOG_POS คุณจะต้องใช้ภายหลัง: head dump.sql -n80 | grep "MASTER_LOG"

คัดลอกไฟล์ "dump.sql" ไปยัง Slave และกู้คืน: mysql -u mysql-user -p <~ / dump.sql

เชื่อมต่อกับ Slave mysql และเรียกใช้คำสั่งเช่นนี้: เปลี่ยน MASTER TO เป็น MASTER_HOST = 'master-server-ip', MASTER_USER = 'การจำลองแบบผู้ใช้', MASTER_PASSWORD = 'ทาสเซิร์ฟเวอร์รหัสผ่าน', MASTER_LOG_FILE = 'ค่าจากด้านบน', MASTER_LOG_POS = ค่าจากด้านบน; เริ่มทาส

ในการตรวจสอบความคืบหน้าของ Slave: SHOW SLAVE STATUS;

หากทุกอย่างดี Last_Error จะว่างเปล่าและ Slave_IO_State จะรายงาน“ กำลังรอให้นายส่งเหตุการณ์” มองหา Seconds_Behind_Master ซึ่งระบุว่าอยู่ด้านหลังมากแค่ไหน YMMV :)


3
วิธีนี้ใช้ได้ผลและหากทาสถูกตั้งค่าและหลุดจากการซิงค์เท่านั้นคุณไม่จำเป็นต้องเปลี่ยน CHANGE MASTER เพียงระบุ--master-data=1(หรือเพียง--master-data)
LSerni

5

นี่คือสิ่งที่ฉันมักจะทำเมื่อทาส mysql ไม่ซิงค์กัน ฉันดู mk-table-sync แต่คิดว่าส่วนความเสี่ยงดูน่ากลัว

กับอาจารย์:

SHOW MASTER STATUS

คอลัมน์ผลลัพธ์ (ไฟล์, ตำแหน่ง) จะถูกใช้งานกับเราในไม่ช้า

บนทาส:

STOP SLAVE

จากนั้นดัมพ์ master db และอิมพอร์ตไปยัง slave db

จากนั้นเรียกใช้สิ่งต่อไปนี้:

CHANGE MASTER TO
  MASTER_LOG_FILE='[File]',
  MASTER_LOG_POS=[Position];
START SLAVE;

ตำแหน่งที่ [ไฟล์] และ [ตำแหน่ง] เป็นค่าที่ส่งออกจาก "SHOW MASTER STATUS" ที่วิ่งไปด้านบน

หวังว่านี่จะช่วยได้!


5
ดูเหมือนว่าจะใช้งานไม่ได้เนื่องจากเห็นได้ชัดว่าคุณไม่ได้อยู่FLUSH TABLES WITH READ LOCK;ต่อหน้าคุณSHOW MASTER STATUSและดัมพ์ฐานข้อมูลหลัก ฉันคิดว่าสิ่งนี้อาจส่งผลให้เกิดข้อผิดพลาดที่สำคัญเช่นซ้ำกับทาสเนื่องจากคุณตั้งค่าสถานะหลักเป็นเวลาก่อนที่จะมีการถ่ายโอนข้อมูลดังนั้นคุณจะเล่นซ้ำประวัติที่รวมอยู่ในการถ่ายโอนข้อมูลแล้ว (ถ้าคุณทำสิ่งต่าง ๆ ตามที่คุณอธิบาย)
KajMagnus

5

ติดตามคำตอบของเดวิด ...

การใช้SHOW SLAVE STATUS\Gจะให้ผลลัพธ์ที่มนุษย์อ่านได้


มีวิธีใดในการหน้าเอาต์พุต?
Josiah

'เพจเจอร์เพิ่มเติม' ฉันคิดว่าจะทำ
Ian

3

บางครั้งคุณก็ต้องให้ลูกเตะด้วยเช่นกัน

ลอง

stop slave;    
reset slave;    
start slave;    
show slave status;

ค่อนข้างบ่อยทาสพวกเขาก็ติดอยู่ :)


... และจอแสดงผลPositionบนต้นแบบใช้show master status;กับบนทาสใช้Exec_Master_Log_Pos: show slave status \Gทาสควรติดต่อกับนาย ทำงานให้ฉันโดยใช้ mysql 5.6 หลังจากเครือข่ายขาดหาย
Mike S

10
นี่คือการเข้าใจผิดเมื่อคุณรีเซ็ตทาสความรู้ที่หายไปโดยสิ้นเชิงเกี่ยวกับที่ต้นแบบเป็น
Qian Chen

2

นี่คือคำตอบที่สมบูรณ์ที่หวังว่าจะช่วยผู้อื่น ...


ฉันต้องการตั้งค่าการจำลองแบบ mysql โดยใช้ master และ slave และเนื่องจากสิ่งเดียวที่ฉันรู้ก็คือมันใช้ log file เพื่อซิงโครไนซ์ถ้า Slave ออฟไลน์และหลุดจากการซิงค์ในทางทฤษฎีมันควรจะเชื่อมต่อกลับเท่านั้น ถึงต้นแบบของมันและทำการอ่านล็อกไฟล์จากจุดที่มันค้างเอาไว้ตามที่ผู้ใช้ระบุไว้

ดังนั้นนี่คือผลการทดสอบหลังจากกำหนดค่า master และ slave ตามที่กล่าวถึงโดย: http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html ...

ให้คุณใช้การกำหนดค่า master / slave ที่แนะนำและไม่เขียนถึงทาสเขาและฉันถูกต้อง (เท่าที่ mysql-server 5.x เกี่ยวข้อง) ฉันไม่จำเป็นต้องใช้ "START SLAVE;" แต่มันก็ขึ้นอยู่กับเจ้านายของมัน แต่มี 88000 ค่าเริ่มต้นที่ลองใหม่ทุก ๆ 60 วินาทีดังนั้นฉันเดาว่าถ้าคุณหมดแรงคุณอาจต้องเริ่มหรือเริ่มทาสใหม่ ยังไงก็ตามสำหรับคนอย่างฉันที่อยากรู้ว่าการมีทาสกำลังออฟไลน์หรือไม่และการสำรองข้อมูลอีกครั้งจำเป็นต้องมีการแทรกแซงด้วยตนเอง .. ไม่เลย

บางทีผู้โพสต์ดั้งเดิมมีความเสียหายในไฟล์บันทึกหรือไม่? แต่ส่วนใหญ่อาจไม่ใช่แค่เซิร์ฟเวอร์กำลังออฟไลน์อยู่หนึ่งวัน


ดึงมาจาก /usr/share/doc/mysql-server-5.1/README.Debian.gz ซึ่งอาจเหมาะสมกับเซิร์ฟเวอร์ที่ไม่ใช่เดเบียนเช่นกัน:

* หมายเหตุเพิ่มเติมเกี่ยวกับการจำลอง
===============================
หากเซิร์ฟเวอร์ MySQL ทำหน้าที่เป็นสลาฟจำลองคุณไม่ควรทำ
ตั้ง --tmpdir ให้ชี้ไปที่ไดเรกทอรีบนระบบไฟล์ที่ใช้หน่วยความจำหรือ
ไดเร็กทอรีที่ถูกล้างเมื่อโฮสต์เซิร์ฟเวอร์รีสตาร์ท การจำลองแบบ
slave ต้องการไฟล์ชั่วคราวบางไฟล์เพื่อความอยู่รอดในการรีสตาร์ทเครื่อง
มันสามารถทำซ้ำตารางชั่วคราวหรือการดำเนินการโหลดข้อมูล INFILE ถ้า
ไฟล์ในไดเร็กทอรีไฟล์ชั่วคราวจะหายไปเมื่อเซิร์ฟเวอร์รีสตาร์ท
การจำลองแบบล้มเหลว

คุณสามารถใช้บางอย่างของ sql like: แสดงตัวแปรเช่น 'tmpdir'; ค้นหา.


ทั้งสองฐานข้อมูลจะซิงค์โดยอัตโนมัติระหว่างกันหรือไม่ เช่นฉันเขียนถึง Master, Slave จะได้รับการอัพเดตโดยอัตโนมัติหรือไม่?
TransformBinary

2

การเพิ่มคำตอบยอดนิยมเพื่อรวมข้อผิดพลาดนี้:

"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

หมายเหตุ: เมื่อทำซ้ำต้นแบบและทาสจะใช้รหัสผ่านเดียวกัน!


ทั้งสองฐานข้อมูลจะซิงค์โดยอัตโนมัติระหว่างกันหรือไม่ เช่นฉันเขียนถึง Master, Slave จะได้รับการอัพเดตโดยอัตโนมัติหรือไม่?
TransformBinary

1

การสร้าง Slave ขึ้นมาใหม่โดยใช้ LVM

นี่คือวิธีที่เราใช้ในการสร้างทาสทาส MySQL โดยใช้ Linux LVM สิ่งนี้รับประกันสแนปชอตที่สอดคล้องกันในขณะที่ต้องการเวลาหยุดทำงานน้อยที่สุดในต้นแบบของคุณ

ตั้ง innodb สูงสุดเพจสกปรกเปอร์เซ็นต์เป็นศูนย์บนเซิร์ฟเวอร์ MySQL หลัก นี่จะเป็นการบังคับให้ MySQL เขียนทุกหน้าไปยังดิสก์ซึ่งจะช่วยเร่งความเร็วในการรีสตาร์ท

set global innodb_max_dirty_pages_pct = 0;

ในการตรวจสอบจำนวนหน้าสกปรกให้รันคำสั่ง

mysqladmin ext -i10 | grep dirty

เมื่อจำนวนหยุดลดลงคุณถึงจุดที่จะดำเนินการต่อไป รีเซ็ตต้นแบบถัดไปเพื่อล้างบันทึก bin / บันทึกการถ่ายทอดเก่า:

RESET MASTER;

ดำเนินการ lvdisplay เพื่อรับ LV Path

lvdisplay

ผลลัพธ์จะมีลักษณะเช่นนี้

--- Logical volume ---
LV Path                /dev/vg_mysql/lv_data
LV Name                lv_data
VG Name                vg_mysql

ปิดฐานข้อมูลหลักด้วยคำสั่ง

service mysql stop

จากนั้นใช้ snaphot mysql_snapshot จะเป็นชื่อโลจิคัลวอลุ่มใหม่ หาก binlogs วางอยู่บนไดรฟ์ระบบปฏิบัติการจำเป็นต้องมีสแนปช็อตด้วย

lvcreate --size 10G --snapshot --name mysql_snapshot /dev/vg_mysql/lv_data

เริ่มต้นแบบอีกครั้งด้วยคำสั่ง

service mysql start

กู้คืนการตั้งค่าหน้าสกปรกให้กลับเป็นค่าเริ่มต้น

set global innodb_max_dirty_pages_pct = 75;

เรียกใช้ lvdisplay อีกครั้งเพื่อให้แน่ใจว่าสแน็ปช็อตอยู่ที่นั่นและมองเห็นได้

lvdisplay

เอาท์พุท:

--- Logical volume ---
LV Path                /dev/vg_mysql/mysql_snapshot
LV Name                mysql_snapshot
VG Name                vg_mysql

เมานต์สแนปชอต

mkdir /mnt/mysql_snapshot
mount /dev/vg_mysql/mysql_snapshot /mnt/mysql_snapshot

หากคุณมี MySQL MySQL ที่รันอยู่คุณจำเป็นต้องหยุดมัน

service mysql stop

ถัดไปคุณต้องล้างโฟลเดอร์ข้อมูล MySQL

cd /var/lib/mysql
rm -fr *

กลับไปสู่หลัก ตอนนี้ซิงค์ภาพรวมกับทาส MySQL

rsync --progress -harz /mnt/mysql_snapshot/ targethostname:/var/lib/mysql/

เมื่อ rsync เสร็จสมบูรณ์คุณสามารถยกเลิกการต่อเชื่อมและลบสแนปชอตได้

umount /mnt/mysql_snapshot
lvremove -f /dev/vg_mysql/mysql_snapshot

สร้างผู้ใช้การจำลองแบบบนต้นแบบถ้าไม่มีผู้ใช้การจำลองแบบเก่าหรือไม่ทราบรหัสผ่าน

GRANT REPLICATION SLAVE on *.* to 'replication'@'[SLAVE IP]' identified by 'YourPass';

ตรวจสอบว่าไฟล์ข้อมูล / var / lib / mysql เป็นของผู้ใช้ mysql ถ้าเป็นเช่นนั้นคุณสามารถละเว้นคำสั่งต่อไปนี้:

chown -R mysql:mysql /var/lib/mysql

บันทึกตำแหน่ง binlog ถัดไป

ls -laF | grep mysql-bin

คุณจะเห็นสิ่งที่ชอบ

..
-rw-rw----     1 mysql mysql  1073750329 Aug 28 03:33 mysql-bin.000017
-rw-rw----     1 mysql mysql  1073741932 Aug 28 08:32 mysql-bin.000018
-rw-rw----     1 mysql mysql   963333441 Aug 28 15:37 mysql-bin.000019
-rw-rw----     1 mysql mysql    65657162 Aug 28 16:44 mysql-bin.000020

ที่นี่ไฟล์บันทึกหลักคือหมายเลขไฟล์สูงสุดตามลำดับและตำแหน่งบันทึกถังขยะคือขนาดไฟล์ บันทึกค่าเหล่านี้:

master_log_file=mysql-bin.000020
master_log_post=65657162

ถัดไปเริ่ม MySQL ทาส

service mysql start

ดำเนินการคำสั่งเปลี่ยนแปลง master บนทาสโดยดำเนินการต่อไปนี้:

CHANGE MASTER TO 
master_host="10.0.0.12", 
master_user="replication", 
master_password="YourPass", 
master_log_file="mysql-bin.000020", 
master_log_pos=65657162; 

ในที่สุดก็เริ่มทาส

SLAVE START;

ตรวจสอบสถานะทาส:

SHOW SLAVE STATUS;

ตรวจสอบให้แน่ใจว่า Slave IO ทำงานอยู่และไม่มีข้อผิดพลาดในการเชื่อมต่อ โชคดี!

สาขา Juha Vehnia

ฉันเพิ่งเขียนลงในบล็อกของฉันซึ่งพบได้ที่นี่ ... มีรายละเอียดเพิ่มเติมเล็กน้อย แต่เรื่องราวก็เหมือนกัน

http://www.juhavehnia.com/2015/05/rebuilding-mysql-slave-using-linux-lvm.html


0

ฉันสร้าง repo GitHub ด้วยสคริปต์เพื่อแก้ปัญหานี้อย่างรวดเร็ว เพียงแค่เปลี่ยนตัวแปรสองสามตัวและรันมัน (ขั้นแรกสคริปต์จะสร้างการสำรองข้อมูลของฐานข้อมูลของคุณ)

ฉันหวังว่าสิ่งนี้จะช่วยคุณ (และคนอื่น ๆ ด้วย)

วิธีการรีเซ็ต (ซิงค์ซ้ำ) การจำลองแบบ MySQL Master-Slave


ฉันเห็นสคริปต์ตั้งตำแหน่งบันทึกหลักเป็น 1 เสมอและชื่อไฟล์บันทึกหลัก ฉันไม่รู้พอที่จะแน่ใจว่าฉันควรจะกังวลหรือไม่ คุณอธิบายได้ไหม ปัจจุบันฉันมีตำแหน่งมากกว่า 1,000,000 หมายความว่าจะพยายามเล่นซ้ำ 1mil ก่อนที่จะเพิ่มความเร็วหรือไม่ ไม่มีโอกาสเกิดความเสียหายในการเล่นคิวรี่เหล่านั้นกับข้อมูลที่มีอยู่หรือไม่? ฉันสงสัยว่าทำไมไม่อยู่ในสคริปต์เมื่อทำการถ่ายโอนข้อมูล mysql ใช้ตัวเลือก --master-data = 2 จากนั้นดึงไฟล์และวางออกจากการถ่ายโอนข้อมูลเพื่อตั้งค่า
Josiah

0

เราใช้เทคนิคการจำลองข้อมูลหลักของ MySQL และหากเซิร์ฟเวอร์ MySQL หนึ่งตัวบอกว่า 1 ถูกลบออกจากเครือข่ายมันจะทำการเชื่อมต่ออีกครั้งหลังจากที่การเชื่อมต่อได้รับการกู้คืนและบันทึกทั้งหมดที่ได้ทำไว้ในเซิร์ฟเวอร์ 2 ซึ่งอยู่ในเครือข่าย ไปยังเซิร์ฟเวอร์ 1 ซึ่งสูญเสียการเชื่อมต่อหลังจากการคืนค่า ทาสกระทู้ใน MySQL พยายามที่จะเชื่อมต่อกับต้นแบบหลังจากทุก 60 วินาทีโดยค่าเริ่มต้น คุณสมบัตินี้สามารถเปลี่ยนแปลงได้เป็น MySQL มีค่าสถานะ "master_connect_retry = 5" โดยที่ 5 เป็นวินาที ซึ่งหมายความว่าเราต้องการลองใหม่หลังจากนั้นทุกๆ 5 วินาที

แต่คุณต้องตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ที่สูญเสียการเชื่อมต่อไม่แสดงการกระทำใด ๆ ในฐานข้อมูลเมื่อคุณได้รับรหัสข้อผิดพลาดคีย์ผิดพลาดซ้ำ: 1062


0

ปริญญาโท :

mysqldump -u root -p --all-databases --master-data | gzip > /tmp/dump.sql.gz  

scp master:/tmp/dump.sql.gz slave:/tmp/ ย้ายไฟล์ดัมพ์ไปยังเซิร์ฟเวอร์ทาส

ทาส:

STOP SLAVE;

zcat /tmp/dump.sql.gz | mysql -u root -p

START SLAVE;
SHOW SLAVE STATUS;  

หมายเหตุ :
ในต้นแบบคุณสามารถเรียกใช้SET GLOBAL expire_logs_days = 3เพื่อเก็บ binlogs เป็นเวลา 3 วันในกรณีที่มีปัญหาทาส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.