搭建mysql主從複製---Mysql Replication

  • 主從複製原理

  Mysql的Replication是一個異步的複製過程,從一個Mysql Instance(master)複製到另外一個Mysql Instance(slave)。中間須要三個線程slave端有1個I/O線程,一個SQL線程,Master端一個I/O線程。html

  要實現Mysql的Replication,首先在Master端打開Binary log(mysql-bin.xxxxxx)功能。由於原理是slave從Master端獲取mysql-bin.xxxxxx,而後在slave端按照順序依次執行日誌中的各類操做。能夠在my.cnf配置文件的[mysqld]組中添加"log-bin"參數項。mysql

 

 

  • 複製的基本過程:

  a、Slave的IO線程連接多Master,並請求日誌文件的指定位置以後的內容。c++

  b、Master接收到請求後,負責複製的IO線程根據請求的信息讀取指定日誌指定位置的日誌信息,返回給Slave的IO線程。內容還包括本次返回的信息在Master端的Binary Log的日誌文件名和位置。sql

  c、Slave端的IO線程街道信息後,將內容寫入Slave端的Relay Log(mysql-relay-log.xxxxxx)末端,並將Master端的bin-log文件和位置記錄到master-info文件中,以便Slave的IO線程下次鏈接Master的時候使用。vim

  d、Slave端的SQL線程檢測到Relay Log中的新內容後,立刻解析Log內容,還原成在Master端的真實執行的Query語句,並執行。兩端執行了相同的Query語句,兩者數據同步。centos

 

 

  • 準備工做

從原理的分析中能夠看到,實現Mysql Replication 至少須要兩臺Mysql實例。服務器

這裏在虛擬機vmware中準備了兩個臺centos5,由於同時開多個虛擬機會很卡,就簡單的開啓兩個吧。less

Master:192.168.80.7異步

Slave:192.168.80.6ide

wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.21.tar.gz
yum install vim* -y
yum install -y gcc gcc-c++
yum install -y bison*
yum install cmake
yum install ncurses* -y

 

 

  • 安裝Mysql Server
tar zxvf mysql-5.6.21.tar.gz  -C /usr/local/src/
cd /usr/local/src/mysql-5.6.21/
groupadd mysql
useradd -r -g mysql mysql
cmake .
make install
cd /usr/local/mysql/
chown -R mysql .
chgrp -R mysql .
scripts/mysql_install_db  --user=mysql
chown -R root .
chown -R mysql data
bin/mysqld_safe --user=mysql &  #測試mysql是否安裝成功
cp support-files/mysql.server  /etc/init.d/mysql
chkconfig --add mysql #將mysql腳本加入服務 可使用service管理
ln -s `pwd`/my.cnf /etc/my.cnf

 

 

  • Master端

 修改Master端的主配置文件

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=test
binlog-ignore-db=mysql

 

備份Master的data目錄 

這裏採用停庫,冷備份。實際上還能夠熱備份須要鎖庫

flush tables with read tables;
unlock tables;

service mysql stop
tar czvf data.tar.gz /usr/local/mysql/data ###/usr/local/mysql/data 爲Master端mysql的datadir

將data.tar.gz覆蓋掉從服務器的datadir

 

 

  • Slave端

將data.tar.gz覆蓋掉從服務器的datadir

獲取Master的Bin-log的Log Postion

show Master  status

| mysql-bin.000003 |      120 | test,test    | mysql,mysql      |  

 

在Master端,建立複製Binary Log日誌的用戶【才操做須要再Master端執行】

create user 'repl'@'%' identified by '123456';
grant replication slave on *.* to 'repl'@'%';
flush privileges; #如不及時刷新會有錯誤

 

接下來須要修改Slave的主配置文件

[mysqld]
server-id=3
log-bin=mysql-bin
binlog-do-db=test
binlog-ignore-db=mysql

 

修改完之後,重啓salve端的mysql服務

service mysql restart

在mysql裏執行:

mysql>CHANGE MASTER TO
MASTER_HOST='192.168.80.7',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=120;

 

start slave

 

至此,Mysql Replaction搭建完成。

 

 

  • 檢查是否正常執行

在Master端執行

show master status;
| mysql-bin.000001 |      120 | test,test    | mysql,mysql      |  

 

顯示如上圖說明配置成功。

在Slave端,

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.80.7
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 1291
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 1454
        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: 1291
              Relay_Log_Space: 1631
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 22dd6712-695b-11e4-b733-000c292f9c4c
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

 

Slave_IO_Running: Yes Slave_SQL_Running: Yes
這兩個線程必須正常。
顯示結果如上則表示Mysql Replication正常工做。

能夠在Master端作一個CURD操做,來檢查是否正常同步。






/********************************************************/
  • 可能的問題:

我安裝的時候出現的問題有
一、建立用戶的時候 出現這個錯誤'repl@%',應該爲 'repl'@'%'
二、由於複製data目錄的時候將data目錄下的auto.cnf也複製了。
auto.cnf的內容以下:

[auto]
server-uuid="xxxx"

 

致使uuid重複的錯誤。

 三、配置 change master to的時候

CHANGE MASTER TO
MASTER_HOST='192.168.80.7',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=120;

 

將master_log_file的名稱寫錯了.寫成了'mysql_bin.00003'

 

在這裏還可能用到這些命令

show variables like 'server_id';
set global server_id=2;

 

/**************************************/

  • 對於uuid

查看uuid:
blkid
ls -l /dev/disk/by-uuid/
dumpe2fs /dev/sda6 | less (查看指定設備的UUID)

產生uuid:
uuidgen
爲設備指定uuid
sudo tune2fs -U `uuidgen` device

 另外一篇,能夠參考:http://www.cnblogs.com/luckcs/articles/2543607.html

相關文章
相關標籤/搜索