MySQL/MariaDB 5.5 Replication Setting
久違的文章,我竟然長達半年沒有寫文章,最近退伍又很剛好找到工作了。又有一堆雜事可以做,我想之後應該有一堆東西可以紀錄吧。
最近忙著幫公司架設Raid
跟備份機制,這邊就紀錄一下MySQL Replication
的流程,雖然說是MySQL
但是公司實際上是用MariaDB
但這不是重點,基本上操作是一樣的。
在Replication
的機制上MySQL Server
分為Master
與Slave
,在一般的應用中主要還是用於負載平衡,但在這邊我只是要用於備份。
設定 Master 資料庫
首先先在Master
的my.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_NAME
、USER_PASS
及SLAVE_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 file
及Log position
,而--all-databases
是指整個資料庫,其中不包含information_schema
及performance_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 File
跟Log Position
記錄下來等一下會用到。
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.00008', MASTER_LOG_POS=5723;
接著登入Slave
,然後用以下指令讓Slave
對應到Master
,請記得先修改USER_NAME
及USER_PASS
為剛剛在Master
所輸入的帳密,MASTER_HOST
為Master
的網路位置,最後將LOG_FILE
及LOG_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;
接著啟動Slave
的Replication
機制。
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
是否也會同樣做動來驗證。