第03章 用户和权限管理【1.MySQL架构篇】【MySQL高级】4

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDSClaw,2核4GB
RDS AI 助手,专业版
简介: 第03章 用户和权限管理【1.MySQL架构篇】【MySQL高级】4

6. 配置文件的使用

6.1 配置文件的格式

6.1配置文件格式

与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号 []扩起来,像这样:

[root@centos7-mysql-1 ~]# vim /etc/my.cnf 
[server]
(具体的启动选项...)
[mysqld]
(具体的启动选项...)
[mysqld_safe]  
(具体的启动选项...)
[client]
(具体的启动选项...)
[mysql]
(具体的启动选项...)
[mysqladmin]
(具体的启动选项...)

像这个配置文件里就定义了许多个组,组名分别是servermysqldmysqld_safeclientmysql

mysqladmin。每个组下边可以定义若干个启动选项,我们以[server]组为例来看一下填写启动选项的形式 (其他组中启动选项的形式是一样的)

[server]
option1       #这是dption1,该选项不需要选项值
option2=value2    #这是option2,该选项需要选项值

在配置文件中指定启动选项的语法类似于命令行语法,但是配置文件中指定的启动选项不允许--前缀,并且

每行只指定一个选项,而且=周围可以有空白字符(命令行中选项名、=、选项值之间不允许有空白字符)。另

外,在配置文件中,我们可以使用#来添加注释,从#出现直到行尾的内容都属于注释内容,读取配置文件时会

忽略这些注释内容。

6.2 启动命令与选项组

[root@centos7-mysql-1 ~]# cd /usr/bin
[root@centos7-mysql-1 bin]# ls



[root@centos7-mysql-1 bin]# cd /usr/sbin
[root@centos7-mysql-1 sbin]# ls


