MySQL設定檔
MySQL發布的最新產品實際上超出了Red Hat Enterprise Linux所攜帶的版本。但是,穩定性和開放原始碼可是很重要的因素,因此在作業系統上使用較早MySQL版本是有道理的。
有許多可以採用的設定檔,它們都被包含在mysql-server PRM程式中。還有一個預設的設定檔被包含在mysql PRM程式包中。
配置MySQL伺服器是一個豐富而複雜的工作。在本文中,我只能膚淺的說一下各種選項。可以使用的MySQL設定檔共有5個。最後4個位於/usr/share/doc/mysql-server-*/目錄中。
·/etc/my.cnf是預設的MySQL設定檔。應該對這個檔案配置修改。它是為學習目的而設計的。
·my-small.cnf是為了小型資料庫而設計的。不應該把這個模型用於含有一些常用項目的資料庫。
·my-medium.cnf是為中等規模的資料庫而設計的。如果你正在企業中使用RHEL,可能會比這個作業系統的最小RAM需求(256MB)明顯多得多的實體記憶體。由此可見,如果有那麼多RAM記憶體可以使用,自然可以在同一台機器上運行其它服務。
·my-large.cnf是為專用於一個SQL資料庫的電腦而設計的。由於它可以為該資料庫使用多達512MB的記憶體,所以在這種類型的系統上將需要至少1GB的RAM,以便它能夠同時處理作業系統與資料庫應用程式。
·my-huge.cnf是為企業中的資料庫而設計的。這樣的資料庫要求專用伺服器和1GB或1GB以上的RAM。
這些選擇高度依賴於記憶體的數量、電腦的運算速度、資料庫的細節大小、訪問資料庫的使用者數量以及在資料庫中裝入並訪問資料的使用者數量。隨著資料庫和使用者的不斷增加,資料庫的效能可能會發生變化。
我將逐個的說明這些設定檔。如果使用者決定使用my-*.cnf檔案之一,將首先需要把這個檔案複製到/etc/my.cnf檔案上。
由於這些原因,使用者應該仔細觀察資料庫系統的效能。如果發現問題,可能需要增加更多的RAM,或者把資料庫遷移到一個含有附加資源(比如多個CPU)的系統上。
提示:資料庫變得非常大。把一個SQL資料庫目錄配置在一個專用分區上可能更有道理。雖然一個不斷增長的資料庫可能會佔滿整個分區,但它至少不會吞掉RHEL運行所必需的磁碟空間。
/etc/my.cnf檔案
預設是/etc/my.cnf檔案。它包含6條命令,並且這6條命令被組織在3個配置段中。這些配置段與Samba設定檔中的配置段相似,並且含有功能組名稱和相關的命令。本文將逐行的說明這個檔案的預設版本。如果使用者進行了任何修改,將需要確保MySQL啟動指令碼(即/etc/rc.d/init.d/mysqld)中的命令一致。
[mysqld]
在這個配置段之內,將會看到與MySQL守護進程相關的命令。
datadir=/var/lib/mysql
MySQL伺服器把資料庫儲存在由datadir變數所定義的目錄中。
Socket=/var/lib/mysql/mysql.sock
MySQL通訊端把資料庫程式局部的或通過網路連接到MySQL客戶。
提示:MySQL被配置成使用InnoDB儲存空間引擎。如果使用者在自己的系統上還沒有一個InnoDB資料庫,將需要給[mysqld]配置段添加skip-innodb語句。
[mysql.server]
在這個配置段之內,將會看到MySQL伺服器守護進程有關的命令。這個配置段的較早期版本被命名為[mysql_server]。如果使用MySQL4.X或MySQL4.X以上版本,將必須把這個配置段標題改成[mysql_server]。當啟動MySQL服務時,它使用這個配置段中的選項。
user=mysql
與MySQL服務相關聯的標準使用者名稱是mysql。它應該是/etc/passwd檔案的一部分;如果在這個檔案中沒有發現它,使用者可能還沒有安裝Red Hat Enterprise Linux mysql-server RPM程式包。
basedir=/var/lib
這表示MySQL資料庫的頂級目錄。它充當MySQL系統上的一個根目錄;這個資料庫中的其它目錄都是相對於這個目錄。
[safe_mysqld]
這個配置段包含MySQL啟動指令碼所引用的命令。如果使用MySQL4.X或4.X以上版本,必須把這個配置段改成[mysqld_safe]。
err-log=/var/log/mysqld.log
這是MySQL所關聯的錯誤被發送到的這個檔案。如果使用MySQL4.X或4.X以上版本,必須使用log-error指令替換這條命令。
pid-file=/var/run/mysqld/mysqld.pid
最後,pid-file指令定義MySQL伺服器在運作期間的進程標識符(PID)。如果MySQL伺服器當前沒有運行,這個檔案應該不存在。
提示:使用者可以配置與使用者特定相關的MySQL設定檔;為此,只需給指定使用者主目錄中的.my.cnf隱含檔案添加所選的配置命令即可。
my-samll-cnf
在本文中,將說明my-small-cnf配置文本中的所有命令。當回顧其它MySQL樣本設定檔時,將參考本文所解釋的各條命令和指令的含義。先從下面這個配置段開始分析該檔案中的有效命令和指令:
[client]
這個配置把指令傳遞給與MySQL伺服器相關的客戶。
port=3306
MySQL所相關的標準TCP/IP連接埠是3306。如果需要修改這個連接埠號碼(可以增強安全),必須確保用於MySQL客戶與伺服器的所有相應設定檔中均修改這個號。
socket=/var/lib/mysql/mysql.sock
正像預設的/etc/my.cnf檔案中所定義的那樣,這是控制MySQL客戶與伺服器間通訊的標準通訊端檔案。
[mysqld]
當啟動MySQL伺服器時,它由[mysqld]配置段中所定義的命令來控制。
port=3306
socket=/var/lib/mysql/mysql.sock
當然,與同一個MySQL資料庫相關的客戶與伺服器需要使用相同的TCP/IP連接埠和通訊端。
skip-locking
多個客戶可能會訪問同一個資料庫,因此這防止外部客戶鎖定MySQL伺服器。這個skip-locking命令是MySQL4.X或4.X以上版本中的skip-external-locking命令。
一般來說,如果正在使用MySQL4.X或4.X上以版本,這個set-variable指令沒有必要帶有這個列表中的這些命令。
set-variable=key_buffer=16k
這個緩衝區確實很小;如果一個資料庫在一個文字檔中包含不止幾百行資料,它將會超載這個緩衝區的容量。這個資料庫可能不會超載一個文字檔地址簿的容量。如果這不只是一個供個人使用的資料庫,這個限額很快就會被達到。假使那樣的話,可能需要考慮與其它設定檔之一相關的那些限額。
set-variable=max_allowed_packet=1M
當然,與一個資料庫相關的資訊會增加到超出實際資料。在預設的情況下,如果該資訊在一個伺服器上超過1MB以上,MySQL將會產生一條錯誤資訊。
set-variable=thread_stack=64k
這條指令限定用於每個資料庫線程的棧大小。預設設定足以滿足大多數應用。
set-variable=table_cache=4
使用者可以限定一個資料庫中開啟表的數量;越小的限額(預設值是64)適合越小規模的資料庫。
set-variable=sort_buffer=64k
在處理一個資料庫時,使用者可能需要記憶體中附加的緩衝區空間。
set-variable=net_buffer_length=2k
正如net_buffer_length指令所定義的,MySQL伺服器還給傳入的請求保留了空間。
server-id=1
一般來說,如果有一個MySQL主伺服器,應該把它的server-id設定成1;應該把MySQL從屬伺服器的server-id設定成2;
[mysqldump]
使用者可以在不同類型的SQL資料庫之間傳輸資料,這由[mysqldump]配置段中的命令來控制。
quick
quick選項支援較大資料庫的轉儲。
set-variable=max_allowed_packet=16M
當然,用來傳輸資料庫表到其它資料庫的max_allowed_packet大於客戶與伺服器之間的簡單通訊所使用的資訊包。
[mysql]
no-auto-rehash
這個配置段設定啟動MySQL服務的條件;在這種情況下,no-auto-rehash確保這個服務啟動得比較快。
[isamchk]
[myisamchk]
像SQL這樣的關聯式資料庫用所謂的Indexed Sequential Access Method(索引順序存取方法,簡稱ISAM)來處理。這兩個配置段中的命令是相同的;這些命令與檢查並修複資料庫表的同名命令有關。
set-variable=key_buffer=8M
set-variable=sort_buffer=8M
在前面談及MySQL伺服器時,使用者己經見過這些變數。它們在這裡都比較大,以便支援資料庫的較快速檢查與修複。
[mysqlhotcopy]
interactive-timeout
正如[mysqlhotcopy]配置段所指定的,在一個資料庫複寫操作期間,串連會掛起。在預設情況下,interactive-timeout變數把一個資料轉送的最大時間量設定為28800秒(8個小時)。
my-medium.cnf檔案
與中等資料庫相關的MySQL設定檔含有和my-small-cnf設定檔中一樣的有效配置段。在[mysqld]配置段中,下面這些命令支援較大規模的伺服器資料庫:
set-variable=key_buffer=16M
set-variable=table_cache=64
set-variable=sort_buffer=512K
set-variable=net_buffer_length=8K
log-bin
一般來說,這個配置段中的命令支援伺服器上的較大快取與緩衝區長度。應該看到兩條新命令。
set-variable=myisam_sort_buffer_size=8M
log-bin
myisam_sort_buffer_size命令允許MySQL索引資料庫,第二條命令支援二進位日誌記錄方法。
[isamchk]
[myisamchk]
當然,這兩個配置段中的緩衝區比用於資料庫傳輸的緩衝區大,這個檔案包含下面這些命令;它們發送訊息到伺服器和接收來自伺服器的訊息。
set-variable=read_buffer=2M
set-variable=write_buffer=2M
my-large.cnf檔案
與較大型資料庫相關的MySQL設定檔含有和my-samll-cnf設定檔中一樣的有效配置段。在本文中,將比較my-large-cnf與my-medium-cnf樣本檔案中的各條命令。在[mysqld]配置段中,下面這些命令支援較大型的伺服器資料庫:
set-variable=key_buffer=256M
set-variable=table_cache=256
set-variable=sort_buffer=1M
set-variable=myisam_sort_buffer_size=64M
set-variable=net_buffer_length=8K
這個配置段中有3條附加的命令。record_buffer命令儲存對一個資料庫中不同表的掃描結果。thread_cache命令對多請求有用;空閑線程被快取起來,進而允許新的搜尋操作採用己有的線程。只要這防止搜尋操作啟動新的伺服器處理序,這就能減輕系統上的負荷。
set-variable=record_buffer=1M
set-variable=thread_cache=8
set-variable=thread_concurrency=8
thread_concurrency變數限定同時啟動並執行線程數量。my-large.cnf樣本檔案建議使用者應該把這個數量限定於本電腦上CPU數量的兩倍;這個特定設定相當��4個CPU。
my-huge.cnf檔案
my-huge.cnf檔案含有和my-large.cnf設定檔中一樣的命令。當然,分配給大多數指令的值比較大並適合較大型的資料庫。
正如wWw.mysql.com網站上所描述的,擁有大量資料庫的組織,比如:google、 Sabre和NASA都採用MySQL。雖然我們猜測這些公司所使用的命令不同於使用者在my-huge.cnf檔案中所看到的命令,但這至少讓使用者對 MySQL企業級資料庫有一個概念。