MySQL_01安装与使用

Windows 和 Linux 版安装详细步骤。

常用语句

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
# 创建数据库
create database if not exists basedb;
create database if not exists archedb;
# 创建用户
create user if not exists 'base'@'%' identified by '123456789',
'arche'@'%' identified by '123456789';
# 创建角色并授予权限
create role if not exists 'baserole'@'%', 'archerole'@'%';
grant all privileges on basedb.* to 'baserole'@'%';
grant all privileges on archedb.* to 'archerole'@'%';
#grant select on *.* to 'baserole'@'%';
#grant select on *.* to 'archerole'@'%';
grant replication slave on *.* to 'baserole'@'%'; # 将任何库下任何表的主从复制权限授予给角色
# 给用户赋予角色
grant 'baserole' to 'base'@'%';
grant 'archerole' to 'arche'@'%';
# 激活角色
set default role all to 'base'@'%', 'arche'@'%';
flush privileges;

show databases;
select host, user, plugin from mysql.user;
show grants for 'baserole'@'%';
show grants for 'base'@'%';
show tables from basedb;


# 删除角色
drop role if exists 'baserole', 'archerole';
# 删除用户
drop user if exists 'base'@'%', 'arche'@'%';
# 删除数据库
drop database if exists basedb;
drop database if exists archedb;

官方doc

mysqld、mysqld_safe、mysqld_multi 会识别配置文件中哪个组的哪些选项?

URL
MySQL命令行程序
https://dev.mysql.com/doc/refman/8.4/en/programs.html
https://dev.mysql.com/doc/refman/8.4/en/program-options.html 程序选项(配置文件读取顺序)
https://dev.mysql.com/doc/refman/8.4/en/option-files.html 使用选项文件(处理顺序、语法)
https://dev.mysql.com/doc/refman/8.4/en/programs-server.html
https://dev.mysql.com/doc/refman/8.4/en/programs-client.html
https://dev.mysql.com/doc/refman/8.4/en/mysql.html MySQL命令行程序-客户端
mysqld是MySQL服务器
https://dev.mysql.com/doc/refman/8.4/en/mysqld-server.html
https://dev.mysql.com/doc/refman/8.4/en/server-configuration-validation.html 服务器配置验证
https://dev.mysql.com/doc/refman/8.4/en/server-option-variable-reference.html mysqld中适用的所有命令行选项、系统变量和状态变量
https://dev.mysql.com/doc/refman/8.4/en/server-options.html 命令行选项
https://dev.mysql.com/doc/refman/8.4/en/server-system-variable-reference.html 系统变量
https://dev.mysql.com/doc/refman/8.4/en/server-status-variable-reference.html 状态变量
MySQL插件
https://dev.mysql.com/doc/refman/8.4/en/server-plugins.html

Windows(ZIP包)

配置环境变量

解压 zip 包到 D:\Program Files\

1
2
3
4
5
MYSQL_HOME
D:\database\mysql-8.0.33-winx64

# 追加到Path
%MYSQL_HOME%\bin

配置文件my.ini

创建 my.ini 配置文件,从MySQL8.0开始,数据库的默认编码为utf8mb4。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[client]
# 客户端符集,utf8字符集指向的是utf8mb3
default-character-set=utf8mb4

[mysqld]
# 设置3306端口
port = 3306
# 允许最大连接数
max_connections=200
# 服务端字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 大小写不敏感
lower_case_table_names=1
# 建立全局密码过期策略,设置密码每隔180天过期
default_password_lifetime=180
# 所有角色永久激活
activate_all_roles_on_login=on
# 默认时区
default-time-zone='+00:00'

lower_case_file_system:此变量描述数据所在的操作系统的文件目录是否区分大小写。ON 大小写不敏感,OFF 大小写敏感。此变量只读,因为它反映了文件系统的属性,设置它对文件系统没有影响。

lower_case_table_names库表是否大小写敏感,可以修改,参数有三种。

  • **0:Unix、Linux 的默认值。**表名存储为给定的大小和比较是区分大小写的
  • **1:Windows的默认值。**表名存储在磁盘是小写的,但是比较的时候是不区分大小写
  • **2:Mac OS X的默认值。**表名存储为给定的大小写但是比较的时候是小写的

安装和卸载

为了避免不必要的麻烦,下文命令均用管理员执行。

1
2
3
4
5
6
# 初始化数据目录,执行完成后会输出root用户的初始默认密码。默认data目录在MYSQL_HOME下创建。可删除data目录再次执行此命令。
C:\> mysqld --initialize --console
# 安装服务
C:\> mysqld --install 服务名 # 默认服务名为MySQL
# 卸载服务
C:\> mysqld --remove 服务名 # 默认服务名为MySQL

mysql.exe 是一个命令行客户端,用于以交互方式或批处理模式执行SQL语句。

mysqld.exe 是一个服务。d 的全拼是 daemon,也就是守护程序的意思,常驻与后台。

1
2
3
# Linux系统里服务一般都是以d结尾,比如httpd,mysqld等。在开启服务时要用服务的名字
systemctl start mysqld.service
service stop mysqld

启动

使用服务启动,或命令启动

1
2
3
4
5
6
7
# 启动MySQL服务
C:\> net start MySQL服务名
# 停止MySQL服务
C:\> net stop MySQL服务名

