我刚刚从 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
下划线之间是破折号,并且模式用双引号引起来。