深入理解mysql引數

dbasdk發表於2014-09-02

       前言: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.log
vi  /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引數,建議每個資料庫都有一個文件用於記錄引數修改的歷史,這樣哪臺出現了問題,便於跟蹤;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

本文作者:JOHN

ORACLE技術部落格:ORACLE 獵人筆記               資料庫技術群:367875324 (請備註ORACLE管理 )  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-1262012/,如需轉載,請註明出處,否則將追究法律責任。

相關文章