# Windows下默认服务名mysql,而Linux下服务名mysqld
C:\> net start mysql

登录

1
mysql -h 主机名 -P 端口号 -u 用户名 -p密码

如果我们要登录本机的 MySQL 数据库,只需要输入以下命令即可:

1
C:\> mysql -u root -p

注意:

-p与密码之间不能有空格,其他参数名与参数值之间可以有空格也可以没有空格。如:

1
C:\> mysql -hlocalhost -P3306 -uroot -pabc123

密码建议在下一行输入,保证安全

1
2
C:\> mysql -h localhost -P 3306 -u root -p
Enter password:****

客户端和服务器在同一台机器上,所以输入localhost或者IP地址127.0.0.1。同时,因为是连接本 机: -hlocalhost就可以省略,如果端口号没有修改:-P3306也可以省略,简写成:

1
2
C:\> mysql -u root -p
Enter password:****

连接成功后,有关于MySQL Server服务版本的信息,还有第几次连接的id标识

也可以在命令行通过以下方式获取MySQL Server服务版本的信息:

1
2
c:\> mysql -V
c:\> mysql --version

登录后,通过以下方式查看当前版本信息:

1
mysql> select version();

密码设置

登录后执行

1
2
mysql> alter user 'root'@'localhost' identified by '123456789' password expire never;
mysql> flush privileges;

flush privileges; 将当前 user 和 privilige 表中的 用户信息/权限设置 从 mysql 库( MySQL 数据库的内置库)中提取到内存里。 MySQL 用户数据和权限有修改后,希望在不重启MySQL服务的情况下直接生效,那么就需要执行这个命令。

常见问题

客户端字符集

若MySQL服务器配置的服务端和客户端字符集是utf-8,而你的客户端的字符集是GBK,则会出现乱码。

解决方案,设置当前连接的客户端字符集 set names utf8; ,等同于

1
2
3
SET character_set_client='utf8';
SET character_set_connection='utf8';
SET character_set_results='utf8';

修改数据库和表的字符编码

修改编码: (1)先停止服务,(2)修改my.ini文件(3)重新启动服务

说明:如果是在修改 my.ini 之前建的库和表,那么库和表的编码还是原来的Latin1,要么删了重建,要么使用 alter语句修改编码。

1
2
3
4
5
6
7
8
mysql> create database testdb charset Latin1;
mysql> use testdb;
mysql> show create table student\G
mysql> alter table student charset utf8mb4; # 修改表字符编码为utf8mb4
mysql> show create table student\G
mysql> alter table student modify name varchar(20) charset utf8mb4; #修改字段字符编码为utf8mb4
mysql> show create database testbd;
mysql> alter database testdb charset utf8mb4; # 修改数据库的字符编码为utf8

Linux

安装方式

YUM

傻瓜式,安装后文件分散

RPM包

掌握,安装后文件分散

通用二进制文件(二进制GLIBC)

掌握,无需编译,推荐

源码编译

了解

关闭防火墙

1
2
3
4
5
firewall-cmd --state
systemctl start firewalld
systemctl stop firewalld
systemctl enable firewalld
systemctl disable firewalld

禁用 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

下载

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

1
2
3
Select Version: 8.4.4 LTS
Select Operating System: Red Hat Enterprise Linux / Oracle Linux
Select OS Version: Red Hat Enterprise Linux 8 / Oracle Linux 8 (x86, 64-bit)

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

检查&卸载

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
rpm -qa | grep -i mysql # -a 查询所有套件;-q 使用询问模式;-i 忽略大小写
yum list installed | grep mysql # 列出已安装的安装包
yum remove \
mysql-community-server-8.4.4-1.el8.x86_64 \
mysql-community-libs-8.4.4-1.el8.x86_64 \
mysql-community-client-8.4.4-1.el8.x86_64 \
mysql-community-common-8.4.4-1.el8.x86_64 \
mysql-community-icu-data-files-8.4.4-1.el8.x86_64 \
mysql-community-client-plugins-8.4.4-1.el8.x86_64 # 卸载上述命令查询出的已安装程序
rpm -qa | grep -i mysql # 确认是否残留

find / -name mysql # 按文件名查找
rm -rf \
/var/lib/mysql \
/var/lib/mysql/mysql \
/var/lib/selinux/targeted/active/modules/100/mysql \
/usr/lib64/mysql \
/usr/share/bash-completion/completions/mysql \
/usr/share/selinux/targeted/default/active/modules/100/mysql # 删除上述命令查找出的相关文件
find / | grep .*mysql.*

rpm -qa | grep -i mariadb # 检查是否安装mariadb。Redhat默认安装
#rpm -e xxx xxx xxx # -e 删除指定组件。删除上述输出组件。rpm不会自行解决依赖,可以通过错误信息找到依赖项,指定多个要删除的组件
yum remove \
mariadb-connector-c-3.1.11-2.el8_3.x86_64 \
mariadb-connector-c-config-3.1.11-2.el8_3.noarch # 推荐使用
find / -name my.cnf # 删除所有查询出的配置文件

# 检查依赖组件
rpm -qa | grep libaio
rpm -qa | grep net-tools

