OperationalError: (1135, "Can't create a new thread (errno 11); if you are not out of available memo

背景概述: 一台物理服务器,跑了多个实例,如果有一天 mysql 错误日志出现类似告警

OperationalError: (1135, "Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug")

 

看了数据库mysql 用户相关参数基本没问题,max_connection 也在安全内。

个人猜测也是和系统分配资源有关系,只是这个参数不能确定。

后来看了一下度娘,有人建议在/etc/bashrc  下添加

ulimit -u 65536  (全局限制用户资源分配)。

 

最后,持续观察。。。

 

 

当出现 `MySQLdb.OperationalError (1038, 'Out of sort memory, consider increasing server sort buffer size')` 错误时,意味着 MySQL 在执行排序操作时耗尽了排序缓冲区的内存,以下是一些解决方法: ### 增加排序缓冲区大小 可以通过修改 MySQL 配置文件(通常是 `my.cnf` 或 `my.ini`)来增加 `sort_buffer_size` 的值。在配置文件中添加或修改以下行: ```ini sort_buffer_size = 2M ``` 上述代码将 `sort_buffer_size` 设置为 2MB,实际大小可以根据服务器的内存情况进行调整。修改完成后,需要重启 MySQL 服务使配置生效。 ### 优化查询语句 复杂的查询语句可能会导致大量的排序操作,从而耗尽排序缓冲区。可以通过以下方式优化查询: - 避免使用 `ORDER BY RAND()`,因为这种方式会对整个结果集进行排序,性能非常低。可以考虑使用其他方式来实现随机排序。 ```python import MySQLdb # 假设使用以下方式连接数据库 db = MySQLdb.connect(host="localhost", user="user", passwd="password", db="database") cursor = db.cursor() # 优化前的查询(不建议) # query = "SELECT * FROM table_name ORDER BY RAND() LIMIT 10" # 优化后的查询示例 query = "SELECT * FROM table_name WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM table_name) ORDER BY id LIMIT 10" cursor.execute(query) results = cursor.fetchall() ``` ### 增加服务器内存 如果服务器的物理内存充足,可以考虑增加 MySQL 服务可用的内存。可以通过修改 `innodb_buffer_pool_size` 等参数来增加 MySQL 的内存使用。例如,在配置文件中修改: ```ini innodb_buffer_pool_size = 512M ``` 上述代码将 `innodb_buffer_pool_size` 设置为 512MB,同样需要重启 MySQL 服务使配置生效。 ### 分批处理数据 如果查询返回的结果集非常大,可以考虑分批处理数据,减少一次性排序的数据量。例如,使用 `LIMIT` 和 `OFFSET` 来分页查询数据: ```python import MySQLdb db = MySQLdb.connect(host="localhost", user="user", passwd="password", db="database") cursor = db.cursor() batch_size = 100 offset = 0 while True: query = f"SELECT * FROM table_name ORDER BY column_name LIMIT {batch_size} OFFSET {offset}" cursor.execute(query) results = cursor.fetchall() if not results: break # 处理当前批次的数据 for row in results: print(row) offset += batch_size ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值