显示变量的默认值

Show the default value for a variable

我正在使用 SET GLOBAL <variable> = <value> 修改 mysql 中的动态设置,我想知道是否有某种方法可以获取每个变量的默认值?例如,如果我使用以下内容:

SET GLOBAL max_connections = 1000;

然后使用以下方式列出变量:

SHOW GLOBAL VARIABLES LIKE 'max_connections';

我可以看到修改后的值1000,但是有没有可能不检查配置文件就得到这个系统变量的默认值?

我在 ubuntu 16.04 上使用 mysql 5.7。

可以选择 information_schema.GLOBAL_STATUS

select VARIABLE_VALUE 
from information_schema.GLOBAL_STATUS 
where VARIABLE_NAME = 'max_connections';

这可能不太理想,但如果是我尝试解决问题,我会创建自己的 table,其中包含所有初始值并在需要时参考。

CREATE TABLE 
   default_variables
SELECT 
   * 
FROM 
   information_schema.GLOBAL_STATUS;

这需要您启动一个与您当前使用的版本相同的新数据库安装,但我认为您可以使用此方法来解决您的问题。

只需导出数据,然后在需要的地方导入即可。

我目前没有看到任何查询默认值的内置方法。

在MySQL 5.7中你可以使用performance_schema获取变量。

修改之前或者set可以select变量查看默认值再修改。

方法一

SELECT 
    VARIABLE_VALUE
FROM
    performance_schema.global_variables
WHERE
    VARIABLE_NAME = 'max_connections';

输出#1

| VARIABLE_VALUE |
| :------------- |
| 151            |

方法#2

如果您不确定变量使用的确切名称like,它也可以在上面的查询中使用。

SHOW GLOBAL VARIABLES LIKE 'max_connect%';

输出#2

Variable_name      | Value
:----------------- | :----
max_connect_errors | 100  
max_connections    | 151  

方法#3

SELECT @@GLOBAL.max_connections;

输出 #3

| @@GLOBAL.max_connections |
| -----------------------: |
|                      151 |

参考这里db-fiddle

注: 如果你需要有历史之类的东西,那么你需要创建一个 table 来在更改之前存储这些值。

P.S. 又多了一类变量session。通过将 global 替换为 session 可以更改这些变量,但它只会影响当前会话。

学分: @scaisedge,@richard

From the manual:

To set a global system variable value to the compiled-in MySQL default value [...] set the variable to the value DEFAULT.

这意味着你可以这样做:

SET @@GLOBAL.max_connections = 1234;

/*
 * Proceed in this order
 * 1) Backup current value
 * 2) Reset to default
 * 3) Read the current value
 * 4) Restore the backup value if necesssary
 */

SET @oldvalue = @@GLOBAL.max_connections;
SET @@GLOBAL.max_connections = DEFAULT;
SET @defvalue = @@GLOBAL.max_connections;
SET @@GLOBAL.max_connections = @oldvalue;

SELECT @@GLOBAL.max_connections AS `current value`
     , @defvalue AS `default value`
-- 1234 and 151

@oldvalue@defvalue是用户变量。

你试过用这个吗

mysqld --verbose --help

基于https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html,它将显示编译的默认值。

要查看特定变量,您可以使用 grep:

mysqld --verbose --help | grep -i 'max-connections'

[编辑:扩展 elomat's ;我没有足够的声望在其中发表评论]

所有 mysql* 命令都有 --no-defaults 选项 不读取 配置文件,因此您可以使用:

mysqld --no-defaults --verbose --help | awk '/Variables/,/^$/' | less

因为你不能执行命令,所以我建议 运行 在使用相同 distro/distro version/MySQL 版本 创建的虚拟机中执行此命令(至查找 MySQL 的版本使用查询 select version();).

另一方面,如果它是本地编译的二进制文件,您可以将可执行文件复制到另一台具有兼容运行时库且没有执行限制的机器。

注意:awk 模式会过滤掉起始选项,直到找到单词 Variable,然后继续打印文本,直到出现空行或文本结尾到达。此 mysqld 实例不保留 运行,因为它没有 --daemonize 选项。