ToB企服应用市场:ToB评测及商务社交产业平台

标题: GreatSQL修改配置文件参数无法生效 [打印本页]

作者: 惊雷无声    时间: 5 天前
标题: 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,但更改文件重启实例后失效。
  1. greatsql> SHOW VARIABLES LIKE 'sql_require_primary_key';
  2. +-------------------------+-------+
  3. | Variable_name           | Value |
  4. +-------------------------+-------+
  5. | sql_require_primary_key | ON    |
  6. +-------------------------+-------+
  7. 1 row in set (0.00 sec)
  8. greatsql> CREATE TABLE `test_table` (
  9.     ->   `id` int NOT NULL,
  10.     ->   `k` int NOT NULL DEFAULT '0',
  11.     ->   `c` char(120) NOT NULL DEFAULT '',
  12.     ->   `pad` char(60) NOT NULL DEFAULT '',
  13.     ->   KEY `k_1` (`k`)
  14.     -> ) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  15. 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修改,举行表创建。
  1. # Session修改
  2. greatsql> SET sql_require_primary_key = OFF ;
  3. # Global修改(需重新登录session)
  4. greatsql> SET GLOBAL sql_require_primary_key = OFF ;
  5. # 建表语句
  6. greatsql> CREATE TABLE `test_table` (
  7.   `id` int NOT NULL,
  8.   `k` int NOT NULL DEFAULT '0',
  9.   `c` char(120) NOT NULL DEFAULT '',
  10.   `pad` char(60) NOT NULL DEFAULT '',
  11.   KEY `k_1` (`k`)
  12. ) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
复制代码
查询参数生效文件

修改配置文件重启实例复现操作后,举行问题排查。
  1. greatsql> SELECT * FROM performance_schema.variables_info WHERE variable_name = 'sql_require_primary_key';
  2. +-------------------------+-----------------+----------------------------------------+-----------+-----------+----------------------------+----------+----------+
  3. | VARIABLE_NAME           | VARIABLE_SOURCE | VARIABLE_PATH                          | MIN_VALUE | MAX_VALUE | SET_TIME                   | SET_USER | SET_HOST |
  4. +-------------------------+-----------------+----------------------------------------+-----------+-----------+----------------------------+----------+----------+
  5. | sql_require_primary_key | PERSISTED       | /greatsql/dbdata/data/mysqld-auto.cnf | 0         | 0         | 2024-11-07 10:44:11.545289 | root     | NULL     |
  6. +-------------------------+-----------------+----------------------------------------+-----------+-----------+----------------------------+----------+----------+
复制代码
通过查询performance_schema.variables_info获取到该参数生效配置文件为 mysqld-auto.cnf,且由SET PERSIST指令配置的,GreatSQL支持利用PERSIST命令修改持久化参数【persisted_globals_load参数须要为ON】,配置后该参数会写入到mysqld-auto.cnf一个 JSON 文件内,当实例启动后该文件内参数配置会覆盖默认实例启动指定的配置文件。
  1. $ python -m json.tool mysqld-auto.cnf
  2. {
  3.     "Version": 2,
  4.     "mysql_dynamic_variables": {
  5.         "sql_require_primary_key": {
  6.             "Metadata": {
  7.                 "Host": "",
  8.                 "Timestamp": 1730947451545289,
  9.                 "User": "root"
  10.             },
  11.             "Value": "ON"
  12.         }
  13.     }
  14. }
复制代码
查询performance_schema.persisted_variables也可以看到该参数被PERSIST指令设定为了 ON。
  1. greatsql> SELECT * FROM  performance_schema.persisted_variables WHERE variable_name = 'sql_require_primary_key';
  2. +-------------------------+----------------+
  3. | VARIABLE_NAME           | VARIABLE_VALUE |
  4. +-------------------------+----------------+
  5. | sql_require_primary_key | ON             |
  6. +-------------------------+----------------+
复制代码
取消 persis 参数

通过RESET PERSIST sql_require_primary_key;后,修改配置文件后重启正常生效。
  1. greatsql> RESET PERSIST sql_require_primary_key;
  2. Query OK, 0 rows affected (0.01 sec)
  3. # persisted_variables 表中已经没有了 sql_require_primary_key 参数的记录了
  4. greatsql> SELECT * FROM  performance_schema.persisted_variables WHERE variable_name = 'sql_require_primary_key';
  5. Empty set (0.00 sec)
  6. # 由 mysqld_safe 启动的 greatsql 实例可以通过 restart 进行重启
  7. greatsql> RESTART;
  8. Query OK, 0 rows affected (0.00 sec)
  9. # 重启后,sql_require_primary_key 生效方式变成了 EXPLICIT 读取实例启动配置文件
  10. greatsql>  SELECT * FROM performance_schema.variables_info WHERE variable_name = 'sql_require_primary_key';
  11. +-------------------------+-----------------+----------------------------------------+-----------+-----------+----------+----------+----------+
  12. | VARIABLE_NAME           | VARIABLE_SOURCE | VARIABLE_PATH                          | MIN_VALUE | MAX_VALUE | SET_TIME | SET_USER | SET_HOST |
  13. +-------------------------+-----------------+----------------------------------------+-----------+-----------+----------+----------+----------+
  14. | sql_require_primary_key | EXPLICIT        | /greatsql/dbdata/conf/gip18713315.cnf | 0         | 0         | NULL     | NULL     | NULL     |
  15. +-------------------------+-----------------+----------------------------------------+-----------+-----------+----------+----------+----------+
  16. 1 row in set (0.01 sec)
  17. greatsql> SHOW VARIABLES LIKE 'sql_require_primary_key';
  18. +-------------------------+-------+
  19. | Variable_name           | Value |
  20. +-------------------------+-------+
  21. | sql_require_primary_key | OFF   |
  22. +-------------------------+-------+
复制代码
三、问题结论

该环境sql_require_primary_key参数实行过SET PERSIST sql_require_primary_key = ON;持久化,在后续修改配置文件内容为 OFF 时,并未实行RESET PERSIST sql_require_primary_key;取消该参数的持久化配置,因此当实例启动时mysqld-auto.cnf文件中的配置会覆盖指定配置文件中的相同配置。

Enjoy GreatSQL
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4