1》mysql主從的工作原理:

?主服務器將更新寫入二進制日志文件(bin_log),并維護文件的一個索引以跟蹤日志循環。這些日志可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知 主服務器從服務器在日志中讀取的最后一次成功更新的位置。從服務器接收從那時起發生的任何更新,然后封鎖并等待主服務器通知新的更新。

??? MySQL復制基于主服務器在二進制日志中跟蹤所有對數據庫的更改(更新、刪除等等)。因此,要進行復制,必須在主服務器上啟用二進制日志。

??? 每個從服務器從主服務器接收主服務器已經記錄到其二進制日志的保存的更新,以便從服務器可以對其數據拷貝執行相同的更新。

??? 從服務器設置為復制主服務器的數據后,它連接主服務器并等待更新過程。如果主服務器失敗,或者從服務器失去與主服務器之間的連接,從服務器保持定期嘗試連 接,直到它能夠繼續幀聽更新。由--master-connect-retry選項控制重試間隔。 默認為60秒。

??? 每個從服務器跟蹤復制時間。主服務器不知道有多少個從服務器或在某一時刻有哪些被更新了。

????mysql主從的工作原理其實就是Slave從Master端獲取該日志然后再在自己身上完全 順序的執行日志中所記錄的各種操作。因此在主服務器上必須開啟Binary Log功能。

2》mysql主從的工作過程

2.1.?Slave?上面的IO線程連接上 Master,并請求從指定日志文件的指定位置(或者從最開始的日志)之后的日志內容;

2.2.?Master?接收到來自 Slave 的 IO 線程的請求后,通過負責復制的 IO 線程根據請求信息讀取指定日志指定位置之后的日志信息,返回給 Slave 端的 IO 線程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息在 Master 端的 Binary Log 文件的名稱以及在 Binary Log 中的位置;

2.3.?Slave?的 IO 線程接收到信息后,將接收到的日志內容依次寫入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并將讀取到的Master端的bin-log的文件名和位置記錄到master- info文件中,以便在下一次讀取的時候能夠清楚的高速Master“我需要從某個bin-log的哪個位置開始往后的日志內容,請發給我”

2.4.?Slave?的 SQL 線程檢測到 Relay Log (中繼日志)中新增加了內容后,會馬上解析該 Log 文件中的內容成為在 Master 端真實執行時候的那些可執行的 Query 語句,并在自身執行這些 Query。這樣,實際上就是在 Master 端和 Slave 端執行了同樣的 Query,所以兩端的數據是完全一樣的。

3》mysql支持復制的類型

(1):基于語句的復制:? 在主服務器上執行的SQL語句,在從服務器上執行同樣的語句。MySQL默認采用基于語句的復制,效率比較高。??
  (2):基于行的復制:把改變的內容復制過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持
  (3):混合類型的復制: 默認采用基于語句的復制,一旦發現基于語句的無法精確的復制時,就會采用基于行的復制。

4》主從服務器的設置。

????主服務器,主機名master,ip地址為192.168.1.113

????從服務器,主機名slave,ip地址為192.168.1.114

首先在主服務器上安裝mysql,安裝過程見:

首先在主服務上操作

????打開mysql的配置文件,作如下修改

server-id?=1??/設置為1,主要不要和從服務器重復
log-bin=mysql.bin???/啟用二進制日志文件,名字可以自己定義
binlog-do-db=db1,db2???/白名單,即需要同步的數據庫
binlog-ignore-db=db1,db2/黑名單,指定忽略不同步的數據庫

修改完配置文件后,注意要重新啟動mysql服務。

然后設置授權給slave一個用來同步數據的用戶repl

?>grant?replication?slave?on?*.*?to?'repl'@'192.168.1.114'?identified?by?'123123';>flush?privileges;>flush?tables?with?read?lock;>show?master?status;+------------------+----------+--------------+------------------+
|?File?????????????|?Position?|?Binlog_Do_DB?|?Binlog_Ignore_DB?|
+------------------+----------+--------------+------------------+
|?mysql-bin.000025?|??????335?|?db1,db2??????|?db1,db2??????????|
+------------------+----------+--------------+------------------+
1?row?in?set?(0.00?sec)mysql>

然后設置從,在從服務器上操作

修改主配置文件作如下修改:

server-id?=2?/注意不要和主服務器一樣
replication-do-db=db1,db2???
replication-ignore-db=db1.db2?/這兩家意思和主服務器加上的那兩句一個意思,如果在那里設置了,此處就不用設置。

然后登錄從服務器,執行如下指令

mysql>?slave?stop;?《1》
Query?OK,?0?rows?affected,?1?warning?(0.00?sec)mysql>?change?master?to?master_host='192.168.1.113',master_port=3306,master_user='repl',master_password='123123',master_log_file='mysql_bin.000025',master_log_pos=335;???《2》
Query?OK,?0?rows?affected?(0.16?sec)
mysql>?slave?start;????《3》
Query?OK,?0?rows?affected?(0.01?sec)mysql>

???然后在從上查看主從是否搭建成功

mysql>?show?slave?status\G;
***************************?1.?row?***************************Slave_IO_State:?Waiting?for?master?to?send?eventMaster_Host:?192.168.1.113Master_User:?replMaster_Port:?3306Connect_Retry:?60Master_Log_File:?mysql-bin.000027Read_Master_Log_Pos:?106Relay_Log_File:?shiyan-relay-bin.000002Relay_Log_Pos:?251Relay_Master_Log_File:?mysql-bin.000027Slave_IO_Running:?Yes???????????/有兩個yesSlave_SQL_Running:?Yes?????Replicate_Do_DB:?Replicate_Ignore_DB:?Replicate_Do_Table:?Replicate_Ignore_Table:?Replicate_Wild_Do_Table:?Replicate_Wild_Ignore_Table:?Last_Errno:?0Last_Error:?Skip_Counter:?0Exec_Master_Log_Pos:?106Relay_Log_Space:?407Until_Condition:?NoneUntil_Log_File:?Until_Log_Pos:?0Master_SSL_Allowed:?NoMaster_SSL_CA_File:?Master_SSL_CA_Path:?Master_SSL_Cert:?Master_SSL_Cipher:?Master_SSL_Key:?Seconds_Behind_Master:?0
Master_SSL_Verify_Server_Cert:?NoLast_IO_Errno:?0Last_IO_Error:?Last_SQL_Errno:?0Last_SQL_Error:?
1?row?in?set?(0.00?sec)ERROR:?
No?query?specifiedmysql>

這一步可能出現如下問題:

mysql>?show?slave?status\G;
***************************?1.?row?***************************Slave_IO_State:?Master_Host:?192.168.1.113Master_User:?replMaster_Port:?3306Connect_Retry:?60Master_Log_File:?mysql_bin.000025Read_Master_Log_Pos:?335Relay_Log_File:?shiyan-relay-bin.000001Relay_Log_Pos:?4Relay_Master_Log_File:?mysql_bin.000025Slave_IO_Running:?NoSlave_SQL_Running:?Yes

可采取如下方法解決:

在master那邊,執行:

flush logs;
show master status;

記下File, Position。

在slave端,執行:

slave stop;

CHANGE MASTER TO MASTER_LOG_FILE='《上面出現的》',MASTER_LOG_POS=《上面出現的》;
slave start;
show slave status \G

一切正常。

5》mysql主從的優點

在slave服務器上執行查詢操作,降低master服務器的訪問壓力

當master服務器上出現了問題可以切換到slave服務器上,不會造成訪問中斷等問題

在slave服務器上進行備份,以避免備份期間影響master服務器的服務使用及日常訪問