1. 程式人生 > 資料庫 >MySQL(八)優化之引數調整配置詳解(理解後根據業務場景調整引數)

MySQL(八)優化之引數調整配置詳解(理解後根據業務場景調整引數)

MySQL優化之引數調整配置詳解(理解後根據業務場景調整引數)

max_connections:

Mysql的最大連線數,如果伺服器的併發請求量比較大,可以調高這個值,當然這是要建立在機器能夠支撐的情況下,因為如果連線數越來越多,mysql會為每個連線提供緩衝區,就會開銷的越多的記憶體,所以需要適當的調整該值,不能隨便去提高設值。

檢視MySQL最大連線數:

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+

檢視當前連線數:

mysql> show status like 'Max_used_connections';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 102   |
+----------------------+-------+

修改最大連線數:

#臨時修改為最大連線數為1024個
mysql> set global max_connections=1024;

#永久修改為最大連線數為1024個
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
max_connections=1024

如果max_used_connections跟max_connections相同,那麼就是max_connections設定過低或者超過伺服器的負載上限了,低於10%則設定過大.

back_log:

mysql能暫存的連線數量,當主要mysql執行緒在一個很短時間內得到非常多的連線請求時候它就會起作用,如果mysql的連線資料達到max_connections時候,新來的請求將會被存在堆疊中,等待某一連線釋放資源,該推棧的數量及back_log,如果等待連線的數量超過back_log,將不被授予連線資源。

back_log值指出在mysql暫時停止回答新請求之前的短時間內有多少個請求可以被存在推棧中,只有如果期望在一個短時間內有很多連線的時候需要增加它

檢視最大堆疊連線數:

mysql> show variables like 'back_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log      | 80    |
+---------------+-------+

檢視MySQL當前連線程序:(設定back_log值的判斷依據)

mysql> show full processlist;
| Id  | User | Host      | db   | Command | Time | State        | Info                                               |
+-----+------+-----------+------+---------+------+--------------+----------------------------------------------------+
|   5 | root | localhost | olda | Query   |    0 | starting     | show full processlist                              |
| 208 | root | localhost | NULL | Sleep   | 1838 |              | NULL                                               |
| 209 | root | localhost | olda | Query   |    6 | Sending data | select * from olda.student where name='olda_74256' |
| 210 | root | localhost | olda | Query   |    6 | Sending data | select * from olda.student where name='olda_74256' |
| 211 | root | localhost | olda | Query   |    0 | Sending data | select * from olda.student where name='olda_74256' |
| 212 | root | localhost | olda | Query   |    0 | Sending data | select * from olda.student where name='olda_74256' |
...............
...............
...............(省略記錄其他多個程序)

發現大量的待連線程序時,就需要加大back_log或者加大max_connections的值

修改最大堆疊連線數:

#永久修改最大堆疊連線數(不能臨時修改堆疊數)
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
back_log=1024

wait_timeout和interactive_timeout:

interactive_timeout:

