利用本機環境搭建MySQL主從數據庫 首先來介紹一下我的配置環境 本機是XP系統 搭載MySQL5.5 IP地址為192.168.1.101(這個地址是自適用的 會隨著你的工作地點的改變而改變 但不管怎麼變 只要讓你的虛擬機——保證能PING通就OK) www.2cto.com 由於我沒有多余的電腦 所以我決定在虛擬機裡再搭建一個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作為從數據庫 www.2cto.com 主數據庫配置文件 在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裡寫配置項前 我們需要在主數據庫上創建一個同步用戶 命令如下 grant replication slave,reload,super on *.* to 'yongbaolinux'@'%' identified by '123456'; 這是一個創建數據庫用戶及相應權限的命令 具體用法可以查閱手冊和百度 接下來繼續在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進行讀寫分離