標籤:讀取 參數檔案 sql資料庫 指定 舉例 參考 ora inno 成功
參數檔案:告訴MySQL執行個體啟動時在哪裡可以找到資料庫檔案,並且指定某些初始化參數,這些參數定義了某種記憶體結構的大小等設定,還會介紹各種參數的類型。
參數檔案
當MySQL執行個體啟動時,MySQL會先去讀一個配置參數檔案,用來尋找資料庫的各種檔案所在位置以及指定某些初始化參數,這些參數通常定義了某種記憶體結構有多大等設定。預設情況下,MySQL執行個體會按照一定的次序去取,你只需通過命令mysql --help|grep my.cnf來尋找即可。
MySQL參數檔案的作用和Oracle的參數檔案極其類似;不同的是,Oracle執行個體啟動時若找不到參數檔案,是不能進行裝載(mount)操作的。MySQL稍微有所不同,MySQL執行個體可以不需要參數檔案,這時所有的參數值取決於編譯MySQL時指定的預設值和原始碼中指定參數的預設值。但是,如果MySQL在預設的資料庫目錄下找不到mysql架構,則啟動同樣會失敗,你可能在錯誤記錄檔檔案中找到如下內容:
090922 16:25:52 mysqld started090922 16:25:53 InnoDB:Started;log sequence number 8 2801063211InnoDB:!innodb_force_recovery is set to 1!090922 16:25:53[ERROR]Fatal error:Can‘t open and lock privilege tables:Table‘mysql.host‘doesn‘t exist090922 16:25:53 mysqld ended
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;
select @@session.read_buffer_size\G;
select @@global.read_buffer_size\G;
把read_buffer_size全域值更改為1MB,而當前會話的read_buffer_size的值還是512KB。這裡需要注意的是,對變數的全域值進行了修改,在這次的執行個體生命週期內都有效,但MySQL執行個體本身並不會對參數檔案中的該值進行修改。也就是說下次啟動時,MySQL執行個體還是會讀取參數檔案。如果你想讓資料庫執行個體下一次啟動時該參數還是保留為當前修改的值,則必須修改參數檔案。要想知道MySQL所有動態變數的可修改範圍,參考MySQL官方手冊的(Dynamic System Variables)的相關內容。
對於靜態變數,如果對其進行修改,會得到類似如下的錯誤
set global datadir=‘/db/mysql‘;
ERROR 1238(HY000):Variable‘datadir‘is a read only variable
MYSQL資料庫的參數檔案