MySQL數據庫支持同步複製、單向、異步複製,在複製的過程當中一個服務器充當主服務,而一個或多個服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌能夠記錄發送到從服務器的更新。當一個從服務器鏈接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,而後封鎖並等待主服務器通知新的更新。html
注意:當你進行復制時,全部對複製中的表的更新必須在主服務器上進行。否避免用戶對主服務器上的表進行的更新與對從服務器上的表所進行的更新之間的衝突。java
MySQL複製基於主服務器在二進制日誌【binlog】中跟蹤全部對數據庫的更改(更新、刪除等)。所以,複製必須在主服務器上啓用二進制日誌,每一個從服務器從主服務器接收主服務器已經記錄到其二進制日誌【relaylog】的保存的更新,以便從服務器能夠對其數據拷貝執行相同的更新。mysql
[主服務器:192.168.25.136] [從服務器:192.168.25.144]sql
在主服務器136上查看主狀態以最新的服務器狀態爲準,在從服務器配置shell
mysql -uroot -proot
show master status\G
第一行代表 當前正在記錄的 binarylog文件名是: mysql-bin.000001.數據庫
第二行,810 表示當前的文件偏移量, 就是寫入在mysql-bin.000001 文件的記錄位置。vim
第三行和第四行,表示須要記錄的數據庫和須要忽略的數據庫。 只有須要記錄的數據庫,其變化纔會被寫入到mysql-bin.000001日誌文件中。服務器
注意:若是顯示"Empty Set",則須要檢查是否開啓了bin文件(小規模文件my-small.cnf默認不開啓,本博客的mysql配置以small爲準,所以需修改)異步
sed -i 's/#log-bin=mysql-bin/log-bin=mysql-bin/g' /etc/my.cnf
在主服務器136上面建立專門用於備份的用戶double測試
GRANT REPLICATION SLAVE ON *.* TO 'double'@'192.168.25.144' IDENTIFIED BY 'double';
開啓主服務器136的 binarylog
vim /etc/my.cnf
# 添加以下內容 binlog_format=mixed binlog-ignore-db=mysql auto-increment-offset=1 auto-increment-increment=3 注:binlog-ignore-db 表示,須要忽略哪些數據庫。我這裏忽略了其餘的4個數據庫。 假設須要未來可能須要3臺服務器作備份, 因此auto-increment-increment 設爲3. 而 auto-increment-offset=1 表示這臺服務器的序號從1開始, 不超過auto-increment-increment。這樣作以後, 我在這臺服務器上插入的第一個id就是 1, 第二行的id就是 4了, 而不是2.
重啓136服務器的mysql服務
service mysqld restart ==>/etc/inint.d/mysqld restart
獲取主服務器136狀態
若是是全新安裝的, 那麼不須要同步初態,直接跳過這一步,到後面直接查看主服務器狀態。
若是已經有了一個數據庫ftl數據庫做爲初態。
先鎖定 hello數據庫: flush tables with read lock; 而後導出數據: mysqldump -uroot -proot ftl -B -x> /tmp/ftl.sql 查看A服務器的binary日誌位置 show master status\G 記住這個文件名和 位置, 等會在從服務器上會用到 解除鎖定了 unlock tables;
設置從服務器 144須要複製的數據庫
修改從服務器的server_id
sed -i 's/server-id.*1/server-id = 2/g' /etc/my.cnf
修改: vim /etc/my.cnf
# 添加以下內容 relay-log = relay-log replicate-ignore-db=information_schema replicate-ignore-db=performance_schema
注:replicate-ignore-db 複製時須要排除的數據庫。除開系統的幾個數據庫以外,全部的數據庫都複製。
relay_log 中繼日誌的名字。 前面說到了, 複製線程須要先把遠程的變化拷貝到這個中繼日誌中, 再執行。
log-slave-updates 意思是,中繼日誌執行以後,這些變化是否須要計入本身的binarylog。 當你的B服務器須要做爲另一個服務器的主服務器的時候須要打開。 就是雙主互相備份,或者多主循環備份。 咱們這裏須要, 因此打開。
重啓144服務器的mysql服務
service mysqld restart ==>/etc/inint.d/mysqld restart
查看從服務器的server_id
mysql -uroot -proot SHOW VARIABLES LIKE 'server_id'; # 顯示跟配置一致便可,前面咱們設置2
從服務器測試主服務器的註冊的double用戶是否正常
mysql -h 192.168.2.144 -udouble -pdouble
在從服務器144上導入主服務器136的初態
scp root@192.168.25.144: /tmp/ftl.sql /tmp/ftl.sql mysql -uroot -proot < /tmp/ftl.sql [沒有添加庫名,是由於備份的時候使用了-B,裏面還有自動建庫的語句]
開啓同步, 在從服務器144服務器上執行
CHANGE MASTER TO MASTER_HOST='192.168.25.136', # 主服務器IP MASTER_USER='double', MASTER_PASSWORD='double', # 主服務器設置的用戶 MASTER_LOG_FILE='mysql-bin.000001', # 根據主服務器看 : show master status\G 裏面的 File MASTER_LOG_POS=2702; # 根據主服務器查看; show master status\G 裏面的 Position
從服務器重啓mysql服務, 而後查看slave線程是否正常
上面幾個參數要跟上面的保持一致,並且IP儘可能用補全,除非在局域網環境,多臺備份服務器
若是其中一個是No, 那就說明不成功。須要查看mysql的錯誤日誌[/usr/local/mysql/data/*.err]
密碼,防火牆,ip地址不對等都會致使失敗,查看日誌文件便可
主從複製結果
在主服務器的ftl數據庫的user表中 連續插入了3條數據, 查看從服務器是否同步數據了