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'命令应用配置更新。

 

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配置文件

### 使用Python通过PyMySQL将爬取的电影数据存储到名为movie_info的MySQL数据库表中,并解决pymysql.err.OperationalError错误 为了将爬取的电影数据存储到MySQL数据库中的`movie_info`表,需要确保以下几点:正确配置数据库连接、创建目标表结构、处理异常情况以及解决`pymysql.err.OperationalError`问题。 #### 数据库连接配置 在建立数据库连接时,必须指定正确的数据库名称。如果数据库不存在,将抛出`pymysql.err.OperationalError: (1049, "Unknown database 'your_database'")`错误[^1]。为避免此问题,可以在连接前检查数据库是否存在或直接创建数据库。 以下是完整的数据库连接代码示例: ```python import pymysql try: # 尝试连接到指定数据库 db = pymysql.connect( host='localhost', port=3306, user='root', password='your_password', db='movie_db', # 替换为实际数据库名 charset='utf8mb4' # 确保支持中文字符 ) except pymysql.err.OperationalError as e: if e.args[0] == 1049: # 如果数据库不存在 # 创建数据库 temp_db = pymysql.connect( host='localhost', port=3306, user='root', password='your_password', charset='utf8mb4' ) with temp_db.cursor() as cursor: cursor.execute("CREATE DATABASE IF NOT EXISTS movie_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") temp_db.close() # 重新连接到新创建的数据库 db = pymysql.connect( host='localhost', port=3306, user='root', password='your_password', db='movie_db', charset='utf8mb4' ) cursor = db.cursor() ``` #### 创建表结构 在插入数据之前,确保`movie_info`表已经存在。可以通过执行SQL语句来创建表。例如: ```sql CREATE TABLE IF NOT EXISTS movie_info ( id INT AUTO_INCREMENT PRIMARY KEY, name_cn VARCHAR(255) NOT NULL, name_en VARCHAR(255), categories TEXT, region VARCHAR(100), duration VARCHAR(50), release_date DATE, score FLOAT, director VARCHAR(255), actors TEXT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ``` 上述SQL语句定义了`movie_info`表的结构,包括字段类型和编码设置[^2]。 #### 插入数据 假设爬取的数据存储在一个列表中,每个元素是一个字典,包含电影的相关信息。可以使用`INSERT INTO`语句将数据插入到`movie_info`表中。例如: ```python movies = [ {"name_cn": "肖申克的救赎", "name_en": "The Shawshank Redemption", "categories": "剧情", "region": "美国", "duration": "142分钟", "release_date": "1994-09-23", "score": 9.3, "director": "弗兰克·德拉邦特", "actors": "蒂姆·罗宾斯, 摩根·弗里曼"}, {"name_cn": "阿甘正传", "name_en": "Forrest Gump", "categories": "剧情", "region": "美国", "duration": "142分钟", "release_date": "1994-07-06", "score": 9.5, "director": "罗伯特·泽米吉斯", "actors": "汤姆·汉克斯, 罗宾·怀特"} ] insert_sql = """ INSERT INTO movie_info (name_cn, name_en, categories, region, duration, release_date, score, director, actors) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s); """ for movie in movies: cursor.execute(insert_sql, ( movie['name_cn'], movie['name_en'], movie['categories'], movie['region'], movie['duration'], movie['release_date'], movie['score'], movie['director'], movie['actors'] )) db.commit() ``` #### 异常处理 为了保证程序的健壮性,建议添加异常处理机制。例如: ```python try: for movie in movies: cursor.execute(insert_sql, ( movie['name_cn'], movie['name_en'], movie['categories'], movie['region'], movie['duration'], movie['release_date'], movie['score'], movie['director'], movie['actors'] )) db.commit() except Exception as e: db.rollback() print(f"Error: {e}") finally: cursor.close() db.close() ``` #### 注意事项 - 确保数据库编码为`utf8mb4`以支持中文字符[^3]。 - 在实际应用中,可以根据需求调整表结构和字段类型。 - 如果数据量较大,可以考虑使用批量插入以提高性能。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值