MySQL做爲一種常見的數據庫管理系統(DBMS),其自身的各類配置項極大的影響了其性能。因此有必要進行了解和學習。html
我最近在看《高性能Mysql》,其中第8章講解了關於配置的不少事項,都值得了解和學習。固然,官網也是最新信息查閱的重要渠道。mysql
官網【可在5.1 TheMySQL Server找到配置解釋。可在5.4找到BinLog相關內容。 】
通常來講,MySQL服務端配置文件的默認位置是:/etc/my.cnf
或者 /etc/mysql/my.cnf
【也能夠經過mysqld --verbose --help|grep -A 1 'Default option'
確認配置文件的位置】nginx
和nginx相似,也能夠選擇分目錄進行include,便於管理總體配置結構。 (好比!includedir /etc/my.cnf.d
而後在my.conf.d
目錄裏對不一樣的配置項分文件。
一、mysql配置文件是分段的,要注意配置項放在了正確的段裏(好比服務器主要用 [mysqld] 這一段git
一、反作用: 一些配置項會產生反作用,臨時修改配置須要很是當心。(好比變動query\_cache\_size
會 當即刪除全部查詢的緩存,從新構建。
二、變量的值:變量不是越大越好,可能會致使內存交換或者超出地址空間。須要跟進狀況設定。
二、配置項有不一樣的做用域,有的是全局,有的是會話。其次,還有動態變量,可在運行時修改。【也就是說,大部分非動態變量須要重啓才能生效】
三、全局變量:修改後對當前會話及已存在的會話均不生效。可經過SHOW GLOBAL VARIABLES
確認。
四、變量的單位:配置時要注意單位,命令行或者配置文件,可使用後綴指定單位(好比1M等,但要注意,使用SQL的SET指令時就不能使用單位。
五、配置文件管理:最好使用git來進行版本管理,加上充足的註釋。能夠避免很多問題。sql
一、一個好的配置,不是從學習配置項開始,也不是詢問怎麼設置或者怎麼修改,更不是觀察服務器行爲和詢問哪一個配置能夠提高性能。
【應該是從理解MySQL內核和行爲開始】
二、保證基礎配置都正確(好比日誌路徑,緩存配置,端口號,數據庫存儲位置等。如非必要,儘可能使用默認配置。(默認配置經受過的測試是最多的。
三、優先進行語句優化等其餘優化,最後考慮修改配置項。shell
通常來講,選擇儘可能少的配置(或者說最小配置),如無必要,不用聲明(不聲明使用默認值)。數據庫
固然一些很是重要的配置項,即便使用默認配置,也最好聲明出來。(好比default_storage_engine)
[mysqld] #GENERAL datadir = /var/lib/mysql socket = /var/lib/mysql/mysql.sock pid-file = /var/lib/mysql/mysqld.pid user = mysql port = 3306 default_storage_engine = InnoDB #InnoDB innodb_buffer_pool_size = 256M #核心配置,須要根據實際狀況調整 innodb_log_file_size = 50M #須要根據實際狀況調整 innodb_file_per_table = 1 #須要根據實際狀況調整 innodb_flush_method = O_DIRECT #這裏是字母O,不是數字0 #LOGGING log-error = /var/log/mysql-error.log slow_query_log = /var/log/mysql-slow.log #OTHER tmp_table_size = 32M #須要根據實際狀況調整 max_heap_table_size = 32M #須要根據實際狀況調整 #query_cache_type = 0 #mysql 8.0有變更,參數名不是這個 #query_cache_size = 0 #mysql 8.0有變更,參數名不是這個 max_connections = 100 #須要根據實際狀況調整 thread_cache_size = 50 #根據其他參數調整線程緩存 table_open_cache = 10 #根據 opened_tables 調整 open_files_limit = 65535 #儘可能調大,配合內核參數 [client] socket = /var/lib/mysql/mysql.sock port = 3306
配置文件解釋:
一、Innodb的配置項:緩存
innodb_buffer_pool_size 【最核心配置,innodb嚴重依賴緩衝池。服務器
索引、行數據緩存、哈希索引,插入緩存、鎖等。 必須爲innodb配置 足夠的緩衝池。 通常爲內存的75%-80%,建議配置的稍低,根據狀況增長比例。[ 《高性能MySQL》P343
Innodb任意時刻能夠保持打開.idb
文件的數量是有限的,由以下兩個參數控制:
innodb_file_per_table
:When innodb_file_per_table is enabled, tables are created in file-per-table tablespaces by default.
innodb_open_files
:It specifies the maximum number of .ibd files that MySQL can keep open at one time.多線程
也可參考官網: https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html
二、MySQL配置項:
線程緩存(thread_cache_size
):
[參數]thread_cache_size
:能夠保持在緩存中的線程數。
當關閉一個鏈接時,會將這個鏈接的線程放入緩存(若是緩存有空間)。下次能夠直接讀緩存,而非從新創建鏈接。
[狀態]thread_cached
:當前已經緩存了的線程數。
[狀態]threads_created
:每秒建立的新線程數,(若是每秒要建立不少線程,那須要考慮增長緩存大小
[狀態]threads_connectd
:當前正在鏈接中的線程數。
線程緩存的配置和上述3個狀態高度相關。根據實際狀況判斷緩存應該配置多少。
PS:靈活利用SHOW STATUS
和SHOW VARIABLES
查看配置的值,查看當前狀態。
table_open_cache
:若是[狀態]opened_tables
很大,或者一直在增加。考慮增長這個參數。table_definition_cache
:一般均可以配置的比較高,最好能夠緩存下全部表的定義。【除非有上萬張表】瞭解了基礎配置,修改了配置文件。還須要關注配置的生效問題。
有的動態配置修改以後就立刻生效。有的全局配置須要重啓才能生效。systemctl restart mysqld
重啓後,還須要獲取變量值進行確認,是否配置變量符合預期。
一、SHOW GLOBAL STATUS
及 SHOW STATUS
查看數據庫當前的狀態參數。(確認當前運行狀況)
二、SHOW VARIABLES
查看數據庫的配置參數。(也可直接進行過濾搜索,確認默認配置值)
【PS:1和2均可經過WHERE等語句進行篩選過濾。好比:show variables where variable_name like 'inno%pool%size%';
【或者說SHOW語句本質也是在查數據庫。只不過是描述數據庫自己的數據
三、[shell]mysqladmin extended-status -ri60
每60秒查看狀態變量的增值
具體可參考:https://blog.csdn.net/demonson/article/details/80103204
四、STATUS
查看MySQL基礎信息,包括版本,字符集,socket,線程數等。
0、yum安裝mysql的步驟
首先是獲取rpm包,經過以下兩個鏈接都可。文件名相似這樣mysql57-community-release-el7-3.noarch.rpm
。
https://dev.mysql.com/downloads/repo/yum/
https://repo.mysql.com/
隨後rpm -ivh xxx.rpm
導入包,yum makecache
生成緩存。最後yum install -y mysql-community-{client,libs,common,server}.x86_64
便可完成安裝。(通常來講,這4個組件就足夠了。)
一、yum安裝mysql後,初次登陸和密碼問題
首先確認/etc/my.cnf
配置,確認err-log的配置。(通常默認是/var/log/mysqld.log
)而後查看錯誤日誌,便可發現臨時密碼。再使用sudo mysql -uroot -p'tmp_passwd'
便可登陸。
參考:https://www.cnblogs.com/array...
其次,臨時密碼不可用於長期登陸,必須修改後纔可進行更多操做。若是嘗試使用臨時密碼登錄後操做,會出現以下提示:You must reset your password using ALTER USER statement before executing this statement.
能夠根據mysql版本採起對應的語句進行密碼修改。
SET PASSWORD = PASSWORD('Newpasswd');
ALTER USER USER() IDENTIFIED BY 'Newpasswd';
參考:http://www.javashuo.com/article/p-khfpsuvt-nb.html
二、[小結]如何修改配置?修改以後什麼時候生效?如何確認修改後的值是否正確?
SHOW VARIABLES WHERE xxx
確認變量當前數值,確認修改變量是不是動態生效。修改MySQL配置文件並保存(通常是/etc/my.cnf
)SHOW VARIABLES
和SHOW STATUS
加上WHERE
等語句進行篩選(前者爲配置變量,後者爲當前的狀態),確認配置變量是否符合預期。(好比SHOW variables WHERE Variable_name = 'innodb_buffer_pool_size';
)參考:https://blog.csdn.net/demonson/article/details/80103204
三、MySQL內部的help
鏈接上MySQL命令行以後,能夠方便的使用help查找不肯定的命令。好比help create
查看能夠建立什麼,help create database
確認怎麼建立新庫的語法。
建立數據庫表的方法也不難:
CREATE TABLE test ( 列名 數據類型 限制, id INTEGER PRIMARY KEY, );
help相關參考:https://blog.csdn.net/woqutechteam/article/details/81115892
四、其餘小問題
SELECT database();
和STATUS;
來確認,本身當前在哪一個數據庫。SCHEMA
和DATBASE
在MySQL裏是同義詞。見https://stackoverflow.com/questions/1219711/mysql-create-schema-and-create-database-is-there-any-differenceinnodb_flush_method = O_DIRECT
這裏是字母O
不是數字0
本文主要講述了MySQL配置的基礎知識,包括配置文件的位置、配置項的分段([mysqld])、做用域、還有配置變量的查詢及當前狀態變量確認。
並且對少許配置變量進行了解釋。
更多配置項的解釋均可經過官網確認。https://dev.mysql.com/doc/refman/5.7/en/