配置文件中不同的选项组是给不同的启动命令使用的。不过有两个选项组比较特别:

  • [serverl组下边的启动选项将作用于所有的服务 器程序。
  • [client]组下边的启动选项将作用于所有的客户端程序。

下面是启动命令能读取的选项组都有哪些:

比如,在/etc/mysql/my.cnf这个配置文件中添加一些内容:

[server]
skip-networking
default-storage-engine=MyISAM

然后直接用mysqld启动服务器程序:

mysqld

虽然在命令行没有添加启动选项,但是在程序启动的时候,就会默认的到我们上边提到的配置文件路径下查找配置文件,其中就包括/etc/my.cnf。又由于mysqld命令可以读取[server]选项组的内容,所以skip-networking和default-storage-engine=MyISAM这两个选项是生效的。你可以把这些启动选项放在 [client]组里再试试用mysqld启动服务器程序,就不生效。

6.3特定MySQL版本的专用选项组

我们可以在选项组的名称后加上特定的MySQL版本号,比如对于[mysqld]选项组来说,我们可以定义一个 [mysqld-5.7]的选项组,它的含义和[mysqld]一样,只不过只有版本号为5.7mysqld程序才能使用这个选项组中的选项。

6.4同一个配置文件中多个组的优先级

我们说同一个命令可以访问配置文件中的多个组,比如mysqld可以访问[mysqld][server]组,如果在同一个配置文件中,比如~/.my.cnf,在这些组里出现了同样的配置项,比如这样:

[server]
default-storage-engine=InnoDB
[mysqld]
default-storage-engine=MyISAM

那么,将以最后一个出现的组中的启动选项为准,比方说例子中default-storage-engine既出现在[mysqld]组也出现在[server]组,因为[mysqld]组在[server]组后边,就以[mysqld]组中的配置项为准。

6.5命令行和配置文件中启动选项的区别

在命令行上指定的绝大部分启动选项都可以放到配置文件中,但是有一些选项是专门为命令行设计的,比方说 defaults-extra-file、 defaults-file这样的选项本身就是为了指定配置文件路径的,再放在配置文件中使用就没啥意义了。


如果同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准!比如我们在配置文件中写了:

[server]
default-storage-engine=InnoDB

而我们的启动命令是:

mysql.server start --default-storage-engine=MyISAM

7. 系统变量(复习)

7.1系统变量简介

变量由系统定义,不是用户定义,属于服务器层面。启动MySQL服务,生成MySQL服务实例期间,MySQL将为 MySQL服务器内存中的系统变量赋值,这些系统变量定义了当前MySQL服务实例的属性、特征。这些系统变量的值要么是编译MySQL时参数的默认值,要么是配置文件(例如my.ini等)中的参数值。大家可以通过网址

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html查看MySQL文档的系统变量。


系统变量分为全局系统变量(需要添加global关键字)以及会话系统变量(需要添加session关键字),有时也把全局系统变量简称为全局变量,有时也把会话系统变量称为local变量。如果不写,默认会话级别。静态变量(在MySQL服务实例运行期间它们的值不能使用set动态修改)属于特殊的全局系统变量。


每一个MySQL客户机成功连接MySQL服务器后,都会产生与之对应的会话。会话期间,MySQL服务实例会在 MySQL服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初始值是全局系统变量值的复制。 如下图:

7.2 查看系统变量

  • 查看所有或部分系统变量
#查看所有全局变量
SHOW GLOBAL VARIABLES:
#查看所有会话变量
SHOW SESSION VARIABLES;  
#或
SHOW VARIABLES;
#查看满足条件的部分系统变量。
SHOW GLOBAL VARIABLES LIKE'%标识符%';
#查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE '%标识符%';

举例:

SHOW GLOBAL VARIABLES LIKE 'admin_%’;
  • 查看指定系统变量
    作为MvSQL编码规范,MvSQL中的系统变量以两个“@”开头,其中“@@global”仅用王标记全局系统变
    量,“@@session”仅用于标记会话系统变量。“@@”首先标记会话系统变量,如果会话系统变量不存在,则标记全局系统变量。
#查看指定的系统变量的值  
SELECT @dglobal.变量名;
#查看指定的会话变量的值
SELECT @@session.变量名;  
#或者
SELECT @@变量名

7.3 设置系统变量

有些时候,数据库管理员需要修改系统变量的默认值,以便修改当前会话或者MySQL服务实例的属性、特征。具体方法;

7.3.1通过启动选项设置

大部分的系统变量都可以通过启动服务器时传送启动选项的方式来进行设置。如何填写启动选项我们总结一下, 主要是两种方式:

  • 通过命令行添加启动选项
    比方说我们在启动服务器程序时用这个命令:
mysqld  --default-storage-engine=MyISAM --max-connections=10
  • 通过配置文件添加启动选项

我们可以这样填写配置文件:

[server]
default-storage-engine=MyISAM  max-connections=10

当使用上边两种方式中的任意一种启动服务器程序后,我们再来查看一下系统变量的值:

 mysql> SHOW VARIABLES LIKE 'default_storage_engine';
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | MyISAM |
+------------------------+--------+
1 row in set (0.05 sec)

可以看到default_storage_engine和max_connections这两个系统变量的值已经被修改了。有一点需要注意 的是,对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间用短划线-或者下划线_连接起来都 可以,但是它对应的系统变量的单词之间必须使用下划线_连接起来。

7.3.2 服务器出现运行过程中设置

对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修改而无需停止并重启服务器。但是,系统变量有作用范围之分。
设置不同作用范围的系统变量

多个客户端程序可以同时连接到一个服务器程序。对于同一个系统变量,我们有时想让不同的客户端有不同的值。比方说客户端A,他想让当前客户端对应的默认存储引擎为InnoDB,所以他可以把系统变量default_storage_engine的值设置为InnoDB;客户端B,他想让当前客户端对应的默认存储引擎为MyISAM,所以他可以把系统变量default_storage_engine的值设置为MyISAM。这样两个客户端拥有不同的默认存储引擎,使用时互不影响,十分方便。但是这样各个客户端都私有一份系统变量会产生这么两个问题:


有一些系统变量并不是针对单个客户端的,比如允许同时连接到服务器的客户端数量max_connections,查 询缓存的大小query_cache_size,这些公有的系统变量让某个客户端私有显然不合适。

一个新连接到服务器的客户端对应的系统变量的值该怎么设置?

为了解决这两个问题,MySQL提出了系统变量作用范围的概念,具体来说作用范围分为这两种:


GLOBAL:全局变量,影响服务器的整体操作。

SESSION:会话变量,影响某个客户端连接的操作。(注:SESSION有个别名叫LOCAL)

在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认 值)。然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量的当前值初始化。


