一,配置文件的位置
[root@yjweb ~]# ll /etc/my.cnf -rw-r--r-- 1 root root 935 Mar 11 16:52 /etc/my.cnf
說明:通常我們都會使用/etc/my.cnf這個文件
說明:劉宏締的架構森林是一個專注架構的博客,地址:https://www.cnblogs.com/architectforest
對應的源碼可以訪問這里獲取: https://github.com/liuhongdi/
說明:作者:劉宏締 郵箱: 371125307@qq.com
二,my.cnf中的配置項:慢查詢日志
#把未使用到索引的sql記錄到慢查詢日志
log_queries_not_using_indexes = 1
#是否打開慢查詢sql日志
slow_query_log = 1
#慢查詢sql日志的文件地址
slow_query_log_file = /data/mysql/log/mysql-slow.log
#慢查詢執行的秒數,超過這個值則會被記錄到慢查詢日志
long_query_time = 1
三,my.cnf中的配置項:運行實例相關
#Mysql服務實例的唯一編號 每個mysql服務實例Id需唯一
server-id = 1
#服務端口號 默認3306
port = 3306
#socket文件的路徑
socket=/data/mysql/var/mysql.sock
#pid文件的路徑
pid-file=/data/mysql/var/mysqld.pid
四,my.cnf中的配置項:目錄
#mysql安裝根目錄
basedir=/usr/local/soft/mysql
#mysql數據文件所在目錄
datadir=/data/mysql/data
五,my.cnf中的配置項:字符集
#數據庫默認字符集,注意不要再用utf8了
character-set-server = utf8mb4
#數據庫字符集對應一些排序規則,要屬於character-set-server對應值的集合內
collation-server = utf8mb4_general_ci
#設置client連接mysql時的字符集,防止亂碼
init_connect='SET NAMES utf8mb4'
六,my.cnf中的配置項:二進制日志
#二進制日志文件
log-bin = /data/mysql/binlog/mysql-bin
#mysql binlog日志文件保存的過期時間,過期后自動刪除
#默認值是0,不限制,這樣會占用空間太多
expire_logs_days = 365
#限制單個文件大小,默認大小:1,073,741,824,即1G,太大了
max_binlog_size = 100M
七,my.cnf中的配置項:錯誤日志
#數據庫錯誤日志文件
log_error=/data/mysql/log/mysqld.log
八,my.cnf中的配置項:操作用戶
user=mysql
九,my.cnf中的配置項:超時
#MySQL連接閑置超過一定時間后(單位:秒)將會被強行關閉 MySQL默認的wait_timeout 值為8個小時,
interactive_timeout參數需要同時配置才能生效
interactive_timeout = 1800 wait_timeout = 1800
十,my.cnf中的配置項:禁用域名的解析
skip_name_resolve = 1
說明:dns慢的情況下會影響性能
十一,my.cnf中的配置項:innodb是否為每個表使用獨立的表空間文件
innodb_file_per_table = 1
說明:這個參數在5.6以后已經默認開啟了
開啟該參數的時候,Innodb將每個新創建的表的數據及索引存儲在一個獨立的.ibd文件里,
而不是系統的表空間。
十二,my.cnf中的配置項:innodb緩沖池的大小設置
1,innodb_buffer_pool_size的默認大小是:128M
innodb_buffer_pool_chunk_size 定義了buffer中每個chunk的大小,
innodb_buffer_pool_instances 定義了buffer中chunk的數量
2,緩沖池大小必須始終等於或者是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances
的倍數
否則mysql會自動調整為相應的倍數
3,計算緩沖池大小的公式:
Performance = innodb_buffer_pool_reads / innodb_buffer_pool_read_requests * 100
這個結果是指從磁盤上讀取數據的百分比
說明: innodb_buffer_pool_reads 是InnoDB 進行邏輯讀取時無法從緩沖池中獲取而執行單頁讀取的次數
innodb_buffer_pool_read_requests 是 InnoDB 完成的邏輯讀請求數
4,查看兩個值:innodb_buffer_pool_reads/innodb_buffer_pool_read_requests 的大小的sql:
show status like 'innodb_buffer_pool_read%'
5,計算buffer pool的命中率:
InnoDB buffer pool 命中率 = innodb_buffer_pool_read_requests / (innodb_buffer_pool_read_requests + innodb_buffer_pool_reads ) * 100
如果低於99%,可以增加innodb_buffer_pool_size
6,innodb_buffer_pool_size這個值的大小不要超過物理內存的50%
十三, my.cnf中的配置項:連接限制之最大並發連接數
1,參數設置
max_connections = 1024
說明:根據自己的運行情況設置,
過小會影響連接的數量,報Too many connections錯誤,
過大會導致服務資源用完無響應
2,查看當前的max_connections設置值
mysql> SHOW VARIABLES LIKE '%max_connections%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | extra_max_connections | 1 | | max_connections | 1000 | +-----------------------+-------+ 2 rows in set (0.00 sec)
3,查看Max_used_connections狀態值
mysql> SHOW GLOBAL STATUS LIKE 'Max_used_connections'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | Max_used_connections | 243 | +----------------------+-------+ 1 row in set (0.00 sec)
說明:Max_used_connections 是從這次mysql服務啟動到現在,同一時刻並行連接數的最大值,可以參考這個值去配置max_connections,
通常可大於等於Max_used_connections的值
4,官方文檔地址:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_connections
可以看到最大值不能超過100000
十四,連接限制之每用戶最大並發連接數 max_user_connections
1,查看當前的設置值
mysql> SHOW VARIABLES LIKE '%max_user_connections%'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | max_user_connections | 1990 | +----------------------+-------+ 1 row in set (0.00 sec)
2,max_user_connections表示的是每個用戶的最大連接數,
注意此處的用戶是以“用戶名+主機名”為單位進行區分
3,如何設置:
如果有3個用戶,max_connections=1000 建議值: max_connections/3 * 2 約等於 700
十五,連接限制之最大錯誤連接數max_connect_errors
1,查看當前的設置值
mysql> SHOW VARIABLES LIKE '%max_connect_errors%'; +--------------------+---------+ | Variable_name | Value | +--------------------+---------+ | max_connect_errors | 1000000 | +--------------------+---------+ 1 row in set (0.00 sec)
2,說明:如果錯誤連接達到該變量設置值, MySQL會阻止連接,直到
使用 FLUSH HOSTS命令或者 mysqladmin flush-hosts,MySQL才會解除阻止操作
3,什么是錯誤連接?
MySQL有個參數connect_timeout,該變量默認是10秒,它是MySQL服務端進程mysqld等待連接建立完成的時間,單位為秒
MySQL客戶端與數據庫建立連接需要發起三次握手協議,正常情況下,這個時間非常短,
但是一旦網絡異常,網絡超時等因素出現,就會導致這個握手協議無法完成。
如果超過connect_timeout時間,仍然無法完成協議握手,MySQL客戶端會收到異常,
異常消息類似於: Lost connection to MySQL server at 'XXX', system error: errno.
4, 如何把被關閉連接的host釋放出來?
Mysql> FLUSH HOSTS;
5,設置:如果業務服務器和數據庫服務器之間網絡不穩定,經常出現連接超時之類的情況,則此值可以加大,
如果只是在局域網中,網絡情況良好,此值可以采用默認值100,或增加到1000
6,這個統計的錯誤數量記錄在哪里可查看?
mysql> use performance_schema; mysql> select * from host_cache;
SUM_CONNECT_ERRORS 這個字段記錄的就是連接錯誤的數量
7,官方文檔地址:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_connect_errors
十六,my.cnf中的配置項:最大允許的包 max_allowed_packet
max_allowed_packet = 16M
說明:這個默認值是64M,即67108864
但生產環境中很少會這么大的包,建議16M或更低一些
說明:導入數據時,如果sql文件大於這個值,會報過小的提示,
Packet for query is too large 或 Packet bigger than max_allowed_packet
可以臨時調整這個值,使用如下兩條sql
set global max_allowed_packet = 2*1024*10*10; show global variables like 'max_allowed_packet';
說明: 命令行修改時,max_allowed_packet的單位為字節,不能用M、G,
只能這算成字節數設置。
配置文件修改才允許設置M、G單位
十七,my.cnf中的配置項:數據安全:innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit = 1
1,innodb_flush_log_at_trx_commit的三個取值:
0, 每秒寫一次log,並flush到磁盤
1, 每次事務提交時,寫log,同時flush到磁盤
2, 每次事務提交時寫log,每秒flush一次到磁盤
2,說明:
1最安全,速度最慢
0,2速度較快,但有一定丟失數據的風險
mysql給出的默認值也是1
十八,my.cnf中的配置項:客戶端
[client]
#服務端口號 默認3306
port = 3306
#socket連接文件
socket = /data/mysql/var/mysql.sock
十九,說明
1,general log 這個配置項是查詢日志,默認值是off,
這個不建議在生產環境中打開
2,慢查詢在生產環境中打開時,
應當注意檢查其內容,
對查詢過慢的sql處理
二十,查看當前的mysql版本
[root@yjweb mysql]# /usr/local/soft/mysql/bin/mysqld -V /usr/local/soft/mysql/bin/mysqld Ver 8.0.19 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)