Mysql将当前配置导出到文件

Mysql将当前配置导出到文件

我们丢失了 my.cnf 文件,想知道是否有办法从当前正在运行的 mysql 实例中导出副本。

谢谢!

答案1

三 (3) 个选项

选项 1:从 mysql 客户端内部

mysql -uroot -A -e"SHOW GLOBAL VARIABLES;" > MySQLCurrentSettings.txt

这会将所有选项捕获到文本文件中。

选项 2:从 Linux 命令行

ps -ef | grep mysqld | grep -v grep

这将显示 mysqld 启动时设置的 mysqld_safe 选项

方法三:直接询问服务员

mysqld --help --verbose

在“mysqld --help --verbose”显示的底部,您将看到 mysqld 从 my.cnf 加载的或默认的当前设置。

答案2

这些说明适用于 centos 7.1 上的原装 mariadb。

下面介绍如何将机器的当前设置备份或复制到新安装(现在或将来)。

在我们要复制设置的机器上,我们可以运行:

/usr/libexec/mysqld --help --verbose > mysql_current_settings.txt

在另一台机器上,我们可以安装 mariadb-server 并运行:

/usr/libexec/mysqld --help --verbose > mysql_default_settings.txt

然后我们将两个文件放入一个目录,在这个例子中是“/a/”。

然后我们运行:

comm -3 <(sort /a/mysql_current_settings.txt) <(sort /a/mysql_default_settings.txt)

如果没有输出,则两个文件相同。这意味着两台机器上的所有设置都为默认设置。

如果有输出,则有些行将不会缩进,而有些行将缩进。

非缩进的行仅出现在第一个文件中,这里是 /a/mysql_current_settings.txt。

缩进的行仅出现在第二个文件中,这里是 /a/mysql_default_settings.txt。

