首先來介紹一下個人配置環境
本機是XP系統 搭載MySQL5.5 IP地址爲192.168.1.101(這個地址是自適用的 會隨着你的工做地點的改變而改變 但無論怎麼變 只要讓你的虛擬機——保證能PING通就OK)
因爲我沒有多餘的電腦 因此我決定在虛擬機裏再搭建一個MySQL
虛擬機的os是CentOS5.5 MySQL爲5.1.18
接下來保證主機和虛擬機相互能通訊 咱們須要知道虛擬機的IP 在虛擬機的linux裏運行ifconfig命令查看eth0的ip 找到第二行 inet addr:192.168.1.115 Bcast:255.255.255.255 Mask:255.255.255.0
到主機XP中 ping 192.168.1.115 再到虛擬機中ping 192.168.1.101 ok 通訊成功
如今來修改主從MySQL的配置文件
我將主機XP做爲主數據庫 虛擬機centos做爲從數據庫
主數據庫配置文件
在MySQL安裝目錄下的my.ini 不知道安裝目錄的就在控制檯裏運行show variables like 'basedir';便可
找到#SERVER SECTION [mysqld] 這一項 前面的#SERVER SECTION 代表下面的配置都是針對MySQL服務器端的
從數據庫配置文件
是/etc/my.cnf /etc這個文件夾存放的是linux的各類配置文件 apache php的配置文件也存於此
一樣找到[mysqld]
如今咱們已經同時打開了主從數據庫的配置文件 並找到了合適的寫配置項的位置
咱們在my.ini裏寫上server-id=1,在my.cnf裏寫上server-id=2 對這些配置項的含義不理解的能夠另行查閱資料。在這裏 server-id 表示給服務器分配一個獨一無二的編號 主數據庫設爲1 從數據庫設爲2
接下來繼續在my.ini裏添加以下選項
log-bin=filename.n //開啓二進制日誌功能 filename.n是日誌文件名 要保證可寫
binlog-do-db=dbname //只把給定數據庫的變化狀況寫進日誌 即須要同步的數據庫
binlog-ignore-db=dbname //不把給定數據庫的變化狀況寫進日誌 即不須要同步的數據庫
在繼續往my.cnf裏寫配置項前 咱們須要在主數據庫上建立一個同步用戶 命令以下
這是一個建立數據庫用戶及相應權限的命令 具體用法能夠查閱手冊和百度
接下來繼續在my.cnf裏添加以下選項
master_host=192.168.1.101
master_user=yongbaolinux
master_password=123456
而後將主從數據庫分別重啓
以root身份進入虛擬機的從數據庫 運行mysql>start slave;mysql>show slave status\G
運氣好點的話你能看到以下的關鍵信息:
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.101
Master_User: yongbaolinux
Master_Port: 3306
.............
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
運氣很差的話 就只能看到這樣
Slave_IO_State:
Master_Host: 192.168.1.101
Master_User: yongbaolinux
Master_Port: 3306
..............
Slave_IO_Running: NO
Slave_SQL_Running: NO
第一欄是空的 也就是說沒有鏈接上master,slave_io也沒有運行 我開始覺得是配置文件的問題 由於機器重啓 路由器從新分配了個ip 192.168.1.102給我 因而我在my.cnf裏修改master_host 爲102
可是重啓數據庫以後發現輸出信息沒有任何變化 第一行依然爲空 第二行的master_host依舊是101
難道my.cnf這個配置文件不起做用?後來我把它刪了 MySQL依然正常啓動了 我不得不說——我凌亂了
個人世界觀人生觀愛情觀在這一瞬間完全崩潰了 通過多方驗證 MySQL的確能夠脫離my.cnf的依賴 由於MySQL能夠依靠默認啓動參數而存在
這下腫麼辦 因而乎 只能這樣了 在console裏修改master信息(後來得知 其實用刷新命令flush也行)
mysql>stop slave;
mysql>change master to
>master_host='192.168.1.102',
>master_user='yongbaolinux',
>master_password='123456';
mysql>start slave;
mysql>show slave status\G
ok 如今一切正常了 輸出信息被修改了
關於Slave_IO_Running和Slave_SQL_Running,下面還有不少廢話要說
每一對master/slave系統中 都會有三個相關線程來互動完成同步工做 其中主上有一個 從上有兩個 就是這個slave_io和那個slave_sql。若是一臺master與多個slave相連,那麼這臺master上確定有與從機數量相同的主線程 而每臺slave上都只有一個slave_io和一個slave_sql.我說明白了吧 再不明白 我也麼辦法了
上述的輸出信息顯示slave_io_running爲NO 就代表這個線程未啓動
這三個線程是這樣互動的:首先io被建立後 會鏈接到master上 並要求master發送二進制日誌裏的語句 這個二進制日誌留到後面再長篇大論 master的主線程便會處理這個合理的要求 而後slave_io會讀取master傳遞過來的語句並把它們複製到數據目錄下的中繼日誌(relay logs)中 可見這個slave_io要作兩件事 一件是發送請求(若是能夠這樣理解的話) 另外一件是讀取並保存數據 最後 slave_sql 出場了 它會讀取中繼日誌(delay logs)中的語句並執行它們而達到更新數據的目的
如今來講說這個二進制日誌,mysql有多種日誌格式,二進制是其中一種,不管是win仍是linux,二進制日誌默認都是關閉的 要開啓很簡單 只要在my.cnf或者my.ini裏寫上log-bin=path,path就是日誌存放路徑 若是不寫路徑只寫一個文件名 那麼日誌文件會被存進datadir,win是C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data,linux是/var/lib/mysql。配置文件修改後重啓 mysql 你到上述兩個文件夾下會找到xxx.index 和xxx.000001,xxx是你自定義的文件名,xxx.index是日誌索引文件,xxx.000001是第一個日誌文件,之後會按照序號遞增。(若是你啥也不指定,那麼默認日誌文件名爲mysql-bin)
二進制文件沒法正常查看,須要mysqlbinlog工具(linux下是命令)
win下打開DOS控制檯,進入C:\Program Files\MySQL\MySQL Server 5.5\bin目錄運行mysqlbinlog xxx.000001(linux下直接運行mysqlbinlog命令,[root
@localhost xxxx]#mysqlbinlog xxxxx.000001;)
在同步操做前 裏面沒有sql語句 若是你進行過主數據庫的操做 你會發現裏面有對應的SQL語句
在打完收工前還有幾句廢話要說
若是主從數據庫的數據表結構不同 好比從機少一張表或者少某個字段之類的 那麼主機進行數據的操做 即DML語句的操做 從機是沒反應的 道理顯而易見 都不存在那張表 怎麼添加數據進去 可是因爲中繼日誌中包含這些DML語句 因此 若是你把從機的數據庫結構弄得跟主機同樣後 數據便會自動同步上去——須要重啓從機數據庫
蛋似 對主機進行DDL 即數據對象的定義操做 好比加一張表 刪一張表之類的 從機是會自動進行的 道理仍是顯而易見 由於DDL在從機上原本就是能夠執行的
好了 如今你在主機上增刪改查 從機上的數據庫會自動變化 達到了主從複製的目的
PS:網上有神說 一主多從的架構並非最好的架構 但目前我也不知道啥是最好的架構了 但願各位大神不吝指教 如今只是主從同步 後面還有用mysql-proxy進行讀寫分離