一般使用MySQL的時候,如果數據量不大,我們都使用一台MySQL服務器,備份的時候使用MySQLdump工具就可以了,但是隨著業務不斷發展,問題出現了:
首先:數據量往往直線上升,單獨一台數據庫服務器開始出現性能的瓶頸,數據訪問越來越慢。
其次:備份也變得困難了,因為MySQLdump是導出一份文本文件,而數據量特別大的時候,這樣的備份往往需要很長時間,可能有人會說,我們可以直接通過拷貝數據文件來備份數據庫,這樣很方便,快捷,不錯,這樣是比mysqldump方便快捷,但是,直接拷貝數據文件備份的方式要求我們必須先關閉mysql服務,然後再拷貝數據文件,否則,你拷貝的文件很可能是壞的。而實際運行的MySQL服務往往要求在任何時候都不可以停止服務,所以這樣的備份方式在此情況下不可行。
如果你遇到了類似上面的問題,你就可以使用建立MySQL主從服務器的方式來解決,下面先來看看主從服務器的設置:
前提:MySQL主從服務器最好使用相同的軟件版本,以避免不不可預期的故障。
首先設置MySQL主服務器:
在主服務器上為從服務器建立一個用戶:
grant replication slave on *.* to '用戶名'@'主機' identifIEd by '密碼';
編輯主服務器的配置文件:/etc/my.cnf
server-id = 1
log-bin
binlog-do-db=需要備份的數據庫名,如果備份多個數據庫,重復設置這個選項即可
binlog-ignore-db=不需要備份的數據庫苦命,如果備份多個數據庫,重復設置這個選項即可
編輯從服務器的配置文件:/etc/my.cnf
server-id=2
master-host=主機
master-user=用戶名
master-passWord=密碼
master-port=端口
replicate-do-db=需要備份的數據庫名,如果備份多個數據庫,重復設置這個選項即可
記得先手動同步一下主從服務器中要備份的數據庫,然後重啟主,從服務器。
要驗證主從設置是否已經成功,可以登錄從服務器輸入如下命令:
MySQL> show slave status\G
會得到類似下面的列表:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果這兩個選項不全是Yes,那就說明你前面某個步驟配置錯了。
如果你的設置是正確的,嘗試在主服務器上插入若干條記錄,然後你再轉到從服務器,會發現相應的新記錄已經自動同步過來了。
如果你的主從服務器已經配置好了,那麼你在應用程序中,只要保證所有的insert/delete/update操作是在主服務器上進行的,那麼相應的數據變化會自動同步到從服務器上,這樣,我們就可以把select操作分擔到多台從數據庫上,從而降低服務器的載荷。
如果你想使用復制數據文件的方式來備份數據庫,只要在從服務器上的MySQL命令行先鍵入slave stop;然後復制數據庫文件,復制好了,再在mysql命令行鍵入slave start;啟動從服務器,這樣就即備份了數據有保證了數據完整性,而且整個過程中主服務器的MySQL無需停止。
-----------------------------------------------------------------------------------
提示:如果修改了主服務器的配置,記得刪除從服務器上的master.info文件。否則從服務器使用的還是老配置,可能會導致錯誤。
-----------------------------------------------------------------------------------
注意:關於要復制多個數據庫時,binlog-do-db和replicate-do-db選項的設置,網上很多人說是用半角逗號分隔,經過測試,這樣的說法是錯誤的,MySQL官方文檔也明確指出,如果要備份多個數據庫,只要重復設置相應選項就可以了。
比如:
binlog-do-db=a
binlog-do-db=b
replicate-do-db=a
replicate-do-db=b
-----------------------------------------------------------------------------------
補充:從服務器上my.cnf中的master-*的設置僅在第一次生效,後保存在master.info文件裡。
補充:1.說明
在做web應用系統中,如果數據庫出現了性能瓶頸,而你又是使用的MySQL數據庫,那麼就可以考慮采用數據庫集群的方式來實現查詢負載了。因為一般來講任何一個系統中數據庫的查詢操作比更新操作要多的多,因此通過多台查詢服務器將數據庫的查詢分擔到不同的查詢數據庫從而提高數據庫的查詢效率。
MySQL數據庫支持數據庫的主從復制功能,使用主數據庫進行數據的插入、刪除與更新操作,而從數據庫則專門用來進行數據庫查詢,這樣就可以將更新操作與查詢操作分離到不同的數據庫上,從而提高查詢的效率。
2.主數據庫配置
MySQL任何一台數據庫服務器都可以作為主數據庫服務器,我們只需要簡單的修改配置文件就可以使之成為主數據庫服務器。我們打開MySQL的配置文件(對於Windows就是MySQL安裝目錄下的my.ini文件,對於Linux通常就是/etc/my.cnf文件),我們在配置文件中加入如下兩行:
server-id = 1
log-bin=MySQL-bin
注意,MySQL進行主從復制是通過二進制的日志文件來進行,所以我們必須開啟MySQL的日志功能,即我們上面的log-bin,同時每一台數據庫服務器都需要指定一個唯一的server-id,通常主數據庫服務器我們指定為1。主數據庫服務器的配置就是如此了,然後我們還需要給主數據庫授予一個可以進行復制的用戶,命令如下:
grant replication slave on *.* to 'repuser'@'%' identifIEd by '123456';
replication slave是MySQL數據庫中表示復制的權限名稱,repuser則是表示從數據庫服務器登陸到主數據庫服務器時用到的用戶名稱,123456表示登陸密碼。這樣,我們就在主數據庫服務器上創建了一個可以進行復制的用戶賬號了。然後我們啟動主數據庫服務器就可以了。
3.從數據庫配置
從數據庫服務器的配置稍微多一點,主要也是修改MySQL的配置文件,加入如下行:
server-id=2
log-bin=MySQL-bin --在從服務器上啟動日志記錄,不是必須,但是官方建議
master-host=主機 --主數據庫服務器的IP地址
master-user=用戶名 --執行復制的用戶名稱,就是grant的用戶
master-passWord=密碼 --復制用戶的密碼,就是grant的用戶密碼
master-port=端口 --主數據庫服務器的端口,默認是3306
相關的配置參數意義已做了說明,主要就是多了配置主數據庫服務器上的復制賬號的信息。然後我們啟動從數據庫服務器,注意啟動從數據庫服務器後,並沒有啟動復制線程,我們需要在命令行中執行如下命令來啟動復制功能:
slave start
啟動後,我們就可以通過如下命令來查看復制的狀態了:
show slave status;
然後我們就可以看到系統的輸出,第一個就是Slave_IO_State,它的值通常就是Waiting for master to send event,然後我們也還可以看到我們剛才配置的主數據庫服務器的IP地址、復制賬號等信息。
我們還可以在從數據庫服務器上動態的改變對主數據庫的配置信息,通過如下命令來進行:
CHANGE MASTER TO MASTER_HOST=’主數據庫服務器的IP地址’, MASTER_PORT=3306,MASTER_USER=’主數據庫上的復制帳號’, MASTER_PASSWord=’密碼’;
4.啟動與監控
1)監控主數據庫服務器的狀態
我們可以通過showmaster status來查看主數據庫服務器的狀態,它的輸出如下:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| MySQL-bin.000003 | 370558 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
其中File是表示日志記錄的文件,而Position則是表示當前日志在文件中的位置,這個也是從數據庫服務器上執行復制操作必須的標識,後面的兩個字段分別表示要記錄的數據庫名稱和不需要記錄的數據庫名稱,我們也可以在配置文件中進行配置。
2)監控從數據庫服務器的狀態
我們可以通過show slave status來查看從數據庫服務器的狀態,它的基本輸出如下:
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Slave_IO_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master |
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Waiting for master to send event | 172.16.11.221 | repuser | 3306 | 60 | mysql-bin.000003 | 370558 | WEB2-relay-bin.000206 | 12251 | MySQL-bin.000003 | Yes | Yes | | | | | | | 0 | | 0 | 370558 | 12251 | None | | 0 | No | | | | | | 0 |
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
1 row in set (0.00 sec)
我們看到紅色的部分,分別表示的是Master_Log_File和Read_Master_Log_Pos,即主數據庫服務器上的日志文件和要讀取的主數據庫服務器上的日志的位置,通常這個Read_Master_Log_Pos是和主數據庫服務器上的Position是一致的,當然這個是指同步以後的,如果從數據庫服務器還沒有同步完畢,那麼這個值通常比主數據庫服務器上的要小。
如果從數據庫服務器在同步的過程中出現了問題,那麼我們可以通過reset slave來重置從數據庫服務器的復制線程,從數據庫服務器上的通常操作命令有:
Slave start; --啟動復制線程
Slave stop; --停止復制線程
Reset slave; --重置復制線程
Show slave status; --顯示復制線程的狀態
Change master to; --動態改變到主數據庫的配置