Mariadb/MySQL生產環境的my.cnf配置示例


       Mariadb/MySQL生產環境的my.cnf配置示例

                           作者:尹正傑 

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

一.針對MySQL主程序mysqld定義參數[mysqld] 

1>.skip-networking=1

  關閉網絡連接,只偵聽本地客戶端, 所有和服務器的交互都通過一個socket實現,socket的配置存放在"/var/lib/mysql/mysql.sock",可在/etc/my.cnf修改
[root@node102.yinzhengjie.org.cn ~]# ss -ntl
State       Recv-Q Send-Q                           Local Address:Port                                          Peer Address:Port              
LISTEN      0      50                                           *:3306                                                     *:*                  
LISTEN      0      128                                          *:22                                                       *:*                  
LISTEN      0      128                                         :::22                                                      :::*                  
[root@node102.yinzhengjie.org.cn ~]# 
[root@node102.yinzhengjie.org.cn ~]# grep -v ^# /etc/my.cnf  #關閉網絡,將"skip-networking"的Value設置為1即可。    
[mysqld]
skip-networking    #關閉網絡,此處我們只需要把該屬性寫在這里就表示啟用了,除非你顯示指定其值為0(表示不啟用),如果我們這樣寫默認是啟用了
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

!includedir /etc/my.cnf.d

[root@node102.yinzhengjie.org.cn ~]# 
[root@node102.yinzhengjie.org.cn ~]# systemctl restart mariadb      #重啟服務,發現MySQL服務在正常運行但是並未對外暴漏端口。
[root@node102.yinzhengjie.org.cn ~]# 
[root@node102.yinzhengjie.org.cn ~]# ps aux | grep mysql | grep -v grep  #MySQL服務處於正常運行狀態
root 8556 0.0 0.1 234060 4184 pts/0 S+ 07:50 0:00 mysql
mysql 10132 0.0 0.0 113308 1624 ? Ss 10:38 0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 10306 0.0 2.0 968688 81204 ? Sl 10:38 0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/li
b64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sockroot     10342 0.0 0.1 234060 4180 pts/1 S+ 10:38 0:00 mysql -uroot -px xxxxxxxxx
[root@node102.yinzhengjie.org.cn ~]#
[root@node102.yinzhengjie.org.cn ~]# ss -ntl
State       Recv-Q Send-Q                           Local Address:Port                                          Peer Address:Port              
LISTEN      0      128                                          *:22                                                       *:*                  
LISTEN      0      128                                         :::22                                                      :::*                  
[root@node102.yinzhengjie.org.cn ~]# 
[root@node102.yinzhengjie.org.cn ~]# mysql -uroot -pyinzhengjie               #本機基於socket文件依舊是可以正常訪問的喲~
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> status
--------------
mysql  Ver 15.1 Distrib 5.5.64-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:        2
Current database:    
Current user:        root@localhost
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server:            MariaDB
Server version:        5.5.64-MariaDB MariaDB Server
Protocol version:    10
Connection:        Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/lib/mysql/mysql.sock
Uptime:            19 sec

Threads: 1  Questions: 4  Slow queries: 0  Opens: 0  Flush tables: 2  Open tables: 26  Queries per second avg: 0.210
--------------

MariaDB [(none)]> 
[root@node102.yinzhengjie.org.cn ~]# grep -v ^# /etc/my.cnf  #關閉網絡,將"skip-networking"的Value設置為1即可。(一般用於維護數據庫使用)

2>.datadir

  指定MySQL數據庫存放數據的目錄。

3>.socket

  指定socket文件路徑。

4>.symbolic-links

  是否支持軟連接,若不支持指定的路徑不能為軟連接。

5>.innodb_file_per_table

  該參數在mysql5.6.6及其后續版本默認開啟,開啟該參數的時候,Innodb將每個新創建的表的數據及索引存儲在一個獨立的.ibd文件里,而不是系統的表空間。當這些innodb表被刪除或清空的時候,存儲空間會被回收。

  開啟innodb_file_per_table(=ON):
    在ALTER TABLE操作重建表的情況下,會將innodb表從系統共享表空間移動到獨立的.ibd文件。

  不開啟innodb_file_per_table(=OFF):
    innodb會將所有表及索引的數據存儲在構成系統表空間的ibdata文件。這樣會降低文件系統操作的性能開銷,例如DROP TABLE 或 TRUNCATE TABLE。它最適合於將整合磁盤都用於存儲mysql數據的情況,因為系統表空間不會收縮,所有的數據庫都在一個空間實例里面。當innodb_file_per_table=OFF的時候,應避免在空間受限的系統表空間里導入大量臨時數據。

  innodb_file_per_table 可通過SET GLOBAL動態的修改為ON或OFF,也可以在my.cnf中做永久性修改,在my.cnf中修改后生效的話需要重啟mysqld服務。

