2023-03-23
原文作者:一直不懂 原文地址:https://blog.csdn.net/shenchaohao12321/article/details/82798275

当 MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等。在默认情况下, MySQL实例会按照一定的顺序在指定的位置进行读取,用户只需通过以下命令来寻找即可。

    mysql --help | grep my.cnf

MySQL数据库参数文件的作用和 Oracle数据库的参数文件极其类似,不同的是,Oracle实例在启动时若找不到参数文件,是不能进行装载(mount)操作的。 MySQL稍微有所不同, MySQL实例可以不需要参数文件,这时所有的参数值取决于编译 MySQL时指定的默认值和源代码中指定参数的默认值。但是,如果 MySQL实例在默认的数据库目录下找不到mysq架构,则启动同样会失败,此时可能在错误日志文件中找到如下内容:

202303232330372381.png
MySQL的mysql架构中记录了访问该实例的权限,当找不到这个架构时, MySQL实例不会成功启动。
MySQL数据库的参数文件是以文本方式进行存储的。用户可以直接通过一些常用的文本编辑软件(如ⅵ和 emacs)进行参数的修改。

1、什么是参数

简单地说,可以把数据库参数看成一个键/值( key/value)对。可以通过命令 SHOW VARIABLES查看数据库中的所有参数,也可以通过LIKE来过滤参数名。

2、参数类型

MySQL数据库中的参数可以分为两类

  • 动态(dynamic)参数
  • 静态(static)参数

动态参数意味着可以在 MySQL实例运行中进行更改,静态参数说明在整个实例生命周期内都不得进行更改,就好像是只读(read only)的。可以通过SET命令对动态的参数值进行修改,SET的语法如下:

    SET
    [global | session] system_var_name=expr
    [@@global. | @@session.  | @@]system_var_name=expr

这里可以看到global和 session关键字,它们表明该参数的修改是基于当前会话还是整个实例的生命周期。有些动态参数只能在会话中进行修改,如 autocommit;而有些参数修改完后,在整个实例生命周期中都会生效,如 binlog_cache_size;而有些参数既可以在会话中又可以在整个实例的生命周期内生效,如 read_buffer_size。举例如下

202303232330384712.png

上述示例中将当前会话的参数 read_buffer_size从2MB调整为了512KB,而用户可以看到全局的 read_buffer_size的值仍然是2MB,也就是说如果有另一个会话登录到 MySQL实例,它的 read_buffer_size的值是2MB,而不是512KB。这里使用了set global|session来改变动态变量的值。用户同样可以直接使用SET @@global|@@session来更改,如下所示:

202303232330397553.png

这次把 read_buffer_size全局值更改为1MB,而当前会话的 read_buffer_size的值还是512KB。这里需要注意的是,对变量的全局值进行了修改,在这次的实例生命周期内都有效,但 MySQL实例本身并不会对参数文件中的该值进行修改。也就是说,在下次启动时 MySQL实例还是会读取参数文件。若想在数据库实例下一次启动时该参数还是保留为当前修改的值,那么用户必须去修改参数文件。要想知道 MySQL所有动态变量的可修改范围,可以参考 MySQL官方手册的 Dynamic System Variables的相关内容。
对于静态变量,若对其进行修改,会得到类似如下错误:
mysql>SET GLOBAL datadir='/db/mysql';
ERROR 1238 (HY000): Variable 'datadir' is a read only variable

阅读全文