MySQL復制概述
MySQL數據庫支持同步復制、單向、異步復制,在復制的過程中一個服務器充當主服務,而一個或多個服務器充當從服務器。主服務器將更新寫入二進制日志文件,並維護文件的一個索引以跟蹤日志循環。這些日志可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日志中讀取的最后一次成功更新的位置。從服務器接收從那時起發生的任何更新,然后封鎖並等待主服務器通知新的更新。
注意:當你進行復制時,所有對復制中的表的更新必須在主服務器上進行。否避免用戶對主服務器上的表進行的更新與對從服務器上的表所進行的更新之間的沖突。
MySQL數據復制的原理[3個進程]
MySQL復制基於主服務器在二進制日志【binlog】中跟蹤所有對數據庫的更改(更新、刪除等)。因此,復制必須在主服務器上啟用二進制日志,每個從服務器從主服務器接收主服務器已經記錄到其二進制日志【relaylog】的保存的更新,以便從服務器可以對其數據拷貝執行相同的更新。
Linux下的Mysql服務器主備的實現
[主服務器:192.168.25.136] [從服務器:192.168.25.144]
在主服務器136上查看主狀態以最新的服務器狀態為准,在從服務器配置
mysql -uroot -proot
show master status\G
第一行表明 當前正在記錄的 binarylog文件名是: mysql-bin.000001.
第二行,810 表示當前的文件偏移量, 就是寫入在mysql-bin.000001 文件的記錄位置。
第三行和第四行,表示需要記錄的數據庫和需要忽略的數據庫。 只有需要記錄的數據庫,其變化才會被寫入到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條數據, 查看從服務器是否同步數據了