我们丢失了 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
(而不是)很感兴趣。首先,我想自己解析它们,但后来我意识到它们不仅在和中,而且它们可能完全在不同的路径中,并且可能包含。mysqld
my.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
- 该
mysql --help --verbose
命令打印当前配置,如其他答案中所述。 - 添加的
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<----------
- 该
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"
}