標籤:mysql 主從複製
1、mysql主從複製原理
對於主伺服器來講,會不停的吧當前資料庫中產生的資訊記錄進二進位日誌中,如果伺服器端接收到用戶端一個需要改變資料的語句之後,這個資料如果採用的是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-binserver-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;
[3]在從伺服器上操作
(1)將匯出的test.sql匯入到從資料庫上。
(2)修改從資料庫的設定檔my.cnf,指定主要資料庫的基本資料
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,就代表正常
mysql主從複製