mysql-logo.gif (3082 bytes)MySQL中文參考手冊

譯者:晏子 (clyan@sohu.com
GB 碼主頁:http://linuxdb.yeah.net

Big5 轉碼者:statue (statue@bbs.yzu.edu.tw
詞彙轉換:彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁: http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站: http://php.wilson.gs/mysqldoc/big5/manual_toc.html


第一章, 前一章, 下一章, 最後一章目錄.


19 用MySQL解決一些常見問題

19.1 資料庫複製

一方面複製可以用來增加健壯性和速度。對健壯性,你有2個系統,而如果你出了問題,切換到備份即可。額外的速度通過把非更新查詢的一部分送到複製伺服器來達到。當然,這只在非更新查詢為主時有用,但是這正是一般的情形。

一方面複製計劃在不久的未來實現。這將被實現,使得從伺服器將以較低優先級的更新和延遲插入被同步到最新數據(這將給讀者以比寫者更高的優先級)。

MySQL(至今)沒有資料庫複製,但是有一些如何實現的資訊。

複製一個資料庫最一般的方法是使用更新日誌。見9.2 更新日誌。這要求充當一個主資料庫(進行數據改變的)並且另一個或多個充當從資料庫。要更新一個從資料庫,只要運行mysql < update_log。提供對於從資料庫適當的主機、用戶和密碼選項,並且將主資料庫的更新日誌作為輸入。

如果你從未從一張表中刪除任何東西,你可以使用一個TIMESTAMP列找出自上一次複製以來(通過比較作你上次做複製的時間)表中哪個行被插入和被改變,且僅拷貝這些行到鏡像中。

有可能使用更新日誌(對刪除)和時間戳記(在兩端)做成一個雙向更新系統統,但是在這種情況下,當同一數據在兩端被改變時,你必須能處理衝突。你可能想保持舊版本以幫助決定什麼被更新了。

因為在這種情況中複製用SQL語句進行,你不應該在更新資料庫的語句中使用下列函數﹔他們不能返回與原資料庫相同的值:

所有的時間函數可安全地使用,比如如果需要,時間戳記被送到鏡像。LAST_INSERT_ID()也可安全地使用。

19.2 資料庫備份

因為MySQL表作為文件儲存,做一個備份是容易的。為了得到一個一致的備份,在相關的表上做一個LOCK TABLES。見7.24 LOCK TABLES/UNLOCK TABLES句法。你只需一個讀鎖定﹔當你在資料庫目錄中做文件的一個拷貝時,這允許其他執行緒繼續查詢該表。如果你想要做一個SQL級的備份,你可以SELECT INTO OUTFILE

備份一個資料庫的另一個方法是使用mysqldump程式:

  1. 為你的資料庫做一個完整的備份:
    shell> mysqldump --tab=/path/to/some/dir --opt --full
    

    你也可以簡單地拷貝所有的表文件(“*.frm”、“*.MYD”“*.MYI”文件),只要伺服器不在更新任何東西。

  2. 停止mysqld如果它正在運行,然後以--log-update選項啟動它。你將得到一個名為“hostname.n”形式的日誌文件, 這裡n是隨著你每次執行mysqladmin refreshmysqladmin flush-logsFLUSH LOGS語句、或重啟伺服器而遞增的一個數字。這些日誌文件向你提供了在你執行mysqldump處後面進行的複製資料庫改變的所需資訊。

如果你必須恢復一些東西,嘗試首先用myisamchk -r恢復你的表。這應該處理所有情況的99.9%。如果myisamchk失敗,嘗試下列程序:

  1. 恢復原來的mysqldump備份。
  2. 執行下列命令以再次運行更新日誌中的更改:
    shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
    

ls被用來以正確的順序得到所有的日誌文件。

你也可以與SELECT * INTO OUTFILE 'file_name' FROM tbl_name做有選擇的備份並且用LOAD DATA INFILE 'file_name' REPLACE ...恢復。為了避免重複記錄,在表中你需要一個PRIMARY KEYUNIQUE鍵。當在唯一鍵值上一個新記錄與一個老記錄重複時,REPLACE關鍵詞使得老記錄用一個新記錄替代。

19.3 在同一台機器上運行多個MySQL伺服器

有些情況下你可能想要在同一台機器上運行多個伺服器。例如,你可能想要測試一個新的MySQL版本而讓你現有生產系統的設置不受到干擾,或你可能是想要為不同的客戶提供獨立的MySQL安裝一個網際網路服務供應商。

如果你想要運行多個伺服器,最容易的方法是用不同的TCP/IP端口和套接字文件重新編譯伺服器,因此他們不是偵聽同一個TCP/IP端口或套接字。

假設一個現存伺服器配置為內定端口號和套接字文件,那麼用一個這樣的configure命令行設置新的伺服器:

shell> ./configure  --with-tcp-port=port_number \
             --with-unix-socket=file_name \
             --prefix=/usr/local/mysql-3.22.9

這裡port_numberfile_name應該不同於內定端口號和套接字文件路徑名,而且--prefix值應該指定一個不同於現存的MySQL安裝所在的安裝目錄。

你可以用這個命令檢查由任何當前執行的MySQL所使用的套接字和端口:

shell> mysqladmin -h hostname --port=port_number variables

如果你有一個MySQL伺服器正運行在你使用了的端口上,你將得到MySQL的一些最重要的可配置變數的一張表,包括套接字名等。

你也應該編輯你機器的初始化腳本(可能是“mysql.server”)來啟動並殺死多個mysqld伺服器。

你不必重新編譯一個新MySQL伺服器,只要以一個不同的端口和套接字啟動即可。你可以通過指定在運行時safe_mysqld使用的選項來改變端口和套接字:

shell> /path/to/safe_mysqld --socket=file_name --port=port_number

如果你在與開啟日誌的另一個伺服器相同的一個資料庫目錄下運行新伺服器,你也應該用safe_mysqld--log--log-update選項來指定日誌文件的名字,否則,兩個伺服器可能正在試圖寫入同一個日誌文件。

警告:通常你決不應該有在同一個資料庫中更新數據的2個伺服器!如果你的OS不支援無故障(fault-free)的系統鎖定,這可能導致令人驚訝的事情發生!

如果你想要為第二個伺服器使用另一個資料庫目錄,你可以使用safe_mysqld--datadir=path選項。

當你想要連接一個正在運行的使用一個不同於編譯進你的客戶程式中端口的MySQL伺服器時,你可以使用下列方法之一:


第一章, 前一章, 下一章, 最後一章目錄.