對於主服務器來講,會不停的吧當前數據庫中產生的信息記錄進二進制日志中,如果服務器端接收到客戶端一個需要改變數據的語句之後,這個數據如果采用的是InnoDB的話,這些數據本身首先被記錄進事務日志,這些會影響數據的語句會被記錄進二進制日志中,而復制講的是,另外一個從服務器上,被動的接受數據,本身並不接受客戶端鏈接進來做任何寫操作,復制是單向的,只能從主服務器到從服務器,因此,從服務器中的數據都是來自於主服務器,主服務是監聽在3306端口上,從服務器啟動了一個客戶端進程,這個進程會向服務器點提供數據服務的端口發起請求,請求讀取二進制日志中的事件,在主服務器點上,mysql主要提供認證服務,同時會啟動一個sqldump線程,這個線程在接收到用戶的請求後,並確保這個用戶具有權限之後,會去讀取二進制日志中的事件,如果客戶端是第一次來請求,那麼這個進程就讀取日志中的第一個事件,讀一個就發送給客戶端一個,從服務的進程在接收到主服務器發行過來的數據之後,會保存在本地的中繼日志,然後再啟動一個具有特殊功能的線程,去中繼之日中讀取事件,讀一行,在本地執行一下,以此類推,最終生成本地的數據庫。mysql的復制時異步的,因此在接收到用戶的請求之後,將結果返回給用戶。並將信息存放在內存中,之後再記錄進二進制文件中,這樣會造成從服務器落後與主服務器,但是這樣也是有好處的,如果你有一個錯誤操作,在這個時間內,立即去從服務器上備份數據就OK,這需要mysql管理員把握。
2、mysql主從復制的實現
[1]首先確保主從服務器上的Mysql版本相同
[2]在主服務器上操作
(1)設置一個從數據庫的賬戶,使用REPLICATION SLAVE賦予權限,如:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave001'@'192.168.0.99' IDENTIFIED BY '123456'; mysql> FLUSH PRIVILEGES;(2)修改主數據庫的配置文件my.cnf,開啟BINLOG,並設置server-id的值,修改之後必須重啟Mysql服務
log-bin = mysql-bin server-id=10(3)之後可以得到主服務器當前二進制日志名和偏移量,這個操作的目的是為了在從數據庫啟動後,從這個點開始進行數據的恢復
mysql> show master status\G;(4)將主數據庫數據導入到從服務器,可以將數據庫原始文件拷貝過去,也可以通過導出腳本,然後倒入到從服務器中,導出腳本前,為確保數據一致,需要對主數據庫進行READ LOCK
mysql> flush tables with read lock;然後進行數據庫導出
mysqldump -h127.0.0.1 -p3306 -uroot -p test > /home/ceshi/test.sql數據備份好之後,需要對主服務器恢復寫錯做
mysql> unlock tables;
server-id = 20 read-only = 1 //開啟只讀模式(3)配置從服務器連接主服務器
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.98', MASTER_USER='slave001', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=107; mysql> START SLAVE;(4)在從服務器進行show salve status驗證
mysql> SHOW SLAVE STATUS\G如果Slave_IO_Running或者Slave_SQL_Running表示yes,就代表正常