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是否也會同樣做動來驗證。