6>.skip_name_resolve

  禁止主機名解析,建議使用。他會將IP地址解析成主機名而這個過程依賴於DNS服務,而你的網絡中沒有做名稱解析可能會導致網絡連接非常慢。

  博主推薦閱讀:
    https://www.cnblogs.com/ivictor/p/5311607.html

7>.character-set-server

  指定服務端的字符集,例如:character-set-server=utf8mb4

8>.innodb_file_per_table("innodb_file_per_table = 1" 打開獨立表空間)

Innodb存儲引擎可將所有數據存放於ibdata*的共享表空間,也可將每張表存放於獨立的.ibd文件的獨立表空間.

共享表空間: 
  某一個數據庫的所有的表數據,索引文件全部放在一個文件中,默認這個共享表空間的文件路徑在data目錄下。 默認的文件名為:ibdata1 初始化為10M。
  優點:
    可以將表空間分成多個文件存放到各個磁盤上(表空間文件大小不受表大小的限制,如一個表可以分布在不同的文件上)。數據和文件放在一起方便管理。
  缺點:
    所有的數據和索引存放到一個文件中,雖然可以把一個大文件分成多個小文件,但是多個表及索引在表空間中混合存儲,這樣對於一個表做了大量刪除操作后表空間中將會有大量的空隙,特別是對於統計分析,日值系統這類應用最不適合用共享表空間。

 

獨立表空間: 
  每一個表都將會生成以獨立的文件方式來進行存儲,每一個表都有一個.frm表描述文件,還有一個.ibd文件。 其中這個文件包括了單獨一個表的數據內容以及索引內容,默認情況下它的存儲位置也是在表的位置之中。

  優點:
    1>.每個表都有自已獨立的表空間。
    2>.每個表的數據和索引都會存在自已的表空間中。
    3>.可以實現單表在不同的數據庫中移動。
    4>.空間可以回收(除drop table操作處,表空不能自已回收)
        Drop table操作自動回收表空間,如果對於統計分析或是日值表,刪除大量數據后可以通過:alter table TableName engine=innodb;回縮不用的空間。
        對於使innodb-plugin的Innodb使用turncate table也會使空間收縮。
        對於使用獨立表空間的表,不管怎么刪除,表空間的碎片不會太嚴重的影響性能,而且還有機會處理。
  缺點:
    1>.單表增加過大,如超過100個G。
    2>.相比較之下,使用獨占表空間的效率以及性能會更高一點。

