用户与权限管理
启动 MySQL 服务后,通过 mysql 命令来登录 MySQL 服务器
mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句";
1、-h:hostname 为主机,hostIP 为主机 IP
2、-P:后面接 MySQL 服务的端口,通过该参数连接到指定的端口,MySQL 服务的默认端口是 3306,不使用该参数时,自动连接到 3306 端口,port 为连接的端口号
3、-u:后面接用户名,username 为用户名
4、-p:提示输入密码
5、DatabaseName:指明登录到哪一个数据库中,如果没有该参数,则直接登录到 MySQL 数据库中,可以使用 USE 命令来选择数据库
6、-e:后面可以直接加 SQL 语句,登录 MySQL 服务器以后,即可执行该 SQL 语句,然后退出 MySQL 服务器
创建用户
CREATE USER 用户名 [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']];
1、用户名参数表示新建用户的账户,由用户(User)和主机名(Host) 构成
2、[ ] 表示可选,可以指定用户登录时需要密码验证,也可以不指定密码验证,用户可以直接登录
(1)不建议不指定密码
(2)如果指定密码值,需要使用 IDENTIFIED BY 指定明文密码值
3、CREATE USER 可以同时创建多个用户
修改用户名
UPDATE mysql.user SET USER='原用户名' WHERE USER='新用户名';
FLUSH PRIVILEGES;
删除用户
1、方式一:使用 DROP 方式删除(建议)
(1)使用 DROP USER 删除用户时,需要 DROP USER 权限
DROP USER 用户名1[,用户名2]…;
2、方式二:使用 DELETE 方式删除
DELETE FROM mysql.user WHERE Host=’主机名或主机IP’ AND User=’用户名’;
FLUSH PRIVILEGES;
(1)不建议通过 DELETE 方式进行删除,系统会有残留信息保留
(2)DROP USER 命令会删除用户以及对应的权限,执行命令后,删除 mysql.user 表和 mysql.db 表相应记录
修改当前用户密码
1、SET
SET PASSWORD = PASSWORD('新密码');
(1)该语句会自动将密码加密后再赋给当前用户
2、ALTER USER(建议)
ALTER USER USER() IDENTIFIED BY '新密码';
(1)使用 USER() 可以获取当前用户名
修改其它用户密码
1、ALTER 修改普通用户密码
ALTER USER 用户名1 [IDENTIFIED BY '新密码'][,用户名2 [IDENTIFIED BY '新密码']]…;
2、SET 修改普通用户密码,当前用户需要权限
SET PASSWORD FOR '用户名'@'主机名或主机IP'='新密码';
3、UPDATE 修改普通用户密码(不建议)
UPDATE MySQL.user SET authentication_string=PASSWORD("新密码")
WHERE User = "用户名" AND Host = "主机名或主机IP";
MySQL 8 密码管理
1、密码过期策略
(1)可以手动设置账号密码过期,也可以建立一个自动密码过期策略
(2)过期策略可以是全局,也可以为每个账号设置单独的过期策略
(3)使用 SQL 语句更改变量值,并持久化
#建立全局策略,设置密码每隔180天过期
SET PERSIST default_password_lifetime = 180;
(4)维护配置文件 my.cnf
[mysqld]
#建立全局策略,设置密码每隔180天过期
default_password_lifetime=180
(5)CREATE USER 和 ALTER USER 语句上加入 PASSWORD EXPIRE 选项可实现单独设置策略
#设置kangshifu账号密码每90天过期
CREATE USER '用户名'@'主机名' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER '用户名'@'主机名' PASSWORD EXPIRE INTERVAL 90 DAY;
#设置密码永不过期
CREATE USER '用户名'@'主机名' PASSWORD EXPIRE NEVER;
ALTER USER '用户名'@'主机名' PASSWORD EXPIRE NEVER;
#延用全局密码过期策略
CREATE USER '用户名'@'主机名' PASSWORD EXPIRE DEFAULT;
ALTER USER '用户名'@'主机名' PASSWORD EXPIRE DEFAULT;
2、密码重用策略
(1)使用 SQL 进行全局设置
#设置不能选择最近使用过的6个密码
SET PERSIST password_history = 6;
#设置不能选择最近365天内的密码
SET PERSIST password_reuse_interval = 365;
(2)my.cnf 配置文件进行全局配置
[mysqld]
#设置不能选择最近使用过的6个密码
password_history=6
#设置不能选择最近365天内的密码
password_reuse_interval=365
(3)单独设置
#不能使用最近5个密码
CREATE USER '用户名'@'主机名' PASSWORD HISTORY 5;
ALTER USER '用户名'@'主机名' PASSWORD HISTORY 5;
#不能使用最近365天内的密码
CREATE USER '用户名'@'主机名' PASSWORD REUSE INTERVAL 365 DAY;
ALTER USER '用户名'@'主机名' PASSWORD REUSE INTERVAL 365 DAY;
权限列表
1、查看权限
SHOW PRIVILEGES;
(1)CREATE、DROP:可以创建新的数据库和表,或删除(移掉)已有的数据库和表,如果将 MySQL 数据库中的 DROP 权限授予某用户,用户就可以删除 MySQL 访问权限保存的数据库
(2)SELECT、INSERT、UPDATE、DELETE:允许在一个数据库现有的表上实施操作
(3)SELECT:只有从一个表中检索行时才被用到
(4)INDEX:允许创建或删除索引,INDEX 适用于已有的表,如果具有某个表的 CREATE 权限,则可以在 CREATE TABLE 语句中包括定义索引
(5) ALTER:可以使用 ALTER TABLE 来更改表的结构和重新命名表
(6)CREATE ROUTINE:创建保存的程序(函数和程序),ALTER ROUTINE:更改和删除保存的程序, EXECUTE:执行保存的程序
(7)GRANT:允许授权给其他用户,可用于数据库、表、保存的程序
(8)FILE:用户可以使用 LOAD DATA INFILE、SELECT ... INTO OUTFILE,读、写服务器上的文件,任何被授予 FILE 权限的用户,都能读、写 MySQL 服务器上的任何文件
授予权限
1、原则
(1)只授予能满足需要的最小权限,如用户只需查询,只给 SELECT 权限,不赋予 UPDATE、INSERT、DELETE 权限
(2)创建用户时,限制用户的登录主机,一般是限制成指定 IP 或者内网 IP 段
(3)为每个用户设置满足密码复杂度的密码
(4)定期清理不需要的用户,回收权限,或删除用户
2、授权方式
(1)角色赋予用户给用户授权
(2)直接给用户授权
3、命令
GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’];
(1)权限为 ALL 时,不包括 GRANT 权限
4、根据用户的不同,对数据进行横向和纵向的分组
(1)横向分组:指用户可以接触到的数据的范围,比如可以看到哪些表的数据
(2)纵向分组:指用户对接触到数据的访问深度,比如读、写、删除
查看权限
1、查看当前用户权限
SHOW GRANTS;
#或
SHOW GRANTS FOR CURRENT_USER;
#或
SHOW GRANTS FOR CURRENT_USER();
2、查看某用户的全局权限
SHOW GRANTS FOR '用户名'@'主机地址';
收回权限
1、取消已经赋予用户的某些权限
2、收回用户不必要的权限,可以在一定程度上保证系统的安全性
3、MySQL 中使用 REVOKE 取消用户的某些权限
(1)用户账户的记录将从 db、host、tables_priv、columns_priv 表中删除
(2)用户账户记录仍然在 user 表中保存,删除 user 表中的账户记录使用 DROP USER 语句
(3)注意:在将用户账户从 user 表删除之前,应该收回相应用户的所有权限
4、收回权限命令
REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;
(1)需要用户重新登录后才能生效
权限表
1、user 表
2、db 表
3、tables_priv 表、columns_priv 表
4、procs_priv 表
user 表:记录用户账号和权限信息
1、范围列 / 用户列
字段名 | 字段类型 | 是否为空 | 默认值 | 说明 |
---|---|---|---|---|
Host | char(60) | NO | 无 | 主机名 |
User | char(32) | NO | 无 | 用户名 |
authentication_string | text | YES | 无 | 密码 |
(1)%:表示所有远程通过 TCP 方式的连接
(2)IP 地址,如;192.168.1.2、127.0.0.1,通过制定 IP 地址进行 TCP 连接
(3)机器名:通过制定网络中的机器名进行 TCP 连接
(4)::1:IPv6 的本地 IP 地址,等同于 IPv4 的 127.0.0.1
(5)localhost:本地方式通过命令行方式的连接
(6)所有密码串通过 password(明文字符串) 生成的密文字符串
(7)MySQL 8.0 在用户管理方面增加角色管理,调整默认密码加密方式,由之前的 SHA1 改为了 SHA2 ,不可逆
(8)MySQL 5.7 及之后版本,密码保存到 authentication_string 字段中,不再使用 password 字段
2、权限列
字段名 | 字段类型 | 是否为空 | 默认值 | 说明 |
---|---|---|---|---|
Select_priv | enum('N','Y') | NO | N | 是否可以通过SELECT 命令查询数据 |
Insert_priv | enum('N','Y') | NO | N | 是否可以通过 INSERT 命令插入数据 |
Update_priv | enum('N','Y') | NO | N | 是否可以通过UPDATE 命令修改现有数据 |
Delete_priv | enum('N','Y') | NO | N | 是否可以通过DELETE 命令删除现有数据 |
Create_priv | enum('N','Y') | NO | N | 是否可以创建新的数据库和表 |
Drop_priv | enum('N','Y') | NO | N | 是否可以删除现有数据库和表 |
Reload_priv | enum('N','Y') | NO | N | 是否可以执行刷新和重新加载MySQL所用的各种内部缓存的特定命令,包括日志、权限、主机、查询和表 |
Shutdown_priv | enum('N','Y') | NO | N | 是否可以关闭MySQL服务器。将此权限提供给root账户之外的任何用户时,都应当非常谨慎 |
Process_priv | enum('N','Y') | NO | N | 是否可以通过SHOW PROCESSLIST命令查看其他用户的进程 |
File_priv | enum('N','Y') | NO | N | 是否可以执行SELECT INTO OUTFILE和LOAD DATA INFILE命令 |
Grant_priv | enum('N','Y') | NO | N | 是否可以将自己的权限再授予其他用户 |
References_priv | enum('N','Y') | NO | N | 是否可以创建外键约束 |
Index_priv | enum('N','Y') | NO | N | 是否可以对索引进行增删查 |
Alter_priv | enum('N','Y') | NO | N | 是否可以重命名和修改表结构 |
Show_db_priv | enum('N','Y') | NO | N | 是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库 |
Super_priv | enum('N','Y') | NO | N | 是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程;使用SET GLOBAL命令修改全局MySQL变量,执行关于复制和日志的各种命令。(超级权限) |
Create_tmp_table_priv | enum('N','Y') | NO | N | 是否可以创建临时表 |
Lock_tables_priv | enum('N','Y') | NO | N | 是否可以使用LOCK TABLES命令阻止对表的访问/修改 |
Execute_priv | enum('N','Y') | NO | N | 是否可以执行存储过程 |
Repl_slave_priv | enum('N','Y') | NO | N | 是否可以读取用于维护复制数据库环境的二进制日志文件 |
Repl_client_priv | enum('N','Y') | NO | N | 是否可以确定复制从服务器和主服务器的位置 |
Create_view_priv | enum('N','Y') | NO | N | 是否可以创建视图 |
Show_view_priv | enum('N','Y') | NO | N | 是否可以查看视图 |
Create_routine_priv | enum('N','Y') | NO | N | 是否可以更改或放弃存储过程和函数 |
Alter_routine_priv | enum('N','Y') | NO | N | 是否可以修改或删除存储函数及函数 |
Create_user_priv | enum('N','Y') | NO | N | 是否可以执行CREATE USER命令,这个命令用于创建新的MySQL账户 |
Event_priv | enum('N','Y') | NO | N | 是否可以创建、修改和删除事件 |
Trigger_priv | enum('N','Y') | NO | N | 是否可以创建和删除触发器 |
Create_tablespace_priv | enum('N','Y') | NO | N | 是否可以创建表空间 |
(1)权限列的字段决定用户权限,在全局范围内,允许对数据和数据库进行的操作
(2)高级管理权限主要对数据库进行管理,例如:关闭服务的权限、超级权限、加载用户等
(3)普通权限主要操作数据库,例如:查询权限、修改权限等
(4)以 priv 结尾的字段的数据类型为 ENUM,可取的值只有 Y、N;Y:表示该用户有对应的权限;N:表示该用户没有对应的权限
(5)从安全角度考虑,这些字段的默认值都为 N
(6)如果要修改权限,可以使用 GRANT 语句为用户赋予一些权限,也可以通过 UPDATE 语句更新 user 表的方式来设置权限
3、安全列:判断用户是否能够登录成功
字段名 | 字段类型 | 是否为空 | 默认值 | 说明 |
---|---|---|---|---|
ssl_type | enum('','ANY','X509','SPECIFIED') | NO | 支持ssl标准加密安全字段 | |
ssl_cipher | blob | NO | 支持ssl标准加密安全字段 | |
x509_issuer | blob | NO | 支持x509标准字段 | |
x509_subject | blob | NO | 支持x509标准字段 | |
plugin | char(64) | NO | mysql_native_password | 引入plugins以进行用户连接时的密码验证,plugin创建外部/代理用户 |
password_expired | enum('N','Y') | NO | N | 密码是否过期 (N 未过期,Y 已过期) |
password_last_changed | timestamp | YES | 记录密码最近修改的时间 | |
password_lifetime | smallint(5) unsigned | YES | 设置密码的有效时间,单位为天数 | |
account_locked | enum('N','Y') | NO | N | 用户是否被锁定(Y 锁定,N 未锁定) |
(1)即使 password_expired 为 Y,用户也可以使用密码登录 MySQL,但是不允许做任何操作
(2)通常标准的发行版不支持 ssl,可以使用 SHOW VARIABLES LIKE "have_openssl" 语句,来查看是否具有 ssl 功能,如果 have_openssl 的值为 DISABLED,那么则不支持 ssl 加密功能
4、资源控制列:限制用户使用的资源
字段名 | 字段类型 | 是否为空 | 默认值 | 说明 |
---|---|---|---|---|
max_questions | int(11) unsigned | NO | 0 | 规定每小时允许执行查询的操作次数 |
max_updates | int(11) unsigned | NO | 0 | 规定每小时允许执行更新的操作次数 |
max_connections | int(11) unsigned | NO | 0 | 规定每小时允许执行的连接操作次数 |
max_user_connections | int(11) unsigned | NO | 0 | 规定允许同时建立的连接次数 |
(1)以上字段的默认值为 0,表示没有限制
(2)一个小时内,用户查询或连接数量超过资源控制限制,用户将被锁定,直到下一个小时才可以在此执行对应的操作
(3)可以使用 GRANT 语句更新这些字段的值
db 表
1、查看 db 表的基本结构
DESC mysql.db;
2、用户列
字段名 | 字段类型 | 是否为空 | 默认值 | 说明 |
---|---|---|---|---|
Host | char(60) | NO | 无 | 主机名 |
Db | char(64) | NO | 无 | 数据库名 |
User | char(32) | NO | 无 | 用户名 |
(1)表示从某个主机连接某个用户对某个数据库的操作权限,这 3 个字段的组合构成 db 表的主键
3、权限列
(1)db 表中的权限列和 user 表中的权限列大致相同
(2)user 表中的权限是针对所有数据库的,而 db 表中的权限只针对指定的数据库
(3)若希望用户只对某个数据库有操作权限,可以先将 user 表中对应的权限设置为 N,然后在 db 表中设置对应数据库的操作权限
tables_priv 表
1、设置单个表进行权限
2、查看 tables_priv 表
DESC mysql.tables_priv;
字段名 | 字段类型 | 是否为空 | 默认值 | 说明 |
---|---|---|---|---|
Host | char(60) | NO | 无 | 主机 |
Db | char(64) | NO | 无 | 数据库名 |
User | char(32) | NO | 无 | 用户名 |
Table_name | char(64) | NO | 无 | 表名 |
Grantor | char(93) | NO | 无 | 修改该记录的用户 |
Timestamp | timestamp | NO | CURRENT_TIMESTAMP | 修改该记录的时间 |
Table_priv | set('Select','Insert','Update','Delete',' Create','Drop','Grant','References', 'Index','Alter','Create View','Show view','Trigger') |
NO | 无 | 表示对表的操作权限,包括 Select、Insert、Update、Delete、Create、Drop、Grant、References、Index 和 Alter 等 |
Column_priv | set('Select','Insert','Update','References') | NO | 无 | 表示对表中的列的操作权限,包括 Select、Insert、Update 和 References |
columns_priv 表
1、设置单个数据列权限
2、查看 columns_priv 表
DESC mysql.columns_priv;
字段名 | 字段类型 | 是否为空 | 默认值 | 说明 |
---|---|---|---|---|
Host | char(60) | NO | 无 | 主机 |
Db | char(64) | NO | 无 | 数据库名 |
User | char(32) | NO | 无 | 用户名 |
Table_name | char(64) | NO | 无 | 表名 |
Column_name | char(64) | NO | 无 | 数据列名称,用来指定对哪些数据列具有操作权限 |
Timestamp | timestamp | NO | CURRENT_TIMESTAMP | 修改该记录的时间 |
Column_priv | set('Select','Insert','Update','References') | NO | 无 | 表示对表中的列的操作权限,包括 Select、Insert、Update 和 References |
procs_priv 表
1、设置存储过程和存储函数的权限
2、查看 procs_priv 表
DECS mysql.procs_priv;
字段名 | 字段类型 | 是否为空 | 默认值 | 说明 |
---|---|---|---|---|
Host | char(60) | NO | 无 | 主机名 |
Db | char(64) | NO | 无 | 数据库名 |
User | char(32) | NO | 无 | 用户名 |
Routine_name | char(64) | NO | 无 | 表示存储过程或函数的名称 |
Routine_type | enum('FUNCTION','PROCEDURE') | NO | 无 | 表示存储过程或函数的类型,Routine_type 字段有两个值,分别是 FUNCTION 和 PROCEDURE。FUNCTION 表示这是一个函数;PROCEDURE 表示这是一个 存储过程。 |
Grantor | char(93) | NO | 无 | 插入或修改该记录的用户 |
Proc_priv | set('Execute','Alter Routine','Grant') | NO | 无 | 表示拥有的权限,包括 Execute、Alter Routine、Grant 3种 |
Timestamp | timestamp | NO | CURRENT_TIMESTAMP | 表示记录更新时间 |
访问控制
1、连接核实阶段
(1)用户试图连接 MySQL 服务器时,服务器基于用户的身份,以及用户是否能提供正确的密码验证身份,来确定接受或者拒绝连接
(2)即客户端用户会在连接请求中,提供用户名、主机地址、用户密码,MySQL 服务器接收到用户请求后,会使用 user 表中的 host、user、authentication_string 匹配客户端提供的信息
(3)服务器只有在 user 表记录的 Host 和 User 字段匹配客户端主机名和用户名,并且提供正确的密码时才接受连接,如果连接核实没有通过,服务器就完全拒绝访问
2、请求核实阶段
(1)对连接上进来的每个请求,服务器检查该请求,执行什么操作、是否有足够的权限执行,权限可以来自 user、db、table_priv、column_priv 表
(2)确认权限时,所检查安全层级的先后顺序:user -> db -> table_priv -> column_priv
(3)如果所有权限表都检查完毕,但还是没有找到允许的权限操作,MySQL 将返回错误信息,用户请求的操作不能执行,操作失败
3、提示
(1)MySQL 通过向下层级的顺序,从 user 表到 columns_priv 表检查权限,但并不是所有的权限都要执行该过程
(2)例如,一个用户登录到 MySQL 服务器之后,只执行对 MySQL 的管理操作,此时只涉及管理权限,因此 MySQL 只检查 user 表
(3)如果请求的权限操作不被允许,MySQL 不会继续检查下一层级的表
角色管理
1、引入角色目的:方便管理拥有相同权限的用户,恰当的权限设定,确保数据的安全性
2、创建角色
(1)使用 CREATE ROLE
CREATE ROLE '角色名'[@'主机名'] [,'角色名'[@'主机名']]...;
(2)角色名称的命名规则和用户名类似,若主机名省略,默认为 %,角色名不可省略 ,不可为空
3、赋予角色权限
(1)创建角色之后,默认该角色是没有任何权限的
GRANT 权限1,权限2…… ON 表名 TO '角色名'[@'主机名'];
(2)可使用 SHOW 查询权限名称
SHOW PRIVILEGES\G;
4、查看角色权限
SHOW GRANTS FOR '用户名'[@'主机名'];
(1)只要创建一个角色,系统就会自动赋予一个 USAGE 权限,即连接登录数据库的权限
5、回收角色权限
(1)撤销角色或角色权限使用 REVOKE
REVOKE 权限1,权限2…… ON 表名 FROM '角色名';
(2)修改角色的权限,影响拥有该角色的账户的权限
6、删除角色
(1)需要对业务重新整合时,可能需要清理之前创建的角色
DROP ROLE 角色1 [,角色2]...
(2)若删除角色,则用户失去通过该角色所获得的所有权限
7、赋予用户角色
(1)角色创建并授权后,要赋予用户,并处于激活状态才能发挥作用
GRANT 角色1 [,角色2,...] TO '用户1'@'主机名1' [,'用户2'@'主机名2'……];
(2)可将多个角色同时赋予多个用户
(3)查询当前角色,如果角色未激活,结果将显示 NONE
SELECT CURRENT_ROLE();
8、激活角色
(1)方式一:指定默认情况下,哪些帐户角色处于活动状态,非永久激活角色
SET DEFAULT ROLE ALL TO '用户1'@'主机名1' [,'用户2'@'主机名2'……];
(2)方式二:对所有角色永久激活,默认为 OFF
SET GLOBAL activate_all_roles_on_login=ON;
9、撤销用户的角色
REVOKE 角色 FROM '用户'@'主机名';
10、设置强制角色
(1)使用强制性角色,服务器会为全部的账户默认赋予该角色,而不需要显示执行赋予角色
(2)方式一:服务启动前设置
[mysqld]
mandatory_roles='角色1@主机1,角色2@主机2'……
(3)方式二:运行时设置
#系统重启后仍然有效
SET PERSIST mandatory_roles = '角色1@主机1,角色2@主机2'……;
#系统重启后失效
SET GLOBAL mandatory_roles = '角色1@主机1,角色2@主机2'……;
配置文件格式
1、与在命令行中指定启动选项不同,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用 [ ] 括起
[server]
(具体的启动选项...)
[mysqld]
(具体的启动选项...)
[mysqld_safe]
(具体的启动选项...)
[client]
(具体的启动选项...)
[mysql]
(具体的启动选项...)
[mysqladmin]
(具体的启动选项...)
2、每个组下边可以定义若干个启动选项
3、在配置文件中指定启动选项的语法,类似于命令行语法,但配置文件中指定的启动选项不允许加 -- 前缀
4、每行只指定一个选项,而且 = 周围可以有空白字符,命令行中选项名、=、选项值之间不允许有空白字符
5、在配置文件中,可以使用 # 来添加注释,从 # 出现直到行尾的内容都属于注释内容,读取配置文件时会忽略这些注释内容
启动命令与选项组
1、配置文件中不同的选项组,给不同的启动命令使用
2、两个特别选项组
(1)[server] 组下的启动选项,将作用于所有服务器程序
(2)[client] 组下的启动选项,将作用于所有客户端程序
启动命令 | 类别 | 可读取的组 |
mysqld
|
启动服务器 |
[mysqld]、[server]
|
mysqld_safe
|
启动服务器 | [mysqld]、[server]、[mysqld_safe] |
mysql.server
|
启动服务器 | [mysqldl、[server]、[mysql.server] |
mysql
|
启动服务器 | [mysql]、[client] |
mysqladmin
|
启动服务器 | [mysqladmin]、[client] |
mysqldump
|
启动服务器 | [mysqldump]、[client] |
启动项优先级
1、命令行没有添加启动选项,但程序启动时,默认路径下查找配置文件,读取对应组的启动选项
2、特定 MySQL 版本的专用选项组
(1)可以在选项组的名称后,加上特定 MySQL 版本号
(2)比如:对于 [mysqld] 选项组,定义一个 [mysqld-5.7] 选项组,含义和 [mysqld] 一样,只有版本号为 5.7 mysqld 程序才能使用这个选项组中的选项
3、同一个配置文件中多个组的优先级:如果在同一个配置文件中,多个组里出现同样的配置项,将以最后一个出现的组中的启动选项为准
4、命令行和配置文件中启动选项的区别
(1)命令行上指定的绝大部分启动选项,都可以放到配置文件中,但有一些选项是专门为命令行设计的,如:defaults-extra-file、defaults-file 指定配置文件路径
(2)如果同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准
系统变量
1、查看系统变量
(1)查看所有全局变量
SHOW GLOBAL VARIABLES;
(2)查看所有会话变量
SHOW SESSION VARIABLES;
#或
SHOW VARIABLES;
(3)查看满足条件的部分系统变量
SHOW GLOBAL VARIABLES LIKE '%标识符%';
2、通过启动选项设置系统变量
(1)通过命令行添加启动选项
(2)通过配置文件添加启动选项
系统变量有作用范围之分
1、GLOBAL︰全局变量,影响服务器的整体操作
2、SESSION︰会话变量,影响某个客户端连接的操作(SESSION 别名 LOCAL)
3、服务器启动时,会将每个全局变量初始化为其默认值(通过命令行或配置文件中指定的选项更改默认值),然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时,使用相应全局变量的当前值初始化
4、在服务器程序运行期间,通过客户端程序设置系统变量
SET [GLOBAL | SESSION] 系统变量名 = 值;
SET [@@(GLOBAL | SESSION).]var_name = 值;
(1)如果在设置系统变量的语句中,省略作用范围,默认的作用范围为 SESSION
(2)如果某个客户端改变某个系统变量在 GLOBAL 作用范围的值,并不会影响该系统变量,在当前已经连接的客户端作用范围为 SESSION 的值,只会影响后续连接的客户端在作用范围为 SESSION 的值
5、不是所有系统变量都具有 GLOBAL、SESSION 作用范围
(1)只有 GLOBAL 作用范围,如:max_connections,表示服务器程序支持同时最多有多少个客户端程序进行连接
(2)只有 SESSION 作用范围,如:insert_id,表示在对某个包含 AUTO_INCREMENT 列的表进行插入时,该列初始的值
(3)有 GLOBAL、SESSION 作用范围,如:default_storage_engine,大部分的系统变量都属于(3)
(4)有些系统变量是只读的,并不能设置值,如:version,表示当前 MySQL 版本,,只能在 SHOW VARIABLES 语句查看
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战