Simple.phateaw.com
พฤษภาคม 17, 2024, 09:58:58 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
ข่าว: ประสบการณ์ดีๆ มีไว้แบ่งปันกันไม่ได้มีไว้ดองไว้ในหัวเราคนเดียว !
 
   หน้าแรก   ช่วยเหลือ ค้นหา ปฏิทิน เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  ส่งหัวข้อนี้  |  พิมพ์  
ผู้เขียน หัวข้อ: การทำ Replicate MySQL  (อ่าน 3818 ครั้ง)
admin
Administrator
บินเดี่ยวได้สบายๆ
*****

จิตพิสัย: +0/-0
กระทู้: 197


อีเมล์
« เมื่อ: ตุลาคม 15, 2009, 07:20:37 pm »

ทำ Replicate MySQL ครับ

หลังจากลง MySQL เสร็จแล้ว ( ขอข้ามขั้นตอนนี้เพราะเคยเขียนไว้แล้วกระทู้ล่างๆ นี้ )
วันนี้มาทำ กับเครื่องดังนี้โดยสิ่งที่มีดังนี้

1.  Master ผมเป็น FreeBSD 6.2
ลง MySQL แบบผ่าน ports เปลี่ยนพาร์ท  data แล้วไว้ที่  /home/mysqldata

2.  Slave เป็น Debian 4.0
ลง MySQL แบบผ่าน apt-get เปลี่ยนพาร์ท data แล้วไว้ที่ /home/mysqldata

เพื่อง่ายต่อการแบคอัพข้อมูลครับ   ลงแบบผ่านซอสคอมไพล์เองก็ได้  แบบกระทู้ก่อนที่เคยเขียนไว้ 

1.ที่เครื่อง Master
- เข้าใช้ MySQL
# mysql -u root -p   

ใส่พาสเวิร์สไป เข้าไปสู่พร้อมของ mysql
>

ทำการแกร้งสิทธิ์ให้เครื่องสลาฟ  ให้มีสิทธิ์ดึงข้อมูล  โดยคำสั่งนี้
GRANT REPLICATION SLAVE ON *.* TO root@"เครือง slave.ชื่อโดเมน" IDENTIFIED BY 'พาสเวิร์ส root ของ slave';

ทำการแก้ไขไฟล์ config   my.cnf  ( ที่ต้องก๊อปมาเองก่อนแล้ว )
# vi /etc/my.cnf    แล้วใส่ค่านี้เพิ่มเข้าไป

server-id       = 1
log-bin=mysql-bin
server-id               = 1
binlog-ignore-db        = mysql
replicate-ignore-db     = mysql


เสร็จแล้วเซฟออกมา


2. ที่เครื่อง Slave
ทำการแก้ไขไฟล์คอนฟิก  my.cnf  ( ที่ก๊อปมาเองแล้วก่อนหน้านี้เช่นกัน  ในเครืองนี้เก็บใน /etc/mysql/my.cnf )
# vi /etc/mysql/my.cnf   

แล้วใส่ค่าไปดังนี้

[mysqld]
master-host= ไอพีเครื่อง Master
master-user=root
master-password= พาสเวิร์ส root ของ slave
master-port=3306
server-id=2

เสร็จแล้ว เซฟออกมา

restart service ทั้ง 2 เครือ่งสักที
มาสเตอร์  freeBSD

- /usr/local/etc/rc.d/mysql-server stop
- /usr/local/etc/rc.d/mysql-server start

slave Debian4

- /etc/init.d/mysql stop
- /etc/init.d/mysql start


ตรวจสอบการทำงานของการ replicate
ที่เครื่อง slave เข้า MySQL
แล้วลองดูสเตตัส  การทำ slave  ดังนี้
> mysql> SHOW SLAVE STATUS\G

*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 10.0.0.217
                Master_User: root
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000003
        Read_Master_Log_Pos: 424
             Relay_Log_File: bebe-relay-bin.000005
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000003
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 424
            Relay_Log_Space: 235
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)

จะโชว์สถานะของสลาฟทั้งหมด  ว่า running อยู่ ทั้ง IO และ slave SQL  มาสเตอร์เครือ่งไหน  แล้ว log บนมาสเตอร์เขียนที่ไฟล์ไหน


แล้วมาดูฝั่ง Master บ้าง
ลอกอิน MySQL
>   แล้วสั่ง
> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      424 |              | mysql            |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

ดูที่ไฟล์เป็นตัวเดียวกัน  ok และระดับหนึ่ง

ทดสอบโดย ผ่านหน้า interface ของ phpmyadmin ก็ได้
โดยลองทดสอบสร้าง database มาสักตัวหนึ่ง  ตารางสักตาราง  จากฝั่ง Master  ( ที่นี้คือ 10.0.0.217)
ดังรูปผมสร้าง ดาต้าเบส ชื่อ REP1 ตารางชื่อ test  ใส่ฟิวไปฟิวหนึ่ง ชื่อ id  แล้วก็ลองใส่ค่า 55555




แล้วลองเปิดดูที่เครือง  Slave ( ที่นี้คือ 10.0.0.232 )



