MySQL数据和InnoDB存储引擎表中的各种类型的文件,这些文件如下:
当MySQL实例启动时,数据库会先去读一个配置参数,用来寻找数据库的各种我恩据所在文职以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等。在默认情况下,MySQL实例会按照一定的顺序在指定的位置进行读取,用户只需要通过命令mysql --help | grep my.cnf
来寻找即可。
MySQL数据库参数的作用和Oracle数据库的参数极其类似,不同的是,Oracle实例在启动时若找不到参数文件,是不能进行状态(mount)操作的。MySQL稍微有所不同,MySQL实例可以不需要参数文件,这时所有的参数取决于编译MySQL时指定的默认值和源代码的指定参数的默认值。但是,如果MySQL实例在默认的数据库目录下找不到MySQL架构,则启动同样会失败,可通过错误日志查看。
MySQL的参数文件是以文本方式进行存储的,用户可以直接通过一些常用的文本编辑器来进行参数的修改。
简单的说,可以把数据库参数看成一个键值对。
比如参数datadir
是键,那么他的值就是/var/lib/mysql/
可以通过SHOW VARIABLES
查看数据库中所有参数,也可以通过LIKE
来过滤参数名。
mysql> show variables like 'datadir%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
从MySQL 5.1版本开始,可以通过information_schema
架构下的global_variables
视图进行查找:
select *
from global_variables
where variable_name like 'datadir%'
从MySQL 5.7.6开始information_shcema.global_variables
已经开始被舍弃,为了兼容性,此时需要打开show_compatibility_56
# 1.查询global_variables异常
mysql> select * from global_variables where variable_name like 'innodb_buffer%' \G;
ERROR 3167 (HY000): The 'INFORMATION_SCHEMA.GLOBAL_VARIABLES' feature is disabl ed; see the documentation for 'show_compatibility_56'
ERROR:
No query specified# 2.查看show_compatibility_56状态
mysql> show variables like '%show_compatibility_56%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| show_compatibility_56 | OFF |
+-----------------------+-------+
1 row in set (0.00 sec)# 3.临时开启show_compatibility_56,重启后失效
# 需要修改my.cnf,添加"show_compatibility_56=1"后永久生效
mysql> set global show_compatibility_56=on;
Query OK, 0 rows affected (0.00 sec)# 4.再次查询
mysql> select * from global_variables where variable_name like 'datadir%';
+---------------+-----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------+-----------------+
| DATADIR | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set, 1 warning (0.00 sec)
MySQL数据库参数可以分为两类:
动态参数意味着可以在MySQL实例运行中进行更改,静态参数说明在整个实例生命周期内都不得进行更改,就好像是只读的。可以通过SET命令对动态参数值进行修改,SET的语法如下:
SET
| [global | session] system_var_name=expr
| [@@global. | @@session. | @@]system_var_name=expr
可以看到这里有global和session关键字,它们表明该参数的修改是基于当前会话还是整个实例的生命周期。有些动态参数只能在会话中进行修改,如autocommit;而有些参数修改完后,在整个实例生命周期中都会生效,如binlog_cache_size; 而有些参数既可以在会话中又可以在整个生命周期内生效,如read_buffer_size。
但是需要注意的是,通过set @@global.system_var_name=expr;
方法对变量的全局值进行修改,在这次的实例生命周期内都有效。但MySQL实例本身并不会对参数文件中的该值进行修改。也就是说,在下次启动时MySQL实例还是会读取参数文件。若想在数据库实例下一次启动时参数保留当前修改的值,那么必须通过修改参数文件实现。