深入理解mysql參數(shù)
前言:mysql參數(shù)的修改在mysql的課程里面應(yīng)該屬于相對(duì)基礎(chǔ)的知識(shí),但是作為一個(gè)mysql的初學(xué)者還是很有必要弄懂這個(gè)知識(shí)點(diǎn),以后的學(xué)習(xí)過程中將會(huì)經(jīng)常用到的。技術(shù)很多時(shí)候都是相通的,如果有學(xué)過oracle的朋友應(yīng)該會(huì)知道,oracle的參數(shù)里面有幾個(gè)標(biāo)簽:動(dòng)態(tài)參數(shù)、靜態(tài)參數(shù)、session級(jí)別修改、全局修改、立即生效和延遲生效。作為數(shù)據(jù)庫mysql也同樣有這些特性,但是整體學(xué)起來后會(huì)發(fā)現(xiàn)mysql某些方面還是沒有oracle做的到位,在該文檔的最后咱們?cè)僮鰝€(gè)總結(jié)。
一、參數(shù)文件
1、查看參數(shù)文件
通過命令行"mysql --help | grep my.cnf"查看my.cnf文件的位置,linux操作系統(tǒng)中參數(shù)文件默認(rèn)為/etc/my.cnf,按照mysql官方文檔的說明,mysql的啟動(dòng)參數(shù)文件的順序如下:
1、查找根據(jù)順序查找全局 /etc/my.cnf /etc/mysql/my.cnf /SYSCONFDIR/my.cnf為全局選項(xiàng)
2、$MYSQL_HOME/my.cnf為服務(wù)指定變量
二、參數(shù)文件的修改
1、動(dòng)態(tài)參數(shù)和靜態(tài)參數(shù)的概念
Mysql 的參數(shù)類型:分為動(dòng)態(tài)(dynamic)和靜態(tài)參數(shù)(static);
動(dòng)態(tài)參數(shù)意味著可以再mysql實(shí)例運(yùn)行中進(jìn)行更改;
靜態(tài)參數(shù)說明在整個(gè)實(shí)例聲明周期內(nèi)都不得進(jìn)行更改,就好像是只讀的。
在動(dòng)態(tài)參數(shù)中,有些參數(shù)修改可以是基于回話的也可以是基于整個(gè)實(shí)例的生命周期。
2、全局變量與會(huì)話變量
全局變量在MYSQL啟動(dòng)的時(shí)候由服務(wù)器自動(dòng)將它們初始化為默認(rèn)值。會(huì)話變量在每次建立一個(gè)新的連接的時(shí)候,由MYSQL來初始化。MYSQL會(huì)將當(dāng)前所有全局變量的值復(fù)制一份。來做為會(huì)話變量。(也就是說,如果在建立會(huì)話以后,沒有手動(dòng)更改過會(huì)話變量與全局變量的值,那所有這些變量的值都是一樣的。全局變量與會(huì)話變量的區(qū)別就在于,對(duì)全局變量的修改會(huì)影響到整個(gè)服務(wù)器,但是對(duì)會(huì)話變量的修改,只會(huì)影響到當(dāng)前的會(huì)話(也就是當(dāng)前的數(shù)據(jù)庫連接)
3、參數(shù)的查看方式
Mysql的參數(shù)可以通過"show variables"來查看,由于從mysql5.1版本開始,可以通過information_schema架構(gòu)下的GLOBAL_VARIABLES視圖來進(jìn)行查找,所以也可以這樣查看"select * from information_schema.global_variables";
查看參數(shù)的腳本:
語句一、
mysql> SHOW VARIABLES LIKE 'max_join_size';
mysql> SHOW GLOBAL VARIABLES LIKE 'max_join_size';
語句二、
mysql> select * from information_schema.global_variables; +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | VARIABLE_NAME | VARIABLE_VALUE | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | MAX_PREPARED_STMT_COUNT | 16382 | | INNODB_BUFFER_POOL_SIZE | 134217728 | | HAVE_CRYPT | YES | | PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE | 10000 | | INNODB_VERSION | 5.5.36 | | QUERY_PREALLOC_SIZE | 8192 | | DELAYED_QUEUE_SIZE | 1000 | | PERFORMANCE_SCHEMA_MAX_COND_INSTANCES | 1000 | | SSL_CIPHER | | | COLLATION_SERVER | utf8_general_ci | | SECURE_FILE_PRIV | | | TIMED_MUTEXES | OFF | | DELAYED_INSERT_TIMEOUT | 300 | | PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES | 1000000 | | LC_TIME_NAMES | en_US |
4、參數(shù)的修改,參數(shù)的修改有以下幾種方法,作為學(xué)習(xí)、便于理解其中的原理所在,這里把幾種方法都整理出來了,歡迎各位的查看
方法一、修改參數(shù)文件。所有的參數(shù)都保存在/etc/my.cnf文件中,所以直接修改該參數(shù)文件便可修改相應(yīng)的系統(tǒng)參數(shù)。
弊端:修改該參數(shù)需要重啟后才能生效,當(dāng)系統(tǒng)上線后一般都不能隨便重啟,所以該方法很少用;
操作方法:
1、修改參數(shù)文件/etc/my.cnf,添加general_log_file = /data/mysql/mysql_2.logvi /etc/my.cnf
# The MySQL server [mysqld] port = 3306 socket = /tmp/mysql.sock skip-external-locking key_buffer_size = 384M max_allowed_packet = 1M table_open_cache = 512 sort_buffer_size = 2M read_buffer_size = 2M read_rnd_buffer_size = 8M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size = 32M # Try number of CPU's*2 for thread_concurrency thread_concurrency = 8 general_log_file = /data/mysql/mysql_2.log |
2、重啟mysql服務(wù)
service mysqld stop
3、檢查參數(shù)是否生效
mysql> show variables like 'general%';
+------------------+-------------------------+
| Variable_name | Value |
+------------------+-------------------------+
| general_log | OFF |
| general_log_file | /data/mysql/mysql_2.log |
+------------------+-------------------------+
2 rows in set (0.00 sec)
當(dāng)前顯示已生效
方法二、如果是動(dòng)態(tài)參數(shù)的話,便可以直接通過語句修改。
(http://dev.mysql.com/doc/refman/5.6/en/dynamic-system-variables.html mysql的所有參數(shù)詳情介紹
sql語法:
SET variable_assignment [, variable_assignment] ... //可以同時(shí)修改多個(gè)參數(shù)
variable_assignment:
user_var_name = expr
| [GLOBAL | SESSION] system_var_name = expr
| @@[global. | session.]system_var_name = expr
例子:
SET sort_buffer_size=10000; /修改SESSION參數(shù)
SET @@local.sort_buffer_size=10000; /修改全局參數(shù)
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000; /同時(shí)修改多個(gè)SESSION參數(shù)
SET @@sort_buffer_size=1000000; /第二種修改全局參數(shù)的方法
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;
說明如下:
1)修改SESSION的參數(shù)的影響:如果您使用SESSION(默認(rèn)情況)設(shè)置一個(gè)系統(tǒng)變量,則該值仍然有效,直到當(dāng)前會(huì)話結(jié)束為止,或者直到您把變量設(shè)置為一個(gè)不同的值為止。
2)如果您使用GLOBAL(要求SUPER權(quán)限)來設(shè)置一個(gè)系統(tǒng)變量,則該值被記住,并被用于新的連接,直到服務(wù)器重新啟動(dòng)為止。
如果您想要進(jìn)行永久式變量設(shè)置,需要寫入到參數(shù)文件。(通過SET命令并不會(huì)修改參數(shù)文件的內(nèi)容,還需要另行修改,這點(diǎn)做的沒有ORACLE好)
3)為了防止不正確的使用,如果您使用SET GLOBAL時(shí)同時(shí)使用了一個(gè)只能與SET SESSION同時(shí)使用的變量,或者如果您在設(shè)置一個(gè)全局變量時(shí)未指定GLOBAL(或@@),則MySQL會(huì)產(chǎn)生一個(gè)錯(cuò)誤。( SET GLOBAL命令修改SESSION參數(shù)的時(shí)候會(huì)報(bào)錯(cuò))
4)如果您想要把一個(gè)SESSION變量設(shè)置為GLOBAL值或把一個(gè)GLOBAL值設(shè)置為內(nèi)部MySQL默認(rèn)值,需使用DEFAULT關(guān)鍵詞。例如,在把max_join_size會(huì)話值設(shè)置為全局值時(shí),以下兩個(gè)語句是一樣的:SET max_join_size=DEFAULT;(恢復(fù)成默認(rèn)值的設(shè)置)
總結(jié):1、mysql的參數(shù)設(shè)置相對(duì)oracle來說較為簡單。
2、針對(duì)參數(shù)設(shè)置的方法本身沒有太多經(jīng)驗(yàn),作為一個(gè)DBA不管是修改oracle參數(shù)、或mysql參數(shù),建議每個(gè)數(shù)據(jù)庫都有一個(gè)文檔用于記錄參數(shù)修改的歷史,這樣哪臺(tái)出現(xiàn)了問題,便于跟蹤;
posted on 2014-09-03 11:54 順其自然EVO 閱讀(307) 評(píng)論(0) 編輯 收藏