安装

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mkdir -p /opt/local/mysql # -p 确保目录名称存在,不存在的就建一个。
cd /opt/local/mysql
#tar -xvf mysql-8.4.3-1.el8.x86_64.rpm-bundle.tar -C /opt/local/mysql
tar -xvf mysql-8.4.3-1.el8.x86_64.rpm-bundle.tar

rpm -ivh --test mysql-community-server-8.4.4-1.el8.x86_64.rpm # 仅作测试,并不真的安装套件。检查依赖关系(解析依赖/检查依赖)
# 以下组件按顺序安装,可全选复制粘贴执行
rpm -Uivh mysql-community-common-8.4.4-1.el8.x86_64.rpm # 服务器和客户端库的通用文件。-U 升级指定的套件档。
rpm -ivh mysql-community-client-plugins-8.4.4-1.el8.x86_64.rpm # 客户端应用程序的共享插件
rpm -ivh mysql-community-libs-8.4.4-1.el8.x86_64.rpm # 数据库客户端应用程序的共享库
rpm -ivh mysql-community-client-8.4.4-1.el8.x86_64.rpm # 客户端应用程序和工具
rpm -ivh mysql-community-icu-data-files-8.4.4-1.el8.x86_64.rpm # 包装 MySQL 正则表达式所需的 ICU 数据文件
rpm -ivh mysql-community-server-8.4.4-1.el8.x86_64.rpm # 数据库服务器及相关工具

rpm -qa | grep -i mysql

mysql --version
#
mysqladmin --version

创建数据目录

初始化数据目录时会自动创建,也可以自己创建并写到配置,下面授予权限

1
2
3
4
# 初始化数据目录时如果没有--user选项,需要向mysql用户和mysql组授予目录所有权,并适当设置目录权限,否则服务启动失败
# 将指定文件的拥有者改为指定的用户或组。chown [-cfhvR] [--help] [--version] user[:group] file...
#chown -R mysql:mysql /var/lib/mysql # -R 处理指定目录以及其子目录下的所有文件
#chmod 777 /var/lib/mysql # 权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

修改配置

备份默认配置文件 cp /etc/my.cnf /etc/my.cnf.back ,修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[client]
default-character-set=utf8mb4


[mysqld]
datadir = /var/lib/mysql
log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
secure_file_priv = /var/lib/mysql-files
server_id = 1
port = 3306
socket = /var/lib/mysql/mysql.sock
########################################################################################
#################### 下面是通用配置,请参考下文选项文件中得[mysqld]组 ####################

初始化数据目录

1
2
3
4
5
6
7
8
9
####### 该命令不会覆盖任何现有mysql模式表,因此在任何情况下都可以安全运行 #######

mysqld --verbose --help | grep initialize
mysqld --verbose --help | grep user

mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql
#mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql
#grep 'temporary password' /var/log/mysqld.log # 在/var/log/mysqld.log中查找临时密码,并打印匹配的行
#cat /var/log/mysqld.log # 查看密码,root@localhost: 后面就是初始化的密码

在Unix和类Unix系统上,数据库目录和文件必须由mysql登录帐户拥有(规范操作),以便服务器在以后运行时具有对它们的读写访问权限。为了确保这一点,从系统root帐户启动mysqld并包含–user选项,如下所示:

mysqld –initialize –user=mysql # “默认安全”安装(即,包括生成随机初始root密码)。在这种情况下,密码被标记为已过期,您必须选择一个新密码。密码太难输啦

mysqld –initialize-insecure –user=mysql # 不会生成root密码,这是不安全的;假定您打算在将服务器投入生产使用之前及时为帐户分配密码。推荐

或者,在以mysql身份登录时执行mysqld,在这种情况下,您可以从命令中省略–user选项。在 Windows 上,使用以下命令之一:

mysqld –initialize –console
mysqld –initialize-insecure –console

启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
systemctl status mysqld.service # 查看状态
systemctl start mysqld.service # 启动服务。网上说第一次启动会根据mysql配置文件自动初始化(未测试),查看临时密码见上文
systemctl stop mysqld.service # 关闭服务
systemctl restart mysqld.service # 重启服务

systemctl list-unit-files | grep mysqld.service # 查看服务是否自启动
systemctl disable mysqld.service # 关闭自启动
systemctl enable mysqld.service # 打开自启动

ps -ef | grep -i mysql # 查看进程

