【问题标题】:Show the default value for a variable显示变量的默认值
【发布时间】:2019-09-10 23:02:10
【问题描述】:

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

SET GLOBAL max_connections = 1000;

然后使用以下命令列出变量:

SHOW GLOBAL VARIABLES LIKE 'max_connections';

我可以看到修改后的值1000,但是是否有可能在不检查配置文件的情况下获取此系统变量的默认值?

我在 ubuntu 16.04 上使用 mysql 5.7。

【问题讨论】:

  • 我相信 max_connections 是 151dev.mysql.com/doc/refman/5.7/en/…
  • 这只是一个例子,不回答问题:)
  • 我认为您必须查看变​​量的官方文档,您已经用自定义值覆盖了它们。
  • 我知道我可以检查文档,问题是我是否以及如何在不阅读每个变量的文档的情况下做到这一点:)

标签: mysql variables default-value mysql-variables


【解决方案1】:

在 MySQL 5.7 中,您可以使用 performance_schema 来获取变量。

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

方法#1

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

输出 #1

|变量值 | | :------------- | | 151 |

方法#2

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

SHOW GLOBAL VARIABLES LIKE 'max_connect%';

输出 #2

变量名 |价值 :----------------- | :---- 最大连接错误 | 100 最大连接数 | 151

方法#3

SELECT @@GLOBAL.max_connections;

输出#3

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

参考这里db-fiddle

注意: 如果您需要历史记录类的东西,那么您需要在更改之前创建一个表来存储这些值。

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

学分:@scaisedge,@richard

【讨论】:

  • 这似乎是一个不错的解决方案。我会尽快尝试一下,看看它是否按预期工作。
【解决方案2】:

From the manual:

将全局系统变量值设置为已编译的 MySQL 默认值 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 是用户变量。

【讨论】:

    【解决方案3】:

    可以从 information_schema.GLOBAL_STATUS 中选择

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

    【讨论】:

    • 嗯,表中不包含任何名为max_connections的变量?查看global_variables 表,它包含变量,但值已更改。关于如何解决这个问题的任何想法?
    • 我正在运行 mysql 5.7
    • 默认值为 151,如 doc dev.mysql.com/doc/refman/5.7/en/…
    • 是的,我知道我可以查看文档以获取此信息,但是您对如何通过实际查询数据库来做到这一点没有任何想法?
    • 在 my.ini 中不存在 .. 所以这个参数设置只在 DB 中
    【解决方案4】:

    这可能并不理想,但如果是我尝试解决问题,我会使用所有初始值创建自己的表,并在需要时引用它。

    CREATE TABLE 
       default_variables
    SELECT 
       * 
    FROM 
       information_schema.GLOBAL_STATUS;
    

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

    只需导出数据并将其导入任何您需要的地方。

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

    【讨论】:

    • 跟踪默认值是个好主意,但在这种情况下,我真的不可能创建任何表,因为我没有对数据库的写访问权限。
    【解决方案5】:

    你试过用这个吗

    mysqld --verbose --help
    

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

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

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

    【讨论】:

    • 是的,这可行,但我无法执行任何二进制文件或读取任何配置文件。如果可能,解决方案必须是通过查询数据库获取信息。
    【解决方案6】:

    [编辑:扩展elomatanswer;我没有足够的声誉对此发表评论]

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

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

    由于您无法执行命令,我建议在使用相同发行版/发行版/MySQL 版本创建的虚拟机中运行此命令(要查找 MySQL 的版本,请使用查询 select version();)。 p>

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 1970-01-01
      • 2011-09-22
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 2013-04-06
      相关资源
      最近更新 更多