MySQL服務配置文件 1、配置文件位置 MySQL服務端的進程mysqld在啟動時,會預設按照以下順序來讀取mysql的配置文件: /etc/my.cnf /etc/mysql/my.cnf 編譯安裝時通過編譯選項指定的位置 如果不想讓mysqld按照這個順序讀取配置文件,可以通過mysqld的 ...
MySQL服務配置文件
1、配置文件位置
MySQL服務端的進程mysqld在啟動時,會預設按照以下順序來讀取mysql的配置文件:
-
/etc/my.cnf
-
/etc/mysql/my.cnf
-
編譯安裝時通過編譯選項指定的位置
如果不想讓mysqld按照這個順序讀取配置文件,可以通過mysqld的 --defaults-file選項來指定一個自定義的配置文件路徑,這樣就會只讀取指定的配置文件。
2、配置文件組成
mysql的配置文件由若幹個塊組成,每個塊裡面包含相關的配置。
[mysqld]
這個塊包含MySQL伺服器mysqld的配置選項
[mysqld_safe]
這個塊用於mysqld_safe腳本的配置選項,mysqld_safe是一個用於安全啟動mysqld的腳本。
[client]
這個塊包含客戶端程式的配置選項,包括mysql命令行工具、mysqldump等
[mysql]
這個塊是針對mysql客戶端工具的配置
例如:
[mysqld]
key = value
說明:
-
參數和值之間可以有若幹個空格
-
一般值不需要加引號,如果值包含了一些特殊字元或者空格,就需要加引號(單雙都可以)
例如:
log_error = "/var/log/mysql/error.log"
3、服務端 基礎配置項
-
user:指定運行mysqld進程的用戶
-
port:指定mysqld進程的埠號
-
bind-address:指定埠綁定的ip地址,0.0.0.0表示所有地址
-
datadir:指定MySQL的數據目錄的位置。這個目錄用於存儲資料庫的實際數據文件,包括表、索引、日誌等
-
basedir:指定MySQL應用程式的安裝根目錄,也就是MySQL的二進位程式、支持文件(如配置文件、腳本等)和庫所在的目錄。用於告訴MySQL在哪裡查找它的二進位執行文件、庫文件和其他支持文件
-
tmpdir:指定MySQL用於存儲臨時文件的目錄,例如臨時表等文件
-
socket:同一臺機器上的客戶端和伺服器之間進行通信是通過socket(套接字)來進行的,這個選項是用於指定socket文件,客戶端預設會通過這個套接字文件進行通信
-
pid-file: 指定MySQL伺服器進程ID(PID)文件的位置。當MySQL伺服器啟動時,它會將自己的進程ID寫入到這個文件中
-
log_error:指定錯誤的具體日誌文件
-
character_set_server:指定mysql服務端使用的預設字元集,字元集決定了MySQL伺服器如何存儲字元串和解釋字元數據。不同的字元集支持不同的語言和符號集。一般設置為 utf8mb4
-
collation-server:指定MySQL伺服器的預設校對規則。校對規則決定了MySQL如何比較字元,一般設置為utf8mb4_general_ci,表示是一個不區分大小寫的校對規則
說明:
[mysqld]配置塊中指定的配置項都是mysqld進程的配置項,可以通過 mysqld --verbose --help
來查看相關配置項以及預設的值。
如果將這些參數在進程啟動的時候在一一指定,這樣管理起來就很麻煩。
例如:
mysqld --port=3306 --pid-file=/var/run/mysqld/mysqld.pid --datadir=/var/lib/mysql
將這些配置都放在配置文件中的[mysqld]配置塊中,方便對這些參數進行統一管理和簡化啟動命令。(在配置文件中,忽略選項的 -- 首碼,直接寫選項名稱)
例如:
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
bind-address = 0.0.0.0
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
log_error = /var/log/mysql/error.log
# 預設字元集為utf8mb4,這是一個支持Unicode的字元集,能夠存儲任何Unicode字元。
character_set_server=utf8mb4
collation-server = utf8mb4_unicode_ci
utf8、utf8mb4、utf8mb3區別:
utf8mb4 和 utf8mb3是MySQL中的兩種字元集編碼,可以理解為它們都是utf8的變種,utf8mb3相當於utf8換了個名字,utf8mb4支持的Unicode字元範圍比utf8更大。
-
utf8mb4:mb4" 代表 "most bytes 4",可以支持最多四個位元組的 Unicode 字元,從MySQL 5.5.3開始支持utf8mb4
-
utf8mb3:早期版本的 MySQL 中,utf8 實際上是 utf8mb3 的別名,它最多支持三個位元組的字元,所以它不能表示所有的 Unicode 字元,特別是一些較新的表情符號和一些特殊的語言字元
4、服務端 調優配置
-
innodb_buffer_pool_size:InnoDB性能優化設置,用於指定InnoDB緩衝池的大小,緩衝池用於緩存數據和索引。一般設置為記憶體的50%作用
-
max_connections:指定了可以同時打開的最大連接數
-
table_open_cache:用於指定可以同時打開的表的數量
-
thread_cache_size:指定線程緩存的大小,可以減少為新連接創建和銷毀線程的開銷。
-
max_allowed_packet::這個選項指定了MySQL伺服器和客戶端之間傳輸的最大數據包大小。
-
sort_buffer_size:用於指定為排序操作分配的記憶體緩衝區的大小,用於存儲排序查詢(如帶有 ORDER BY 子句的查詢)的中間結果。
-
default_authentication_plugin:( MySQL 8.0 引入的選項)用於指定預設使用的身份驗證插件,因為mysql引入了幾種新的身份驗證插件,但是某些客戶端和應用可能還不完全支持新的身份驗證方法,所以為了確保相容性,就需要使用這個選項來修改預設身份驗證插件。
-
wait_timeout:設置自動斷開連接的時間,如果一個連接超過這個時間沒有和mysql服務交互,就會斷開連接。一般設置為幾個小時或者一天
例如:
[mysqld]
# 基礎 配置
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
bind-address = 0.0.0.0
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
log_error = /var/log/mysql/error.log
character_set_server=utf8mb4
collation-server = utf8mb4_unicode_ci
# 調優 配置
wait_timeout = 86400
innodb_buffer_pool_size = 4G
max_connections = 2000
thread_cache_size = 16
max_allowed_packet = 64M
sort_buffer_size = 200M
default_authentication_plugin = mysql_native_password
mysqld的身份驗證插件:
早期版本的 MySQL 預設使用的是mysql_native_password身份驗證插件。它的主要特點是廣泛的相容性,但相對於新的身份驗證方法,它的安全性較低。
在 MySQL 8.0 中,引入了caching_sha2_password作為預設的身份驗證插件,提供了更強的安全性。caching_sha2_password使用 SHA-256 加密演算法,比mysql_native_password提供更高級的密碼加密。
由於一些老舊的客戶端和應用程式可能不支持caching_sha2_password插件,MySQL 提供了default_authentication_plugin配置選項,允許資料庫管理員指定預設的身份驗證插件。
5、客戶端 配置
客戶端的配置就比服務端配置簡單多了,客戶端主要關註的是如何連接到MySQL伺服器,以及一些基本的客戶端行為設置。
-
socket:如果通過UNIX套接字連接,需要指定套接字文件的路徑。
-
skip-auto-rehash:禁用自動補全功能。在有大量資料庫和表時,這可以加快啟動速度。
-
default-character-set:用於指定客戶端使用的預設字元集。
例如:
[client]
socket=/var/run/mysqld/mysqld.sock
default-character-set=utf8mb4
skip-auto-rehash
客戶端和服務端字元集說明:
客戶端和服務端的字元集要保持一直,如果不一樣可能會導致以下問題:
-
客戶端顯示問題:客戶端可能無法正確顯示從伺服器檢索的文本數據。這尤其在處理非英文字元時常見。
-
數據插入問題:向資料庫中插入數據時,如果客戶端的字元集與資料庫或表的字元集不一致,可能會導致插入的數據出現亂碼或錯誤。
6、mysqld_safe 配置
在mysql的配置文件中,[mysqld_safe]配置塊是給 mysqld_safe 這個腳本使用的,現在基本上不使用這個配置塊了。
(1)mysqld_safe 是一個在早期版本的 MySQL 中用於啟動 MySQL 伺服器的腳本,提供了額外的安全特性和錯誤恢復功能。隨著 MySQL 的發展,尤其是從 5.7 版本開始,許多這些功能已被集成到 mysqld 本身。
(2)在現代 Linux 系統中,systemd 作為系統服務管理器,提供了對服務的監控、日誌管理、自動重啟等功能。這些功能的存在確實減少了 mysqld_safe 的必要性。
如果要使用mysql_safe腳本,一般常用的配置項有兩個:
-
socket:指定套接字文件位置
-
nice:設置 MySQL 伺服器進程的 "nice" 值,一般設置為0,表示正常優先順序
如果是使用systemd的service文件,可以這樣指定:
[Unit]
Description=MySQL Server 5.6.51
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
Nice=0 # 指定Nice優先順序,這個可以忽略,因為預設Nice就是0
PIDFile=/var/run/mysqld/mysqld.pid
ExecStart=/etc/init.d/mysqld start
ExecStop=/etc/init.d/mysqld stop
ExecReload=/etc/init.d/mysqld reload
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
MySQL服務單元文件
從2010年起,systemd首先被Fedora 15採用以替換傳統的System V init進程。隨後許多其他Linux發行版也跟進,例如Ubuntu從其15.04版本起採用systemd,而Red Hat系列則從7版本開始採用。
systemd為服務管理引入了一系列高效的功能特性,大大簡化了傳統init系統中可能較為複雜和繁瑣的管理流程。
例如,在systemd的管理下,管理MySQL服務時可以避免使用傳統的mysqld_safe腳本。mysqld_safe是一個專門用於啟動和監控MySQL伺服器的shell腳本。但在systemd體系中,服務的啟動、監控和日誌記錄等功能都可以通過systemd的配置文件和命令來直接實現,這不僅簡化了服務管理,也提高了系統的可維護性和可靠性。
包管理器安裝
如果操作系統的初始化進程是systemd進程,通過包管理器安裝的mysql服務,會自動配置好service文件的。
二進位安裝
二進位安裝的話就沒有提供支持systemd的service文件,需要自己手動編寫。有兩種方式:
方式一:二進位軟體包裡面有一個名為mysql.service的腳本文件,可以直接通過編寫systemd的service文件來調用這個腳本,從而實現對mysql服務的管理。
例如:
[Unit]
Description=MySQL Server 5.6.51
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
Nice=0
PIDFile=/var/run/mysqld/mysqld.pid
ExecStart=/etc/init.d/mysqld start
ExecStop=/etc/init.d/mysqld stop
ExecReload=/etc/init.d/mysqld reload
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
方式二:自己手動編寫service文件
例如:
[Unit]
Description=MySQL Community Server
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=notify
User=mysql
Group=mysql
PIDFile=/var/run/mysqld/mysqld.pid
PermissionsStartOnly=true
ExecStart=/opt/mysql-8.0/bin/mysqld
TimeoutSec=infinity
Restart=on-failure
RuntimeDirectory=mysqld
RuntimeDirectoryMode=755
LimitNOFILE=10000
# Set enviroment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1
編譯安裝
編譯安裝的話,如果是Mysql5.7及其以上的版本,編譯時通過加 -DWITH_SYSTEMD=1
選項,可以在安裝目錄下的lib/systemd/system目錄下生成service文件,將這個文件拷貝到對應位置就可以實現對mysql服務的管理了。
例如:
# Copyright (c) 2015, 2023, Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# systemd service file for MySQL forking server
#
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network-online.target
Wants=network-online.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=notify
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Execute pre and post scripts as root
# hence, + prefix is used
# Needed to create system tables
ExecStartPre=+/usr/local/mysql/bin/mysqld_pre_systemd
# Start main service
ExecStart=/usr/local/mysql/bin/mysqld $MYSQLD_OPTS
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 10000
Restart=on-failure
RestartPreventExitStatus=1
# Set enviroment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false