用户与权限管理

启动 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 语句查看

posted @   半条咸鱼  阅读(226)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示