指的是mysql在關閉一個互動的連線之前所需要等待的秒數,比如我們在終端上進行mysql管理,使用的即使互動的連線,這時候,如果沒有操作的時間超過了interactive_time設定的時間就會自動的斷開,預設的是28800,可調優為7200。`

wait_timeout:

指的是mysql在關閉一個非互動的連線之前所要等待的秒數

如果設定太小,那麼連線關閉的就很快,從而使一些持久的連線不起作用

設定建議:

如果設定太大,容易造成連線開啟時間過長,在show processlist時候,能看到很多的連線 ,一般希望wait_timeout儘可能低

修改埠連線方式舉例:

#這是測試修改引數,(生產中一定不要這麼幹,根據生產環境開發需要的長連線時間修改)
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
wait_timeout=7200
interactive_timeout=7200

長連線的應用,為了不去反覆的回收和分配資源,降低額外的開銷。

一般我們會將wait_timeout設定比較小,interactive_timeout要和應用開發人員溝通長連結的應用是否很多。如果他需要長連結,那麼這個值可以不需要調整。
另外還可以使用類外的引數彌補。

key_buffer_size:

key_buffer_size指定索引緩衝區的大小,它決定索引處理的速度,尤其是索引讀的速度

  • 此引數與myisam表的索引有關
  • 臨時表的建立有關(多表連結、子查詢中、union)

在有以上查詢語句出現的時候,需要建立臨時表,用完之後會被丟棄

臨時表有兩種建立方式:

記憶體中------->key_buffer_size
磁碟上------->ibdata1(5.6)

存放ibtmp1 (5.7),已經更新為獨立表空間了

檢視key_buffer_size預設值:

#單位為 "位元組"
mysql> show variables like 'key_buffer_size';
+-----------------+---------+
| Variable_name   | Value   |
+-----------------+---------+
| key_buffer_size | 8388608 |
+-----------------+---------+

檢視Myisam索引請求情況:

#一共有 30 個索引讀取請求,有 5 個請求在記憶體中沒有找到直接從硬碟中讀取索引,(控制在 5% 以內)
mysql> show status like "key_read%";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Key_read_requests | 30    |    一共發生了多少次讀取索引
| Key_reads         | 5     |    從"磁碟"讀取索引次數
+-------------------+-------+

設定依據:

通過key_read_requests和key_reads可以直到key_baffer_size設定是否合理。

注意:key_buffer_size只對myisam表起作用,即使不使用myisam表,但是內部的臨時磁碟表是myisam表,也要使用該值。

使用檢查狀態值created_tmp_disk_tables得知建立臨時表資訊:

mysql> show status like "created_tmp%";
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |    在"磁碟"種建立臨時表情況
| Created_tmp_files       | 6     |
| Created_tmp_tables      | 6     |    在"記憶體"中建立臨時表情況
+-------------------------+-------+

計算磁碟或記憶體建立臨時表比例:

Created_tmp_tables/(Created_tmp_disk_tables + Created_tmp_tables)      ==     記憶體臨時表的佔比

Created_tmp_disk_tables/(Created_tmp_disk_tables + Created_tmp_tables) ==     磁碟臨時表的佔比(10%以下)

修改key_buffer_size值:

#當前為測試值,具體配置大小根據生產環境壓力測試而定
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
key_buffer_size=16M

根據MySQL在 磁碟 上建立臨時表的百分比來設定索引快取區大小

query_cache_size:

查詢快取簡稱QC,使用查詢緩衝,mysql將查詢結果存放在緩衝區中,今後對於同樣的select語句(區分大小寫),將直接從緩衝區中讀取結果。

  • 查詢完結果之後,會對SQL語句進行hash運算,得出hash值,我們把他稱之為SQL_ID
  • 會將儲存引擎返回的結果+SQL_ID儲存到快取中。

使用方式:

1、一條SQL執行時,進行hash運算,得出SQLID,去找query cache
2、如果cache中有,則直接返回資料行,如果沒有,就走原有的SQL執行流程

一個SQL語句查詢如果以select開頭,那麼mysql伺服器將嘗試對其使用查詢快取。

注意:兩個SQL語句,只要想差哪怕是一個字元(列如大小寫不一樣;多一個空格等),那麼這兩個sql將使用不同的一個cache。

檢視預設配置:

mysql> show variables like '%query_cache%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| have_query_cache             | YES     |
| query_cache_limit            | 1048576 |     超過此大小的查詢將不快取:(單位:位元組)
| query_cache_min_res_unit     | 4096    |     快取塊的最小大小:(預設是4KB,設定值大對大資料查詢有好處)
| query_cache_size             | 1048576 |     預設快取大小 1M:(單位:位元組)
| query_cache_type             | OFF     |     快取型別
| query_cache_wlock_invalidate | OFF     |     預設是關閉SQL查詢快取的
+------------------------------+---------+

query_cache_type:
    如果設定為0,那麼可以說,你的快取根本就沒有用,相當於禁用了。
    如果設定為1,將會快取所有的結果,除非你的select語句使用SQL_NO_CACHE禁用了查詢快取。
    如果設定為2,則只快取在select語句中通過SQL_CACHE指定需要快取的查詢。

修改快取大小判斷依據:

mysql> show status like "%Qcache%";
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Qcache_free_blocks      | 1       |    快取中相鄰記憶體塊的個數:(如果該值顯示較大,則說明Query Cache 中的記憶體碎片較多了)
| Qcache_free_memory      | 1031832 |    空閒的快取空間大小 1MB:(單位:位元組)
| Qcache_hits             | 0       |    SQL查詢語句命中快取次數:(數字越大,快取效果越理想。)
| Qcache_inserts          | 0       |    表示多少次未命中然後插入資料到快取:(這樣的情況的次數越多,表示查詢快取應用到的比較少,效果也就不理想)
| Qcache_lowmem_prunes    | 0       |    多少條SQl查詢快取因為記憶體不足而被清除出QueryCache:(如果這個數字在不斷增長,就表示可能碎片非常嚴重,或者記憶體很少。)
| Qcache_not_cached       | 125157  |    不適合進行快取的查詢的數量,通常是由於這些查詢不是 SELECT 語句或者用了now()之類的函式。
| Qcache_queries_in_cache | 0       |    當前Query Cache 中cache 的Query 數量
| Qcache_total_blocks     | 1       |    當前Query Cache 中的block 數量
+-------------------------+---------+

修改快取大小及開啟快取:(根據生產環境需求開啟)

#引數僅代表當前測試環境,(根據生成環境配置大小)
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
query_cache_size=64M
query_cache_type=1
query_cache_limit=50M

注意:如果出現hits命中比例過低,其實就可以關閉查詢快取了。使用redis專門快取資料庫

max_connect_errors:

是一個mysql中與安全有關的計數器值,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼等情況,當超過指定次數,mysql伺服器將禁止host的連線請求,直到mysql伺服器重啟或通過flush hosts命令清空此host的相關資訊 max_connect_errors的值與效能並無太大關係。

檢視預設最大連線失敗數:

mysql> show variables like '%max_connect_errors%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 100   |
+--------------------+-------+

檢視當前錯誤連線次數:

mysql> show status like '%errors_max_conn%';
+-----------------------------------+-------+
| Variable_name                     | Value |
+-----------------------------------+-------+
| Connection_errors_max_connections | 0     |
+-----------------------------------+-------+

修改連線失敗最大數:

#引數僅代表當前測試環境,(根據生成環境配置大小)
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
max_connect_errors=2000

重新整理host連線錯誤記錄:

#清除所有連線錯誤的主機IP資訊
flush hosts;

sort_buffer_size:

每個需要進行排序的執行緒分配該大小的一個緩衝區。

ORDER BY
GROUP BY
distinct
union

檢視預設排序快取大小:

mysql> show variables like 'sort_buffer_size%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| sort_buffer_size | 262144 |     預設為256KB
+------------------+--------+

配置依據:

  • Sort_Buffer_Size並不是越大越好,由於是connection級的引數,過大的設定 + 高併發可能會耗盡系統記憶體資源。每個使用者連線後都會分配一個sort_buffer空間。
  • 列如:有500個連線將會消耗500 乘以 sort_buffer_size(2M)=1G記憶體

修改排序快取引數大小:

#一般不會設定特別大,否則對伺服器記憶體壓力過大
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
sort_buffer_size=1M

結合索引,減少排序

max_allowed_packet:

mysql根據配置檔案會限制,server接受的資料包大小。

檢視預設最大更新資料大小:

mysql> show variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 4194304 |       預設最大更新資料大小為 "4M"
+--------------------+---------+

配置依據:

  • 有時候大量的插入和更新會受max_allowed_packet引數限制,導致寫入或者更新失敗,建議設定引數的最大值是1GB,注意:必須設定1024的倍數

修改大事務限制引數:

#根據生產業務需求修改
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
max_allowed_packet=32M

join_buffer_size:

用於表間關聯快取的大小,和sort_buffer_size一樣,該引數對應的分配記憶體也是每個連線獨享

select a.name,b.name from a join b on a.id=b.id where xxxx

儘量在SQL與方面進行優化,效果較為明顯。

優化的方法:在on條件列加索引,至少應當是有MUL索引

檢視join獨享快取大小:

mysql> show variables like 'join_buffer_size';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| join_buffer_size | 262144 |    預設大小256KB
+------------------+--------+

修改join獨立快取大小:

#不代表生產引數,和key_buffer_size配合使用
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
join_buffer_size=2M

thread_cache_size:

伺服器執行緒快取,這個值表示可以重新利用儲存在快取中執行緒的數量,當斷開連線時,那麼客戶端的執行緒將被放到快取中以響應下一個客戶而不是銷燬(前提是快取數未達上限),如果執行緒重新被請求,那麼請求將從快取中讀取,如果快取中是空的或者是新的請求,那麼這個執行緒將被重新建立,如果有很多新的執行緒,增加這個值可以改善系統性能。

配置依據:

官方建議設定規則:1GB 記憶體配置為8個快取,2GB配置為16個快取,3GB配置為32個快取,4GB或更高記憶體,可配置更大。

  • 通過比較 Connections 和 Threads_created 狀態的變數,可以看到這個變數的作用。
  • 伺服器處理此客戶的執行緒將會快取起來以響應下一個客戶而不是銷燬(前提是快取數未達上限)

檢視試圖連線MySQL(不管成功或失敗)的連線數:

mysql> show status like 'threads_%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 102   |
| Threads_created   | 102   |
| Threads_running   | 81    |
+-------------------+-------+

引數解釋:

Threads_cached    : 代表當前此時此刻執行緒快取中有多少空閒執行緒。
Threads_connected : 代表當前已建立連線的數量,因為一個連線就需要一個執行緒,所以也可以看成當前被使用的執行緒數。
Threads_created   : 代表從最近一次服務啟動,已建立執行緒的數量,如果發現Threads_created值過大的話,表明MySQL伺服器一直在建立執行緒,這也是比較耗資源,可以適當增加配置檔案中thread_cache_size值。
Threads_running   : 代表當前啟用的(非睡眠狀態)執行緒數。並不是代表正在使用的執行緒數,有時候連線已建立,但是連線處於sleep狀態。

檢視預設執行緒快取數:

mysql> show variables like 'thread_cache_size';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| thread_cache_size | 18    |
+-------------------+-------+

修改執行緒快取數:

#根據使用者量級及伺服器效能調配
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
thread_cache_size=200

Threads_created :一般在架構設計階段,會設定一個測試值,做壓力測試

如果一直陡峭的增長,或者出現大量峰值,那麼繼續增加此值的大小,在系統資源夠用的情況下(記憶體)

如果在一段時間內,Threads_created趨於平穩,說明對應引數設定是OK。

innodb_buffer_pool_size:

對於InnoDB表來說,innodb_buffer_pool_size的作用就相當於key_buffer_size對於MyISAM表的作用一樣。

配置依據:

InnoDB使用該引數指定大小記憶體來緩衝資料和索引。
對於單獨的MySQL資料庫伺服器,最大可以把該值設定成實體記憶體的80%,一般我們建議不要超過實體記憶體的70%

檢視預設innodb快取空間大小:

mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |     128MB :預設單位:位元組
+-------------------------+-----------+

修改innodb快取空間大小:

#根據伺服器記憶體效能調配,類似於索引資料及資料等快取最大伐值
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
innodb_buffer_pool_size=4096M

檢視詳細innodb快取資訊:
show engine innodb status\G

innodb_flush_log_at_trx_commit:

主要控制了innodb將log buffer中的資料寫入redo日誌檔案並flush磁碟的時間點,取值分別為0、1、2三個。

  • 0,表示當事務提交時,不做日誌寫入操作,而是每秒鐘將log buffer中的資料寫入日誌檔案並flush磁碟一次;
  • 1,則在每秒鐘或是每次事物的提交都會引起日誌檔案寫入、flush磁碟的操作,確保了事務的ACID;
  • 2,每次事務提交引起寫入日誌檔案的動作,但每秒鐘完成一次flush磁碟操作。

檢視預設重新整理策略:

mysql> show variables like 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+

修改重新整理redo日誌策略:

[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
innodb_flush_log_at_trx_commit=1

innodb_thread_concurrency:

此引數用來設定innodb執行緒的併發數量,預設值為0表示不限制。

檢視預設innodb執行緒併發數量:

mysql> show variables like 'innodb_thread_concurrency';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_thread_concurrency | 0     |
+---------------------------+-------+

配置依據:

根據伺服器CPU核心數量配置,還有當前系統所有CPU核心使用情況,均不均勻

修改innodb執行緒併發數:

#當前配置為測試環境,根據生產環境伺服器CPU核心數量修改
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
innodb_thread_concurrency=4

innodb_log_buffer_size:

此引數確定redo日誌檔案所用的記憶體快取區大小,以M為單位。redo日誌記憶體快取區更大能提高效能,對於較大的事務,可以增大快取大小。

設定依據:

  • 1、大事務: 儲存過程呼叫 CALL
  • 2、多事務

檢視預設redo日誌快取大小:

mysql> show variables like 'innodb_log_buffer_size';
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |    預設16MB:預設單位:位元組
+------------------------+----------+

修改redo日誌快取大小:

#當前配置為測試環境,根據生產環境業務的事務大小配置
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
innodb_log_buffer_size=32M

innodb_log_file_size:

設定 ib_logfile0ib_logfile1檔案

此引數確定資料日誌檔案的大小,以M為單位,更大的設定可以提高效能.

檢視預設redo磁碟日誌大小:

mysql> show variables like 'innodb_log_file_size';
+----------------------+----------+
| Variable_name        | Value    |
+----------------------+----------+
| innodb_log_file_size | 50331648 |   預設48MB:預設單位:位元組
+----------------------+----------+

修改redo磁碟日誌檔案大小:

#生產中一般最高也就設定256MB
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
innodb_log_file_size=100M

innodb_log_files_in_group:

redo磁碟日誌寫到多個檔案。推薦設定為3,也就是有ib_logfile2檔案

注意:都是與innodb_log_file_size引數配置一起使用

檢視預設檔案數:

mysql> show variables like 'innodb_log_files_in_group';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_files_in_group | 2     |
+---------------------------+-------+

修改redo磁碟日誌檔案數:

[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
innodb_log_files_in_group=3

read_buffer_size:

MySql讀入緩衝區大小。對錶進行順序掃描的請求將分配一個讀入緩衝區,MySql會為它分配一段記憶體緩衝區。如果對錶的順序掃描請求非常頻繁,並且你認為頻繁掃描進行得太慢,可以通過增加該變數值以及記憶體緩衝區大小提高其效能。和 sort_buffer_size一樣,該引數對應的分配記憶體也是每個連線獨享

檢視預設讀入緩衝區大小:

mysql> show variables like 'read_buffer_size';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| read_buffer_size | 131072 |   預設128KB,預設單位:位元組
+------------------+--------+

修改讀入緩衝區大小:

#當前為測試環境測試引數
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
read_buffer_size=2M

注意:一般生產環境設定為“1MB”就可以,併發高就設定“2MB”,最高不要超過“4MB”

read_rnd_buffer_size:

MySql的隨機讀(查詢操作)緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀快取區。進行排序查詢時,MySql會首先掃描一遍該緩衝,以避免磁碟搜尋,提高查詢速度,如果需要排序大量資料,可適當調高該值。但MySql會為每個客戶連線發放該緩衝空間,所以應儘量適當設定該值,以避免記憶體開銷過大。

檢視隨機查詢緩衝區大小:

mysql> show variables like 'read_rnd_buffer_size';
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| read_rnd_buffer_size | 262144 |   預設256KB,預設單位:位元組
+----------------------+--------+

修改隨機查詢緩衝區大小:

[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
read_rnd_buffer_size=2M

注意:順序讀是指根據索引的葉節點資料就能順序地讀取所需要的行資料。隨機讀是指一般需要根據輔助索引葉節點中的主鍵尋找實際行資料,而輔助索引和主鍵所在的資料段不同,因此訪問方式是隨機的。

順序IO:索引掃描,順序IO

bulk_insert_buffer_size:

批量插入資料快取大小,可以有效提高插入效率。

檢視插入資料快取大小:

mysql> show variables like 'bulk_insert_buffer_size';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| bulk_insert_buffer_size | 8388608 |   預設8MB,預設單位:位元組
+-------------------------+---------+

修改插入資料快取大小:

#根據生產業務插入資料的需求進行修改快取大小
[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
bulk_insert_buffer_size=8M

binlog_cache_size:

為每個session 分配的記憶體,在事務過程中用來儲存二進位制日誌的快取, 提高記錄bin-log的效率。沒有什麼大事務,dml語句也不是很頻繁的情況下可以設定小一點,如果事務大而且多,dml操作也頻繁,則可以適當的調大一點。前者建議是–1M,後者建議是:即 2-4M 。

檢視預設binlog記憶體快取大小:

mysql> mysql> show variables like 'binlog_cache_size';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |    預設32KB,預設單位:位元組
+-------------------+-------+

修改binlog記憶體快取大小:

[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
binlog_cache_size=2M

max_binlog_cache_size:

表示的是binlog 能夠使用的最大cache 記憶體大小。

檢視預設binlog最大記憶體快取空間大小:

mysql> show variables like 'max_binlog_cache_size';
+-----------------------+----------------------+
| Variable_name         | Value                |
+-----------------------+----------------------+
| max_binlog_cache_size | 18446744073709547520 |    預設16383PB,預設單位:位元組
+-----------------------+----------------------+

修改binlog最大使用記憶體空間大小:

[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
max_binlog_cache_size=8M

max_binlog_size:

指定binlog日誌檔案的大小,如果當前的日誌大小達到max_binlog_size,還會自動建立新的二進位制日誌。你不能將該變數設定為大於1GB或小於4096位元組。預設值是1GB。在匯入大容量的sql檔案時,建議關閉sql_log_bin,否則硬碟扛不住,而且建議定期做刪除。

檢視每個最大binlog日誌檔案大小:

mysql> show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| max_binlog_size | 1073741824 |    預設1GB,預設單位:位元組
+-----------------+------------+

修改每個最大binlog日誌檔案大小:

[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
max_binlog_size=512M

expire_logs_days:

定義了mysql清除過期日誌的時間。二進位制日誌自動刪除的天數。預設值為0,表示“沒有自動刪除”。

檢視預設刪除binlog時間:

mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 0     |   預設不自動刪除binlog日誌檔案
+------------------+-------+

修改binlog日誌刪除時間:

[root@mysql ~]# vim /usr/local/mysql/conf/my.cnf
expire_logs_days=7

MySQL安全引數:

雙1標準(基於安全的控制):
binlog重新整理引數預設是0,意味著mysql並不重新整理,由作業系統自己決定什麼時候重新整理快取到持久化設定

sync_binlog=1                       什麼時候刷寫binlog日誌到磁碟,每次事務commit
innodb_flush_log_at_trx_commit=1    什麼時間刷寫redo日誌到磁碟當,每次事務commit或每秒鐘
innodb_flush_log_at_timeout=1       引數決定最多丟失多少秒的資料,預設是1秒

儲存引擎安全:

Innodb_flush_method=(O_DIRECT, fdatasync)

fdatasync:

(1)在資料頁需要持久化時,首先將資料寫入OS buffer中,然後由os決定什麼時候寫入磁碟
(2)在redo buffuer需要持久化時,首先將資料寫入OS buffer中,然後由os決定什麼時候寫入磁碟
    但,如果innodb_flush_log_at_trx_commit=1的話,日誌還是直接每次commit直接寫入磁碟

Innodb_flush_method=O_DIRECT

(1)在資料頁需要持久化時,直接寫入磁碟
(2)在redo buffuer需要持久化時,首先將資料寫入OS buffer中,然後由os決定什麼時候寫入磁碟
    但,如果innodb_flush_log_at_trx_commit=1的話,日誌還是直接每次commit直接寫入磁碟

最安全模式:

innodb_flush_log_at_trx_commit=1
innodb_flush_method=O_DIRECT

最高效能模式:

innodb_flush_log_at_trx_commit=0
innodb_flush_method=fdatasync