tpl01 | NAT | 29.159 | mysql(源碼) | /etc/my.cnf | 提供mysql服務(主) | yw008 | 數據庫主從搭建 | mysql 5.6.39 |
tpl02 | NAT | 29.152 | mysql(源碼) | /etc/my.cnf | mysql服務(從) | yw008 | 數據庫主從搭建 | mysql 5.6.39 |
1.參考其他博客在 tpl01, tpl02 編譯安裝mysql服務
2. 給數據庫設置密碼:
方法一: 用root進入mysql後
mysql > set password=password('你的密碼');
mysql > flush privileges;
步驟一:初始化現有庫
爲了在啓用binlog日誌及同步之前保持主,從庫的一致性,建議備份主服務器上現有的庫,然後導入到從服務器上。
可以通過mysqldump工具來實現庫的導出,導入。
1)備份 MySQL Master(tpl01) 上現有的庫
如果服務器已經啓動 binlog, 建議對日誌做一次重置,否則可忽略:
mysql > reset master; //重置binlog日誌, 以數據庫用戶root登入
以備份mysql庫,test庫爲例,導出操作如下:
mysqldump -u root -p -B mysql test > /root/mytest.sql
ls -lh /root/mytest.sql
2) 在MySQL Slave(tpl02) 上導入備份的庫
先清理目標庫,避免導入時衝突。主要是採用InnoDB引擎的庫。
mysql > drop database test; //刪除test庫等, 以數據庫用戶root 登入
使用scp 工具下載備份文件
scp tpl01:/root/mytest.sql ./
mysql -uroot -p < mytest.sql
導入成功後,可重新登入mysql > 環境,確認清理的目標庫已恢復。
mysql > show databases;
步驟二: 配置MySQL Master(主服務器,tpl01)
1) 修改/etc/my.cnf 配置,重新啓動MySQL服務程序
- [mysqld]
- log_bin=dbsvr1-bin //啓用binlog日誌,並指定文件名前綴
- server_id = 10 //指定服務器ID號
- innodb_flush_log_at_trx_commit=1 //優化設置
- sync-binlog=1 //允許日誌同步
- .. ..
- sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- explicit_defaults_for_timestamp=1
重啓mysql服務
service mysql restart
2)新建一個備份用戶,授予複製權限
需要的權限爲 REPLICATION SLAVE,允許Slave服務器訪問。
mysql > grant replication slave on *.* to 'replicater'@'192.168.29.%' identified by '123qwe';
3) 檢查Master服務器的同步狀態
在已經初始化現有庫的情況下,查看MASTER狀態,記錄下當前日誌文件名,偏移的位置(下面slave 發起複製時需要用到):
mysql > show master status\G
步驟三: 配置MySQL (從服務器 tpl02)
1) 修改 /etc/my.cnf 配置,重啓MySQL服務器
- [root@dbsvr2 ~]# vim /etc/my.cnf
- [mysqld]
- log_bin=dbsvr2-bin //啓動SQL日誌,並指定文件名前綴
- server_id = 20 //指定服務器ID號,不要與Master的相同
- innodb_flush_log_at_trx_commit=1 //優化設置
- sync-binlog=1 //允許日誌同步
- log_slave_updates=1 //記錄從庫更新,便於實現“主-從-從”鏈式複製
- .. ..
- sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- explicit_defaults_for_timestamp=1
在生產環境中,還可以根據需要設置更詳細的同步選項。 如 指定當主,從網絡中斷時的超時重試時間(slave-net-timeout=60)等,可參考MySQL手冊
配置完成後,重啓mysql 服務:
service mysql restart
2)登入 mysql > 環境, 發起同步操作
通過change master 語句指定 master 服務器的IP地址, 同步用戶名/密碼,起始日誌文件,偏移位置
- mysql> CHANGE MASTER TO MASTER_HOST='192.168.29.159',
- -> MASTER_USER='replicater',
- -> MASTER_PASSWORD='123qwe',
- -> MASTER_LOG_FILE='tpl01-bin.000001', //對應Master的日誌文件
- -> MASTER_LOG_POS=335;
然後執行start slave 啓動複製:
mysql > start slave;
通過上述操作,MASTER服務器的設置信息自動存爲master.info文件,以後每次MySQL服務器程序時會自動調用並更新。
3)檢查Slave 服務器的同步狀態
通過show slave status 語句可查看從服務器狀態,確認其中的IO線程,SQL線程正常運行,才能成功同步:
mysql > show slave status\G
若IO線程或SQL線程有一個爲 No, 則應檢查服務器的錯誤日誌,分析並排出故障後重啓主從複製。
步驟四:測試主從同步效果
1)在Master上操作數據庫,表,表記錄
新建newdb庫,newtable 表,隨意插入幾條表記錄。
2)在slave上確認自動同步的結果
直接切換到newdb庫,並查詢newtable表的記錄,應該與Master上的一樣,這才說明主從同步已經成功生效。
3)在Master服務器上可查看Slave主機的信息
mysql > show slave hosts;
步驟五:將Slave 服務器設爲只讀
一般來說,爲了避免寫入衝突,採用主從複製結構時,不應該允許用戶從Slave執行數據庫寫入操作,這樣會導致雙方數據的不一致性。
正因爲如此,我們可以把slave數據庫限制爲只讀模式,這種情況下有 SUPER權限的用戶和 SLAVE 同步線程才能寫入。
相關驗證操作集效果可參考以下過程。
1) 新建一個測試用戶rwuser(不能用root測試)
mysql > grant all on newdb.* to rwuser@localhost identified by '123qwe';
2) 未啓用只讀前,驗證Slave 寫入
在slave上以rwuser登入(不要root)
mysql -u rwuser -p
然後向newdb庫中新建一個booker表
mysql > use newdb;
mysql > create table booker(id int(12));
在slave 上可看到新建的booker表:
mysql > show tables;
但是在Master上卻看不到,導致主從上的newdb出現不一致:
mysql > use newdb;
mysql > show tables;
完成上述驗證後,在slave刪除booker表,確保雙方一致:(不刪除下面實驗還是能進行下去的)
mysql > drop table booker;
3) 修改/etc/my.cnf 文件,重載配置
vim /etc/my.cnf
[mysqld]
read_only=1
~] service mysql restart
4)再次在Slave 驗證數據庫寫入操作
仍然是以rwuser(不要用root)來驗證,當嘗試創建表時被拒絕:
mysql > use newdb;
mysql > create table booker(id int(12)); //失敗
mysql > drop table mytable; //失敗