• 【Mysql】Mysql的启动选项和系统变量(二)


    概述

    在Mysql中很多配置都设置有默认值,建议不熟悉的情况下不要作修改。比方说mysql 5.7服务器端允许同时连入的客户端的默认最大值是151 ,表的默认存储引擎是 InnoDB ,我们可以在程序启动的时候去修改这些默认值,这种在程序启动时指定的设置项我们称之为启动选项(startup options),这些选项控制着服务端启动后的配置。在 MySQL 安装目录下的 bin 目录中的各种可执行文件,不论是服务器相关的程序(比如 mysqld 、 mysqld_safe )还是客户端相关的程序(比如 mysql 、mysqladmin ),在使用的时候有很多参数也可以自行指定。这些启动参数可以放在命令行中指定,也可以把它们放在配置文件中指定。下边我们通过 mysqld 为例,来说明放在不同位置的区别。

    启动选项

    在命令行使用选项

    如果我们在启动客户端程序时在 -h 参数后边紧跟服务器的IP地址,这就说明客户端和服务端需要通过TCP/IP 网络进行通信。在我测试环境中客户端程序和服务器程序都装在同一台服务器上,所以在使用客户端程序连接服务器程序时指定的主机名是 127.0.0.1 的情况下,客户端进程和服务器进程之间会使用 TCP/IP 网络进行通信。
    如果我们在启动服务端时想禁止各客户端使用 TCP/IP 网络进行通信,可以在启动服务器程序的命令行里添加 skip-networking 启动选项,如下:
    mysqld --skip-networking
    注意在命令行中指定启动选项时需要在选项名前加上 – 前缀。如果选项名是由多个单词构成的,可以使用短划线 - 将它们连接起来,也可以使用下划线 _ 连接起来,也就是说 skip-networking 和skip_networking 都是正确的。
    在按照上述命令启动服务器程序后,如果我们再使用 mysql 来启动客户端程序时,再把服务器主机名指定为127.0.0.1 (IP地址的形式)的话会显示连接失败:

    [root@k8s-m2 ~]# mysql -h127.0.0.1 -p
    Enter password: 
    ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)
    
    • 1
    • 2
    • 3

    这就意味着我们指定的启动选项 skip-networking 生效了!
    但是我们本机可以使用sock进行连接,注意自己环境中sock文件的实际位置。

    [root@k8s-m2 ~]# mysql --socket=/usr/local/mysql/mysql.sock -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 6
    Server version: 5.7.30 Source distribution
    
    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> ^DBye
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    再如,我们前边说过如果在创建表的语句中没有显式指定表的存储引擎的话,那就5.7版本的mysql会默认使用 InnoDB作为表的存储引擎。如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
    mysqld --default-storage-engine=MyISAM
    我们现在就已经把表的默认存储引擎改为 MyISAM 了,在客户端程序连接到服务器程序后试着创建一个表:

    mysql> create table default_engine_table(i int);
    Query OK, 0 rows affected (0.12 sec)
    
    • 1
    • 2

    这个定义语句中我们并没有明确指定表的存储引擎,创建成功后再看一下这个表的结构:

    mysql> show create table default_engine_table;
    +----------------------+-------------------------------------------------------------------------------------------------------+
    | Table                | Create Table                                                                                          |
    +----------------------+-------------------------------------------------------------------------------------------------------+
    | default_engine_table | CREATE TABLE `default_engine_table` (
      `i` int(11) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
    +----------------------+-------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    可以看到该表的存储引擎已经是 MyISAM 了,说明启动选项 default-storage-engine 生效了。
    在启动服务器程序的命令行后边指定启动选项的通用格式就是这样的:
    –启动选项1[=值1] --启动选项2[=值2] … --启动选项n[=值n]
    也就是说我们可以将各个启动选项写在一行中,各个启动选项之间使用空白字符隔开,在每一个启动选项名称前边添加 – 。对于不需要值的启动选项,比如 skip-networking ,它们不需要指定对应的值。对于需要指定值的启动选项,比如 default-storage-engine 我们在指定这个设置项的时候需要显式的指定它的值。注意,在命令行上指定有值的启动选项时需要注意,选项名、=、选项值之间不能有空白字符。
    每个MySQL程序都有很多不同的选项。大多数程序提供了一个–help选项,你可以查看该程序支持的全部启动选项以及它们的默认值。例如,使用 mysql --help 可以看到 mysql 程序支持的启动选项, mysqld_safe --help可以看到 mysqld_safe 程序支持的启动选项。查看 mysqld 支持的启动选项有些特别,需要使用 mysqld --verbose --help 。

    选项的长形式和短形式

    前边提到的 skip-networking 、 default-storage-engine 称之为长形式的选项(因为它们比较长),但是为了方便,有些选项可以简写,下面列举了一些我们常用的短形式写法。

    长形式短形式含义
    –host-h主机名
    –user-u用户名
    –password-p密码
    –port-P端口
    –version-V版本信息

    短形式的选项名只有一个字母,使用时在选项名前只加一个短划线 - 前缀,而使用长形式选项时需要在选项名前加两个短划线 – 。
    使用短形式指定启动选项时,选项名和选项值之间可以没有间隙,或者用空白字符隔开( -p 选项有些特殊, -p和密码值之间不能有空白字符)。其次,选项名是区分大小写的,比如 -p 和 -P 选表示完全不同的含义。

    配置文件中使用选项

    在命令行中设置启动选项只对当次启动生效,单如果我们想每次重启程序的时候都需要这些启动选项,更好的方式还是把这些启动选项写在配置文件中,然后启动时通过配置文件加载相应的启动选项,这也是实际工作中我们更加推荐的方式。

    配置文件的路径

    以Linux为例。MySQL 会按照下列路径来寻找配置文件:

    路径名说明
    /etc/my.cnf
    /etc/mysql/my.cnf
    SYSCONFDIR/my.cnf
    $MYSQL_HOME/my.cnf特定于服务器的选项(仅限服务端)
    defaults-extra-file命令行指定的额外配置文件路径
    ~/.my.cnf用户特定选项
    ~/.mylogin.cnf用户特定的登录路径选项(仅限客户端)
    • SYSCONFDIR 表示在使用 CMake 构建 MySQL 时使用 SYSCONFDIR 选项指定的目录。默认情况下,这是位于编译安装目录下的 etc 目录。
    • MYSQL_HOME 是一个环境变量,该变量的值是我们自己设置的,可设置可不设置。该变量的值代表一个路径,我们可以在该路径下创建一个 my.cnf 配置文件,那么这个配置文件中只能放置关于启动服务器程序相关的选项(也就是其他的配置文件既能存放服务器相关的选项也能存放客户端相关的选项, .mylogin.cnf 除外,它只能存放客户端相关的一些选项)。
    • 列表中的最后两个以 ~ 开头的路径是用户相关的,Linux系统中都有一个当前登陆用户的概念,每个用户都可以有一个家目录, ~ 就代表这个家目录,我们可以查看 HOME 环境变量的值来确定一下当前用户的家目录,比方说我当前的root用户的家目录就是 /root 。之所以说列表中最后两个配置文件是用户相关的,是因为不同的Linux 系统的用户都可以在自己的用户目录下创建 .my.cnf 或者 .mylogin.cnf ,换句话说,不同登录用户使用的 .my.cnf 或者 .mylogin.cnf 配置文件可以是不同的。
    • defaults-extra-file 用来添加额外的配置文件路径
    • .mylogin.cnf 它不是一个纯文本文件(其他的配置文件都是纯文本文件),而是使用mysql_config_editor 实用程序创建的加密文件。文件中只能包含一些用于启动客户端软件时连接服务器的一些选项,包括 host 、user 、password 、 port 和 socket 。而且它只能被客户端程序所使用。

    在实际使用中。服务器上的这几个路径中的任意一个都可以当作配置文件来使用,如果它们不存在,可以手动创建,比方说手动在 ~/.my.cnf 这个路径下创建一个配置文件。
    另外,我们知道在使用 mysqld_safe 程序启动服务器时,会间接调用mysqld ,所以对于传递给 mysqld_safe 的启动选项来说,如果 mysqld_safe 程序不处理,会接着传递给mysqld 程序处理。比方说 skip-networking 选项是由 mysqld 处理的, mysqld_safe 并不处理,但是如果我们我们在命令行上这样执行:
    mysqld_safe --skip-networking
    则在 mysqld_safe 调用 mysqld 时,会把它处理不了的这个 skip-networking 选项交给 mysqld 处理。

    配置文件的内容

    与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[] 扩起来,目前mysql中支持的组名有server 、mysqld 、mysqld_safe 、 client 、 mysql 、mysqladmin 。每个组下边可以定义若干个启动选项,我们以 [server] 组为例来看一下填写启动选项的形式(其他组中启动选项的形式是一样的):
    [server]
    option1 #这是option1,该选项不需要选项值
    option2 = value2 #这是option2,该选项需要选项值

    在配置文件中指定启动选项的语法类似于命令行语法,但是配置文件中只能使用长形式的选项。在配置文件中指定的启动选项不添加 – 前缀,并且每行只指定一个选项,而且 = 周围可以有空白字符(命令行中选项名、= 、选项值之间不允许有空白字符)。另外,在配置文中,我们可以使用 # 来添加注释,从 # 出现直到行尾的内容都属于注释内容,读取配置文件时会忽略这些注释内容。
    配置文件中不同的选项组是给不同的启动命令使用的,如果选项组名称与程序名称相同,则组中的选项将专门应用于该程序。例如,[mysqld] 和 [mysql] 组分别应用于 mysqld 服务器程序和 mysql 客户端程序。不过有两个选项组比较特别:

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

    需要注意的一点是, mysqld_safe 和 mysql.server 这两个程序在启动时都会读取 [mysqld] 选项组中的内容。下面我们看看一些启动命令能读取的选项组有哪些:

    启动命令类别能读取的组
    启动命令类别能读取的组
    mysqld启动服务器[mysqld] 、 [server]
    mysqld_safe启动服务器[mysqld] 、 [server] 、 [mysqld_safe]
    mysql.server启动服务器[mysqld] 、 [server] 、 [mysql.server]
    mysql启动客户端[mysql] 、 [client]
    mysqladmin启动客户端[mysqladmin] 、 [client]
    mysqldump启动客户端[mysqldump] 、 [client]

    现在我们以 Linux操作系统为例,在 /etc/my.cnf 这个配置文件中添加一些内容( Linux系统参考上边提到的配置文件路径):

    vim /etc/my.cnf
    [server]
    default-storage-engine=MyISAM
    #然后直接用 mysqld 启动服务器程序:
    systemctl  start mysqld
    
    • 1
    • 2
    • 3
    • 4
    • 5

    虽然在命令行没有添加启动选项,但是在程序启动的时候,就会默认的到我们上边提到的配置文件路径下查找配置文件,其中就包括 /etc/my.cnf 。又由于systemctl start mysqld会调用/etc/init.d/mysqld文件,而该文件的mysqld命令可以读取 [server] 选项组的内容,所以default-storage-engine=MyISAM 这个选项是生效的。
    注意:如果我们想指定mysql.server程序的启动参数,则必须将它们放在配置文件中,而不是放在命令行中。因为mysql.server仅支持start和stop作为命令行参数。

    特定MySQL版本的专用选项组

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

    配置文件的优先级

    我们前边说过 MySQL 将在某些固定的路径下搜索配置文件,我们也可以通过在命令行上指定 defaults-extrafile 启动选项来指定额外的配置文件路径。 MySQL 将按照我们在上表中给定的顺序依次读取各个配置文件,如果该文件不存在则忽略。值得注意的是,如果我们在多个配置文件中设置了相同的启动选项,那以最后一个配置文件中的为准。比方说 /etc/my.cnf 文件的内容是这样的:
    [server]
    default-storage-engine=InnoDB
    而 ~/.my.cnf 文件中的内容是这样的:
    [server]
    default-storage-engine=MyISAM
    又因为 ~/.my.cnf 比 /etc/my.cnf 顺序靠后,所以如果两个配置文件中出现相同的启动选项,以 ~/.my.cnf 中的为准,所以 MySQL 服务器程序启动之后, default-storage-engine 的值就是 MyISAM 。

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

    我们说同一个命令可以访问配置文件中的多个组,比如 mysqld 可以访问 [mysqld] 、 [server] 组,如果在同一个配置文件中,比如 /etc/my.cnf ,在这些组里出现了同样的配置项,比如这样:
    [server]
    default-storage-engine=InnoDB
    [mysqld]
    default-storage-engine=MyISAM
    那么,将以最后一个出现的组中的启动选项为准,比方说例子中 default-storage-engine 既出现在 [mysqld] 组也出现在 [server] 组,因为 [mysqld] 组在 [server] 组后边,所以以 [mysqld] 组中的配置项为最终使用配置。

    defaults-file的使用

    如果我们不想让 MySQL 到默认的路径下搜索配置文件(就是上表中列出的那些),可以在命令行指定 defaultsfile 选项,比如这样(以Linux 系统为例):
    mysqld --defaults-file=/tmp/myconfig.cnf
    这样,在程序启动的时候将只在 /tmp/myconfig.cnf路径下搜索配置文件。如果文件不存在或无法访问,则会发生错误。
    注意:defaults-extra-filedefaults-file的区别,使用defaults-extra-file可以指定额外的
    配置文件搜索路径(也就是说那些固定的配置文件路径也会被搜索)。

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

    在命令行上指定的绝大部分启动选项都可以放到配置文件中,但是有一些选项是专门为命令行设计的,比方说defaults-extra-file 、 defaults-file 这样的选项本身就是为了指定配置文件路径的,就不用放在配置文件中了。其他的一些只能用在命令行上而不能用到配置文件中的启动选项我们后面用到的时候再具体说明。此外,如果同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准!比如我们在配置文件中写了:
    [server]
    default-storage-engine=InnoDB
    而我们的启动命令是:
    mysql.server start --default-storage-engine=MyISAM
    那么最后 default-storage-engine 的值是 MyISAM。

    系统变量

    系统变量简介

    MySQL 服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为 MySQL 系统变量,比如允许同时连入的客户端数量用系统变量 max_connections 表示,表的默认存储引擎用系统变量 default_storage_engine 表示,查询缓存的大小用系统变量 query_cache_size 表示, MySQL 服务器程序的系统变量有好几百条,每个系统变量都有一个默认值,我们可以使用命令行或者配置文件中的选项在启动服务器时改变一些系统变量的值。大多数的系统变量的值也可以在程序运行过程中修改,而无需停止并重新启动它。

    系统变量的查看

    我们可以使用下列命令查看 MySQL 服务器程序支持的系统变量以及它们的当前值:
    SHOW VARIABLES [LIKE 匹配的模式];
    但是系统变量很多,直接使用 SHOW VARIABLES 查看的话会很难查找到某个具体的变量配置,我们可以指定查看某个系统变量,但是有很多的系统变量名我们可能记得不是很清楚,可以使用LIKE配合%进行模糊匹配过滤条件来查看我们需要的系统变量的值,%可以在任何位置,如下:

    mysql> SHOW VARIABLES LIKE 'default_storage_engine';
    +------------------------+--------+
    | Variable_name          | Value  |
    +------------------------+--------+
    | default_storage_engine | InnoDB |
    +------------------------+--------+
    1 row in set (0.01 sec)
    
    mysql> SHOW VARIABLES LIKE 'default%';
    +-------------------------------+-----------------------+
    | Variable_name                 | Value                 |
    +-------------------------------+-----------------------+
    | default_authentication_plugin | mysql_native_password |
    | default_password_lifetime     | 0                     |
    | default_storage_engine        | InnoDB                |
    | default_tmp_storage_engine    | InnoDB                |
    | default_week_format           | 0                     |
    +-------------------------------+-----------------------+
    5 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    设置系统变量

    通过启动选项设置

    大部分的系统变量可以通过启动服务器时传送启动选项的方式和通过配置文件添加启动选项两种方式来进行设置,如下:

    • 通过命令行添加启动选项:
      mysqld --default-storage-engine=MyISAM --max-connections=200
    • 通过配置文件添加启动选项:
      [server]
      default-storage-engine=MyISAM
      max-connections=200

    注意:对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间可以用短划线 - 或者下划线 _ 连接,但是对应的系统变量之间必须使用下划线 _ 连接起来。

    服务器程序运行过程中设置

    对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修改而无需停止并重启服务器。不过系统变量有作用范围之分,以下作一些说明。
    设置不同作用范围的系统变量
    我们前边说过,多个客户端程序可以同时连接到一个服务器程序。对于同一个系统变量,我们有时想让不同的客户端有不同的值。比方客户端A他想让当前客户端对应的默认存储引擎为 InnoDB ,所以他可以把系统变量 default_storage_engine 的值设置为 InnoDB ;客户端B想让当前客户端对应的默认存储引擎为 MyISAM ,所以他可以把系统变量default_storage_engine 的值设置为 MyISAM 。这样可以A和B两个客户端拥有不同的默认存储引擎(只对后面创建的表生效),使用时互不影响,十分方便。但是这样各个客户端都私有一份系统变量会产生这么两个问题:

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

    Mysql中提出了系统变量的作用范围的概念,具体来说作用范围分为这两种:

    • GLOBAL :全局变量,影响服务器的整体操作。
    • SESSION :会话变量,影响某个客户端连接的操作。(注:SESSION 有个别名叫 LOCAL)

    在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认值)。然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量的当前值初始化。
    以 default_storage_engine 举例,在服务器启动时会初始化一个名为default_storage_engine ,作用范围为 GLOBAL 的系统变量。之后每当有一个客户端连接到该服务器时,服务器都会单独为该客户端分配一个名为 default_storage_engine ,作用范围为 SESSION 的系统变量,该作用范围为SESSION 的系统变量值按照当前作用范围为 GLOBAL 的同名系统变量值进行初始化。
    很明显通过启动选项设置的系统变量的作用范围都是 GLOBAL 的,也就是对所有客户端都是有效的,因为在系统启动的时候还没有客户端程序连接进来。

    在服务器程序运行期间通过客户端程序设置系统变量的语法:
    SET [GLOBAL|SESSION] 系统变量名 = 值;
    或者写成这样也行:
    SET [@@(GLOBAL|SESSION).]var_name = XXX;
    比如我们想在服务器运行过程中把作用范围为 GLOBAL 的系统变量 default_storage_engine 的值修改为MyISAM ,也就是想让之后新连接到服务器的客户端都用 MyISAM 作为默认的存储引擎,那我们可以选择下边两条语句中的任意一条来进行设置:
    语句一:SET GLOBAL default_storage_engine = MyISAM;
    语句二:SET @@GLOBAL.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 [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];

    如下设置并查看系统变量的过程:

    mysql> show session variables like "default_storage_engine";
    +------------------------+--------+
    | Variable_name          | Value  |
    +------------------------+--------+
    | default_storage_engine | InnoDB |
    +------------------------+--------+
    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)
    
    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.01 sec)
    
    • 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

    可以看到,最初 default_storage_engine 的系统变量无论是在 GLOBAL 作用范围上还是在 SESSION 作用范围上的值都是 InnoDB ,我们在 SESSION 作用范围把它的值设置为 MyISAM 之后,可以看到 GLOBAL 作用范围的值并没有改变。
    注意:如果某个客户端改变了某个系统变量在GLOBAL作用范围的值,并不会影响该系统变量在当前已经连接的客户端作用范围为SESSION的值,只会影响后续连入的客户端在作用范围为SESSION的值。
    注意事项:

    • 并不是所有系统变量都具有 GLOBAL 和 SESSION 的作用范围。
      • 有一些系统变量只具有 GLOBAL 作用范围,比方说 max_connections ,表示服务器程序支持同时最多有多少个客户端程序进行连接。
      • 有一些系统变量只具有 SESSION 作用范围,如 insert_id ,表示在对某个包含 AUTO_INCREMENT 列的表进行插入时,该列初始的值。
      • 有一些系统变量的值既具有 GLOBAL 作用范围,也具有 SESSION 作用范围,比如我们前边用到的default_storage_engine ,而且绝大部分的系统变量都是可以设置这两个范围的。
    • 有些系统变量是只读的,并不能设置值。
      比方说 version相关的 ,表示当前 MySQL 版本的相关信息,我们客户端是不能设置改变它的,只能使用SHOW VARIABLES 语句里查看。

    启动选项和系统变量的区别

    启动选项是在程序启动时我们传递的一些参数,而系统变量是影响服务器程序运行行为的变量,它们之间的关系如下:

    • 大部分的系统变量都可以通过启动选项进行设置。
    • 部分系统变量是在程序运行过程中自动生成的,是不可以当作启动选项来设置,比如
      auto_increment_offset 、character_set_client 等。
    • 有些启动选项也不是系统变量,比如 defaults-file 。

    状态变量

    为了让我们更好的了解服务器程序的运行情况, MySQL 服务器程序中维护了好多关于程序运行状态的变量,它们被称为状态变量 。比方说 Threads_connected 表示当前有多少客户端与服务器建立了连接, Handler_update表示已经更新了多少行记录等,这些状态信息能很好的反应服务器当时的运行状况。
    由于状态变量是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置,我们使用人员是不能设置的。与系统变量类似, 状态变量也有 GLOBAL 和 SESSION 两个作用范围的,所以查看 状态变量的语句可以这么写:
    SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];
    类似的,如果我们不写明作用范围,默认的作用范围是 SESSION ,比方说这样:

    mysql> show status like "thread%";
    +-------------------+-------+
    | Variable_name     | Value |
    +-------------------+-------+
    | Threads_cached    | 0     |
    | Threads_connected | 1     |
    | Threads_created   | 1     |
    | Threads_running   | 1     |
    +-------------------+-------+
    4 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    所有以 Thread 开头的 SESSION 作用范围的状态变量就都被显示出来了。

    更多关于mysql的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

  • 相关阅读:
    小程序制作小程序开发适合哪些企业?
    Evil.js(罪恶的) —— 代码
    Maven间接依赖
    在RabbitMQ中 WorkQueue 工作队列 和发布(publish)/订阅(Subscribe) 有什么区别?
    基础中的基础!吴恩达deeplearning.ai:如何搭建一个神经网络
    SpringMVC使用(二)
    几行代码轻松实现flutter 调用百度地图
    金九银十面试跳槽季;你准备好了吗?
    【概念认知】关于“体系”概念的个人认识
    腾讯季报图解:营收1340亿降3% 马化腾称主动退出非核心业务
  • 原文地址:https://blog.csdn.net/margu_168/article/details/133773869