ScarShow

< IS >

MySQL/MariaDB 5.5 Replication Setting

久違的文章,我竟然長達半年沒有寫文章,最近退伍又很剛好找到工作了。又有一堆雜事可以做,我想之後應該有一堆東西可以紀錄吧。

最近忙著幫公司架設Raid跟備份機制,這邊就紀錄一下MySQL Replication的流程,雖然說是MySQL但是公司實際上是用MariaDB但這不是重點,基本上操作是一樣的。

Replication的機制上MySQL Server分為MasterSlave,在一般的應用中主要還是用於負載平衡,但在這邊我只是要用於備份。

設定 Master 資料庫

首先先在Mastermy.cnf的設定檔案中加上以下設定:

# my.cnf
[mysqld]
server-id=1
log-bin=/path/to/mysql-bin

server-id在伺服器中必須是唯一值,數值大小是 1 ~ 232-1,log-bin則是設定Binary Log的路徑。

如果想要針對特定的資料庫做複寫或不要複寫到Slave,可以再另外加上以下的設定。

# 要複寫的
binlog-do-db=db1
binlog-do-db=db2
# 不要複寫的
binlog-ignore-db=db3
binlog-ignore-db=db4

當設定完成之後重新啟動Master

service mysql restart

接著登入伺服器使用指令SHOW MASTER STATUS觀看Master的狀態。

mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008 | 5723     | db1,db2      | db3,db4          |
+------------------+----------+--------------+------------------+

接著為Master加上Slave用來Replication的專用帳號,將USER_NAMEUSER_PASSSLAVE_HOST換成你的資料。

CREATE USER 'USER_NAME'@'SLAVE_HOST' IDENTIFIED BY 'USER_PASS';
GRANT REPLICATION SLAVE ON *.* TO 'USER_NAME'@'SLAVE_HOST';
FLUSH PRIVILEGES;

最後將資料庫的資料匯出,然後傳送到Slave接著下面的Slave資料庫設定步驟。這邊的參數--master-data是匯出時一同匯出Master的資料包含Log fileLog position,而--all-databases是指整個資料庫,其中不包含information_schemaperformance_schema但有mysql資料庫。

mysqldump -u root -p --master-data --all-databases > all_db.sql

設定 Slave 資料庫

將剛剛的從Master傳送過來的檔案匯入Slave之中,如果不想要將Slave的使用者權限覆蓋過去的話,請將檔案中有關於mysql資料庫的指令移除。

mysql -u root -p < all_db.sql

同樣也是設定將Slave加上server-id設定。

# my.cnf
[mysqld]
server-id=2

設定指定資料庫是否被Master複寫。

# 要複寫的
replicate-do-db=db1
replicate-do-db=db2
# 不要複寫的
replicate-ignore-db=db3
replicate-ignore-db=db4

設定完成後重新啟動Slave

service mysql restart

然後在登入前先去看剛剛匯入的檔案,找出以下的query,把這邊的Log FileLog Position記錄下來等一下會用到。

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.00008', MASTER_LOG_POS=5723;

接著登入Slave,然後用以下指令讓Slave對應到Master,請記得先修改USER_NAMEUSER_PASS為剛剛在Master所輸入的帳密,MASTER_HOSTMaster的網路位置,最後將LOG_FILELOG_POS修改為剛剛所記錄下來的資料。

CHANGE MASTER TO
    MASTER_HOST='MASTER_HOST',
    MASTER_USER='USER_NAME',
    MASTER_PASSWORD='USER_PASS',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='LOG_FILE',
    MASTER_LOG_POS=LOG_POS,
    MASTER_CONNECT_RETRY=10;

接著啟動SlaveReplication機制。

START SLAVE;

最後使用SHOW SLAVE STATUS \G;來觀看Slave的狀態,如果Replication正確的話應該會長下面這樣。

mysql > SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: MASTER_HOST
                  Master_User: USER_NAME
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 6635
               Relay_Log_File: db1-relay-bin.000002
                Relay_Log_Pos: 156
        Relay_Master_Log_File: mysql-bin.000008
             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: 90650
              Relay_Log_Space: 6164
              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更動幾筆資料,看看是否Slave是否也會同樣做動來驗證。