程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 利用本機環境搭建MySQL主從數據庫

利用本機環境搭建MySQL主從數據庫

編輯:MySQL綜合教程

利用本機環境搭建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進行讀寫分離  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved