MySQL的调控按钮 —— 启动选项和系统变量

发布时间:2026/7/28 14:12:22

MySQL的调控按钮 —— 启动选项和系统变量 启动选项和配置文件标签 MySQL 是怎样运行的如果你用过手机你的手机上一定有一个设置的功能你可以选择设置手机的来电铃声、设置音量大小、设置解锁密码等等。假如没有这些设置功能我们的生活将置于尴尬的境地比如在图书馆里无法把手机设置为静音无法把流量开关关掉以节省流量在别人得知解锁密码后无法更改密码MySQL的服务器程序和客户端程序也有很多设置项比如对于MySQL服务器程序我们可以指定诸如允许同时连入的客户端数量、客户端和服务器通信方式、表的默认存储引擎、查询缓存的大小吧啦吧啦的设置项。对于MySQL客户端程序我们之前已经见识过了可以指定需要连接的服务器程序所在主机的主机名或IP地址、用户名及密码等信息。这些设置项一般都有各自的默认值比方说服务器允许同时连入的客户端的默认数量是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表示的含义是相同的。所以上边的写法与下边的写法是等价的mysqld --skip_networking在按照上述命令启动服务器程序后如果我们再使用mysql来启动客户端程序时再把服务器主机名指定为127.0.0.1IP地址的形式的话会显示连接失败mysql -h127.0.0.1 -uroot -p Enter password: ERROR 2003 (HY000): Cant connect to MySQL server on 127.0.0.1 (61)这就意味着我们指定的启动选项skip-networking生效了再举一个例子我们前边说过如果在创建表的语句中没有显式指定表的存储引擎的话那就会默认使用InnoDB作为表的存储引擎。如果我们想改变表的默认存储引擎的话可以这样写启动服务器的命令行mysqld --default-storage-engineMyISAM我们现在就已经把表的默认存储引擎改为MyISAM了在客户端程序连接到服务器程序后试着创建一个表mysql CREATE TABLE sys_var_demo( - i INT - ); Query OK, 0 rows affected (0.02 sec)这个定义语句中我们并没有明确指定表的存储引擎创建成功后再看一下这个表的结构mysql SHOW CREATE TABLE sys_var_demo\G *************************** 1. row *************************** Table: sys_var_demo Create Table: CREATE TABLE sys_var_demo ( i int(11) DEFAULT NULL ) ENGINEMyISAM DEFAULT CHARSETutf8 1 row in set (0.01 sec)可以看到该表的存储引擎已经是MyISAM了说明启动选项default-storage-engine生效了。所以在启动服务器程序的命令行后边指定启动选项的通用格式就是这样的--启动选项1[值1] --启动选项2[值2] ... --启动选项n[值n]也就是说我们可以将各个启动选项写到一行中各个启动选项之间使用空白字符隔开在每一个启动选项名称前边添加--。对于不需要值的启动选项比方说skip-networking它们就不需要指定对应的值。对于需要指定值的启动选项比如default-storage-engine我们在指定这个设置项的时候需要显式的指定它的值比方说InnoDB、MyISAM啦什么的 在命令行上指定有值的启动选项时需要注意选项名、、选项值之间不可以有空白字符比如写成下边这样就是不正确的mysqld --default-storage-engine MyISAM每个MySQL程序都有许多不同的选项。大多数程序提供了一个–help选项你可以查看该程序支持的全部启动选项以及它们的默认值。例如使用mysql --help可以看到mysql程序支持的启动选项mysqld_safe --help可以看到mysqld_safe程序支持的启动选项。查看mysqld支持的启动选项有些特别需要使用mysqld --verbose --help。选项的长形式和短形式我们前边提到的skip-networking、default-storage-engine称之为长形式的选项因为它们很长设计MySQL的大叔为了我们使用的方便对于一些常用的选项提供了短形式我们列举一些具有短形式的启动选项来瞅瞅MySQL支持的短形式选项太多了全列出来会刷屏的长形式短形式含义--host-h主机名--user-u用户名--password-p密码--port-P端口--version-V版本信息短形式的选项名只有一个字母与使用长形式选项时需要在选项名前加两个短划线--不同的是使用短形式选项时在选项名前只加一个短划线-前缀。有一些短形式的选项我们之前已经接触过了比方说我们在启动服务器程序时指定监听的端口号mysqld -P3307使用短形式指定启动选项时选项名和选项值之间可以没有间隙或者用空白字符隔开-p选项有些特殊-p和密码值之间不能有空白字符也就是说上边的命令形式和下边的是等价的mysqld -P 3307另外选项名是区分大小写的比如-p和-P选项拥有完全不同的含义大家需要注意一下。配置文件中使用选项在命令行中设置启动选项只对当次启动生效也就是说如果下一次重启程序的时候我们还想保留这些启动选项的话还得重复把这些选项写到启动命令行中这样真的神烦唉于是设计MySQL的大叔们提出一种配置文件也称为选项文件的概念我们把需要设置的启动选项都写在这个配置文件中每次启动服务器的时候都从这个文件里加载相应的启动选项。由于这个配置文件可以长久的保存在计算机的硬盘里所以只需我们配置一次以后就都不用显式的把启动选项都写在启动命令行中了所以我们推荐使用配置文件的方式来设置启动选项。配置文件的路径MySQL程序在启动时会寻找多个路径下的配置文件这些路径有的是固定的有的是可以在命令行指定的。根据操作系统的不同配置文件的路径也有所不同我们分开看一下。Windows操作系统的配置文件在Windows操作系统中MySQL会按照下列路径来寻找配置文件路径名备注%WINDIR%\my.ini%WINDIR%\my.cnfC:\my.iniC:\my.cnfBASEDIR\my.iniBASEDIR\my.cnfdefaults-extra-file命令行指定的额外配置文件路径%APPDATA%\MySQL\.mylogin.cnf登录路径选项仅限客户端在阅读这些Windows操作系统下配置文件路径的时候需要注意一些事情在给定的前三个路径中配置文件可以使用.ini的扩展名也可以使用.cnf的扩展名。%WINDIR%指的是你机器上Windows目录的位置通常是C:\WINDOWS如果你不确定可以使用这个命令来查看echo %WINDIR%BASEDIR指的是MySQL安装目录的路径在我的Windows机器上的BASEDIR的值是C:\Program Files\MySQL\MySQL Server 5.7第四个路径指的是我们在启动程序时可以通过指定defaults-extra-file参数的值来添加额外的配置文件路径比方说我们在命令行上可以这么写mysqld --defaults-extra-fileC:\Users\xiaohaizi\my_extra_file.txt这样MySQL服务器启动时就可以额外在C:\Users\xiaohaizi\my_extra_file.txt这个路径下查找配置文件。%APPDATA%表示Windows应用程序数据目录的值可以使用下列命令查看echo %APPDATA%列表中最后一个名为.mylogin.cnf配置文件有点儿特殊它不是一个纯文本文件其他的配置文件都是纯文本文件而是使用mysql_config_editor实用程序创建的加密文件。文件中只能包含一些用于启动客户端软件时连接服务器的一些选项包括host、user、password、port和socket。而且它只能被客户端程序所使用。小贴士 mysql_config_editor实用程序其实是MySQL安装目录下的bin目录下的一个可执行文件这个实用程序有专用的语法来生成或修改 .mylogin.cnf 文件中的内容如何使用这个程序不是我们讨论的主题可以到MySQL的官方文档中查看。类Unix操作系统中的配置文件在类UNIX操作系统中MySQL会按照下列路径来寻找配置文件路径名备注/etc/my.cnf/etc/mysql/my.cnfSYSCONFDIR/my.cnf$MYSQL_HOME/my.cnf特定于服务器的选项仅限服务器defaults-extra-file命令行指定的额外配置文件路径~/.my.cnf用户特定选项~/.mylogin.cnf用户特定的登录路径选项仅限客户端在阅读这些UNIX操作系统下配置文件路径的时候需要注意一些事情SYSCONFDIR表示在使用CMake构建MySQL时使用SYSCONFDIR选项指定的目录。默认情况下这是位于编译安装目录下的etc目录。小贴士 如果你不懂啥是个CMAKE啥是个编译那就跳过吧对我们后续的文章没啥影响。MYSQL_HOME是一个环境变量该变量的值是我们自己设置的我们想设置就设置不想设置就不设置。该变量的值代表一个路径我们可以在该路径下创建一个my.cnf配置文件那么这个配置文件中只能放置关于启动服务器程序相关的选项言外之意就是其他的配置文件既能存放服务器相关的选项也能存放客户端相关的选项.mylogin.cnf除外它只能存放客户端相关的一些选项。小贴士 如果大家使用mysqld_safe启动服务器程序而且我们也没有主动设置这个MySQL_HOME环境变量的值那这个环境变量的值将自动被设置为MySQL的安装目录也就是MySQL服务器将会在安装目录下查找名为my.cnf配置文件别忘了mysql.server会调用mysqld_safe所以使用mysql.server启动服务器时也会在安装目录下查找配置文件。列表中的最后两个以~开头的路径是用户相关的类UNIX系统中都有一个当前登陆用户的概念每个用户都可以有一个用户目录~就代表这个用户目录大家可以查看HOME环境变量的值来确定一下当前用户的用户目录比方说我的macOS机器上的用户目录就是/Users/xiaohaizi。之所以说列表中最后两个配置文件是用户相关的是因为不同的类UNIX系统的用户都可以在自己的用户目录下创建.my.cnf或者.mylogin.cnf换句话说不同登录用户使用的.my.cnf或者.mylogin.cnf配置文件是不同的。defaults-extra-file的含义与Windows中的一样。.mylogin.cnf的含义也同Windows中的一样再次强调一遍它不是纯文本文件只能使用mysql_config_editor实用程序去创建或修改用于存放客户端登陆服务器时的相关选项。这也就是说在我的计算机中这几个路径中的任意一个都可以当作配置文件来使用如果它们不存在你可以手动创建一个比方说我手动在~/.my.cnf这个路径下创建一个配置文件。另外我们在唠叨如何启动MySQL服务器程序的时候说过使用mysqld_safe程序启动服务器时会间接调用mysqld所以对于传递给mysqld_safe的启动选项来说如果mysqld_safe程序不处理会接着传递给mysqld程序处理。比方说skip-networking选项是由mysqld处理的mysqld_safe并不处理但是如果我们我们在命令行上这样执行mysqld_safe --skip-networking则在mysqld_safe调用mysqld时会把它处理不了的这个skip-networking选项交给mysqld处理。配置文件的内容与在命令行中指定启动选项不同的是配置文件中的启动选项被划分为若干个组每个组有一个组名用中括号[]扩起来像这样[server] (具体的启动选项...) [mysqld] (具体的启动选项...) [mysqld_safe] (具体的启动选项...) [client] (具体的启动选项...) [mysql] (具体的启动选项...) [mysqladmin] (具体的启动选项...)像这个配置文件里就定义了许多个组组名分别是server、mysqld、mysqld_safe、client、mysql、mysqladmin。每个组下边可以定义若干个启动选项我们以[server]组为例来看一下填写启动选项的形式其他组中启动选项的形式是一样的[server] option1 #这是option1该选项不需要选项值 option2 value2 #这是option2该选项需要选项值 ...在配置文件中指定启动选项的语法类似于命令行语法但是配置文件中只能使用长形式的选项。在配置文件中指定的启动选项不允许加--前缀并且每行只指定一个选项而且周围可以有空白字符命令行中选项名、、选项值之间不允许有空白字符。另外在配置文件中我们可以使用#来添加注释从#出现直到行尾的内容都属于注释内容读取配置文件时会忽略这些注释内容。为了大家更容易对比启动选项在命令行和配置文件中指定的区别我们再把命令行中指定option1和option2两个选项的格式写一遍看看--option1 --option2value2配置文件中不同的选项组是给不同的启动命令使用的如果选项组名称与程序名称相同则组中的选项将专门应用于该程序。例如[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]现在我们以macOS操作系统为例在/etc/mysql/my.cnf这个配置文件中添加一些内容Windows系统参考上边提到的配置文件路径[server] skip-networking default-storage-engineMyISAM然后直接用mysqld启动服务器程序mysqld虽然在命令行没有添加启动选项但是在程序启动的时候就会默认的到我们上边提到的配置文件路径下查找配置文件其中就包括/etc/mysql/my.cnf。又由于mysqld命令可以读取[server]选项组的内容所以skip-networking和default-storage-engineMyISAM这两个选项是生效的。你可以把这些启动选项放在[client]组里再试试用mysqld启动服务器程序看一下里边的启动选项生效不剧透一下不生效。小贴士 如果我们想指定mysql.server程序的启动参数则必须将它们放在配置文件中而不是放在命令行中。mysql.server仅支持start和stop作为命令行参数。特定MySQL版本的专用选项组我们可以在选项组的名称后加上特定的MySQL版本号比如对于[mysqld]选项组来说我们可以定义一个[mysqld-5.7]的选项组它的含义和[mysqld]一样只不过只有版本号为5.7的mysqld程序才能使用这个选项组中的选项。配置文件的优先级我们前边唠叨过MySQL将在某些固定的路径下搜索配置文件我们也可以通过在命令行上指定defaults-extra-file启动选项来指定额外的配置文件路径。MySQL将按照我们在上表中给定的顺序依次读取各个配置文件如果该文件不存在则忽略。值得注意的是如果我们在多个配置文件中设置了相同的启动选项那以最后一个配置文件中的为准。比方说/etc/my.cnf文件的内容是这样的[server] default-storage-engineInnoDB而~/.my.cnf文件中的内容是这样的[server] default-storage-engineMyISAM又因为~/.my.cnf比/etc/my.cnf顺序靠后所以如果两个配置文件中出现相同的启动选项以~/.my.cnf中的为准所以MySQL服务器程序启动之后default-storage-engine的值就是MyISAM。同一个配置文件中多个组的优先级我们说同一个命令可以访问配置文件中的多个组比如mysqld可以访问[mysqld]、[server]组如果在同一个配置文件中比如~/.my.cnf在这些组里出现了同样的配置项比如这样[server] default-storage-engineInnoDB [mysqld] default-storage-engineMyISAM那么将以最后一个出现的组中的启动选项为准比方说例子中default-storage-engine既出现在[mysqld]组也出现在[server]组因为[mysqld]组在[server]组后边就以[mysqld]组中的配置项为准。defaults-file的使用如果我们不想让MySQL到默认的路径下搜索配置文件就是上表中列出的那些可以在命令行指定defaults-file选项比如这样以UNIX系统为例mysqld --defaults-file/tmp/myconfig.txt这样在程序启动的时候将只在/tmp/myconfig.txt路径下搜索配置文件。如果文件不存在或无法访问则会发生错误。小贴士 注意defaults-extra-file和defaults-file的区别使用defaults-extra-file可以指定额外的配置文件搜索路径也就是说那些固定的配置文件路径也会被搜索。命令行和配置文件中启动选项的区别在命令行上指定的绝大部分启动选项都可以放到配置文件中但是有一些选项是专门为命令行设计的比方说defaults-extra-file、defaults-file这样的选项本身就是为了指定配置文件路径的再放在配置文件中使用就没啥意义了。剩下的一些只能用在命令行上而不能用到配置文件中的启动选项就不一一列举了用到的时候再提哈本书中基本用不到有兴趣的到官方文档看哈。另外有一点需要特别注意如果同一个启动选项既出现在命令行中又出现在配置文件中那么以命令行中的启动选项为准比如我们在配置文件中写了[server] default-storage-engineInnoDB而我们的启动命令是mysql.server start --default-storage-engineMyISAM那最后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 max_connections; ------------------------ | Variable_name | Value | ------------------------ | max_connections | 151 | ------------------------ 1 row in set (0.00 sec)可以看到现在服务器程序使用的默认存储引擎就是InnoDB允许同时连接的客户端数量最多为151。别忘了LIKE表达式后边可以跟通配符来进行模糊查询也就是说我们可以这么写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.01 sec) mysql这样就查出了所有以default开头的系统变量的值。设置系统变量通过启动选项设置大部分的系统变量都可以通过启动服务器时传送启动选项的方式来进行设置。如何填写启动选项我们上边已经花了大篇幅来唠叨了就是下边两种方式通过命令行添加启动选项。比方说我们在启动服务器程序时用这个命令mysqld --default-storage-engineMyISAM --max-connections10通过配置文件添加启动选项。我们可以这样填写配置文件[server] default-storage-engineMyISAM max-connections10当使用上边两种方式中的任意一种启动服务器程序后我们再来查看一下系统变量的值mysql SHOW VARIABLES LIKE default_storage_engine; -------------------------------- | Variable_name | Value | -------------------------------- | default_storage_engine | MyISAM | -------------------------------- 1 row in set (0.00 sec) mysql SHOW VARIABLES LIKE max_connections; ------------------------ | Variable_name | Value | ------------------------ | max_connections | 10 | ------------------------ 1 row in set (0.00 sec) mysql可以看到default_storage_engine和max_connections这两个系统变量的值已经被修改了。有一点需要注意的是对于启动选项来说如果启动选项名由多个单词组成各个单词之间用短划线-或者下划线_连接起来都可以但是对应的系统变量之间必须使用下划线_连接起来。服务器程序运行过程中设置系统变量比较牛逼的一点就是对于大部分系统变量来说它们的值可以在服务器程序运行过程中进行动态修改而无需停止并重启服务器。不过系统变量有作用范围之分下边详细唠叨下。设置不同作用范围的系统变量我们前边说过多个客户端程序可以同时连接到一个服务器程序。对于同一个系统变量我们有时想让不同的客户端有不同的值。比方说狗哥使用客户端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作为默认的存储引擎那我们可以选择下边两条语句中的任意一条来进行设置语句一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.00 sec) mysql可以看到最初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) mysql所有以Thread开头的SESSION作用范围的状态变量就都被展示出来了。

相关新闻