[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 數據庫 > MySQL > 正文
MySQL中文參考手冊---19 用MySQL解決一些常見問題
http://linuxdb.yeah.net 譯者:晏子 (2001-05-14 12:09:09)

19.1 數據庫復制

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

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

MySQL(至今)沒有數據庫復制,但是有一些如何實現的信息。

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

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

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

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

  • DATABASE()
  • GET_LOCK()RELEASE_LOCK()
  • RAND()
  • USER(), SYSTEM_USER()SESSION_USER()
  • VERSION()

所有的時間函數可安全地使用,比如如果需要,時間戳記被送到鏡像。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服務器時,你可以使用下列方法之一:

  • --host 'hostname' --port=port_numer[--host localhost] --socket=file_name啟動客戶。
  • 在你的C或Perl程序中,當連接MySQL服務器時,你可以給出端口和套接字參數。
  • 在你啟動客戶程序之前,設置MYSQL_UNIX_PORTMYSQL_TCP_PORT環境變量,指向Unix套接字和TCP/IP的端口。如果你通常使用一個特定的套接字或端口,你應該將設置這些環境變量的命令放進你的“.login”文件中。見12.1 不同的 MySQL程序概述
  • 在你的主目錄下的“.my.cnf”文件中指定缺省套接字和TCP/IP端口。見4.15.4 選項文件
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
MySQL中文參考手冊--8.MySQL教程--8.7 雙胞胎項目的查詢(實例) (2001-07-22 18:24:01)
MySQL中文參考手冊--8.MySQL教程--8.6 以批處理模式使用mysql (2001-07-22 18:23:47)
MySQL中文參考手冊--8.MySQL教程--8.5 獲得數據庫和表的信息 (2001-07-22 18:23:34)
MySQL中文參考手冊--8.MySQL教程--8.4 創造並使用一個數據庫 (2001-07-22 18:22:59)
MySQL中文參考手冊--8.MySQL教程--8.3 常用查詢的例子 (2001-07-22 18:22:34)
MySQL中文參考手冊--8.MySQL教程--8.2 輸入查詢 (2001-07-22 18:22:15)
MySQL中文參考手冊--8.MySQL教程--8.1 連接與斷開服務者 (2001-05-27 10:37:07)
MySQL中文參考手冊---21 怎樣對比MySQL與其他數據庫 (2001-05-14 12:11:51)
MySQL中文參考手冊---20 MySQL客戶工具和API (2001-05-14 12:10:54)
MySQL中文參考手冊---19 用MySQL解決一些常見問題 (2001-05-14 12:09:09)

===更多相關===
 

★  樊強制作 歡迎分享  ★