天天看點

MYSQL資料庫的參數檔案

參數檔案:告訴MySQL執行個體啟動時在哪裡可以找到資料庫檔案,并且指定某些初始化參數,這些參數定義了某種記憶體結構的大小等設定,還會介紹各種參數的類型。

當MySQL執行個體啟動時,MySQL會先去讀一個配置參數檔案,用來尋找資料庫的各種檔案所在位置以及指定某些初始化參數,這些參數通常定義了某種記憶體結構有多大等設定。預設情況下,MySQL執行個體會按照一定的次序去取,你隻需通過指令mysql --help|grep my.cnf來尋找即可。

MySQL參數檔案的作用和Oracle的參數檔案極其類似;不同的是,Oracle執行個體啟動時若找不到參數檔案,是不能進行裝載(mount)操作的。MySQL稍微有所不同,MySQL執行個體可以不需要參數檔案,這時所有的參數值取決于編譯MySQL時指定的預設值和源代碼中指定參數的預設值。但是,如果MySQL在預設的資料庫目錄下找不到mysql架構,則啟動同樣會失敗,你可能在錯誤日志檔案中找到如下内容:

MySQL中的mysql架構中記錄了通路該執行個體的權限,當找不到這個架構時,MySQL執行個體不會成功啟動。

和Oracle參數檔案不同的是,Oracle的參數檔案分為二進制的參數檔案(spfile)和文本類型的參數檔案(init.ora),而MySQL的參數檔案僅是文本的,友善的是,你可以通過一些常用的編輯軟體(如vi和emacs)進行參數的編輯。

可以把資料庫參數看成一個鍵/值對。可以通過show variables檢視所有的參數,或通過like來過濾參數名。

從MySQL 5.1版本開始,可以通過information_schema架構下的GLOBAL_VARIABLES視圖來進行查找,如下所示:

select * from GLOBAL_VARIABLES where VARIABLE_NAME like 'innodb_buffer%'\G;

show variables like 'innodb_buffer%'\G

Oracle的參數有所謂的隐藏參數(undocumented parameter),以供Oracle“内部人士”使用,SQL Server也有類似的參數。有些DBA曾問我,MySQL中是否也有這類參數。我的回答是:沒有,也不需要(其實是有)。即使Oracle和SQL Server中都有些所謂的隐藏參數,在絕大多數情況下,這些資料庫廠商也不建議你在生産環境中對其進行很大的調整。

MySQL參數檔案中的參數可以分為兩類:動态(dynamic)參數和靜态(static)參數。動态參數意味着你可以在MySQL執行個體運作中進行更改;靜态參數說明在整個執行個體生命周期内都不得進行更改,就好像是隻讀(read only)的。

可以通過SET指令對動态的參數值進行修改,SET的文法如下:

SET 

  | [global|session] system_var_name=expr 

  | [@@global.|@@session.|@@] system_var_name=expr

這裡可以看到global和session關鍵字,它們表明該參數的修改是基于目前會話還是整個執行個體的生命周期。

有些動态參數隻能在會話中進行修改,如autocommit;

有些參數修改完後,在整個執行個體生命周期中都會生效,如binlog_cache_size;

而有些參數既可以在會話又可以在整個執行個體的生命周期内生效,如read_buffer_size。

舉例如下:

set read_buffer_size=524288;

select @@session.read_buffer_size\G;

select @@global.read_buffer_size\G;

将read_buffer_size的會話值從2MB調整為了512KB,可以看到全局的read_buffer_size的值仍然是2MB,也就是說,如果有另一個會話登入到MySQL執行個體,它的read_buffer_size的值是2MB,而不是512KB。這裡使用了set global|session來改變動态變量的值。

使用set @@global|@@session來更改

set @@global.read_buffer_size=1048576;

把read_buffer_size全局值更改為1MB,而目前會話的read_buffer_size的值還是512KB。這裡需要注意的是,對變量的全局值進行了修改,在這次的執行個體生命周期内都有效,但MySQL執行個體本身并不會對參數檔案中的該值進行修改。也就是說下次啟動時,MySQL執行個體還是會讀取參數檔案。如果你想讓資料庫執行個體下一次啟動時該參數還是保留為目前修改的值,則必須修改參數檔案。要想知道MySQL所有動态變量的可修改範圍,參考MySQL官方手冊的(Dynamic System Variables)的相關内容。

對于靜态變量,如果對其進行修改,會得到類似如下的錯誤

set global datadir='/db/mysql';