一、主從配置的原理: MySQL的 Replication 是一個異步的復制過程,從一個 MySQL instace(我們稱之為 Master)復制到另一個MySQL instance(我們稱之 Slave)。在 Master 與 Slave之間的實現整個復制過程主要由三個線程來完成,其中兩個線程(Sql線程和IO線程)在 Slave 端,另外一個線程(IO線程)在 Master端。要實現 MySQL 的 Replication ,首先必須打開 Master 端的Binary Log(MySQL-bin.xxxxxx)功能,否則無法實現。因為整個復制過程實際上就是Slave從Master端獲取該日志然后再在自己身上完全順序的執行日志中所記錄的各種操作。打開 MySQL 的 Binary Log 可以通過在啟動 MySQL Server 的過程中使用“—log-bin” 參數選項,或者在 my.cnf 配置文件中的 MySQLd 參數組([MySQLd]標識后的參數部分)增加“log-bin” 參數項。 MySQL 復制的基本過程如下: 1. Slave 上面的IO線程連接上 Master,并請求從指定日志文件的指定位置(或者從最開始的日志)之后的日志內容; 2. Master 接收到來自 Slave 的 IO 線程的請求后,通過負責復制的 IO線程根據請求信息讀取指定日志指定位置之后的日志信息,返回給 Slave 端的 IO線程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息在 Master 端的 Binary Log 文件的名稱以及在 BinaryLog 中的位置;3. Slave 的 IO 線程接收到信息后,將接收到的日志內容依次寫入到 Slave 端的RelayLog文件(MySQL-relay-bin.xxxxxx)的最末端,并將讀取到的Master端的bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的高速Master“我需要從某個bin-log的哪個位置開始往后的日志內容,請發給我”4. Slave 的 SQL 線程檢測到 Relay Log 中新增加了內容后,會馬上解析該 Log 文件中的內容成為在 Master端真實執行時候的那些可執行的 Query 語句,并在自身執行這些 Query。這樣,實際上就是在 Master 端和 Slave端執行了同樣的 Query,所以兩端的數據是完全一樣的。二、設置MySQL主從配置的優點 1、解決web應用系統,數據庫出現的性能瓶頸,采用數據庫集群的方式來實現查詢負載;一個系統中數據庫的查詢操作比更新操作要多得多,通過多臺查詢服務器將數據庫的查詢分擔到不同的查詢服務器上從而提高查詢效率。2、MySQL數據庫支持數據庫的主從復制功能,使用主數據庫進行數據的插入、刪除與更新操作,而從數據庫則專門用來進行數據查詢操作,這樣可以將更新操作和查詢操作分擔到不同的數據庫上,從而提高了查詢效率。三、主從數據庫服務器的配置 (可以設置一個或者多個從服務器)環境: 數據庫版本號: 5.5.32 MySQL主庫電腦的ip:192.168.4.15叢庫電腦的IP:192.168.4.21 1、首先查看兩臺機器之間的網絡是否是通的用其中的一臺ping另外一臺,如下用IP地址為192.168.4.21的主機ping192.168.4.15的機器,其結果如下:如果結果如上圖所示,則說明兩臺機器的網絡是通的,否則請先檢查網絡。2、打開主數據庫,在主數據庫里面建一個需要同步的數據庫,如下 user數據庫3、配置主數據庫服務器(1)、修改MySQL的配置文件(my.ini),如下,在mysqlld里面添加:上面的這些配置的含義:- server-id 顧名思義就是服務器標識id號了,每一臺服務器都有一個固定 的標示id。- log-bin MySQL進行主從復制是通過二進制的日志文件來進行的,此處是 開啟MySQL的日志功能 - binlog-do-db 是你需要復制的數據庫名稱, - binlog-ignore-db 是不需要復制的數據庫名稱 (2)、重新啟動主數據庫,給主數據庫服務器授予一個可以進行復制的用戶,如下的slave,這樣從服務器就能通過這個連接用戶有權限來訪問主數據庫服務器 :GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO 'slave'@'192.168.4.21' IDENTIFIED BY '123456' with grant option ;如下: 密碼 用戶權限 用戶名 從機IP設置完畢以后可以通過NAVCAT查看權限:(3)、重新啟動主數據庫,通過mysql>show master status;監控主服務器的狀態*記下 file 和 possion的值,這里的file,position會在從庫的配置里用到。4、從數據庫服務器的配置(1)、修改MySQL的配置文件(my.ini),如下,在mysqlld里面添加:、#server-id = 1 ####必須把server-id = 1注釋掉, 上面的這些配置的含義:- server-id=2 從數據庫的唯一標示id為2- master-host=192.168.4.15 #主數據庫的ip地址- master-user=slave #主數據庫已經授權的可以連接復制的用戶的用戶名- master-passWord=123456 #主數據庫已經授權的可以連接復制的用戶的密碼- master-port=3306 #主數據庫的端口號(2)、啟動從數據庫我當時遇到的情況是沒有成功啟動,查看error日志 發現 然后把 下面四行注釋掉 master-host=192.168.4.15 #主數據庫的ip地址master-user=slave #主數據庫已經授權的可以連接復制的用戶的用戶名master-password=123456 #主數據庫已經授權的可以連接復制的用戶的密碼master-port=3306 #主數據庫的端口號再執行下面的命令。 slave stop; change master to master_host='192.168.4.15', master_user='slave', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=107;slave start; 如下:(3)、可以通過 show slave status;來看看從庫的情況。不過信息太多。為了方便查看可以用下面這個命令 show slave status /G;顯示結果如下:查看上面的Slave_IO_Running: Yes 和Slave_SQL_Running: Yes 2個都為yes則證明主從同步正常,如果有任一個顯示NO,則證明同步有問題。可以查看數據庫日志文件,里面基本上會顯示出錯誤之處,根據錯誤一步一步排查,基本上都可以解決的。3、在從數據庫中創建一個與要備份的主數據庫相同的數據庫名,則配置完成。從數據庫會隨著主數據庫的改變動態的同步數據庫。如下,在主數據庫的user表中創建一個user表此時查看從數據庫,可以發現:則說明主從數據庫搭建成功。五、常見問題與解答1、現象:修改完配置后, 重啟MySQL,提示MySQL manager or server PID file could not be found 解決:查找進程中的MySQL,kill掉 > service MySQL restart > ps -aux|grep myslq > kill 進程號 # service MySQL start 注:MySQL.sock文件在MySQL啟動后才會生成,位置為/tmp下或/var/lib/MySQL/下 2、現象:從數據庫無法同步, show slave status顯示Slave_SQL_Running為No,Seconds_Behind_Master為null 原因: a.程序可能在slave上進行了寫操作 b.也可能是slave機器重起后,事務回滾造成的. 解決:方法一: MySQL> slave stop; MySQL> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; MySQL> slave start; 解決:方法二: Slave庫,MySQL> slave stop; --停掉slave服務 Master庫,MySQL> show master status; +----------------------+----------+--------------+------------------+ |File |Position |Binlog_Do_DB |Binlog_Ignore_DB | +----------------------+----------+--------------+------------------+ | MySQL-bin.000040 | 324 | | | +----------------------+----------+--------------+------------------+ 然后到slave服務器上執行手動同步 MySQL> change master to > master_host='192.168.1.2', > master_user='repuser', > master_password='123456', > master_port=3306, > master_log_file='MySQL-bin.000040', > master_log_pos=324; 啟動slave服務,MySQL> slave start; 通過show slave status查看Slave_SQL_Running為Yes,Seconds_Behind_Master為0,即為正常。 注:手動同步需要停止master的寫操作! 3、現象:從數據庫無法同步, show slave status顯示Slave_IO_Running為No,Seconds_Behind_Master為null 解決:重啟主數據庫 service MySQL restart MySQL> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | MySQL-bin.000001 | 98 | | | +------------------+----------+--------------+------------------+ MySQL> slave stop; MySQL> change master to Master_Log_File=‘MySQL-bin.000001',Master_Log_Pos=98 MySQL> slave start;
新聞熱點
疑難解答