MySQL_01安装与使用

了解几种安装方式:

  • dnf/apt:傻瓜式,安装后文件分散
  • rpm/deb包:掌握,安装后文件分散
  • 通用二进制文件:二进制GLIBC。掌握,无需编译,推荐
  • 源码编译:了解

安装前

关闭防火墙

1
2
3
4
5
6
7
8
9
10
# centos
firewall-cmd --state
systemctl stop firewalld
systemctl disable firewalld

# ubuntu
ufw status
ufw disable # 临时关闭
systemctl stop ufw
systemctl disable ufw

CentOS禁用SELinux

编辑 vim /etc/selinux/config

1
2
3
4
5
#SELINUX=permissive # 设置 secure Linux 为宽松
SELINUX=disabled # 禁用

# 更改完成后,请重新启动服务器或运行以下命令。
setenforce Permissive

禁用swap分区

请禁用交换分区

1
free -m -s 5 # -m 以MB为单位显示内存使用情况;-s<间隔秒数>  持续观察内存使用状况。

使用RPM包安装

官方doc: https://dev.mysql.com/doc/refman/8.4/en/linux-installation.html

安装文件布局请参阅: https://dev.mysql.com/doc/refman/8.4/en/linux-installation-rpm.html

RPM Bundlemysql-8.4.6-1.el8.x86_64.rpm-bundle.tar,包含MySQL所有组件。

