一、mysql主(稱master)從(稱slave)複製的原理:
(1).master將資料改變記錄到二進位日誌(binary log)中,也即是設定檔log-bin指定的檔案(這些記錄叫做二進位日誌事件,binary log events)
(2).slave將master的binary log events拷貝到它的中繼日誌(relay log)
(3).slave重做中繼日誌中的事件,將改變反映它自己的資料(資料重演)
附簡要原理圖:
二、mysql主從複製支援的類型:
(1).基於語句的複製:在主伺服器上執行的SQL語句,在從伺服器上執行同樣的語句.MySQL預設採用基於語句的複製,效率比較高
word-spacing: 0px"> (2).基於行的複製:把改變的內容直接複製過去,而不關心到底改變該內容是由哪條語句引發的 . 從mysql5.0開始支援
word-spacing: 0px"> (3).混合類型的複製: 預設採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製.
三、主從配置需要注意的地方:
(1).主DB server和從DB server資料庫的版本一致
(2).主DB server和從DB server資料庫資料一致[ 這裡就會可以把主的備份在從上還原,也可以直接將主的資料目錄拷貝到從的相應資料目錄]
(3).主DB server開啟二進位日誌,主DB server和從DB server的server_id都必須唯一
四、主從配置的簡要步驟:
附簡要示意圖:
1.主DB SERVER上的配置
(1).安裝資料庫
(2).修改資料庫設定檔,指明server_id,開啟二進位日誌(log-bin)
(3).啟動資料庫,查看當前是哪個日誌,position號是多少
(4).登陸資料庫,授權使用者[ip地址為從機IP地址,如果是雙向主從,這裡的還需要授權原生IP地址(此時自己的IP地址就是從IP地址)]
(5).備份資料庫[記得加鎖和解鎖]
(6).傳送備份到從DB server上
(7).啟動資料庫
以下步驟,為單向主從搭建成功,想搭建雙向主從需要的步驟:
(1).登陸資料庫,指定主DB server的地址,使用者,密碼等資訊[此步僅雙向主從時,需要]
(2).開啟同步,查看狀態
2.從DB SERVER上的配置
(1).安裝資料庫
(2).修改資料庫設定檔,指明server_id[如果是搭建雙向主從的話,也要開啟二進位日誌(log-bin)]
(3).啟動資料庫,還原備份
(4).查看當前是哪個日誌,position號是多少[單向主從此步不需要,雙向主從需要]
(5).指定主DB server的地址,使用者,密碼等資訊
(6).開啟同步,查看狀態
五、單向主從環境[也稱 mysql A/B複製]的搭建案例:
1.主DB server和從DB server都安裝相應版本的資料庫,我的兩台DB server都已經安裝好(5.6.14版本),都會是雙執行個體,這裡就不示範安裝,可以參考mysql源碼編譯安裝和mysql多執行個體配置兩篇文章
註:兩台機器的的selinux都是disable(永久關閉selinux,請修改/etc/selinux/config,將SELINUX改為disabled),防火牆可以選擇關閉,開啟的話也行[不行的話,添加防火牆策略]
2.修改主DB server的設定檔(/etc/my.cnf),開啟日誌功能,設定server_id值,保證唯一[client102為主DB server]
[root@client102 scripts]# vim /etc/my.cnf # 修改設定檔裡,下面兩個參數: # 設定server_id,一般建議設定為IP,或者再加一些數字 server_id =102# 開啟二進位日誌功能,可以隨便取,最好有含義 log-bin=mysql3306-bin
3.啟動資料庫伺服器,並登陸資料庫,授予相應的使用者用於同步
# 我這裡是多執行個體mysql,所以啟動是這樣的,如果大家是單一實例的,就直接啟動就可以[/etc/init.d/mysqld start] [root@client102 scripts]# mysqld_multi start 3306 # 登陸mysql 伺服器 [root@client102 scripts]# mysql -uroot -S /usr/local/mysql/mysqld3306.sock -p # 授予使用者權限用於主從同步 mysql> grant replication slave on *.* to 'kongzhong'@'192.168.1.100' identified by 'kongzhong'; Query OK, 0 rows affected (0.00 sec) # 重新整理授權表資訊 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) # 查看position 號,記下position 號(很重要,從機上需要這個position號和現在的記錄檔,我這裡是414和mysql3306-bin.000001) mysql> show master status; +----------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------------+----------+--------------+------------------+-------------------+| mysql3306-bin.000001 | 414 | | | | +----------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)
4.為保證主DB server和從DB server的資料一致,這裡採用主備份,從還原來實現初始資料一致
複製代碼 代碼如下:
# 臨時鎖表
mysql> flush tables with read lock;
# 我這裡實行的全庫備份,在實際中,我們可能只同步某一個庫,可以只備份一個庫
# 新開一個終端,執行如下操作
[root@client102 data]# mysqldump -p3306 -uroot -p -S /usr/local/mysql/mysqld3306.sock --all-databases > /tmp/mysql.sql
# 解鎖
mysql> unlock tables;
# 將備份的資料傳送到從機上,用於恢複
[root@client102 data]# scp /tmp/mysql.sql root@192.168.1.100:/tmp
5.從DB server設定檔只需修改一項,其餘用命令列做
複製代碼 代碼如下:
[root@client100 ~]# vim /etc/my.cnf
# 設定server_id,一般建議設定為IP,或者再加一些數字
server_id =100
6.啟動資料庫,還原備份資料
複製代碼 代碼如下:
# 啟動資料庫
[root@client100 ~]# mysqld_multi start 3306
# 還原主DB server備份的資料
[root@client100 ~]# mysql -uroot -S /usr/local/mysql/mysqld3306.sock -p < /tmp/mysql.sql
7.登陸資料庫,添加相關參數(主DBserver的ip/連接埠/同步處理的使用者/密碼/position號/讀取哪個記錄檔)
複製代碼 代碼如下:
[root@client100 ~]# mysql -uroot -S /usr/local/mysql/mysqld3306.sock -p
mysql> change master to
-> master_host='192.168.1.102',
-> master_user='kongzhong',
-> master_password='kongzhong',
-> master_port=3306,
-> master_log_file='mysql3306-bin.000001',
-> master_log_pos=414;
#/* 下面是一部分註解:
#/* 指定主DB server的IP地址
master_host='192.168.1.102'
#/* 指定用於同步的使用者[這個就是我們在主DB server授權的使用者]
master_user='kongzhong'
#/* 指定用於同步的使用者的密碼
master_password='kongzhong'
#/* 指定主DB server的連接埠[下面一個例子,可以重點看這個]
master_port=3306
#/* 指定從DB server 從哪個記錄檔開始讀[在主DB server上使用show master status查看到日誌]
master_log_file='mysql3306-bin.000001'
#/* 指定 從哪個POSITION號開始讀
master_log_pos=414
# 開啟主從同步
mysql> start slave;
# 查看主從同步狀態
mysql> show slave status\G;
# 主要看以下兩個參數:[這兩個參數如果是yes就表示主從同步正常]
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
8.下面大家就可以在主DB server上建立一個表,看是否能同步到從DB server上,我這裡就不測試了
[註:千萬不要在從DB server手動插入資料,那樣資料就不一致,主從就會斷開,需要重新設定了]
如果有問題,可以嘗試關閉IPTABLES(/etc/init.d/iptables stop)和selinux(setenforce 0:臨時關閉selinux,永久關閉selinux,請修改/etc/selinux/config,將SELINUX改為disabled)
9.上面所搭建的是單向主從,也是用的比較多的,有人想瞭解雙向主從是如何搭建,其實,就是主DB server和從DB sever都開啟日誌功能,然後在主DB SERVER執行授權使用者[這裡授權的是自己作為從伺服器,也就是這裡的IP地址是主DB server的IP地址],然後再在主DB server上進行chang master操作.有不理解的可以留言詢問.