深入理解mysql參數
前言:mysql參數的修改在mysql的課程里面應該屬于相對基礎的知識,但是作為一個mysql的初學者還是很有必要弄懂這個知識點,以后的學習過程中將會經常用到的。技術很多時候都是相通的,如果有學過oracle的朋友應該會知道,oracle的參數里面有幾個標簽:動態參數、靜態參數、session級別修改、全局修改、立即生效和延遲生效。作為數據庫mysql也同樣有這些特性,但是整體學起來后會發現mysql某些方面還是沒有oracle做的到位,在該文檔的最后咱們再做個總結。
一、參數文件
1、查看參數文件
通過命令行"mysql --help | grep my.cnf"查看my.cnf文件的位置,linux操作系統中參數文件默認為/etc/my.cnf,按照mysql官方文檔的說明,mysql的啟動參數文件的順序如下:
1、查找根據順序查找全局 /etc/my.cnf /etc/mysql/my.cnf /SYSCONFDIR/my.cnf為全局選項
2、$MYSQL_HOME/my.cnf為服務指定變量
二、參數文件的修改
1、動態參數和靜態參數的概念
Mysql 的參數類型:分為動態(dynamic)和靜態參數(static);
動態參數意味著可以再mysql實例運行中進行更改;
靜態參數說明在整個實例聲明周期內都不得進行更改,就好像是只讀的。
在動態參數中,有些參數修改可以是基于回話的也可以是基于整個實例的生命周期。
2、全局變量與會話變量
全局變量在MYSQL啟動的時候由服務器自動將它們初始化為默認值。會話變量在每次建立一個新的連接的時候,由MYSQL來初始化。MYSQL會將當前所有全局變量的值復制一份。來做為會話變量。(也就是說,如果在建立會話以后,沒有手動更改過會話變量與全局變量的值,那所有這些變量的值都是一樣的。全局變量與會話變量的區別就在于,對全局變量的修改會影響到整個服務器,但是對會話變量的修改,只會影響到當前的會話(也就是當前的數據庫連接)
3、參數的查看方式
Mysql的參數可以通過"show variables"來查看,由于從mysql5.1版本開始,可以通過information_schema架構下的GLOBAL_VARIABLES視圖來進行查找,所以也可以這樣查看"select * from information_schema.global_variables";
查看參數的腳本:
語句一、
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、參數的修改,參數的修改有以下幾種方法,作為學習、便于理解其中的原理所在,這里把幾種方法都整理出來了,歡迎各位的查看
方法一、修改參數文件。所有的參數都保存在/etc/my.cnf文件中,所以直接修改該參數文件便可修改相應的系統參數。
弊端:修改該參數需要重啟后才能生效,當系統上線后一般都不能隨便重啟,所以該方法很少用;
操作方法:
1、修改參數文件/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服務
service mysqld stop
3、檢查參數是否生效
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)
當前顯示已生效
方法二、如果是動態參數的話,便可以直接通過語句修改。
(http://dev.mysql.com/doc/refman/5.6/en/dynamic-system-variables.html mysql的所有參數詳情介紹
sql語法:
SET variable_assignment [, variable_assignment] ... //可以同時修改多個參數
variable_assignment:
user_var_name = expr
| [GLOBAL | SESSION] system_var_name = expr
| @@[global. | session.]system_var_name = expr
例子:
SET sort_buffer_size=10000; /修改SESSION參數
SET @@local.sort_buffer_size=10000; /修改全局參數
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000; /同時修改多個SESSION參數
SET @@sort_buffer_size=1000000; /第二種修改全局參數的方法
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;
說明如下:
1)修改SESSION的參數的影響:如果您使用SESSION(默認情況)設置一個系統變量,則該值仍然有效,直到當前會話結束為止,或者直到您把變量設置為一個不同的值為止。
2)如果您使用GLOBAL(要求SUPER權限)來設置一個系統變量,則該值被記住,并被用于新的連接,直到服務器重新啟動為止。
如果您想要進行永久式變量設置,需要寫入到參數文件。(通過SET命令并不會修改參數文件的內容,還需要另行修改,這點做的沒有ORACLE好)
3)為了防止不正確的使用,如果您使用SET GLOBAL時同時使用了一個只能與SET SESSION同時使用的變量,或者如果您在設置一個全局變量時未指定GLOBAL(或@@),則MySQL會產生一個錯誤。( SET GLOBAL命令修改SESSION參數的時候會報錯)
4)如果您想要把一個SESSION變量設置為GLOBAL值或把一個GLOBAL值設置為內部MySQL默認值,需使用DEFAULT關鍵詞。例如,在把max_join_size會話值設置為全局值時,以下兩個語句是一樣的:SET max_join_size=DEFAULT;(恢復成默認值的設置)
總結:1、mysql的參數設置相對oracle來說較為簡單。
2、針對參數設置的方法本身沒有太多經驗,作為一個DBA不管是修改oracle參數、或mysql參數,建議每個數據庫都有一個文檔用于記錄參數修改的歷史,這樣哪臺出現了問題,便于跟蹤;