以default_storage_engine举例,在服务器启动时会初始化一个名为default_storage_engine,作用范围为GLOBAL的系统变量。之后每当有一个客户端连接到该服务器时,服务器都会单独为该客户端分配一个名为 default_storage_engine,作用范围为SESSION的系统变量,该作用范围为SESSION的系统变量值按照当前作用范围为GLOBAL的同名系统变量值进行初始化。


很显然,通过启动选项设置的系统变量的作用范围都是GLOBAL的,也就是对所有客户端都有效的,因为在系统 启动的时候还没有客户端程序连接进来呢。了解了系统变量的GLOBAL和SESSION作用范围之后,我们再看一下在服务器程序运行期间通过客户端程序设置系统变量的语法:

SET [GLOBAL|SESSION]系统变量名=值; 

或者写成这样也行:

SET [@@(GLOBAL| SESSION).]var_name = XXX;

比如,服务器运行过程中把作用范围为GLOBAL的系统变量default_storage_engine的值修改为MyISAM,也就是想让之后新连接到服务器的客户端都用MyISAM作为默认的存储引擎,那我们可以选择下边两条语句中的任意一条来进行设置:

#方式一:
Tl
SET GLOBAL default_storage_engine = MyISAM;
#方式二:
SET @@GL0BAL.default_storage_engine = MyISAM;

如果只想对本客户端生效,也可以选择下边三条语句中的任意一条来进行设置:

#方式一:
SET SESSION default_storage_engine = MyISAM;
#方式二:
sET @@SESSION.default_storage_engine = MyISAM;
#方式三:
SET default_storage_engine = MyISAM;

从上边的方式三可以看出,如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是SESSION。也就是说SET 系统变量名 = 值SET SESSION 系统变量名 = 值是等价的。

查看不同作用范围的系统变量

既然系统变量有作用范围之分,那我们的SHOW VARIABLES语句查看的是什么作用范围的系统变量呢?

答:默认查看的是SESSION作用范围的系统变量。

我们也可以在查看系统变量的语句上加上要查看哪个作用范围的系统变量:

SHOW [GLOBALI SESSION] VARIABLES [LIKE 匹配的模式];

下边我们演示一下完整的设置并查看系统变量的过程:

mysql> SHOW SESSION VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.01 sec)
mysql> SHOW GLOBAL VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> SET SESSION default_storage_engine = MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SESSION VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | MyISAM |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> SHOW GLOBAL VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)

可以看到,最初default_storage_engine的系统变量无论是在GLOBAL作用范围上还是在SESSION作用范围 上的值都是InnoDB,我们在SESSION作用范围把它的值设置为MyISAM之后,可以看到GLOBAL作用范围的值并没有改变。


小贴士:如果某个客户端改变了某个系统变量在GLOBAL作用范围的值,并不会影响该系统变量在当前已经连接的客户端作用范围为SESSION的值,只会影响后续连入的客户端在作用范围为SESSION的值。

注意事项

并不是所有系统变量都具有GLOBALSESSION的作用范围。

有一些系统变量只具有GLOBAL作用范围,比方说max_connections,表示服务器程序支持同时最多有多少 个客户端程序进行连接。

有一些系统变量只具有SESSION作用范围,比如insert_id,表示在对某个包含AUTO_INCREMENT列的表进行插入时,该列初始的值。

有一些系统变量的值既具有GLOBAL作用范围,也具有SESSION作用范围,比如我们前边用到的default_storage_engine,而且其实大部分的系统变量都是这样的

有些系统变量是只读的,并不能设置值。

比方说version,表示当前MySQL的版本,我们客户端是不能设置它的值的,只能在SHOW VARIABLES语句里查看。


2022/7/30 11:17

最后

p105~p109

Markdown 41609 字数 1571 行数

HTML 36828 字数 897 段落

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
11月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
10月前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
SQL 存储 缓存
MySQL的架构与SQL语句执行过程
MySQL架构分为Server层和存储引擎层,具有高度灵活性和可扩展性。Server层包括连接器、查询缓存(MySQL 8.0已移除)、分析器、优化器和执行器,负责处理SQL语句;存储引擎层负责数据的存储和读取,常见引擎有InnoDB、MyISAM和Memory。SQL执行过程涉及连接、解析、优化、执行和结果返回等步骤,本文详细讲解了一条SQL语句的完整执行过程。
511 3
|
7月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
511 158
|
7月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1280 152
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
952 156
|
7月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
536 156

推荐镜像

更多