จะเห็นได้ว่ามีตารางโผล่มาอีกอันคือ REP1 และข้อมูลด้านในเหมือนกันกับ ตัว master เด๊ะ ๆ 
เป็นอันว่าสำมะเร็จครับ   การทำ Replicate MySQL


หากก๊อปมาแล้วบางที ฟังชั่นการ Replicate หลุด
ฟ้องว่าไม่เจอ ตัวมาสเตอร์เราต้องทำการเชื่อมต่อใหม่ด้วยคำสั่ง

CHANGE MASTER TO MASTER_HOST='ip ตัวมาสเตอร์', MASTER_USER='user ที่ระบุในคอนฟิกในการ rep', MASTER_PASSWORD='password ที่ระบุในการทำ rep';

เพิ่มเติมในกรณีที่เกิดเหตุขัดข้องทำให้การ replicate ไม่ทำการ sync กันไม่ว่าจะเป็นไฟดับ  หรือ รีบูทเครืองแล้วเออเรอร์
สตาร์ทเซอร์วิสแล้วยังไส่ sync กัน    ให้ทำการ  stop service ทั้ง2 ฝั่ง
แล้ว  copy ข้อมูลของตัว master ทั้งหมด  ยกเว้น  ที่ขึ้นต้นว่า mysql ต่างๆ นั้นไม่ต้องเอามา
แล้วไปวางบนเครื่อง slave และลบ log ไฟล์เก่าบน slave ออกให้หมด
แล้วค่อยสตาร์ท service ทั้งสองเครืองขึ้นมาใหม่   แล้วลองเทสดู
แจ้งลบกระทู้นี้หรือติดต่อผู้ดูแล   บันทึกการเข้า
admin
Administrator
บินเดี่ยวได้สบายๆ
*****

จิตพิสัย: +0/-0
กระทู้: 197


อีเมล์
« ตอบ #1 เมื่อ: ตุลาคม 01, 2014, 03:20:36 pm »

***Update สำหรับ MySQL version ใหม่ (ที่ผมเจอตอนนี้ version 5.6 )
ไม่ยอมให้ระบุคอนฟิก replicate ลงใน my.cnf แล้วนะครับ   ต้องสั่งผ่าน command เอง
ดังตัวอย่าง

http://opensourcedbms.com/dbms/setup-replication-with-mysql-5-6-server-on-centos-6-redhat-el6-fedora/


ตอนแรกไม่รู้มึนไปค่อนวัน  กับ error หลังสตาร์ท
#  /etc/init.d/mysql start
Starting MySQL.... ERROR! The server quit without updating PID file (/var/lib/mysql/TH10DR-JIRA1.pid).

ว่า configure อะไรผิด
แจ้งลบกระทู้นี้หรือติดต่อผู้ดูแล   บันทึกการเข้า
admin
Administrator
บินเดี่ยวได้สบายๆ
*****

จิตพิสัย: +0/-0
กระทู้: 197


อีเมล์
« ตอบ #2 เมื่อ: มกราคม 14, 2016, 05:47:41 pm »

อัพเดทสำหรับ version 5.6 ขึ้นไป  ให้ใช้แบบ command เท่านั้นฝังในไฟล์คอนฟฟิกไม่ได้

ที่เครือง master
==============
> stop mysql  service
เช็คไฟล์   my.cnf ว่า server=1 อยู่ไหม

server-id   = 1

-ลบ log file ในพาร์ท /var/lib/myql  ให้หมด (bin_log )

create user ที่ใช้

> create user 'repuser'@'%' identified by 'reppassword';
> grant replication slave on *.* to 'repuser'@'%';
> GRANT REPLICATION SLAVE ON *.* TO 'repuser'@'IPเครือง slave';
> FLUSH TABLES WITH READ LOCK;
  
> show master status;
ได้ผลประมาณ
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      120 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
(จำชื่อ log ไฟล์ และตำแหน่งไว้)
 
dump ข้อมุลไปให้เครือง slave
# mysqldump -u root -p DATA > /tmp/DATA.sql
# scp DATA.sql user@IP เครือง slave:/tmp

> UNLOCK TABLES;



===============
ที่เครื่อง slave

> stop service mysql และลบไฟล์ log ต่างๆ  bin_log , relay-log.info, master.info
> เช็ค id server ในไฟล์ my.cnf
server-id   = 2

import data ที่ส่งจากเครือง 1 เมื่อสักครู่
> mysql -u root -p  DATA < /tmp/DATA.sql

> slave stop;
> CHANGE MASTER TO MASTER_HOST = 'IPเครือง master', MASTER_USER = 'repuser', MASTER_PASSWORD = 'reppassword', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 120;

( เปลียนชื่อ log ไฟลืและตำแหน่งตามที่ได้จากเครือง master; )

>slave start;
> show slave status\G;

« แก้ไขครั้งสุดท้าย: มกราคม 14, 2016, 05:52:09 pm โดย admin » แจ้งลบกระทู้นี้หรือติดต่อผู้ดูแล   บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  ส่งหัวข้อนี้  |  พิมพ์  
 
กระโดดไป:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF CMS | SMF © 2011, Simple Machines Valid XHTML 1.0! Valid CSS!