MySQL 忽略任何 my.cnf 配置

MySQL 忽略任何 my.cnf 配置

我刚刚从 Ubuntu repo(5.7.22-0ubuntu18.04.1(Ubuntu))全新安装了 ubuntu 18.04 和 MySQL。

到目前为止,MySQL 可以正常工作,但我需要更改一些变量。尝试将 sql 模式更改为“STRICT_TRANS_TABLES、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION”。

因此我在 /etc/mysql/mysql.conf.d/ 中放置了一个新文件“mysqld_custom.cnf”:

[mysqld]
skip-external-locking
bind_address            = 127.0.0.1
sql_mode                = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

query_cache_limit       = 1M
query_cache_size        = 16M

performance_schema      = 1

log_error = /var/log/mysql/error.log
slow_query_log_file = /var/log/mysql/mysql-slow.log
slow_query_log          = 1
long_query_time         = 2
log_queries_not_using_indexes

expire_logs_days = 10
max_binlog_size   = 100M

general_log_file = /var/log/mysql/query.log
general_log = 1

一切看起来都很好。/usr/sbin/mysqld --verbose --help 给我

sql-mode  STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

并且使用 mysqld --print-defaults 似乎没问题:

# mysqld --print-defaults
mysqld would have been started with the following arguments:
--skip-external-locking --bind_address=127.0.0.1 --sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --query_cache_limit=1M --query_cache_size=16M --performance_schema=1 --log_error=/var/log/mysql/error.log --slow_query_log_file=/var/log/mysql/mysql-slow.log --slow_query_log=1 --long_query_time=2 --log_queries_not_using_indexes --expire_logs_days=10 --max_binlog_size=100M --general_log_file=/var/log/mysql/query.log --general_log=1

但正在运行的服务器显示:

mysql> SHOW GLOBAL  VARIABLES LIKE "sql_mode";
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> SHOW GLOBAL  VARIABLES LIKE "%general_log%";
+------------------+-----------------------------+
| Variable_name    | Value                       |
+------------------+-----------------------------+
| general_log      | OFF                         |
| general_log_file | /var/lib/mysql/ubuntu18.log |
+------------------+-----------------------------+
2 rows in set (0.00 sec)

我尝试将“mysqld_custom.cnf”放入 /etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/。

知道我做错了什么吗?提前谢谢

答案1

我遇到了同样的问题,花了两天时间,但我想我终于找到了。整个系统中分布着几个配置,为了找到负责设置 sql_mode 的一个或多个配置,我使用了以下命令:

sudo grep --include=\*.cnf -rnw '/' -e "sql[-_]mode"

(有关该命令如何工作的信息可以在这里阅读:https://stackoverflow.com/a/16957078/1806628

此命令实际上是从根目录搜索每个文件,以查看哪些文件包含 sql_mode 或 sql-mode 文本,对于我来说,它在以下位置找到了具有其默认值的附加配置:

/usr/share/mysql/my-default.cnf:31:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
/usr/my.cnf:28:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

在我更改了那里的值并重新启动服务后,这些值最终发生了改变。

情况很棘手,因为我曾经通过在 /etc/mysql/my.cnf 中输入错误来检查哪个文件被用作配置,这确实导致 mysql 无法运行,所以它让我相信只有一个文件,而我正在编辑正确的文件。而在现实世界中也有其他文件,它们将覆盖设置。

希望这能帮助那些正在努力解决同样问题的人。

答案2

使用选项更改sql_mode,您可以有2个选项:

  • 无需重启数据库,使用命令设置全局 sql_mode:

    SET GLOBAL sql_mode=“ STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  • 选项 2:您的配置文件:(/etc/mysql/my.cnf更新:较新版本(Mysql例如 5.7.8 或更高版本)可能需要略有不同的语法)

    sql_mode=“ STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

restart service mysql

确保sql-moden下划线之间是破折号,并且模式用双引号引起来。

始终参考MySQL 文档您的版本可以看到sql 模式选项

相关内容