ll /root/.cache/vmware/drag_and_drop/
rm -rf /root/.cache/vmware/drag_and_drop/*

首次登录

1
2
3
4
5
# 使用 --initialize-insecure 初始化后的登录方式
mysql -u root --skip-password
# 使用 --initialize 初始化后的登录方式
mysql -hlocalhost -P3306 -uroot -p
mysql -u root -p

通用二进制文件(使用中

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

下载

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

1
rpm -qa | grep glibc # 需根据操作系统glibc版本选择

image-20240927194202683

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

Compressed TAR Archive, Minimal Installmysql-8.4.3-linux-glibc2.17-x86_64-minimal.tar.xz ,最小安装,不包括调试二进制文件,并去掉了调试符号。貌似 glibc 2.17 之后不提供了

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

检查&卸载

先按 RPM包 -> 检查&卸载 操作一遍,然后继续:

1
2
3
4
5
rpm -qa | grep -i ncurses-compat-libs # -a 查询所有套件;-q 使用询问模式;-i 忽略大小写
yum install ncurses-compat-libs

yum deplist perl # 检查依赖组件/组件依赖
yum install perl

安装

1
2
3
4
5
6
7
8
mkdir -p /opt/local/mysql
cd /opt/local/
tar xvf mysql-8.4.3-linux-glibc2.28-x86_64.tar.xz
mv /opt/local/mysql-8.4.3-linux-glibc2.28-x86_64/* /opt/local/mysql/
rm -rf /opt/local/mysql-8.4.3-linux-glibc2.28-x86_64

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

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

1
2
3
4
5
6
# 在/etc/profile文件末尾添加
echo "export PATH=/opt/local/mysql/bin:$PATH" >> /etc/profile
#vim /etc/profile
#export PATH=$PATH:/opt/local/mysql/bin
# 使环境变量生效
source /etc/profile

创建数据目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建各实例数据存放目录
mkdir -p /opt/local/mysql/3306/{data,log,mysql-files}
mkdir -p /opt/local/mysql/3307/{data,log,mysql-files}
# 创建各实例error日志,可省略,会自动创建
#touch /opt/local/mysql/3306/log/error.log
#touch /opt/local/mysql/3307/log/error.log

tree /opt/local/mysql # 以树状图列出目录的内容。-d 显示目录名称而非内容。

groupadd mysql # 创建组
useradd -r -g mysql -s /bin/false mysql # 创建用户。-g 指定所属群组;-s 指定用户登入后所使用的shell。
chown -R mysql:mysql /opt/local/mysql # 设置文件拥有者,user:group
#chmod 770 /opt/local/mysql # 权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

#userdel -r mysql # -r 删除用户登入目录以及目录中所有文件
#groupdel mysql # 必须先删除群组下的用户

修改配置

登录MySQL可查看变量: show variables like '%secure_file_priv%';

新建配置文件 vim /opt/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
# mysqld_safe命令:读取 [mysqld]、[server]、[mysqld_safe] 选项组。
# mysqld_multi命令: 读取 [mysqld_multi]、[mysqldN] 选项组。[mysqld_multi] 组可用于 mysqld_multi 本身的选项。 [mysqldN] 组可用于传递给特定 mysqld 实例的选项。

[client]
default-character-set = utf8mb4


[mysqld]
####################################################################################################################################################################################################
user = mysql # 以哪个系统账户运行mysqld
bind_address = * # 当绑定多个值时,不允许通配符。不支持正则。IP地址必须存在。
basedir = /opt/local/mysql # MySQL基本安装目录。服务器可执行文件在启动时确定自己的完整路径名,并使用其所在目录的父目录作为默认basedir值。
local_infile = OFF #
mysqlx = OFF #
lc_messages_dir = /opt/local/mysql/share #
lc_messages = en_US # 在这种情况下,mysqld将区域设置en_US映射到语言english,并在/opt/local/mysql/share/english目录中查找错误文件
default_password_lifetime = 180 # 全局密码自动过期策略,每N天修改一次
#mysql-native-password = ON # 8.4中默认禁用,9.0.0开始被删除
max_connections = 10 # 允许同时连接的最大客户端数量,默认151,最小1,最大100000。最大有效值为 (open_files_limit 的有效值 - 810) 与 max_connections 实际设置的值中的较小者。状态变量 connection_errors_max_connections:由于达到服务器 max_connections 限制,因此拒绝的连接数。
back_log = -1 # 表示在MySQL暂时停止响应新请求之前,在这段短时间内可以堆叠多少个请求。仅当您预计在短时间内会有大量连接时才需要增加此值。默认值 -1(表示自动调整大小;不要分配该文字值),默认调整为 max_connections 的值。
max_connect_errors = 100 # 当主机的 max_connect_errors 次连续连接请求被中断且未成功连接时,服务器将阻止该主机继续连接。
character_set_server = utf8mb4 # 服务默认字符集
lower_case_table_names = 1 # 此选项适用于数据库名称和表名称。0:存储区分大小写,比较区分大小写; 1:存储小写,比较不区分大小写; 2:存储区分大小写,比较小写
default-time-zone = '+08:00' # 设置服务器默认时区,若未指定则与系统时区相同
skip-grant-tables = OFF # 需重启。该配置使所有用户登录当前数据库都免密,修改密码后立即去掉。
activate_all_roles_on_login = OFF #
default_storage_engine = InnoDB # 为永久表设置存储引擎
default_tmp_storage_engine = InnoDB # 临时表的默认存储引擎
log_timestamps = SYSTEM
transaction_isolation = REPEATABLE-READ # 设置默认事务隔离级别
max_allowed_packet = 67108864 # 默认67108864(64MB),最小1024。
tmp_table_size = 16777216 # 默认16777216(16MB),最小1024,
max_heap_table_size = 16777216 # 默认16777216(16MB),最小16384(16KB)
init_connect = 'SET NAMES utf8mb4' # 服务器将为每个连接的客户端执行的字符串。
#################################### 线程 ###################################
thread_cache_size = -1 # 服务器应缓存多少个线程以供重复使用。当客户端断开连接时,如果缓存中的线程数少于 thread_cache_size,则该客户端的线程将被放入缓存中。默认值 -1(表示自动调整大小;不要分配该文字值),默认值基于以下公式,上限为100: 8 + (max_connections / 100)。可以结合状态变量调整线程池大小 show global status like 'Thread%'。
thread_stack = 1048576 # 每个线程的堆栈大小。默认值对于正常操作来说足够大。如果线程堆栈大小太小,则会限制服务器可以处理的SQL语句的复杂性、存储过程的递归深度以及其他消耗内存的操作。默认1048576(1MB),最小131072(128KB)。
wait_timeout = 28800 # 默认28800。服务器在关闭 非交互式连接 之前等待该连接活动的秒数。在线程启动时,会话 wait_timeout 值从全局 wait_timeout 值或全局 interactive_timeout 值初始化,取决于客户端的类型(由 mysql_real_connect() 的 CLIENT_INTERACTIVE 连接选项定义)。
interactive_timeout = 28800 # 默认28800。服务器在关闭 交互式连接 之前等待该连接活动的秒数。交互式客户端定义为使用 mysql_real_connect() 的 CLIENT_INTERACTIVE 选项的客户端。另请参阅 wait_timeout。
#################################### 用户进程分配到的内存 #####################
sort_buffer_size = 262144 # 每个必须执行排序的会话都会分配一个该大小的缓冲区。不特定于任何存储引擎,并且以通用方式应用以进行优化。值必须足够大,以便在排序缓冲区中容纳十五个元组。增加 max_sort_length 的值可能需要增加 sort_buffer_size 的值。如果您在 SHOW GLOBAL STATUS 输出中看到每秒有许多 Sort_merge_passes,则可以考虑增加 sort_buffer_size 值以加快无法通过查询优化或改进索引来改进的 ORDER BY 或 GROUP BY 操作。默认262144(256KB),最小32768(32KB)。
join_buffer_size = 262144 # 用于 普通索引扫描、范围索引扫描、不使用索引并因此执行全表扫描 的连接,所使用的缓冲区的最小大小。默认262144(256KB),最小128。
read_buffer_size = 131072 # 对MyISAM表进行顺序扫描的每个线程都会为其扫描的每个表分配一个此大小(以字节为单位)的缓冲区。如果执行多次顺序扫描,您可能需要增加该值,默认131072(128KB),最小8192(8KB)。
binlog_cache_size = 32768 # 当服务器上启用二进制日志记录时,如果服务器支持任何事务存储引擎,则为每个客户端分配一个二进制日志缓存。如果事务的数据超出了内存缓冲区的空间,则超出的数据将存储在临时文件中。默认32768(32KB),最小4096。
max_binlog_cache_size = 18446744073709547520 # 如果事务需要超过这么多字节,服务器会生成多语句事务需要超过“max_binlog_cache_size”字节的存储错误。当gtid_mode不为ON时,最大推荐值为4GB,因为在这种情况下,MySQL无法使用大于4GB的二进制日志位置;该选项仅设置事务缓存的大小;语句缓存的上限由 max_binlog_stmt_cache_size 系统变量控制。最小4096。
key_buffer_size = 8388608 # MyISAM 表的索引块被缓冲并由所有线程共享。该选项是用于索引块的缓冲区的大小。密钥缓冲区也称为密钥缓存。默认8388608(8MB),最小0。
#################################### Innodb #################################
innodb_buffer_pool_size = 134217728 # 缓冲池的大小(以字节为单位),InnoDB 缓存表和索引数据的内存区域。默认134217728(128MB),最小5242880(5MB)。
innodb_buffer_pool_instances = 1 # InnoDB缓冲池划分的区域数。对于缓冲池大小在几GB范围内的系统,将缓冲池划分为单独的实例可以提高并发性,因为不同线程读取和写入缓存页面时会减少争用。使用哈希函数将存储在缓冲池中或从缓冲池读取的每个页面随机分配给其中一个缓冲池实例。每个缓冲池管理自己的空闲列表、刷新列表、LRU 以及连接到缓冲池的所有其他数据结构,并受自己的缓冲池互斥锁保护。\n 总缓冲池大小在所有缓冲池之间分配。为了获得最佳效率,请指定 innodb_buffer_pool_instances 和 innodb_buffer_pool_size 的组合,以便每个缓冲池实例至少为 1GB。
innodb_buffer_pool_dump_pct = 25 # 指定每个缓冲池要读出并转储的最近使用的页面的百分比。范围是 1 到 100。默认值为 25。例如,如果有 4 个缓冲池,每个缓冲池有 100 个页面,并且 innodb_buffer_pool_dump_pct 设置为 25,则会转储每个缓冲池中最近使用的 25 个页面。人话:MySQL正常关闭时把buffer中页信息保存到磁盘,启动后再从磁盘加载到buffer,实现服务器快速预热。
innodb_data_file_path = ibdata1:12M:autoextend # 定义InnoDB系统表空间数据文件的名称、大小和属性。file_name:file_size[:autoextend[:max:max_file_size]]
innodb_file_per_table = ON # ON:在每表文件的表空间中创建表(独立表空间); OFF:在系统表空间中创建表(系统表空间)
#innodb_flush_method = 0 # 定义将数据刷新到InnoDB数据文件和日志文件的方法,这会影响I/O吞吐量。Unix默认选项:4或0,Windows默认选项:0。

innodb_redo_log_archive_dirs = NULL # 定义可创建重做日志存档文件的带标签目录。您可以在以分号分隔的列表中定义多个带标签目录。默认值为NULL,不允许激活重做日志归档。
innodb_redo_log_capacity = 104857600 # 默认104857600(100MB)。定义重做日志文件占用的磁盘空间量。已经取代 innodb_log_file_size 和 innodb_log_files_in_group。总共的redo日志文件大小其实就是: innodb_log_file_size * innodb_log_files_in_group。
innodb_log_buffer_size = 67108864 # redo log bufer。默认67108864(64MB),最小1048576(1MB)。InnoDB用于写入磁盘日志文件的缓冲区大小。较大的日志缓冲区使得大型事务能够运行,而无需在事务提交之前将日志写入磁盘。因此,如果您有更新、插入或删除多行的事务,则增大日志缓冲区可以节省磁盘 I/O。尚硅谷:为了提高性能,也是先将信息写入 Innodb Log Buffer 中,当满足 innodb_flush_log_trx_commit 参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)中。
innodb_flush_log_at_trx_commit = 1 # 从redo log bufer刷盘到redo log file的策略。为了在使用事务的复制设置中实现持久性和一致性InnoDB,始终设置 innodb_flush_log_at_trx_commit=1 (完全符合 ACID 要求,默认设置 1。每次提交事务时,日志都会写入并刷新到磁盘)。

innodb_undo_tablespaces = 2 # 定义InnoDB使用的undo表空间的数量。默认值和最小值为2,最大值127。
innodb_undo_log_truncate = ON # 启用后,超过 innodb_max_undo_log_size 定义的阈值的undo表空间将被标记为截断。只有undo表空间才能被截断。不支持截断驻留在系统表空间中的undo日志。要进行截断,必须至少有两个undo表空间。
innodb_max_undo_log_size = 1073741824 # 定义undo表空间的阈值大小。如果undo表空间超出阈值,则在启用 innodb_undo_log_truncate 时可以将其标记为截断。默认1073741824(1GB),最小10485760(10MB)。

innodb_print_all_deadlocks = OFF # 当启用此选项时,有关 InnoDB 用户事务中的所有死锁的信息都将记录在 mysqld 错误日志中。

innodb_flush_sync = ON # 默认启用,在检查点发生 I/O 活动突发期间,会忽略 innodb_io_capacity 和 innodb_io_capacity_max 配置。为了遵守 innodb_io_capacity 和 innodb_io_capacity_max 定义的 I/O 速率,请禁用 innodb_flush_sync。
innodb_io_capacity = 200 # 默认值10000。定义InnoDB后台任务可用的每秒 I/O 操作数 (IOPS),例如从缓冲池刷新页面和从更改缓冲区合并数据。人话:缓冲区刷新到磁盘时,每秒刷新的脏页数量;
innodb_io_capacity_max = 400 # 默认 2 * innodb_io_capacity。
innodb_read_io_threads = 4 # 默认值为 CPUCore / 2。 InnoDB 中用于读取操作的 I/O 线程数。写入线程的对应项是 innodb_write_io_threads。
innodb_write_io_threads = 4 # 默认值为 4。 InnoDB 中用于写入操作的 I/O 线程数。读取线程的对应项是 innodb_read_io_threads。
innodb_lock_wait_timeout = 50 # InnoDB 事务在放弃之前等待行锁的时间长度(以秒为单位)。默认值为 50 秒。
#################################### Table ##################################
table_open_cache = 4000 # 所有线程打开的表的数量。增加此值会增加 mysqld 所需的文件描述符的数量。默认 4000 = MAX((open_files_limit - 10 - max_connections) / 2, 400),最大524288。
table_definition_cache = -1 # 范围 400 ~ 524288。默认值-1(表示自动调整大小;不要分配该文字值)。
#################################### Open ###################################
open_files_limit = 8161 # 操作系统中 mysqld 可用的文件描述符数量。默认 8161 = 10 + max_connections + (table_open_cache * 2),该值是从三种计算方式中取的最大值,详见官网。
#################################### 主从复制 ################################
#log-bin=mysql-bin
#master_info_repository
#relay_log_info_repository
#log_slave_updates
#relay_log_recovery
#slave_skip_errors
#################################### 日志相关 ################################
# flush logs:关闭并重新打开服务器正在写入的任何常规查询日志文件。https://dev.mysql.com/doc/refman/8.4/en/flush.html ######
########## 通用查询日志,记录用户的所有操作 ##########
general_log = OFF # 是否启用通用查询日志。日志输出的目标由 log_output 系统变量控制;如果该值为 NONE,则即使启用了日志也不会写入任何日志条目。默认OFF。
general_log_file = localhost.log # 通用查询日志文件的名称。默认值host_name.log。
########## 慢查询日志 ##########
long_query_time = 10 # 如果查询花费的时间超过这么多秒,服务器将增加Slow_queries状态变量。如果启用了慢查询日志,则查询将记录到慢查询日志文件中。默认值10秒,最小0秒。
slow_query_log = ON # 是否启用慢查询日志。日志输出的目的地由log_output系统变量控制;如果该值为 NONE,则即使启用了日志也不会写入任何日志条目。“慢”由 long_query_time 变量的值决定。默认OFF。
slow_query_log_file = localhost-slow.log # 慢查询日志文件的名称。默认值 host_name-slow.log。
log_queries_not_using_indexes = ON # 如果在启用慢查询日志的情况下启用此变量,则会记录预期检索所有行的查询。此选项并不一定意味着不使用索引。例如,使用完整索引扫描的查询使用索引,但会被记录,因为索引不会限制行数。默认OFF。
log_throttle_queries_not_using_indexes = 0 # 如果启用了 log_queries_not_using_indexes,则 log_throttle_queries_not_using_indexes 变量会限制每分钟可写入慢查询日志的此类查询的数量。默认值0,表示“无限制”。
min_examined_row_limit = 0 # 检查少于此行数的查询将不会记录到慢查询日志中。设置此系统变量的会话值是一项受限制的操作。会话用户必须具有足够的权限才能设置受限制的会话变量。默认值0。
log_slow_replica_statements = ON # 开启从服务器的慢查询日志。请查阅官网...
########## 二进制日志,变更日志 ##########
log-bin = binlog # 二进制日志文件名称,也可以加上路径 /opt/local/mysql/3306/data/binlog。数据库文件最好不要与日志文件放在同一个磁盘上,当数据库文件所在的磁盘发生故障时,可以使用日志文件恢复数据。
binlog_expire_logs_seconds = 2592000 # 设置二进制日志的有效期(以秒为单位)。有效期结束后,二进制日志文件可以被自动删除。可能的删除发生在启动时以及二进制日志刷新时。可以通过将 binlog_expire_logs_auto_purge 系统变量设置为 OFF 来禁用二进制日志的自动清除。此设置优先于 binlog_expire_logs_seconds 的任何设置。要手动删除二进制日志文件,请使用 PURGE BINARY LOGS 语句。默认2592000秒(30天)。
binlog_expire_logs_auto_purge = ON # 启用或禁用二进制日志文件的自动清除。清除之前等待的间隔由 binlog_expire_logs_seconds 控制。即使 binlog_expire_logs_auto_purge 处于 ON 状态,将 binlog_expire_logs_seconds 设置为 0 也会停止自动清除。此变量对 PURGE BINARY LOGS 没有影响。默认值ON。
max_binlog_size = 200M # 每次重启会新建。事务以一个块的形式写入二进制日志,因此它永远不会被拆分到多个二进制日志中。因此,如果您有大型事务,您可能会看到二进制日志文件大于 max_binlog_size。如果 max_relay_log_size 为 0,则 max_binlog_size 的值也适用于中继日志。最大值和默认值为1073741824(1GB)。
log_bin_trust_function_creators = OFF # 此变量在启用二进制日志记录时适用。限制存储过程,因为二进制日志的一个重要功能是用于主从复制,而存储函数(now())有可能导致主从的数据不一致。所以当开启二进制日志后,需要限制存储函数的创建、修改、调用。
binlog_format = ROW # 默认ROW(MIXED、STATEMENT、ROW)。
binlog_row_image = full #
binlog-ignore-db = test # 不要复制的数据库
binlog-do-db = basedb # 需要复制的数据库
sync_binlog = 1 # 为了在使用事务的复制设置中实现持久性和一致性InnoDB,如果启用了二进制日志记录,请设置 sync_binlog=1。
########## 中继日志,从库 ##########
relay_log = relaylog # 中继日志文件名称
#################################### 其他 ###################################
max_execution_time = 0 # 默认值0,不启用超时。SELECT语句的执行超时时间(以毫秒为单位)。存储程序中的 SELECT 语句会忽略 max_execution_time。
read_only = OFF
####################################################################################################################################################################################################


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


# 3306 数据库实例
[mysqld3306]
basedir = /opt/local/mysql # MySQL安装基目录的路径。
datadir = /opt/local/mysql/3306/data # MySQL服务器数据目录的路径。相对路径是相对于当前目录解析的。如果您希望服务器自动启动(即在您无法提前知道当前目录的环境中),最好将 datadir 值指定为绝对路径。
log-error = /opt/local/mysql/3306/log/error.log # 将默认错误日志目标设置为指定的文件。这会影响以默认目标为基础输出目标的日志接收器。如果该选项没有指定文件,则 Unix 和类 Unix 系统上的默认错误日志目标是数据目录中名为 host_name.err 的文件。
pid-file = /opt/local/mysql/3306/mysql3306.pid # 5.7建议两层目录,否则启动时可能会卡住
secure_file_priv = /opt/local/mysql/3306/mysql-files # 服务器会将导入和导出操作限制为仅处理该目录中的文件。例如:load data、select...insert outfile语句,load_file()函数。
server_id = 3306 # 用于主从复制
port = 3306
socket = /tmp/mysql_3306.sock
lower_case_table_names = 1 # 会在初始化数据目录和启动服务时,替换[mysqld]组的设置(存在多个选项组时,最后一个配置项生效)
#mysqlx_port = 33060 # x协议从8.0开始
#mysqlx_socket = /tmp/mysqlx_33060.sock



# 3307 数据库实例
[mysqld3307]
basedir = /opt/local/mysql
datadir = /opt/local/mysql/3307/data
log-error = /opt/local/mysql/3307/log/error.log
pid-file = /opt/local/mysql/3307/mysql3307.pid
secure_file_priv = /opt/local/mysql/3307/mysql-files
server_id = 3307 # 用于主从复制
port = 3307
socket = /tmp/mysql_3307.sock
lower_case_table_names = 1
#mysqlx_port = 33070
#mysqlx_socket = /tmp/mysqlx_33070.sock

初始化数据目录

mysqld 通常读取 [mysqld] 组。如果此选项以 --defaults-group-suffix=_other 给出,mysqld 还会读取 [mysqld_other] 组。最后读取的选项会覆盖最先读取的。

1
2
mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=3306 --initialize-insecure --user=mysql
mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=3307 --initialize-insecure --user=mysql

启动(mysqld_multi)&自启(service)–使用中

启动(mysqld_multi)

若不指定 --defaults-file ,默认读取 /etc/my.cnf~/.my.cnf

mysqld_multi 在 my.cnf 中只会搜索名为 [mysqldN] 的组,N可以是任何正整数。

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=/opt/local/mysql/my.cnf report # 查看mysql服务
mysqld_multi --defaults-file=/opt/local/mysql/my.cnf start # 启动所有组
mysqld_multi --defaults-file=/opt/local/mysql/my.cnf start 3306,3307
mysqld_multi --defaults-file=/opt/local/mysql/my.cnf stop # 关闭所有组
mysqld_multi --defaults-file=/opt/local/mysql/my.cnf stop 3306,3307

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

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

自启(service)

新增启动文件 vim /etc/init.d/mysqld_multi ,或从mysql目录中复制并修改 cp /opt/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=/opt/local/mysql
bindir=/opt/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=/opt/local/mysql/my.cnf start $2
;;
'stop' )
"$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf stop $2
;;
'report' )
"$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf report $2
;;
'restart' )
"$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf stop $2
"$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf start $2
;;
*)
echo "Usage: $0 {start|stop|report|restart}" >&2
;;
esac

启动

1
2
3
4
5
6
7
chmod 770 /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)

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

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

修改配置文件中的配置组名称,用 @ 作为分隔符,因为这是 systemd 支持的唯一分隔符。

1
2
[mysqld@3306] # 3306是实例的别名,可以定义成其他更有意义的名字
[mysqld@3307]

创建 systemd 服务配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vim /etc/systemd/system/mysqld@.service

# mysqld@.service 内容如下
[Unit]
Description= MySQL server
Documentation= https://zh.wikipedia.org/wiki/Systemd
After=network.target
After=syslog.target

[Service]
User=mysql
Group=mysql
Type=forking
TimeoutSec=0
# %I是实例占位符,表示选项文件mysqld分组名中@符号后面的内容
ExecStart=/opt/local/mysql/bin/mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=@%I $MYSQLD_OPTS
LimitNOFILE=65535
Restart=on-failure

[Install]
WantedBy=multi-user.target

重新加载systemd服务配置文件:systemctl daemon-reload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## 

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

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

两种自启动区别

systemd(systemctl)本身可以设置开机自启动,service(/etc/init.d/mysqld_multi)靠其本身不行,需要借助其他工具。

service需要通过mysqld_safe来间接启动mysqld,因为脚本是通过mysqld_multi命令启动,而[mysqld_multi]组中又指定了mysqld_safe启动;systemctl可以直接启动mysqld,可以看到mysqld@.service文件中使用的是mysqld命令。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql -u root --skip-password -S /tmp/mysql_3306.sock
mysql -u root -p -S /tmp/mysql_3306.sock

# 修改密码/设置密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456789';
# 永久修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456789' PASSWORD EXPIRE NEVER;
# 修改身份验证插件,并永久修改密码。8.0之后默认的身份验证插件是 caching_sha2_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456789' PASSWORD EXPIRE NEVER;

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

quit/exit # 退出当前会话

使用mysql命令连接DB

1
2
3
4
mysql -h 192.168.0.7 -P 3306 -u base -p 123456789;
use ideps;
#或者
mysql -h192.168.0.7 -P3306 -ubase -p123456789 basedb;

数据库创建和删除

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
# 查看所有的数据库
mysql> show databases;

# 创建数据库 create database 数据库名; 名称不能与已经存在的数据库重名。
mysql> create database if not exists basedb;
mysql> create database if not exists archedb;
mysql> show create database basedb;
mysql> show create database archedb;
# 删除数据库
mysql> drop database if exists basedb;
mysql> drop database if exists archedb;

# 查看某个库的所有表
mysql> show tables from basedb;
# 使用basedb数据库
mysql> use basedb;
mysql> show tables like '%base_%';

# 创建学生表
create table student (
id int,
name varchar(20) # 说名字最长不超过20个字符
);

# 查看表的创建信息
mysql> show create table 表名称;
mysql> show create table 表名称\G
# 查看表结构
mysql> desc 表名称;

查看存储引擎

1
2
# 查看mysql提供的存储引擎
mysql> show engines;

查看服务器系统变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看服务器系统变量,my.ini配置信息
mysql> show variables;
mysql> show variables like 'character%';
mysql> show variables like 'collation%';
mysql> show variables like '%connections%';
mysql> show variables like '%engine%';
mysql> show variables like '%basedir%';
mysql> show variables like '%port%';

mysql> show global variables like '%lower_case%'; # 查看当前mysql的大小写敏感配置
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | ON |
| lower_case_table_names | 1 |
+------------------------+-------+
2 rows in set, 1 warning (0.00 sec)