MySQL主從複製
環境:系統內核版本:Linux version 2.6.18-308.el5
Mysql版本: mysql-5.5.28
主服務器IP:172.16.7.1
從服務器IP:172.16.7.2
注意事項:
1.爲了避免循環複製,在主從模型中,任何一臺服務器彼此間都需要一個ID號標識,而且彼此間絕對不能相同。
2.在主服務器上,並不是每個節點都可以到主服務器上面進行同步複製數據的,因此需要在主機上建立密碼帳號,只有持有帳號密碼的用戶纔可以訪問複製數據。
3.從服務器開啓中繼日誌
搭建一個簡單的主從服務器需要如下基本要求:
對主服務器:
1.每個server-id = 要唯一
2.開啓二進制日誌
3.創建一個具有複製權限的用戶帳號
4.設定二進制日誌緩衝區刷寫,每當有二進制日誌更新,就立即同步
對從服務器:
1.每個server-id = 要唯一
2.開啓中繼日誌
3.以中繼用戶連接到主服務器就可以
4.設置爲只讀
如果主服務器已經運行很久了,在主服務器上要創建一個完全備份,而後在從服務器應用此備份,並在連接至主服務器指定二進制日誌文件和其事件位置
操作步驟如下:
主服務器配置:
- vim /etc/my.cnf
- datadir = /data/mydata #數據所在目錄
- server-id = 1 #用於唯一標示自己
- log-bin=/binlog/mysql-bin #二進制日誌所在目錄,將其和數據分開存放
- sync_binlog=1 #同步二進制日誌
啓動mysqld
- service mysqld start
進入數據庫,給從服務器複製權限
- mysql>GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO rpuser@'172.16.%.%' IDENTIFIED BY 'redhat';
- mysql>FLUSH PRIVILEGES;
- mysql>SHOW MASTER STATUS; //指定從哪兒開始複製
- msql>SHOW BINLOG EVENTS IN 'mysql-bin.000001'; //查看以前的事件
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000001 | 354 | | |
- +------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec) //記錄二進制日誌事件發生所在位置
在從服務器上
安裝mysql,添加系統帳號
修改配置文件
- vim /etc/my.cnf
- datadir = /data/mydata
- #log-bin=mysql-bin //二進制日誌開啓功能註釋掉
- server-id = 10 //自己的ID號
- relay-log = /relaylog/mysql-relay //開啓中繼日誌
- relay-log-index = mysql-relay.index //中繼日誌索引
- read-only=1 //從服務器只提供讀的功能,設定爲只讀
啓動服務
- [root@lab ~]#service mysqld start
進入數據庫,設定主服務器
- mysql>CHANGE MASTER TO master_host='172.16.7.1', master_user='reuser', master_password='redhat', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=354;
- ######################################
- master_log_file='mysql-bin.000001' //指定從哪個二進制日誌文件開始複製
- master_log_pos=354 //從二進制日誌複製的位置
以上的這兩項參數可以通過主服務器中mysql>SHOW MASTER STATUS中獲取
啓動從服務器
- mysql>START SLAVE; //默認是兩個線程都啓動的,如果想要啓動一個線程,可以手動指定
- mysql>SHOW SLAVE STATUS\G;//查看從服務器是否啓動成功;查看各服務器中變量是否成功啓用
驗證:
主服務器:在主服務器上創建數據庫查看從服務器是否正常
查看主服務器狀態
從服務器是否同步
以上是主服務器中沒有數據的情況,假如說從服務器同步主服務器中數據時主服務器中已經存在有數據:
則在同步之前要將主服務器中之前的數據導入到從服務器
Master服務器:
- mysqldump --all-databases --lock-all-tables --flush-logs --master-data=2 >/tmp/data.sql
- scp /tmp/data.sql lab1:/tmp
- 並記錄下主服務器現在的二進制日誌及所在位置
- mysql> FLUSH TABLES READ LOCK;
- Query OK, 0 rows affected (0.06 sec)
- mysql> SHOW MASTER STATUS;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000003 | 107 | | |
- +------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
- mysql> UNLOCK TABLES;
- Query OK, 0 rows affected (0.00 sec)
Slave服務器:
導入主服務器中原有數據
- mysql < /tmp/data.sql
- mysql>CHANGE MASTER TO master_host='172.16.7.1', master_user='reuser', master_password='redhat', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=107;
啓動從服務器即可
mysql>START SLAVE;
以上爲實驗的簡單步驟,僅供各位參考。。