GreatSQL修改配置文件参数无法生效
GreatSQL修改配置文件参数无法生效
一、问题描述
客户需要创建无主键表,因提供默认模板设置了参数sql_require_primary_key = ON
(创建新表或更改现有表结构的语句强制要求表具有主键),当创建无主键表时会提示ERROR 3750 (HY000): Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set.
无法创建,现需要将参数修改为sql_require_primary_key = OFF
,但更改文件重启实例后失效。
greatsql> SHOW VARIABLES LIKE 'sql_require_primary_key';
------------------------- -------
| Variable_name | Value |
------------------------- -------
| sql_require_primary_key | ON |
------------------------- -------
1 row in set (0.00 sec)
greatsql> CREATE TABLE `test_table` (
-> `id` int NOT NULL,
-> `k` int NOT NULL DEFAULT '0',
-> `c` char(120) NOT NULL DEFAULT '',
-> `pad` char(60) NOT NULL DEFAULT '',
-> KEY `k_1` (`k`)
-> ) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
ERROR 3750 (HY000): Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set. Add a primary key to the table or unset this variable to avoid this message. Note that tables without a primary key can cause performance problems in row-based replication, so please consult your DBA before changing this setting.
二、问题排查
使用命令修改先解决问题
因该参数sql_require_primary_key
支持动态修改,先使用 SET global sql_require_primary_key = OFF
修改,进行表创建。
# Session修改
greatsql> SET sql_require_primary_key = OFF ;
# Global修改(需重新登录session)
greatsql> SET GLOBAL sql_require_primary_key = OFF ;
# 建表语句
greatsql> CREATE TABLE `test_table` (
`id` int NOT NULL,
`k` int NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
查询参数生效文件
修改配置文件重启实例复现操作后,进行问题排查。
greatsql> SELECT * FROM performance_schema.variables_info WHERE variable_name = 'sql_require_primary_key';
------------------------- ----------------- ---------------------------------------- ----------- ----------- ---------------------------- ---------- ----------
| VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE | SET_TIME | SET_USER | SET_HOST |
------------------------- ----------------- ---------------------------------------- ----------- ----------- ---------------------------- ---------- ----------
| sql_require_primary_key | PERSISTED | /greatsql/dbdata/data/mysqld-auto.cnf | 0 | 0 | 2024-11-07 10:44:11.545289 | root | NULL |
------------------------- ----------------- ---------------------------------------- ----------- ----------- ---------------------------- ---------- ----------
- VARIABLE_NAME:参数名称;
- VARIABLE_SOURCE:最近设置参数的来源,以下是几个常见值说明;
- PERSISTED:由实例 mysqld-auto.cnf 文件设置的参数;
- EXPLICIT:由实例启动指定配置文件设置的参数,即
--defaults-file
指定的配置文件; - DYNAMIC:在实例运行期间动态设置的参数;
- COMPILED:实例默认值;
- COMMAND_LINE:命令行设置的参数;
- VARIABLE_PATH:如果参数由配置文件而来,则为配置文件路径,否则为空;
- MIN_VALUE && MIN_VALUE:参数允许设置的最小值和最大值,非数值类型的保持为0;
- SET_TIME:最近设置参数的时间;
- SET_USER && SET_HOST:最近设置参数的用户和主机。
通过查询performance_schema.variables_info
获取到该参数生效配置文件为 mysqld-auto.cnf
,且由SET PERSIST
指令配置的,GreatSQL支持使用PERSIST
命令修改持久化参数【persisted_globals_load
参数需要为ON】,配置后该参数会写入到mysqld-auto.cnf
一个 JSON 文件内,当实例启动后该文件内参数配置会覆盖默认实例启动指定的配置文件。
$ python -m json.tool mysqld-auto.cnf
{
"Version": 2,
"mysql_dynamic_variables": {
"sql_require_primary_key": {
"Metadata": {
"Host": "",
"Timestamp": 1730947451545289,
"User": "root"
},
"Value": "ON"
}
}
}
查询performance_schema.persisted_variables
也可以看到该参数被PERSIST
指令设定为了 ON。
greatsql> SELECT * FROM performance_schema.persisted_variables WHERE variable_name = 'sql_require_primary_key';
------------------------- ----------------
| VARIABLE_NAME | VARIABLE_VALUE |
------------------------- ----------------
| sql_require_primary_key | ON |
------------------------- ----------------
取消 persis 参数
通过RESET PERSIST sql_require_primary_key;
后,修改配置文件后重启正常生效。
greatsql> RESET PERSIST sql_require_primary_key;
Query OK, 0 rows affected (0.01 sec)
# persisted_variables 表中已经没有了 sql_require_primary_key 参数的记录了
greatsql> SELECT * FROM performance_schema.persisted_variables WHERE variable_name = 'sql_require_primary_key';
Empty set (0.00 sec)
# 由 mysqld_safe 启动的 greatsql 实例可以通过 restart 进行重启
greatsql> RESTART;
Query OK, 0 rows affected (0.00 sec)
# 重启后,sql_require_primary_key 生效方式变成了 EXPLICIT 读取实例启动配置文件
greatsql> SELECT * FROM performance_schema.variables_info WHERE variable_name = 'sql_require_primary_key';
------------------------- ----------------- ---------------------------------------- ----------- ----------- ---------- ---------- ----------
| VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE | SET_TIME | SET_USER | SET_HOST |
------------------------- ----------------- ---------------------------------------- ----------- ----------- ---------- ---------- ----------
| sql_require_primary_key | EXPLICIT | /greatsql/dbdata/conf/gip18713315.cnf | 0 | 0 | NULL | NULL | NULL |
------------------------- ----------------- ---------------------------------------- ----------- ----------- ---------- ---------- ----------
1 row in set (0.01 sec)
greatsql> SHOW VARIABLES LIKE 'sql_require_primary_key';
------------------------- -------
| Variable_name | Value |
------------------------- -------
| sql_require_primary_key | OFF |
------------------------- -------
三、问题结论
该环境sql_require_primary_key
参数执行过SET PERSIST sql_require_primary_key = ON;
持久化,在后续修改配置文件内容为 OFF 时,并未执行RESET PERSIST sql_require_primary_key;
取消该参数的持久化配置,因此当实例启动时mysqld-auto.cnf
文件中的配置会覆盖指定配置文件中的相同配置。
相关文章
- 优化GreatSQL日志文件空间占用 GreatSQL对于日志文件磁盘空间占用,做了一些优化,对于binlog、...03-18
- "数据约束条件" date: 2022-11-24T21:24:31 08:00 draft: false MySQL字段约束条件 无符号, 零填充...03-18
【GreatSQL优化器-16】INDEX_SKIP_SCAN
【GreatSQL优化器-16】INDEX_SKIP_SCAN 一、INDEX_SKIP_SCAN介绍 GreatSQL 优化器的索引跳跃扫描(Index Ski...03-18- MySQL 是一个非常流行的开源关系数据库管理系统,在各种应用场景中都得到了广泛的应用。随...03-18
- 🤖 DB-GPT 是一个开源的 AI 原生数据应用程序开发框架,具有 AWEL(代理工作流表达式语...03-18
GreatSQL 8.0.32-27 GA (2025-3-10)
GreatSQL 8.0.32-27 GA (2025-3-10) 版本信息 发布时间:2025年3月10日 版本号:8.0.32-27, Revision aa66a38591...03-18- 6. MySQL 索引的数据结构(详细说明) @目录6. MySQL 索引的数据结构(详细说明)1. 为什么使用索引2...03-18
- @Override @Transactional(rollbackFor = Exception.class) public void batchInsertDeviceData(IotMsgNotifyData iotMsgNotifyDa...03-18
- 个人Qt项目总结——数据库查询断言问题 问题: 当我使用MySQL数据库的查询操作时, 如果查询...03-18
- MySQL 是一种广泛使用的关系数据库管理系统,MySQL 8 是其最新的主要版本,结合了出色的性能和...03-18
最新评论