mysql主從搭建


tpl01NAT29.159mysql(源碼)/etc/my.cnf提供mysql服務(主)yw008數據庫主從搭建mysql 5.6.39
tpl02NAT29.152mysql(源碼)/etc/my.cnfmysql服務(從)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服務程序

  1. [mysqld]
  2. log_bin=dbsvr1-bin                     //啓用binlog日誌,並指定文件名前綴
  3. server_id = 10                         //指定服務器ID號
  4. innodb_flush_log_at_trx_commit=1     //優化設置
  5. sync-binlog=1                         //允許日誌同步
  6. .. ..
  7. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
  8. 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服務器

  1. [root@dbsvr2 ~]# vim /etc/my.cnf
  2. [mysqld]
  3. log_bin=dbsvr2-bin                     //啓動SQL日誌,並指定文件名前綴
  4. server_id = 20                         //指定服務器ID號,不要與Master的相同
  5. innodb_flush_log_at_trx_commit=1     //優化設置
  6. sync-binlog=1                         //允許日誌同步
  7. log_slave_updates=1                 //記錄從庫更新,便於實現“主-從-從”鏈式複製
  8. .. ..
  9. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
  10. explicit_defaults_for_timestamp=1

在生產環境中,還可以根據需要設置更詳細的同步選項。 如 指定當主,從網絡中斷時的超時重試時間(slave-net-timeout=60)等,可參考MySQL手冊

配置完成後,重啓mysql 服務:

service mysql restart

2)登入 mysql >  環境, 發起同步操作

通過change master 語句指定 master 服務器的IP地址, 同步用戶名/密碼,起始日誌文件,偏移位置

    

  1. mysql> CHANGE MASTER TO MASTER_HOST='192.168.29.159',
  2. -> MASTER_USER='replicater',
  3. -> MASTER_PASSWORD='123qwe',
  4. -> MASTER_LOG_FILE='tpl01-bin.000001',     //對應Master的日誌文件
  5. -> 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;                 //失敗


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章