使用通用二进制文件安装(使用中

官方doc: https://dev.mysql.com/doc/refman/8.4/en/binary-installation.html

下载

官网下载 MySQL Community Serverhttps://dev.mysql.com/downloads/

Compressed TAR Archivemysql-8.4.6-linux-glibc2.28-x86_64.tar.xz,常规二进制发行版。本文使用

Compressed TAR Archive, Minimal Installmysql-8.4.6-linux-glibc2.28-x86_64-minimal.tar.xz ,最小安装,不包括调试二进制文件,并去掉了调试符号。

TARmysql-8.4.6-linux-glibc2.28-x86_64.tar

查看操作系统 glibc 版本

1
2
3
4
5
# Linux发行版通用
ldd --version

# centos
rpm -qa | grep glibc

image-20240927194202683

卸载旧版本

如果您之前曾通过操作系统自带的包管理工具(如dnf或apt)安装过MySQL,那么在使用原生二进制文件进行安装时可能会遇到问题。请确保之前安装的 MySQL 已被完全卸载(使用包管理系统),并且任何额外的文件(如旧版本的数据文件)也已删除。您还应检查配置文件(如 /etc/my.cnf 或 /etc/mysql 目录)并将其删除。

centos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# rpm -qa,列出系统中所有已安装的 RPM 包。-q → query(查询);-a → all(所有包);
rpm -qa | grep -iE 'mysql|mariadb' # grep -iE,-i 忽略大小写;-E 启用扩展正则表达式
dnf list installed | grep mysql # 列出已安装的安装包

#rpm -e xxx xxx xxx # -e 删除指定组件。删除上述输出组件。rpm不会自行解决依赖,可以通过错误信息找到依赖项,指定多个要删除的组件
dnf remove \
mysql-community-server-8.4.6-1.el8.x86_64 \
mysql-community-client-8.4.6-1.el8.x86_64 \
mysql-community-libs-8.4.6-1.el8.x86_64 \
mysql-community-common-8.4.6-1.el8.x86_64 \
mysql-community-client-plugins-8.4.6-1.el8.x86_64 \
mysql-community-icu-data-files-8.4.6-1.el8.x86_64 \
mariadb-connector-c-3.1.11-2.el8_3.x86_64 \
mariadb-connector-c-config-3.1.11-2.el8_3.noarch # 卸载数据库安装程序

# 查找残余文件
find / -name mysql # 按文件名查找
find / | grep .*mysql.*
find / -name my.cnf # 查找mysql配置文件

ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查询已安装的 MySQL 相关包
dpkg -l | grep -iE 'mysql|mariadb' # grep -iE,-i 忽略大小写;-E 启用扩展正则表达式
apt list --installed | grep mysql # 列出已安装的安装包

apt remove --purge \
mysql-community-server \
mysql-community-client \
mysql-community-libs \
mysql-community-common \
mysql-community-client-plugins \
mysql-community-icu-data-files # 卸载数据库安装程序

# 查找残余文件
find / -name mysql # 按文件名查找
find / | grep .*mysql.*
find / -name my.cnf # 查找mysql配置文件

安装依赖

MySQL 依赖于 libaio 库。如果该库未在本地安装,数据目录初始化和后续服务器启动步骤将失败。如有必要,请使用适当的包管理器进行安装。

ubuntu

1
2
3
4
5
6
7
8
9
dpkg -l | grep -iE 'libaio1t64'
apt list --installed | grep -iE 'libaio1t64'

apt-get update
apt-cache search 'libaio1t64'
apt-get install libaio1t64

# Ubuntu 24.04 软件包名为 libaio1t64,而 MySQL 依赖 libaio.so.1 (未更新),创建符号链接如下
ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1

centos

1
2
3
4
5
6
rpm -q libaio
dnf list installed | grep -iE 'libaio'

dnf makecache # 生成或更新本地的 仓库缓存 / 元数据
dnf search libaio # 从系统的 YUM 仓库(Repository) 中搜索包含关键词的软件包信息。
dnf install libaio

Oracle Linux 8 / Red Hat 8 (EL8): 这些平台默认不会安装文件 /lib64/libtinfo.so.5,而该文件是 MySQL 客户端 bin/mysql 运行 mysql-VERSION-el7-x86_64.tar.gz 和 mysql-VERSION-linux-glibc2.28-x86_64.tar.xz 包时所需的。为解决此问题,请安装 ncurses-compat-libs 包。

1
2
3
4
5
6
7
8
9
# ubuntu
dpkg -l | grep libncurses
apt-cache search libncurses
apt-get install ...

# centos
rpm -q ncurses
dnf search ncurses
dnf install ...

解压二进制包

表 2.3 通用 Unix/Linux 二进制包的 MySQL 安装布局

https://dev.mysql.com/doc/refman/8.4/en/binary-installation.html#binary-installation-layout

目录 目录内容
bin MySQL 服务器(mysqld)、客户端和实用程序程序
docs MySQL 手册(Info 格式)
man Unix 手册页
include Include (header) files
lib Libraries
share 错误信息、词典和数据库安装的SQL语句
support-files 其他支持文件

解压

1
2
3
4
5
6
mkdir -p /data/local && cd /data/local/
tar -xvf mysql-8.4.6-linux-glibc2.28-x86_64.tar.xz
mv ./mysql-8.4.6-linux-glibc2.28-x86_64 ./mysql

# 创建指向安装目录的符号链接(软链接),这样可以轻松地将其引用为 /data/local/mysql
#ln -s mysql-8.4.6-linux-glibc2.28-x86_64 mysql

为了让mysqld命令可以在任何位置执行,需配置环境变量,参考:**环境变量持久化 **

1
2
3
4
5
6
7
grep -qxF 'export PATH=/data/local/mysql/bin:$PATH' /etc/profile || \
echo 'export PATH=/data/local/mysql/bin:$PATH' >> /etc/profile

#vim /etc/profile
#export PATH=$PATH:/data/local/mysql/bin
# 使环境变量生效
source /etc/profile

创建数据目录

1
2
3
4
5
6
7
8
cd /data/local/mysql
# 创建各实例数据存放目录
mkdir -p /data/local/mysql/3306/{data,log,mysql-files}
mkdir -p /data/local/mysql/8306/{data,log,mysql-files}
# 创建各实例error日志,可省略,会自动创建
#touch /data/local/mysql/3306/log/error.log
#touch /data/local/mysql/8306/log/error.log
tree -d /data/local/mysql # 以树状图列出目录的内容。-d 显示目录名称而非内容。

创建用户并赋予权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
groupadd mysql
# -r 创建一个 系统用户(UID < 1000,一般不用于登录);
# -g mysql 指定用户所属的主组为 mysql(该组必须已存在)
# -s /bin/false 指定用户的 shell 为 /bin/false,禁止该用户登录系统
useradd -r -g mysql -s /bin/false mysql # 创建一个用于运行 MySQL 服务的系统用户,该用户属于 mysql 用户组,且禁止用户登录。
# 将指定文件的拥有者改为指定的用户或组。chown [-cfhvR] [--help] [--version] user[:group] file...
chown -R mysql:mysql /data/local/mysql # 将文件的拥有者改为指定的用户或组。-R 处理指定目录以及其子目录下的所有文件。
#chmod 750 /data/local/mysql # 权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

# 查看所有用户组
cat /etc/group
# 查看所有用户(系统 + 登录用户)
cat /etc/passwd
# 查看某个用户所属的所有组
groups mysql
# 查看指定用户详细信息(包括主组)
id mysql
#userdel -r mysql # 删除名为 mysql 的 Linux 用户。-r 删除用户登入目录以及目录中所有文件
#groupdel mysql # 必须先删除群组下的用户

创建配置文件

新建配置文件 vim /data/local/mysql/my.cnf ,修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 服务器程序的配置 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


# 服务器程序的配置(所有数据库实例)。适用于 mysqld、mysqld_safe。
# 通常把服务端选项放在[mysqld]段,名字更直观。[server]段可以作为一种 “额外/兼容” 的方式。个人习惯:[server]存放过时的配置
[server]
#mysql-native-password = ON # 8.4中默认禁用,9.0.0开始被删除

# 服务器程序的配置(所有数据库实例)。适用于 mysqld、mysqld_safe。
[mysqld]
#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓#
user = mysql # 以指定用户运行 mysqld 服务器(此处的 "用户 "是指操作系统用户,而不是授权表中列出的MySQL数据库的账号)。
#bind_address = * # 当绑定多个值时,不允许通配符。不支持正则。IP地址必须存在。
basedir = /data/local/mysql # MySQL安装的根目录。若在启动时未显式指定,MySQL 会尝试根据 mysqld 程序所在的当前路径推断默认的 basedir。
local_infile = ON # 此变量控制服务器端对LOAD DATA语句的LOCAL权限。根据local_infile设置,服务器将拒绝或允许客户端在启用LOCAL权限时进行本地数据加载。
lc_messages_dir = /data/local/mysql/share # 错误消息所在的目录。
lc_messages = en_US # 默认en_US。用于错误消息的区域设置。服务器将该参数转换为语言名称,并与 --lc-messages-dir 的值组合,生成错误消息文件位置 /data/local/mysql/share/english。
default-time-zone = '+08:00' # 设置默认服务器时区。此选项用于设置全局 time_zone 系统变量。若未指定此选项,则默认时区与系统时区相同(由 system_time_zone 系统变量的值决定)。
mysqlx = OFF # 默认ON。此选项控制服务器在启动时加载X插件的方式。在MySQL 8.4中,X插件默认处于启用状态,但可通过此选项控制其激活状态。

#################################### 字符集、排序、大小写 ###################################
#character_set_server = utf8mb4 # 服务器的默认字符集。
#collation_server = utf8mb4_0900_ai_ci # 服务器级别的默认排序规则为 utf8mb4_0900_ai_ci,不区分重音符号,不区分大小写。 修改此参数不会影响已创建的数据库对象,会影响新建表的字段数据的排序、比较(大小写是否敏感)。 最大影响(一次性):修改已创建的大表的 Collation,会重建索引重建和锁表。
#lower_case_table_names = 0 # 若设置为 0,则表名按指定形式存储且比较时区分大小写。若设置为 1,则表名在磁盘上以小写形式存储且比较时不区分大小写。若设置为 2,则表名按给定形式存储但比较时转换为小写。此选项同样适用于数据库名和表别名。 此变量的默认值取决于平台,Unix 0、Windows 1、macOS 2。 禁止使用与服务器初始化时不同的 lower_case_table_names 设置启动服务器。此限制是必要的,因为各类数据字典表字段使用的排序规则取决于服务器初始化时定义的设置,若以不同设置重启服务器,将导致标识符排序和比较方式出现不一致。

#################################### root密码 ###################################
#default_password_lifetime = 0 # 全局自动密码过期策略。默认值0表示禁用自动密码过期功能;正整数N表示允许的密码有效期,密码必须每N天更改一次。
# 下面三个配置项推荐在MySQL启动命令行使用,因为只使用一次。
#skip-grant-tables = OFF # 默认OFF。该参数会导致服务器不读取 mysql 系统模式中的授权表,从而完全绕过权限系统启动。这使得任何能够访问服务器的人都能无限制地访问所有数据库。 由于使用 --skip-grant-tables 启动服务器会禁用身份验证检查(即免密登录),此时服务器还会通过(自动)启用 skip_networking 参数来禁用远程连接。
#skip_networking = OFF # 默认OFF。此变量控制服务器是否允许TCP/IP连接。若启用此选项,服务器仅允许本地(非TCP/IP)连接,且所有与mysqld的交互必须通过命名管道或共享内存(Windows系统)或Unix套接字文件(Unix系统)实现。
#init_file = /data/local/mysql/mysql-init.sql # 可用于 重置管理员密码、初始化数据库和表。文件内容是纯文本SQL语句即可,不限制后缀。必须拥有文件的读权限。

#################################### 权限 ###################################
#activate_all_roles_on_login = OFF # 默认OFF。是否在用户登录服务器时自动激活所有已授予的角色,详见官网。 扩展:1、SELECT CURRENT_ROLE(); 返回 NONE,说明尚未激活任何角色。2、查看被授予的权限 SHOW GRANTS; 。 3、如果直接把权限赋予用户(即传统的 GRANT ... TO 'user'@'host'),那么 activate_all_roles_on_login 完全没用,也不会产生任何影响,但还是推荐使用 角色授权 而不是 直接授权。

#################################### 禁止load ###################################
secure_file_priv = NULL # 默认值因系统和安装方式而异。此变量用于限制数据导入和导出操作的影响,例如由LOAD DATA和SELECT ... INTO OUTFILE语句以及LOAD_FILE()函数执行的操作。这些操作仅允许具有FILE权限的用户执行。如果设置为 NULL,服务器将禁用导入和导出操作。

#################################### 网络通信与数据传输限制 ###################################
max_connections = 100 # 默认151,最大100000。允许的最大并发客户端连接数。实际生效值取 open_files_limit - 810 的有效值与 max_connections 实际设置值中的较小者。如果服务器因达到 max_connections 限制而拒绝连接,则会递增 Connection_errors_max_connections 状态变量。
max_connect_errors = 10000 # 默认100。当来自某个主机的连续连接请求在 max_connect_errors 次尝试后均未成功建立连接时,服务器将阻止该主机进行进一步连接。如果在前一次连接中断后,该主机在少于 max_connect_errors 次尝试内成功建立了连接,则该主机的错误计数将清零。
back_log = 50 # 默认-1。MySQL可处理的未完成连接请求数量。当主MySQL线程在极短时间内收到大量连接请求时,该参数便会生效。此时主线程需要花费一定时间(尽管非常短暂)来检查连接并启动新线程。back_log值决定了在此短暂时间内可堆叠的请求数量上限,超过该值后MySQL将暂时停止响应新请求。仅当预期短时间内出现大量连接时才需增加此值。 换言之,该值即为传入TCP/IP连接的监听队列大小。操作系统对此队列大小设有自身限制。Unix系统调用listen()的手册页应包含更多细节。请查阅操作系统文档以获取该变量的最大值。back_log的设置值不得超过操作系统设定的上限。 默认值为 max_connections 的值,这使得允许的连接队列能够根据最大允许连接数进行调整。
wait_timeout = 3600 # 默认28800。服务器在关闭 非交互式连接 之前等待该连接活动的秒数。在线程启动时,会话 wait_timeout 值从全局 wait_timeout 值或全局 interactive_timeout 值初始化,取决于客户端的类型(由 mysql_real_connect() 的 CLIENT_INTERACTIVE 连接选项定义)。
interactive_timeout = 3600 # 默认28800。服务器在关闭 交互式连接 之前等待该连接活动的秒数。交互式客户端定义为使用 mysql_real_connect() 的 CLIENT_INTERACTIVE 选项的客户端。另请参阅 wait_timeout。
max_allowed_packet = 512M # 默认67108864(64MB)。定义 MySQL 服务器与客户端(包括其他副本服务器)之间单个消息或数据包的大小上限。影响 INSERT、UPDATE 大字段(如 BLOB 或 TEXT)以及执行超长查询语句时的处理。
replica_max_allowed_packet = 1G # 默认1073741824(1GB)。专门用于从库(Replica),设置从库接收来自主库(Source)数据包的最大限制。它会覆盖从库上的 max_allowed_packet 设置。
#max_execution_time = 0 # 默认0。SELECT语句的执行超时时间,单位为毫秒。若值为0,则禁用超时机制。 仅适用于只读 SELECT 语句。 存储程序中的 SELECT 语句将忽略 max_execution_time 设置。
max_prepared_stmt_count = 4194304 # 默认16382,最大4194304。此变量限制了服务器中预编译语句的总数(即所有客户端连接所创建的预编译语句的总和,关闭连接会销毁创建的预处理语句)。在可能发生基于通过预编译大量语句导致服务器内存耗尽的拒绝服务攻击的环境中,可以使用此变量。将该值设置为 0 将禁用预编译语句。

#################################### 线程 ###################################
thread_cache_size = 0 # 默认-1。服务器应缓存多少个线程以供复用。当客户端断开连接时,若缓存中的线程数少于 thread_cache_size,则将客户端的线程放入缓存。线程请求将优先通过复用缓存中的线程来满足,仅当缓存为空时才会创建新线程。若存在大量新连接,可增加此变量值以提升性能。通常情况下,若线程实现良好,此设置不会带来显著性能提升。但若服务器每秒处理数百个连接,应将 thread_cache_size 设置得足够高,确保多数新连接能使用缓存线程。通过比较 Connections 和 Threads_created 状态变量差异,可评估线程缓存效率。默认值基于以下公式计算,默认值的上限为100: 8 + (max_connections / 100)

#################################### 连接 ####################################
skip_name_resolve = ON # 默认值OFF。控制服务器在处理客户端连接时是否进行DNS反向解析(使用PTR记录)。若设为ON,则仅使用IP地址,但MySQL用户授权表(mysql.user)中的 Host 列值必须为 IP 地址或网段(如 'root'@'192.168.1.%'),不能使用主机名(如 'root'@'db-server'),否则会导致连接失败。 跳过 DNS 查询过程能提升连接速度。
#init_connect = 'SET NAMES utf8mb4;' # 服务器为每个连接的客户端执行的字符串。该字符串由一个或多个SQL语句组成,各语句之间以分号分隔。
#require_secure_transport = OFF # 客户端连接到服务器时是否需要使用某种形式的加密传输。当此变量启用时,服务器仅允许使用TLS/SSL加密的TCP/IP连接,或使用套接字文件(在Unix系统上)或共享内存(在Windows系统上)的连接。服务器将拒绝不安全的连接尝试,这些尝试将以ER_SECURE_TRANSPORT_REQUIRED错误失败。简言之,OFF 表示服务器不强制客户端必须使用加密连接,可以使用 mysql --ssl-mode=disable。

#################################### 每个连接占用的内存 ####################################
########## 线程 ##########
thread_stack = 1M # 默认1048576(1MB),最小131072(128KB)。每个线程的堆栈大小。默认值足以满足正常运行需求。若线程堆栈过小,将限制服务器可处理的SQL语句复杂度、存储过程的递归深度及其他耗费内存的操作。

########## 每个连接的核心参数(按需分配) ##########
sort_buffer_size = 2M # 默认262144(256KB)。每个需要执行排序的会话都会分配一个该大小的缓冲区。该参数不特定于任何存储引擎,而是以通用方式应用于优化。排序缓冲区大小至少需满足容纳十五个元组的要求(元组指的是排序过程中的一行记录,如果单行数据非常大,而buffer设置得极小,可能会导致查询直接报错或无法执行排序优化)。此外,当增加 max_sort_length 的值时,可能需要相应提升 sort_buffer_size 的值。 如果您在 SHOW GLOBAL STATUS 输出中看到每秒有许多 Sort_merge_passes,则可以考虑增加 sort_buffer_size 值以加快无法通过查询优化或改进索引来改进的 ORDER BY 或 GROUP BY 操作。
#innodb_sort_buffer_size = 64M # 默认值1048576(1MB)。sort_buffer_size 是为了让查询变快,innodb_sort_buffer_size 是为了让加索引变快。除非你的服务器专门用于大规模数据导入,否则不要在配置文件(Global)里把这个值设得特别大。建议:大表加索引时,在 Session 级别 调大。
join_buffer_size = 8M # 默认262144(256KB)。用于普通索引扫描、范围索引扫描和不使用索引从而执行全表扫描的表连接操作所使用的缓冲区的大小。
read_buffer_size = 2M # 默认131072(128KB)。对MyISAM表进行顺序扫描的每个线程都会为其扫描的每个表分配一个此大小(以字节为单位)的缓冲区。如果执行多次顺序扫描,您可能需要增加该值。
read_rnd_buffer_size = 8M # 默认262144(256KB)。此变量用于从MyISAM表读取数据,并适用于任何存储引擎的多范围读取优化。 当从MyISAM表按键排序操作后的排序顺序读取行时,数据通过此缓冲区读取以避免磁盘寻道。 将该变量设为较大值可显著提升 ORDER BY 性能。
binlog_cache_size = 4M # 默认32768(32KB)。在事务期间用于存储二进制日志变更的内存缓冲区大小。 当服务器启用二进制日志功能时,若服务器支持任何事务型存储引擎,则会为每个客户端分配二进制日志缓存。若事务数据超出内存缓冲区容量,则多余数据将存储于临时文件中。当服务器启用二进制日志加密时,内存缓冲区本身不加密,但用于存储二进制日志缓存的临时文件将被加密。每次事务提交后,系统会通过清空内存缓冲区并截断临时文件(若存在)来重置二进制日志缓存。 若频繁处理大型事务,可通过增大此缓存大小来减少或消除临时文件写入需求,从而提升性能。状态变量 Binlog_cache_use 和 Binlog_cache_disk_use 可用于调整此缓存大小。 binlog_cache_size 仅设置事务缓存大小;语句缓存的大小由系统变量 binlog_stmt_cache_size 控制。

#################################### 临时表(共享) ####################################
# 在执行特定复杂查询时,每个连接动态分配。
tmp_table_size = 512M # 默认16777216(16MB)。定义由MEMORY和TempTable存储引擎创建的内部内存临时表的最大尺寸。若内部内存临时表超过此尺寸,将自动转换为磁盘上的内部临时表。 用户手动创建的TempTable表不受支持。 当使用MEMORY存储引擎处理内存中临时表时,实际大小限制取决于 tmp_table_size 与 max_heap_table_size 的较小值。 若需执行大量复杂的GROUP BY查询且内存充足,请增加tmp_table_size的值。 可通过比较Created_tmp_disk_tables与Created_tmp_tables的数值,对比创建的内部磁盘临时表数量与内部临时表总数。
max_heap_table_size = 512M # 默认16777216(16MB)。

#################################### 事务 ###################################
transaction_isolation = REPEATABLE-READ # 设置默认事务隔离级别。READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ(默认)、SERIALIZABLE。


#################################### 存储引擎 #################################
#default_storage_engine = InnoDB # 默认InnoDB。表的默认存储引擎。此变量仅设置永久表的存储引擎。
#default_tmp_storage_engine = InnoDB # 默认InnoDB。临时表(通过 CREATE TEMPORARY TABLE 创建)的默认存储引擎。
disabled_storage_engines = "Myisam,Memory" # 默认空字符串。指示哪些存储引擎不可用于创建表或表空间。

#################################### MyISAM #################################
bulk_insert_buffer_size = 64M # 默认8388608(8MB)。专门用于优化 MyISAM 存储引擎批量插入性能的线程级缓存参数。优化场景:LOAD DATA INFILE、INSERT INTO... SELECT。通过在内存中缓存索引数据以减少磁盘 I/O 次数,从而显著提升数据导入速度。
#key_buffer_size = 8388608 # 默认8388608(8MB)。专门用于缓存 MyISAM 表的索引(Index)数据的内存区域,所有线程共享。

#################################### Innodb #################################
#innodb_print_all_deadlocks = OFF # 默认OFF。开启 (ON):InnoDB用户事务中所有的死锁信息都会记录在 mysqld 错误日志 (error log) 中。关闭 (OFF/Default):使用 SHOW ENGINE INNODB STATUS 语句,能查看最后一次死锁的信息。
#innodb_lock_wait_timeout = 50 # InnoDB事务在放弃获取行锁之前等待的时间(以秒为单位)。默认值为 50 秒。超时则会触发以下错误:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
#innodb_adaptive_hash_index = OFF # 默认OFF。是否启用自适应哈希索引。自适应哈希索引 是 InnoDB 的一个特性,用于在内存中基于 B+ 树索引创建哈希索引,从而将某些频繁的单行记录查询从 O(logn) 的 B+ 树搜索降至 O(1) 的哈希查找,显著提升等值查询性能(如用户登录、主键查找)。
innodb_doublewrite = ON

########## 缓冲池 ##########
innodb_buffer_pool_size = 1G # 默认134217728(128MB)。核心缓冲池的大小(以字节为单位),该内存区域的缓存包括:数据页(Data Pages)、索引页(Index Pages)、自适应哈希索引(Adaptive Hash Index)、Undo log(Undo Pages)等。如果是专用 DB 服务器,推荐设置为内存的 70% – 80%。可根据缓存命中率调整大小。
innodb_buffer_pool_instances = 1 # InnoDB缓冲池划分的区域数量。对于缓冲池规模达几GB的系统,将缓冲池划分为多个实例,可减少不同线程读写缓存页时的竞争,从而提升并发性。存储于缓冲池或从缓冲池读取的每个页面,都会通过哈希函数随机分配至某个缓冲池实例。每个实例独立管理其空闲列表、刷新列表、最近最少使用列表(LRU) 及其他数据结构,并由自己的缓冲池互斥锁进行保护。 总缓冲池大小在所有缓冲池之间分配。为获得最佳效率,请将 innodb_buffer_pool_instances 与 innodb_buffer_pool_size 组合设置,确保每个缓冲池实例至少为 1GB。
innodb_buffer_pool_dump_pct = 25 # 默认值25,范围是1到100。指定每个缓冲池中读出并转储的最近使用页的百分比。例如,若存在4个缓冲池,每个缓冲池包含100个页,且 innodb_buffer_pool_dump_pct 设置为25,则每个缓冲池中最近使用的25个页将被转储。人话:MySQL正常关闭时把buffer中页信息转储到磁盘,启动后再从磁盘加载到buffer,实现服务器快速预热。

########## 表空间 ##########
#innodb_file_per_table = ON # 当启用 innodb_file_per_table 时,表默认创建在按表分文件的表空间中。当禁用时,表默认创建在系统表空间中。
#innodb_data_file_path = ibdata1:12M:autoextend # 定义InnoDB系统表空间数据文件的名称、大小和属性。若未为innodb_data_file_path指定值,默认行为是创建一个自动扩展的数据文件,其大小略大于12MB,命名为ibdata1。
#innodb_page_size = 16K # 默认16384(16KB)。指定 InnoDB 表空间的页大小(InnoDB存储引擎用于存储数据和索引的最小逻辑单位)。只能在初始化 MySQL 实例之前进行配置,初始化完成后无法更改。值可以以字节或千字节为单位指定。例如,16 千字节的页大小可以指定为 16384、16KB 或 16k。

########## 处理数据页读取和写入的后台 I/O 线程数 ##########
#innodb_read_io_threads = 4 # 默认值为 CPUCore / 2。 InnoDB 中用于读取操作的 I/O 线程数。从数据文件(.ibd)读取数据页。
#innodb_write_io_threads = 4 # 默认值为 4。 InnoDB 中用于写入操作的 I/O 线程数。将脏页刷新到数据文件。
#innodb_purge_threads = 1 # 用于 InnoDB 清理操作的后台线程数量。增加该值将创建更多的清理线程,这在需要对多个表执行 DML 操作的系统上可以提高效率。 默认值:若可用逻辑处理器数<=16,则为1;否则为4。 推荐高并发场景下最低为4,默认值即可。

########## 数据落盘 ##########
#innodb_io_capacity = 10000 # 默认值10000。定义了可供 InnoDB 后台任务使用的每秒 I/O 操作次数 (IOPS),例如从缓冲池(buffer pool)刷新脏页,以及合并来自写缓冲(change buffer)的数据。 刷新页:在数据库中,指将内存中修改过的数据(脏页)写入到磁盘。 缓冲池:InnoDB 用来缓存表和索引数据的内存区域。写缓冲:一种特殊的数据结构,用于缓存对二级索引页的修改。
#innodb_io_capacity_max = 20000 # 默认 2 * innodb_io_capacity。
#innodb_flush_sync = ON # 默认ON。在检查点(checkpoints)发生 I/O 活动爆发(即大量数据需要紧急写入磁盘)期间,会导致 innodb_io_capacity 和 innodb_io_capacity_max 的设置被忽略。如果想严格遵守 innodb_io_capacity 和 innodb_io_capacity_max 设定的 I/O 速率,请禁用此变量。建议开启:启用此参数可能导致在 Checkpoint 期间磁盘 I/O 压力骤增,从而引起短暂的 前端业务延迟增加。

# 事务的特性ACID:
# - 原子性 (A):由 Undo Log 保证。
# - 持久性 (D):由 Redo Log 保证。
# - 一致性 (C):由 Undo Log 和 Redo Log 共同维护。
# - 隔离性 (I):由锁机制和 MVCC 保证。

########## 回滚日志 ##########
# InnoDB 事务引擎用于保存被修改行的旧版本数据的日志,用于回滚事务和构建历史版本读视图。例如,对行的 UPDATE 或 DELETE 操作,会在 Undo 日志中记录旧值;插入操作也会产生 Undo 记录用于回滚。Insert Undo 日志只在事务回滚时使用,可在事务提交后立即丢弃;而 Update/Delete Undo 日志还要用于 MVCC 一致性读,须待所有更早的事务结束后才能丢弃。每个 Undo 日志记录指向前一个版本,形成回滚段(Rollback Segment)链表。
# 事务回滚实现:记录的是对数据的逻辑修改(例如:把 ID 为1的记录名修改为 'B',undo log 会记录相反的修改,即把名从 'B' 改回 'A')。
# MVCC实现:当一个事务读取某行记录时,若该记录已被其他事务占用,可以通过 undo log 读取之前的版本数据。
# 保证事务的原子性:能够将数据恢复到事务开始前的状态,实现“要么全做,要么全不做”。
#
#innodb_undo_directory = ./ # 创建回滚表空间的路径。./ 即数据目录。
#innodb_max_undo_log_size = 1G # 默认1073741824(1GB)。定义undo表空间的阈值大小。如果undo表空间超出阈值,则在启用 innodb_undo_log_truncate 时可以将其标记为截断。
#innodb_undo_log_truncate = ON # 默认ON。自动截断Undo Log 表空间,从而释放磁盘空间。 为什么需要这个参数?Undo Log 是实现原子性与 MVCC 的核心。当数据库中存在大量的大事务或长时间未提交的长事务时,Undo Log 会快速膨胀。若禁用自动截断,Purge 线程仅释放过期的 Undo 记录,回滚段空间归还给表空间,但不会缩减物理文件大小。Undo 表空间会持续增长直至服务器重启或手动操作,适用于不关心空间回收的场景。若启用自动截断,每 innodb_purge_rseg_truncate_frequency 次 Purge 操作检查一次 Undo 表空间,并在满足条件时快速清空并截断该表空间。
#innodb_purge_rseg_truncate_frequency = 128 # 默认128。控制Purge协调线程清理回滚段(Rollback Segment)的频率,默认值128,表示每进行128次Purge操作检查一次是否需要截断。

########## 重做日志 ##########
# InnoDB引擎层实现。
# 保证事务的持久性:在事务提交时,将数据页的修改按顺序写入Redo Log,即使服务器宕机,重启后也能利用该日志恢复数据(重做已提交的修改),确保数据不丢失。
# Redo Log 落盘:实时发生(事务提交时)。它保证了“数据不丢”,但它存的不是最终的数据文件。当 Redo Log 使用量达到总容量的约 75% 时,会触发异步刷新(Checkpoint 落盘);
# Checkpoint 落盘:Checkpoint 是数据库用来确保“数据落盘”的一个标记点。它的核心作用是:把内存(Buffer Pool)里修改过的数据(脏页)刷写到磁盘上,并以此缩短数据库崩溃后的恢复时间。 一旦触发 Checkpoint 落盘,内存(Buffer Pool)里的脏页就写进了磁盘的数据文件(.ibd),被 Checkpoint 落盘的那部分 redo log 就没用了。 Redo Log 是循环写的(像个圆圈),被 Checkpoint 标记过的区域变成了“可覆盖”状态,当后续有新的写入时,MySQL 就会直接把新日志覆盖写在这些旧位置上(追加写)。
# Checkpoint 的触发条件:
# 1、日志空间不足(最紧急):当 Redo Log 使用量达到总容量(innodb_redo_log_capacity)的约 75% 时,会触发异步刷新;如果达到 90% 左右,会触发同步刷新(会卡住所有的写入操作,俗称“打嗝”)。
# 2、内存(Buffer Pool)中修改过的数据页占比例太高(默认超过 innodb_max_dirty_pages_pct = 90%)时,为了给新数据腾地方,必须把旧脏页刷入磁盘,顺便推进 Checkpoint。
# 3、定期任务:Master Thread 每秒或每 10 秒会启动一次异步刷新,即使系统不忙。
# 4、数据库关闭:正常关闭数据库时,会执行一次 Sharp Checkpoint,把所有脏页全部刷回磁盘。
#
#innodb_redo_log_archive_dirs = NULL # 默认值为NULL,不激活重做日志归档。定义可创建重做日志归档文件的标记目录。
#innodb_flush_log_at_trx_commit = 1 # 从redo log bufer刷盘到redo log file的策略。为了在使用事务的复制设置中实现持久性和一致性InnoDB,始终设置 innodb_flush_log_at_trx_commit=1 (完全符合 ACID 要求,默认设置 1。每次提交事务时,日志都会写入并刷新到磁盘)。
#innodb_log_group_home_dir = ./ # InnoDB 重做日志文件的目录路径。./ 即数据目录。
innodb_log_buffer_size = 256M # 默认67108864(64MB)。redo log(重做日志)缓冲区。较大的日志缓冲区使得大型事务能够运行,而无需在事务提交之前将日志写入磁盘。因此,若存在需更新、插入或删除大量行的事务,增大日志缓冲区可节省磁盘I/O操作。
innodb_redo_log_capacity = 2G # 默认104857600(100MB)。redo log(重做日志)文件占用的磁盘空间大小。 高并发场景下,建议将该值调大,以容纳更多短时间内的写入操作。过小的 Redo Log 会频繁触发 Checkpoint 落盘,导致大量的磁盘 I/O 抖动,影响写入性能。

#################################### 日志相关 ####################################
# flush logs 语句,关闭并重新打开服务器正在写入的任何日志文件。https://dev.mysql.com/doc/refman/8.4/en/flush.html
#log_output = FILE # 默认值 FILE。通用查询日志和慢查询日志的输出目标。该值是一个由TABLE、FILE和NONE组成的一个或多个以逗号分隔的单词列表。TABLE选择将日志记录到mysql系统模式中的general_log和slow_log表中。FILE选择将日志记录到日志文件中。NONE禁用日志记录。如果值中包含NONE,则它将优先于其他任何存在的单词。TABLE 和 FILE 可以同时指定以选择两个日志输出目标。此变量用于选择日志输出目标,但不会启用日志输出。要启用日志输出,需启用 general_log 和 slow_query_log 系统变量。对于 FILE 日志记录,general_log_file 和 slow_query_log_file 系统变量确定日志文件的位置。有关更多信息,请参阅第 7.4.1 节“选择通用查询日志和慢查询日志输出目标”。

########## 错误日志 ##########
log_timestamps = SYSTEM # 默认UTC。此变量控制写入错误日志的消息中时间戳的时区,以及写入文件的通用查询日志和慢查询日志消息的时区。该设置不影响写入表(mysql.general_log、mysql.slow_log)的常规查询日志和慢查询日志消息的时区。从这些表中检索的行可通过CONVERT_TZ()函数或设置会话time_zone系统变量,将本地系统时区转换为任意目标时区。 log_timestamps 允许取值为 UTC(默认值)和 SYSTEM(本地系统时区)。
log_error_verbosity = 1 # 默认2。控制错误日志记录详细程度的参数。

########## 通用查询日志 ##########
# 记录所有客户端连接和执行的SQL语句,默认关闭。
general_log = ON # 默认OFF。是否启用通用查询日志。该值可设为0(或OFF)以禁用日志,或设为1(或ON)以启用日志。日志输出目标由log_output系统变量控制;若该值为NONE,即使启用日志也不会写入任何日志条目。
general_log_file = general.log # 默认值 host_name.log。通用查询日志文件的名称。

########## 慢查询日志 ##########
slow_query_log = ON # 默认OFF。是否启用慢查询日志。日志输出目标由log_output系统变量控制;若该值为NONE,即使启用日志也不会写入任何日志条目。“慢速”的判定依据 long_query_time 变量的值。
slow_query_log_file = slow.log # 默认值 host_name-slow.log。慢查询日志文件的名称。
long_query_time = 1 # 默认值10秒,最小值0秒,最大值为31536000秒(即365天)。若查询耗时超过此秒数阈值,服务器将递增Slow_queries状态变量。若慢查询日志启用,该查询将被记录至慢查询日志文件。此值以实际耗时而非CPU时间衡量,因此在低负载系统中低于阈值的查询,在高负载系统中可能超出阈值。
log_queries_not_using_indexes = ON # 默认OFF。如果在启用慢查询日志的情况下启用此变量,则预期检索所有行的查询将被记录。此选项并不一定意味着未使用索引。例如,使用全索引扫描的查询虽然使用了索引,但仍会被记录,因为该索引无法限制行数。
#log_throttle_queries_not_using_indexes = 0 # 默认值为0,表示“无限制”。如果启用了 log_queries_not_using_indexes 选项,log_throttle_queries_not_using_indexes 变量将限制每分钟写入慢查询日志的此类查询数量。
#min_examined_row_limit = 0 # 默认值0。查询行数少于此数量的查询不会被记录到慢查询日志中。

########## 二进制日志 和 主库 ##########
# Server层实现,它记录了 DDL 和 DML 语句,不记录 SELECT、SHOW 等查询操作,用于数据备份、数据恢复和主从复制。
log-bin = binlog # 指定二进制日志文件的基础名称。启用二进制日志记录后,服务器会将所有修改数据的语句记录到二进制日志中,该日志用于备份和复制。 二进制日志是一系列具有基础名称和数字扩展名的文件。--log-bin 选项的值即为日志序列的基础名称。服务器通过在基础名称后添加数字后缀来按顺序创建二进制日志文件。 二进制日志文件的默认存储位置为数据目录,可通过在基础名称前添加绝对路径来指定替代存储位置。
#binlog_order_commits = ON # 默认ON。
#binlog_expire_logs_auto_purge = ON # 启用或禁用二进制日志文件的自动清除功能。将此变量设置为ON(默认值)可启用自动清除;设置为OFF则禁用自动清除。清除前的等待间隔由 binlog_expire_logs_seconds控制。即使 binlog_expire_logs_auto_purge 设置为 ON,将 binlog_expire_logs_seconds 设为 0 也会阻止自动清理操作的执行。
#binlog_expire_logs_seconds = 2592000 # 设置二进制日志的过期时间(以秒为单位)。过期后,二进制日志文件可被自动删除。可能的删除时机包括启动时和二进制日志刷新时。 默认二进制日志过期时间为2592000秒,即30天(30×24×60×60秒)。 可通过将 binlog_expire_logs_auto_purge 系统变量设为 OFF 禁用二进制日志自动清除功能。此设置优先于 binlog_expire_logs_seconds 的所有配置。 若需手动清除二进制日志文件,请使用 PURGE BINARY LOGS 语句。
#max_binlog_size = 1073741824 # 最大值和默认值为1073741824(1GB)。 用于控制 Master 上二进制日志的大小。 若向二进制日志写入数据导致当前日志文件大小超过此变量值,服务器将轮换二进制日志(关闭当前文件并打开下一个文件)。加密二进制日志文件额外包含512字节的头部信息,该部分计入max_binlog_size的计算范围。 每笔事务都会以单个数据块的形式写入二进制日志,因此不会被拆分到多个二进制日志文件中。因此,若存在大型事务,可能会出现二进制日志文件超过 max_binlog_size 限制的情况。

#log_bin_trust_function_creators = OFF # 此变量在启用二进制日志时生效。它控制是否信任存储函数创建者不会创建可能导致不安全事件写入二进制日志的存储函数。若设置为0(默认值),则用户除非同时拥有CREATE ROUTINE或ALTER ROUTINE权限以及SUPER特权,否则不得创建或修改存储函数。设置为0时,还强制要求函数必须声明为DETERMINISTIC特性,或声明为READS SQL DATA或NO SQL特性。若变量设为1,MySQL在创建存储函数时不强制执行这些限制。此变量同样适用于触发器创建。
#binlog_format = ROW # binlog_format 已弃用,将在未来的 MySQL 版本中移除。这意味着除行级日志格式外的其他日志格式支持也将在未来版本中移除。因此,任何新的 MySQL 复制配置都应仅采用行级日志格式。
binlog-do-db = basedb # 将特定数据库的更改写入二进制日志。主从架构中需要同步的数据库(白名单)。指定多个库需重复书写多行(不能用逗号隔开)。
binlog-do-db = archedb
#binlog-ignore-db = test # 主从架构中忽略同步的数据库,同步其他所有数据库(黑名单)。不建议与 binlog-do-db 同时配置。
#sync_binlog = 1 # 控制 MySQL 服务器将二进制日志同步到磁盘的频率。1:启用在事务提交前将二进制日志同步到磁盘的功能。这是最安全的设置,但由于磁盘写入次数增加,可能会对性能产生负面影响。在断电或操作系统崩溃的情况下,二进制日志中缺失的事务仅处于准备状态。这允许自动恢复程序回滚这些事务,从而确保二进制日志中不会丢失任何事务。

########## 中继日志 和 从库 ##########
# 主从复制架构中从库(Slave)的核心组件。
# 从库的I/O线程:负责从主库读取二进制日志(Binlog),并将其完整地复制到本地,存储为中继日志。
# 从库的SQL线程:从中继日志中读取记录并执行(重放),从而完成从库的数据更新。
# 核心作用详解:
# 1、缓冲与中转(Buffer & Relay):作为数据中转站,这使得主库无需等待从库完全执行完即可发送下一个binlog,提高了复制性能。
# 2、确保数据一致性:从库的SQL线程按顺序读取并执行中继日志中的事件,保证从库数据与主库最终一致。
# 3、断点续传与持久化:中继日志持久化在磁盘上。如果从库宕机,重启后SQL线程可以从上次停止的位置继续执行,避免复制中断,确保数据安全。
# 4、解耦I/O与SQL线程:允许读取日志(I/O线程)和执行日志(SQL线程)异步进行。
relay_log = relay-log # 中继日志文件的基础名称。对于默认复制通道,中继日志的默认基础名称为 host_name-relay-bin。对于非默认复制通道,中继日志的默认基础名称为 host_name-relay-bin-channel,其中 channel 是记录在此中继日志中的复制通道名称。
#relay_log_purge = ON # 默认值为 ON(启用)。当中继日志不再需要(即 SQL 线程已重做)时,自动删除它们。
relay_log_recovery = ON # 默认OFF。当该参数设置为 ON 时,如果从库发生意外宕机,在重启后:1、抛弃损坏的 Relay Log:它会忽略所有现有的 Relay Log 文件(防止其中的损坏数据导致同步报错)。2、重置同步位点:它会根据 SQL 线程 已经成功执行到的位点,重新从主库(Source)拉取所需的 Binary Log 并写入新的 Relay Log。3、自动化恢复:IO 线程会自动对齐到 SQL 线程的位置,无需人工干预即可恢复同步。
#max_relay_log_size = 0 # 默认值0,即等于 max_binlog_size 的值。 用于控制 Slave 上中继日志的大小。 如果副本向其中继日志写入数据导致当前日志文件大小超过此变量的值,副本将轮换中继日志(关闭当前文件并打开下一个文件)。如果 max_relay_log_size 为 0,服务器将同时使用 max_binlog_size 作为二进制日志和中继日志的大小。
#sync_relay_log = 10000 # 如果此变量的值大于0,则MySQL服务器会在向中继日志写入每sync_relay_log个事件后,使用fdatasync()函数将中继日志同步到磁盘。设置此变量将立即对所有复制通道生效,包括正在运行的通道。 将sync_relay_log设置为0将导致不执行磁盘同步操作;此时服务器依赖操作系统像处理其他文件那样,不定期地将中继日志内容刷新至磁盘。
#log_replica_updates = ON # 默认ON。指定副本服务器从复制源服务器接收到的更新是否应记录到副本自身的二进制日志中。
#replicate-do-db / replicate-ignore-db # 指定需要复制或忽略的数据库。
#replicate-do-table / replicate-ignore-table # 指定需要复制或忽略的表。

#################################### 主从复制 ####################################
replica_skip_errors = 1007,1008,1050 # 默认OFF。用于在复制过程中遇到特定错误时自动跳过,避免同步中断。
#sql_replica_skip_counter = 0
replica_net_timeout = 600 # 默认值为60秒。指定在副本认为连接中断、中止读取并尝试重新连接之前,等待源端发送更多数据或心跳信号的秒数。设置此变量不会立即生效。该变量的状态将应用于所有后续的 START REPLICA 命令。

#################################### 其他 ####################################
########## 描述符 ##########
open_files_limit = 8161 # 操作系统提供给 mysqld 的文件描述符数量。 计算公式:a、10 + max_connections + (table_open_cache * 2);b、max_connections * 5;c、操作系统限制。服务器尝试使用这些值中的最大值来获取文件描述符的数量。 在 Unix 系统上,该值不能设置为大于 ulimit -n 命令显示的数值。

########## Table ##########
table_open_cache = 4000 # 所有线程打开的表的数量。增加此值会增加 mysqld 所需的文件描述符的数量。默认 4000 = MAX((open_files_limit - 10 - max_connections) / 2, 400),最大524288。
table_definition_cache = 2000 # 范围 400 ~ 524288。默认值-1(表示自动调整大小;不要分配该文字值)。可存储在表定义缓存中的表定义数量。如果使用的表数量较多,可以创建一个较大的表定义缓存,以加快表的打开速度。与正常的表缓存不同,表定义缓存占用空间较小,且不使用文件描述符。最小值为 400。默认值基于以下公式,上限为 2000:MIN(400 + table_open_cache / 2, 2000)

########## Performance_schema ##########
#performance_schema = ON # 默认值ON。用于指示性能模式是否启用。
performance_schema_events_statements_history_long_size = 10000 # 默认-1(表示自动调整大小;请勿直接赋值此字面量)。
performance_schema_events_stages_history_long_size = 10000
performance_schema_events_waits_history_long_size = 10000
performance_schema_events_transactions_history_long_size = 10000

#↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑#


# 服务器程序的配置(3306 数据库实例)。选项组读取顺序:[server] -> [mysqld] -> [mysqld3306]
[mysqld3306]
server_id = 3306 # 主从复制时有用
port = 3306
socket = /tmp/mysql_3306.sock
basedir = /data/local/mysql
datadir = /data/local/mysql/3306/data # MySQL服务器数据目录的路径
log_error = /data/local/mysql/3306/log/error.log # 将默认错误日志目标设置为指定的文件。默认错误日志目标是数据目录中名为 host_name.err 的文件。
pid_file = /data/local/mysql/3306/mysql.pid # 5.7建议两层目录,否则启动时可能会卡住
#secure_file_priv = /data/local/mysql/3306/mysql-files
#mysqlx_port = 13306 # 从8.0开始。MySQL X Protocol 是一种为了让 MySQL 更好地支持 NoSQL 文档操作、提升性能和现代化连接体验而推出的新标准。它让 MySQL 不仅仅是一个关系型数据库,也成为了一个灵活的文档存储平台。
#mysqlx_socket = /tmp/mysqlx_13306.sock


# 服务器程序的配置(8306 数据库实例)。
[mysqld8306]
server_id = 8306
port = 8306
socket = /tmp/mysql_8306.sock
basedir = /data/local/mysql
datadir = /data/local/mysql/8306/data
log_error = /data/local/mysql/8306/log/error.log
pid_file = /data/local/mysql/8306/mysql.pid


# 服务器程序的配置,可管理多数据库实例。适用于 mysqld_multi。
[mysqld_multi]
user = root # 调用 mysqladmin 时使用的 MySQL 数据库的账号
pass = 123456789 # 调用 mysqladmin 时使用的 MySQL 数据库的密码
mysqld = /data/local/mysql/bin/mysqld_safe # 要使用的mysqld二进制文件。mysqld_safe是启动Unix上的 mysqld服务器的推荐方法。mysqld_safe添加了一些安全功能,例如在发生错误时重新启动服务器以及将运行时信息记录到错误日志中。
mysqladmin = /data/local/mysql/bin/mysqladmin # 用于停止服务器的mysqladmin二进制文件
log = /data/local/mysql/mysqld_multi.log


#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 客户端程序的配置 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


# 客户端程序的配置(所有数据库实例)。适用于 mysql、mysqladmin、mysqldump、mysqlimport、mysqlshow 等。
[client]
default-character-set = utf8mb4


# 客户端程序的配置(3306数据库实例)。
[client_3306]
socket = /tmp/mysql_3306.sock


# 客户端程序的配置(8306数据库实例)。
[client_8306]
socket = /tmp/mysql_8306.sock


# 客户端程序的配置(所有数据库实例)。适用于 mysql。
[mysql]
ssl-mode = DISABLED # 此选项用于指定与服务器连接时所需的安全状态。
# DISABLED:建立未加密的连接。
# PREFERRED:如果服务器支持加密连接,则建立加密连接;如果无法建立加密连接,则回退到未加密连接。如果未指定 --ssl-mode,则此为默认值。
# 通过 Unix 套接字文件建立的连接在 PREFERRED 模式下不会加密。若要强制对 Unix 套接字文件连接进行加密,请使用 REQUIRED 或更严格的模式。(然而,套接字文件传输默认是安全的,因此加密套接字文件连接并不会使其更安全,反而会增加 CPU 负载。)


# 客户端程序的配置(所有数据库实例)。适用于 mysqladmin。
[mysqladmin]
user = root # 连接 MySQL 服务器时使用的 MySQL 用户名
password = 123456789

初始化数据目录

https://dev.mysql.com/doc/refman/8.4/en/data-directory-initialization.html

--defaults-group-suffix :不仅读取常规的选项组,还读取具有常规名称并带有 str 后缀的组。例如,MySQL 客户端通常读取 [client] 和 [mysql] 组。如果将此选项设置为 –defaults-group-suffix=_other,MySQL 还会读取 [client_other] 和 [mysql_other] 组。

--defaults-file :仅读取指定的选项文件,默认读取 /etc/my.cnf~/.my.cnf 。例外情况:即使使用了 –defaults-file 选项,mysqld 仍会读取 mysqld-auto.cnf 文件,而客户端程序会读取 .mylogin.cnf 文件。

初始化数据目录,请使用 --initialize--initialize-insecure 选项调用 mysqld,具体取决于您是否希望服务器为 ‘root‘@’localhost’ 账户生成一个随机的初始密码,还是创建该账户时不设置密码:

  • 使用 --initialize 选项进行“默认安全”安装(即包括生成随机初始 root 密码)。在此情况下,密码会被标记为过期,您必须选择一个新密码。

  • 使用 --initialize-insecure 选项时,不会生成 root 密码。这不安全;假设您计划在将服务器投入生产使用前及时为该账户分配密码。

--user在 Unix 和类 Unix 系统上,确保数据库目录和文件属于哪个 Linux 系统用户是非常重要的,以便日后运行 mysqld 时,服务进程能正常读写这些文件。为了实现这一点,你应该用 Linux 系统的 root 用户启动 mysqld(初始化命令),并加上 --user=mysql 参数,以确保最终生成的文件归属 Linux 操作系统的 mysql 用户。见选项文件的 [mysqld] 组。

1
2
3
4
5
6
7
8
# 不会生成 root 密码
mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=3306 --initialize-insecure --user=mysql
mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=8306 --initialize-insecure --user=mysql

# 生成随机初始 root 密码,密码会被标记为过期
#mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=8306 --initialize --user=mysql
#cat /var/log/mysqld.log # 查看密码,root@localhost: 后面就是初始化的密码
#grep 'temporary password' /var/log/mysqld.log # 在/var/log/mysqld.log中查找临时密码,并打印匹配的行

启动

单实例

mysqld --user :以哪个 Linux 系统用户运行 mysqld 服务器。见选项文件的 [mysqld] 组。

mysqladmin --user :连接 MySQL 服务器时使用的 MySQL 用户名。见选项文件的 [mysqladmin] 组。

1
2
3
4
5
6
7
8
9
10
# 打印程序名称及其从选项文件获取的所有选项。密码值将被屏蔽。若使用此选项,它必须是命令行中的第一个选项,但允许紧接在 --defaults-file 或 --defaults-extra-file 之后使用。
mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=3306 --print-defaults
mysqladmin --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=_3306 --print-defaults

# 启动
mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=3306 &
mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=8306 &
# 关闭
mysqladmin --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=_3306 shutdown # 也可进入数据库,执行 shutdown; 语句。
mysqladmin --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=_8306 shutdown

多实例

mysqld_multi 用于管理(启动、停止、查看状态)多个 MySQL 实例仅搜索名为 [mysqldN] 的选项组。

mysqld_multi --user :调用 mysqladmin 时使用的 MySQL 数据库的账号。见选项文件的 [mysqld_multi] 组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# mysqld_multi [options] {start|stop|reload|report} [GNR[,GNR] ...]    多实例启动
mysqld_multi --defaults-file=/data/local/mysql/my.cnf report # 查看mysql服务
mysqld_multi --defaults-file=/data/local/mysql/my.cnf start # 启动所有组
mysqld_multi --defaults-file=/data/local/mysql/my.cnf start 3306,8306
mysqld_multi --defaults-file=/data/local/mysql/my.cnf stop # 关闭所有组
mysqld_multi --defaults-file=/data/local/mysql/my.cnf stop 3306,8306

# 若启动失败,请查看 mysqld_multi.log 或 各实例的错误日志
cat -n /data/local/mysql/mysqld_multi.log | tail -n 20 # 显示文件的最后 10 行。
cat -n /data/local/mysql/3306/log/error.log | tail -n 20
cat -n /data/local/mysql/3307/log/error.log | tail -n 20

# 清空日志文件
> /data/local/mysql/mysqld_multi.log
> /data/local/mysql/3306/log/error.log
> /data/local/mysql/3307/log/error.log

首次登录/远程访问/密码设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 使用 --initialize-insecure 初始化的数据目录,通过 Unix Socket 登录能自动通过认证。
mysql -u root --skip-password -S /tmp/mysql_3306.sock
# 使用 --initialize 初始化的数据目录,可通过用户名密码登录。
#mysql -u root -p -S /tmp/mysql_3306.sock

# 设置root远程访问
use mysql;
select host, user, plugin from mysql.user;
update mysql.user set host='%' where user='root';
flush privileges;

# 修改密码/设置密码
alter user 'root'@'%' identified by '123456789';
# 修改身份验证插件,并永久修改密码。8.0之后默认的身份验证插件是 caching_sha2_password
alter user 'root'@'%' identified with caching_sha2_password by '123456789' password expire never;
#alter user 'root'@'%' identified with mysql_native_password by '123456789' password expire never;

quit/exit # 退出当前会话

重置Root密码

https://dev.mysql.com/doc/refman/8.4/en/resetting-permissions.html

--skip-grant-tables

自动启停(多实例)

https://dev.mysql.com/doc/refman/8.4/en/automatic-start.html

Linux 服务管理有两种方式 service 和 systemd 。

systemd

使用 systemd 配置多个 MySQL 实例: https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html

由于 systemd 具备在已安装 systemd 支持的平台上管理多个 MySQL 实例的能力,因此 mysqld_multi 和 mysqld_multi.server 变得不再必要,且不会被安装。

@ 是 systemd 支持的唯一分隔符(模板单元标识符)。启动时 mysqld@实例名.service,systemd 会把 实例名 作为参数传递给模板单元文件,模板文件中可以通过 %i%I 等变量引用这个实例名。

创建 systemd 服务配置文件 vim /etc/systemd/system/mysqld@.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[Unit]
Description=MySQL server
Documentation=https://zh.wikipedia.org/wiki/Systemd
After=syslog.target network.target network-online.target
Wants=network-online.target

[Service]
Type=simple
# mysqld 前台运行,需配置 Type=simple
# mysqld_safe 后台运行,需配置 Type=forking,同时指定 PIDFile。测试 mysqld_safe 启动失败,可能需要配置选项组!!!
#PIDFile=/data/local/mysql/mysql-%I.pid

User=mysql
Group=mysql

ExecStart=/data/local/mysql/bin/mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=%I
ExecStop=/data/local/mysql/bin/mysqladmin --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=_%I shutdown
Restart=on-failure
RestartSec=10s
# 文件描述符的数量
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

systemd 服务管理工具 systemctl:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 重新加载systemd服务配置文件
systemctl daemon-reload

systemctl status mysqld@3306
systemctl status mysqld@8306
systemctl start mysqld@3306
systemctl start mysqld@8306
systemctl stop mysqld@3306
systemctl stop mysqld@8306
systemctl restart mysqld@3306
systemctl restart mysqld@8306

# 开机自启
systemctl enable mysqld@3306
systemctl enable mysqld@8306
# 关闭自启
systemctl disable mysqld@3306
systemctl disable mysqld@8306

# 查看systemd journal日志
journalctl -u mysqld@3306
journalctl -u mysqld@8306

service

新增启动文件 vim /etc/init.d/mysqld_multi ,或从mysql目录中复制并修改 cp /data/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/sh
#
# A simple startup script for mysqld_multi by Tim Smith and Jani Tolonen.
# This script assumes that my.cnf file exists either in /etc/my.cnf or
# /root/.my.cnf and has groups [mysqld_multi] and [mysqldN]. See the
# mysqld_multi documentation for detailed instructions.
#
# This script can be used as /etc/init.d/mysql.server
#
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 64 36
# description: A very fast and reliable SQL database engine.
#
# Version 1.0
#

basedir=/data/local/mysql
bindir=/data/local/mysql/bin
export PATH=$bindir:$PATH

if test -x $bindir/mysqld_multi
then
mysqld_multi="$bindir/mysqld_multi";
else
echo "Can't execute $bindir/mysqld_multi from dir $basedir";
exit;
fi

case "$1" in
'start' )
"$mysqld_multi" --defaults-file=/data/local/mysql/my.cnf start $2
;;
'stop' )
"$mysqld_multi" --defaults-file=/data/local/mysql/my.cnf stop $2
;;
'report' )
"$mysqld_multi" --defaults-file=/data/local/mysql/my.cnf report $2
;;
'restart' )
"$mysqld_multi" --defaults-file=/data/local/mysql/my.cnf stop $2
"$mysqld_multi" --defaults-file=/data/local/mysql/my.cnf start $2
;;
*)
echo "Usage: $0 {start|stop|report|restart}" >&2
;;
esac

启动

1
2
3
4
5
6
7
chmod 750 /etc/init.d/mysqld_multi

service mysqld_multi report
service mysqld_multi start
service mysqld_multi start 3306,3307
service mysqld_multi stop
service mysqld_multi stop 3306,3307

设置开机启动

1
2
3
# 设置 mysqld_multi 服务在运行级别为2、3、4、5时启动。--level 指定读系统服务要在哪一个Linux运行级别中开启或关闭。
chkconfig --level 2345 mysqld_multi on
chkconfig --level 2345 mysqld_multi off

两种自启动区别

systemd 使用 mysqld 启动服务器。

service 使用 mysqld_multi 管理服务器,启动程序由 [mysqld_multi] 组的 mysqld 选项指定,默认是 mysqld,本文指定为 mysqld_safe。