1.1 mysql支持的複製類型: mysql
基於語句的複製:在主服務器上執行的SQL語句,在從服務器上執行一樣的語句。MySQL默認採用基於語句的複製,效率比較高。一旦發現無法精確複製時,會自動選着基於行的複製。sql
基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持數據庫
混合類型的複製: 默認採用基於語句的複製,一旦發現基於語句的沒法精確的複製時,就會採用基於行的複製。vim
1.2 複製的原理緩存
master將改變記錄到二進制日誌(binary log)中(這些記錄叫作二進制日誌事件,binary log events);安全
slave將master的binary log events拷貝到它的中繼日誌(relay log);服務器
slave重作中繼日誌中的事件,將更改應用到本身的數據上。ide
1.該過程的第一部分就是master記錄二進制日誌。在每一個事務更新數據完成以前,master在二日誌記錄這些改變。MySQL將事務串行的寫入二進制日誌,即便事務中的語句都是交叉執行的。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。
下一步就是slave將master的binary log拷貝到它本身的中繼日誌。首先,slave開始一個工做線程——I/O線程。I/O線程在master上打開一個普通的鏈接,而後開始binlog dump process。Binlog dump
process從master的二進制日誌中讀取事件,若是已經跟上master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。
SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌一般會位於OS的緩存中,因此中繼日誌的開銷很小。
此外,在master中也有一個工做線程:和其它MySQL的鏈接同樣,slave在master中打開一個鏈接也會使得master開始一個線程。複製過程有一個很重要的限制——複製在slave上是串行化的,也就是說master上的並行更新操做不能在slave上並行操做。spa
2.複製配置 有兩臺MySQL數據庫服務器Master和slave,Master爲主服務器,slave爲從服務器,初始狀態時,Master和slave中的數據信息相同,當Master中的數據發生變化時,slave也跟着發生相應的變化,使得master和slave的數據信息同步,達到備份的目的。
3.要點:
負責在主、從服務器傳輸各類修改動做的媒介是主服務器的二進制變動日誌,這個日誌記載着須要傳輸給從服務器的各類修改動做。所以,主服務器必須激活二進制日誌功能。從服務器必須具有足以讓它鏈接主服務器並請求主服務器把二進制變動日誌傳輸給它的權限。線程
1.3版本問題
1.主從服務器版本是否同樣,儘可能保持一下
----------------------------------------分割線---------------------------------------------------------------------------------------------
使用版本 mysql Ver 15.1 Distrib 5.5.50-MariaDB
一、啓用二進制日誌
vim /etc/my.cnf
log-bin = mysql-bin #二進制日誌文件,此項爲必填項,不然不能同步數據;
binlog_format = mixed
expire_logs_days = 7
server-id = 1 #這是數據庫ID,此ID是惟一的,主庫默認爲1,其餘從庫以此ID進行遞增,ID值不能重複,不然會同步出錯;
sync_binlog = 1 #主從複製時的事務安全
binlog-do-db = mediaman #須要同步的數據庫,若是須要同步多個數據庫;
二、主服務器---建立同步帳號
grant replication slave on . to saas@10.27.177.XX identified by 'XXXXXX';
三、重啓mysql,運行 SHOW MASTER STATUS
三、從服務器配置
vim /etc/my.cnf
server-id = 2
#relay_log = mysql-relay-bin 默認值 mariadb-relay-bin
四、從服務鏈接Master服務器
change master to master_host = '10.27.177.XX', master_user = 'saas', master_port=3306, master_password='XXXXX', master_log_file = 'mysql-bin.000112', master_log_pos=278736;
五、在Slave上面啓動複製線程:
START SLAVE;
5.1 是否開始複製(都爲Yes)爲正確
Slave_IO_Running:Yes
Slave_SQL_Running: Yes
SHOW SLAVE STATUSG
六、master顯示show processlist\G
七、slave顯示show processlist\G
八、設置主從同步--slave_skip_errors
1簡介
mysql在主從複製過程當中,因爲各類的緣由,從服務器可能會遇到執行BINLOG中的SQL出錯的狀況,在默認狀況下,服務器會中止複製進程,再也不進行同步,等到用戶自行來處理。 slave-skip-errors的做用就是用來定義複製過程當中從服務器能夠自動跳過的錯誤號,當複製過程當中遇到定義的錯誤號,就能夠自動跳過,直接執行後面的SQL語句。
2參數說明
slave_skip_errors選項有四個可用值,分別爲:off,all,ErorCode,ddl_exist_errors。 默認狀況下該參數值是off,咱們能夠列出具體的error code,也能夠選擇all,mysql5.6及MySQL Cluster NDB 7.3以及後續版本增長了參數ddl_exist_errors,該參數包含一系列 errorcode(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146) 一些error code表明的錯誤以下: 1007:數據庫已存在,建立數據庫失敗 1008:數據庫不存在,刪除數據庫失敗 1050:數據表已存在,建立數據表失敗 1051:數據表不存在,刪除數據表失敗 1054:字段不存在,或程序文件跟數據庫有衝突 1060:字段重複,致使沒法插入 1061:重複鍵名 1068:定義了多個主鍵 1094:位置線程ID 1146:數據表缺失,請恢復數據庫 1053:複製過程當中主服務器宕機 1062:主鍵衝突 Duplicate entry '%s' for key %d my.cnf中的寫法: slave_skip_errors=1062,1053 slave_skip_errors=all slave_skip_errors=ddl_exist_errors