主從復制是MySQL中最重要的功能之一。主從復制是指一台服務器充當主數據庫服務器,另一台或多台服務器充當從數據庫服務器,主服務器中的數據自動復制到從服務器之中。對於多級復制,數據庫服務器即可充當主機,也可充當從機。MySQL主從復制的基礎是主服務器對數據庫修改記錄二進制日志,從服務器通過主服務器的二進制日志自動執行更新。
主從復制的類型:
1.基於語句的復制
主服務器上面執行的語句在從服務器上面再執行一遍
存在的問題:時間上可能不完全同步造成偏差,執行語句的用戶也可能不是同一個用戶。
2.基於行的復制
把主服務器上面改編后的內容直接復制過去,而不關心到底改變該內容是由哪條語句引發的
存在的問題:比如一個工資表中有一萬個用戶,我們把每個用戶的工資+1000,那么基於行的復制則要復制一萬行的內容,由此造成的開銷比較大,而基於語句的復制僅僅一條語句就可以了。
3.混合類型的復制
MySQL默認使用基於語句的復制,當基於語句的復制會引發問題的時候就會使用基於行的復制,MySQL會自動進行選擇。
主從復制的原理:
主服務器上面的任何修改都會保存在二進制日志Binary log里面
從服務器上面啟動一個I/O thread,連接到主服務器上面請求讀取二進制日志,然后把讀取到的二進制日志寫到本地的一個Realy log(中繼日志)里面。
從服務器上面開啟一個SQL thread定時檢查Realy log,如果發現有更改立即把更改的內容在本機上面執行一遍。
主從復制的步驟:
主服務器:ip:192.168.10.139 系統:Rhel7 數據庫Maria DB
從服務器:ip:192.168.10.129 系統:Centos6.5 數據庫:MySQL
主服務器配置:
- 修改主服務器配置文件 /etc/my.cnf ,修改完后需要重啟mysql服務
1 [mysqld] 2 log-bin=mysql-bin //啟用二進制日志 (必選) 3 server-id=139 //設置服務器唯一ID,一般取IP最后一段(必選) 4 binlog-do-db=140 //指定對db_nameA記錄二進制日志 (可選) 5 binlog-ignore-db=mysql //指定不對db_namB記錄二進制日志(可選)
- 為從服務器添加mysql賬戶並配置權限,在主服務器上,必須為從服務器創建一個用來連接主服務器的用戶,並設置replication slave權限
1 mysql>grant replication slave on *.* to backup@'192.168.10.129' identified by '123'; 2 //創建backup用戶,密碼為123,並且配置好權限
- 刷新權限:flush privileges;
- 驗證是否開啟主從復制:
1 select * from user where user = 'backup' \G;
- 查看主服務器正在使用二進制日志狀態:
show master status;
從服務器配置 :
- 修改從服務器配置文件 /etc/my.cnf ,修改完后需要重啟mysql服務:service mysqld restart
1 [mysqld] 2 server-id=129 //必須服務器唯一ID,一般取IP最后一段
- 進入數據庫,設置主服務器信息:
1 mysql> change master to master_host='192.168.10.139', 2 -> master_user='backup', 3 -> master_password='123', 4 -> master_log_file='mysql-bin.000001', 5 -> master_log_pos=245;
- 開啟從服務器復制二進制日志,實現同步功能: slave start ;
- 驗證數據庫相關參數: show slave status \G;
數據庫的備份和還原:
衡量備份還原的指標:
- RPO:恢復點目標,恢復的程度
- RIO:恢復時間目標,恢復花費的時間
備份方式:
- 冷備份:拷貝數據庫目錄,需要先停機再備份,對於在線不間斷提供業務的不適用
- 快照備份:lvm快照,mysql裝在lvm創建的分區,可以熱備份(在線備份),缺點在於所有的文件,包括數據、日志等需要存放在一個邏輯卷中,然后再對卷快照備份,只支持本地備份,生產環境用的也比較少
- 邏輯備份: mysqldump工具,單線程備份,備份速度較慢;mydumper工具,mysqldump升級版,有限制條件
備份單個庫:
- 備份:
mysqldump -uroot -p dbname1> 1.sql
- 還原:
mysql -uroot -p dbname2 < 1.sql
備份多個庫:
- 備份:
mysqldump -uroot -p --database db1 db2 > 1.sql
- 還原:
mysql -uroot -p < 1.sql
備份全部庫:
- 備份:
mysqldump -uroot -p --all-databases > 1.sql
- 還原:
mysql -uroot -p < 1.sql
備份單個表:
- 備份:
mysqldump dbname1 tb1 > 1.sql
- 還原:
mysql -uroot -p dbname2 < 1.sql