開啟獨立表空間,在配置文件(my.cnf)的[mysqld]中設置: innodb_file_per_table = 1(MariaDB 10.2.x版本默認是開啟的喲~

9>.skip-grant-tables

  忽略授權表,這意味着將所有用戶的授權操作給取消了。換句話說,關閉MySQL服務器的認證,從而可以重置root的密碼。

10>.userstat

  開啟查看索引使用工具。

11>.max_connections = 8000

  MySQL 服務所允許的同時會話數的上限,經常出現Too Many Connections的錯誤提示,則需要增大此值。

  這個值不是越大越好,而是需要根據你的服務器性能而定,若這個值設置過小可能會出現上面的報錯信息,但是設置過大就會導致服務器性能扛不住啦!

12>.back_log = 300

  back_log 是操作系統在監聽隊列中所能保持的連接數

13>.max_connect_errors = 1000

  每個客戶端連接最大的錯誤允許數量,當超過該次數,MYSQL服務器將禁止此主機的連接請求,直到MYSQL服務器重啟或通過flush hosts命令清空此主機的相關信息

14>.open_files_limit = 10240

  所有線程所打開表的數量。

15>.max_allowed_packet = 32M

  每個連接傳輸數據大小.最大1G,須是1024的倍數,一般設為最大的BLOB的值

16>.wait_timeout = 10

  指定一個請求的最大連接時間

17>.sort_buffer_size = 16M

  排序緩沖被用來處理類似ORDER BY以及GROUP BY隊列所引起的排序

18>.join_buffer_size = 16M

  不帶索引的全表掃描.使用的buffer的最小值

19>.query_cache_size = 128M

  查詢緩沖大小

20>.query_cache_limit = 4M

  指定單個查詢能夠使用的緩沖區大小,缺省為1M

21>.transaction_isolation = REPEATABLE-READ

  設定默認的事務隔離級別

22>.thread_stack = 512K

  線程使用的堆大小. 此值限制內存中能處理的存儲過程的遞歸深度和SQL語句復雜性,此容量的內存在每次連接時被預留.

23>.log-bin

  開啟二進制日志功能,若不指定路徑則默認和數據存放在同一目錄,生產環境強烈建議將MySQL日志和數據分開存放。

24>.binlog_format=row

  指定默認的二進制日志格式。
  二進制日志記錄三種格式:
    基於“語句”記錄:
      statement,只記錄語句,默認模式。該模式存在弊端,比如執行"UPDATE students SET birth = now();"無法保存具體的時間戳,若按照該語句進行還原數據准確性肯定出現問題。     基於“行”記錄:
      row,只記錄數據,即直接將數據存儲下來,但日志量較大。適合數據相對來說重要的場景。推薦使用這種模式,數據恢復時准確的最高,但帶來的代價就是得犧牲更多的磁盤空間。建議健康磁盤剩余空間進行及時擴充。     混合模式:
      mixed,相對來說比較折中的方式,讓系統自行判定該基於哪種方式進行。   查看格式配置:     SHOW VARIABLES LIKE 'binlog_format';

25>.innodb_buffer_pool_size = 24G

  InnoDB使用一個緩沖池來保存索引和原始數據, 可設置這個變量到服務器物理內存大小的80%

26>.innodb_file_io_threads = 4

  用來同步IO操作的IO線程的數量

27>.innodb_thread_concurrency = 16

  在InnoDb核心內的允許線程數量,建議的設置是CPU數量加上磁盤數量的兩倍

28>.innodb_log_buffer_size = 16M

  用來緩沖日志數據的緩沖區的大小

29>.innodb_log_file_size = 512M

  在日志組中每個日志文件的大小

30>.innodb_log_files_in_group = 3

  在日志組中的文件總數

31>.innodb_lock_wait_timeout = 120

  SQL語句在被回滾前,InnoDB事務等待InnoDB行鎖的時間

32>.long_query_time = 2

  慢查詢時長

33>.log-queries-not-using-indexes

  將沒有使用索引的查詢也記錄下來

34>.更多服務器參數信息

  由於Mysqld參數有很多,我這里就不能一一列舉啦,我后面博客中也整理了很多參數,但並沒有統一羅列再次,不過萬變不離其宗,更多服務器參數咱們都可以在官網查閱到。官方給出了最權威的說明。

  博主推薦閱讀:
    https://www.cnblogs.com/yinzhengjie/p/11758208.html
    https://dev.mysql.com/doc/refman/5.7/en/server-option-variable-reference.html
    https://mariadb.com/kb/en/library/full-list-of-mariadb-options-system-and-status-variables/

 

二.針對MySQL安全性的參數[mysqld_safe]

1>.pid-file

  指定進程的pid號存放路徑。
  案例:
    pid-file        = /mysql/3306/pid/mariadb.pid

2>.log-error

  存放錯誤日志文件。
  案例:
    log-error       = /mysql/3306/log/mariadb.log

 

三.針對MySQL客戶端參數[mysql]

1>.default-character-set

  指定客戶端默認字符集,例如:default-character-set=utf8mb4

2>.safe-updates

  當用戶使用UPDATE或者DELETE語句時需要加WHRER關鍵詞進行過濾,否則無法對表中的數據進行修改。

  如果用戶沒有加WHERE繼續過濾會有如下報錯信息:
    "ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column"

 

五.MYSQL配置最佳實踐

  高並發大數據的互聯網業務,架構設計思路是“解放數據庫CPU,將計算轉移到服務層”,並發量大的情況下,這些功能很可能將數據庫拖死,業務邏輯放到服務層具備更好的擴展性,能夠輕易實現“增機器就加性能”

  博主推薦閱讀:
    阿里巴巴Java開發手冊
    http://zhuanlan.51cto.com/art/201702/531364.htm(58到家數據庫30條軍規解讀)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM