Laravel 7.4连接远程MS SQL报错SQLSTATE[HY001]内存不足求助
连接远程MS SQL数据库时出现SQLSTATE[HY001]内存分配不足错误的解决方法
问题详情
连接远程MS SQL(Azure SQL)数据库时,抛出以下错误:
"message": "SQLSTATE[HY001] Unable to allocate sufficient memory (insharp.database.windows.net:1433) (severity 8)",
"exception": "Doctrine\DBAL\Driver\PDO\Exception",
"file": "/var/www/analytics/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Exception.php",
"line": 18,
"trace": [
*
当前配置与代码
MS SQL数据库配置代码
'sqlsrv' => [ 'driver' => 'sqlsrv', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, ],
动态切换数据库连接代码
DB::purge('dynamic'); Config::set('database.connections.dynamic.driver', $request->db_type); Config::set('database.connections.dynamic.host', $request->host); Config::set('database.connections.dynamic.port', $request->port); Config::set('database.connections.dynamic.database', $request->db_name); Config::set('database.connections.dynamic.username', $request->user_name); Config::set('database.connections.dynamic.password', $request->password); DB::reconnect('dynamic');
解决方法
1. 补充动态连接的关键配置项
你的动态连接配置缺少针对Azure SQL的必要参数,补充后可解决多数内存分配异常问题:
encrypt: Azure SQL强制要求加密连接,设为truetrust_server_certificate: 生产环境设为false,避免证书信任风险timeout: 延长连接超时时间,比如60,防止网络延迟引发的内存问题charset: 显式设置字符集,避免驱动默认值冲突
修改后的动态配置代码:
DB::purge('dynamic'); Config::set('database.connections.dynamic.driver', $request->db_type); Config::set('database.connections.dynamic.host', $request->host); Config::set('database.connections.dynamic.port', $request->port); Config::set('database.connections.dynamic.database', $request->db_name); Config::set('database.connections.dynamic.username', $request->user_name); Config::set('database.connections.dynamic.password', $request->password); // 补充缺失配置 Config::set('database.connections.dynamic.charset', 'utf8'); Config::set('database.connections.dynamic.encrypt', true); Config::set('database.connections.dynamic.trust_server_certificate', false); Config::set('database.connections.dynamic.timeout', 60); DB::reconnect('dynamic');
2. 调整PHP内存限制
- 检查
php.ini中的memory_limit参数,建议设置为256M或更高(根据业务需求调整) - 临时排查时可在代码开头添加:
ini_set('memory_limit', '256M');,生产环境需修改配置文件
3. 更新SQLSRV驱动版本
旧版Microsoft SQLSRV PHP驱动存在内存分配bug,通过phpinfo()查看当前版本,前往官方渠道下载最新驱动替换。
4. 优化动态连接逻辑
- 请求结束时主动关闭动态连接:
DB::disconnect('dynamic'); - 避免频繁创建新连接,可复用已有的动态连接或限制并发连接数
内容的提问来源于stack exchange,提问作者Wishwajith Milinda
相关产品推荐
相关产品推荐