现在我们知道了所有设置,除了在启动 mysqld 的命令行中设置的一些设置。这些设置可能来自 /etc/my.cnf 或 /etc/my.cnf.d/* 文件,或自定义脚本,或别名等。无论如何,我们都可以使用以下命令查看它们:

ps -ef | grep mysqld

现在我们知道,在新安装中只需更改极少的设置即可将其配置为旧安装。


以下是一些其他细节。

在 centos 7.1 上,以下命令显示所有当前设置,除了在启动 mysqld 的命令行中设置的一些设置:

/usr/libexec/mysqld --help --verbose

总的来说,它表明:

第一部分,我们在启动mysqld时可以作为第一个参数使用的设置;

第二部分,编译时设置的设置;

第三部分,当前设置。

即使其输出的最后一行说:要查看正在运行的 MySQL 服务器正在使用的值,请输入:

    mysqladmin variables -uroot -p

即使我们在 /etc/my.cnf 中更改它并重新启动 mysql,该命令也不会显示 fe、bind-address。

以下命令还显示许多设置,但没有显示“bind-address”:

mysql -uroot -p -e"SHOW VARIABLES;"

请注意,在 centos 7.1 上,mysqld 不在 $PATH 中。

答案3

这是我最喜欢的生成当前 my.cnf 的方法:

{ echo -e "# MYSQL VARIABLES {{{1\n##\n# MYSQL `mysql -V|sed 's,^.*\(V.*\)\, for.*,\1,'` - By: `logname`@`hostname -f` on `date +%c`\n##"; for l in {a..z}; do echo '#'; mysql -NBe "SHOW GLOBAL VARIABLES LIKE '${l}%'" | sed 's,\t,^= ,' | column -ts^ | tr "\n" '@' | eval $(echo "sed '" "s,@\("{a..u}{a..z}"\),\n\n\1,;" "'") | eval $(echo "sed '" "s,@\(innodb_"{a..z}{a..z}"\),\n\n\1,;" "'") | tr '@' "\n" | sed 's,^,# ,g'; done; echo -e "#\n##\n# MYSQL VARIABLES }}}1"; } | tee ~/mysql-variables.log

然而,这对于 Mac OS X 来说并不可靠。

这将输出一个干净的变量日志,注释掉,准备导入到你的 my.cnf 中。

原文来源:http://www.askapache.com/mysql/view-mysql-variables-my-cnf.html

答案4

摘要my.cnf

为了以编程方式配置我自己的 mysql-client,我对从各种文件中读取的设置mysql(而不是)很感兴趣。首先,我想自己解析它们,但后来我意识到它们不仅在和中,而且它们可能完全在不同的路径中,并且可能包含。mysqldmy.cnf~/.my.cnf/etc/my.cnf

由于mysqld和同样mysql支持--help --verbose参数,我根据其他答案(尤其是rolandomysqldba瑞安)。它们都可以与 mysql 命令一起使用。只需在相应代码段的开头使用所需的命令即可。

简单值列表

为了显示文件mysql中的值my.cnf,我使用了

mysql --help --verbose \
| sed -n -E '/^---+/,/^$/{/^---+/d;/^$/d;s/^([^[:space:]]+)[[:space:]]+(\(No default value\)|(.*)$)/\1=\3/;p}' \
| sort
  1. mysql --help --verbose命令打印当前配置,如其他答案中所述。
  2. 添加的sed命令基本上改变了mysql的输出,并且
    • ------仅打印具有当前设置的部分(具有该设置的部分和下一个空行之间的行),
    • 删除(No default value)值字段的部分,并且
    • 将其格式化为某种key=value格式(分隔符=在此部分中指定:\1=\3,其中\1代表键, 代表\3值)。像这样
      -----8<----------
      column-names=TRUE
      column-type-info=FALSE
      comments=FALSE
      compress=FALSE
      connect-expired-password=FALSE
      connect-timeout=0
      database=
      debug-check=FALSE
      debug-info=FALSE
      default-auth=
      default-character-set=auto
      delimiter=;
      force=FALSE
      host=127.0.0.1
      -----8<----------
      
  3. sort命令按字母顺序对值进行排序:-)

简单表格

如果你更喜欢表输出,将以下内容附加到上述命令:| column -t -s= -o' = ',其中'='是输入的分隔符(-s)和' = '输出的分隔符​​(-o):

mysql --help --verbose \
| sed -n -E '/^---+/,/^$/{/^---+/d;/^$/d;s/^([^[:space:]]+)[[:space:]]+(\(No default value\)|(.*)$)/\1=\3/;p}' \
| sort \
| column -t -s= -o' = '

它看起来将类似于此:

-----8<----------
column-names             = TRUE
column-type-info         = FALSE
comments                 = FALSE
compress                 = FALSE
connect-expired-password = FALSE
connect-timeout          = 0
database                 =
debug-check              = FALSE
debug-info               = FALSE
default-auth             =
default-character-set    = auto
delimiter                = ;
force                    = FALSE
host                     = 127.0.0.1
-----8<----------

简单 JSON 列表

如果你需要JSON解析它,请使用| column -t -s= --json -N key,value -n my.cnf,你会得到:

{
   "my.cnf": [
      {
         "key": "abort-source-on-error",
         "value": "FALSE"
      },{
         "key": "auto-rehash",
         "value": "TRUE"
      },{
  -----8<----------
      },{
         "key": "vertical",
         "value": "FALSE"
      },{
         "key": "xml",
         "value": "FALSE"
      }
   ]
}

使用 jq 的 JSON 对象

如果你有jq可用,您可以将其格式化为一个对象,如下所示:
| jq -Rn ' reduce ( inputs / "=" ) as [$key,$value] ({}; .[$key] |= $value )'

mysql --help --verbose \
| sed -n -E '/^---+/,/^$/{/^---+/d;/^$/d;s/^([^[:space:]]+)[[:space:]]+(\(No default value\)|(.*)$)/\1=\3/;p}' \
| sort \
| jq -Rn ' reduce ( inputs / "=" ) as [$key,$value] ({}; .[$key] |= $value )'
{
  "abort-source-on-error": "FALSE",
  "auto-rehash": "TRUE",
  "auto-vertical-output": "FALSE",
  "binary-as-hex": "FALSE",
  "binary-mode": "FALSE",
  "character-sets-dir": "",
  -----8<----------
  "socket": "/run/mysqld/mysqld.sock",
  "ssl": "FALSE",
  "table": "FALSE",
  "tls-version": "",
  "unbuffered": "FALSE",
  "vertical": "FALSE",
  "xml": "FALSE"
}

相关内容