pymysql.err.OperationalError: (1105, ‘Out Of Memory Quota![conn_id=225186]‘)

在使用Python向TiDB 4.0集群写入数据后,执行增量范围查询时遇到了'OutOfMemoryQuota'错误,原因是'mem-quota-query'参数默认限制为1GB。为解决此问题,可以考虑调整该参数值增大内存配额,例如设置为10GB,同时优化SQL以减少内存使用。此外,还可以修改其他相关配置如'max-index-length'、'log.query-log-max-len'和'log.file.max-days',然后通过'tiup cluster reload'命令应用配置更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

python往tidb4.0的集群里面写入数据后进行增量范围查询,报错:
pymysql.err.OperationalError: (1105, 'Out Of Memory Quota![conn_id=225186]')

image

 

原因分析:

在 4.0 版本中 mem-quota-query这个参数默认为1G,所以有大 sql 超过1G 会报错

解决办法:

可以考虑适当调大参数值,或者尝试优化sql,降低内存使用。

 

解决:

1、修改配置文件:tiup cluster edit-config test-cluster

server_configs:
  tidb:
    # 以字节为单位设置查询的内存配额。4.0默认1G
    mem-quota-query: 10737418240
    # 设置最大索引长度
    max-index-length: 12288
    # 最长的 SQL 输出长度。(变更)4.0需要修改
    log.query-log-max-len: 6000
    # 设置日志保留天数
    log.file.max-days: 10

 2、加载配置文件使修改生效:tiup cluster reload tidb-dev -R tidb,tikv

 

参考文章:

在线修改-tidb-配置

4.0修改参数

TiDB配置文件

### 错误分析 `pymysql.err.OperationalError: (1364, "Field 'Id' doesn't have a default value")` 表明在尝试向数据库表中插入数据时,某个字段(这里是 `Id` 或其他类似的字段名)缺少必要的值[^3]。此错误通常发生在以下情况: - 数据库表定义了一个字段为 **NOT NULL**,但在执行插入操作时未提供该字段的值。 - 字段没有设置默认值。 因此,在这种情况下,需要确保每次插入记录时都显式指定所有必需字段的值,或者修改数据库结构以允许自动填充这些字段。 --- ### 解决方案 #### 方法一:调整 SQL 插入语句 如果无法更改数据库设计,则需在 Python 脚本中明确传递所需字段的值。以下是修正后的代码示例: ```python import pymysql try: # 建立数据库连接 connection = pymysql.connect( host='localhost', user='root', password='password', database='mydatabase' ) with connection.cursor() as cursor: # 明确指定要插入的数据及其对应的字段名称 sql_query = """ INSERT INTO mytable (`id`, `name`, `age`) VALUES (%s, %s, %s); """ data_to_insert = (1, "John Doe", 28) # 替换实际数据 cursor.execute(sql_query, data_to_insert) connection.commit() except pymysql.err.OperationalError as e: print(f"发生错误: {e}") finally: if connection.open: connection.close() ``` 在此方法中,通过将 `id` 的具体数值传入查询字符串来解决问题。 --- #### 方法二:更新数据库表结构 另一种更灵活的方式是对数据库中的目标表格进行结构调整,使得某些列可以自动生成唯一标识符或接受空值。可以通过运行如下 SQL 来实现这一目的: ```sql ALTER TABLE mytable MODIFY COLUMN id INT AUTO_INCREMENT PRIMARY KEY; ``` 这条命令的作用是让 `id` 列成为主键并启用自动增长功能,从而无需再手动为其分配具体的整数值得到解决。 注意:执行此类变更前应备份现有数据以防万一。 --- #### 方法三:设定字段默认值 当不希望某特定字段采用递增模式却仍想避免重复输入固定内容时,可考虑赋予它一个合理的缺省选项。例如对于日期型属性来说常用当前时刻作为初始状态;而对于布尔逻辑则往往取假定初态False/True等等。下面展示如何针对不同类型的资料建立预设规则的例子: ```sql -- 设置 name 默认为空字符串 "" ALTER TABLE mytable ALTER COLUMN name SET DEFAULT ''; -- 设定 age 默认为零岁 0 ALTER TABLE mytable ALTER COLUMN age SET DEFAULT 0; -- 安排 created_at 自动获取此刻的时间戳 NOW() ALTER TABLE mytable ADD COLUMN created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; ``` 以上步骤能够有效减少程序端处理负担的同时也提高了系统的健壮性和一致性。 --- ### 总结 综上所述,面对由于缺失必要参数引发的操作失败异常状况,可以从三个方面入手加以改善——即完善客户端提交的信息完整性、优化后台存储机制以及合理配置实体模型特性之间的关系。每种策略各有优劣适用于不同的应用场景下,请依据实际情况选取最合适的解决方案予以实施。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值