【问题标题】:Laravel - SQLSTATE[HY001] Unable to allocate sufficient memory - MsSQLLaravel - SQLSTATE [HY001] 无法分配足够的内存 - MsSQL
【发布时间】:2021-03-31 09:01:09
【问题描述】:

我在 laravel 中的项目与 MsSql 数据库中的视图进行第二次连接,我正确配置了我的 .env 和配置,但是这是内存溢出错误:

$ php artisan tinker
Psy Shell v0.10.5 (PHP 7.3.24-3+ubuntu18.04.1+deb.sury.org+1 — cli) by Justin Hileman
>>> use App\Condinvest\BoletoPropCondominio as BPC
>>> BPC::first();
Illuminate\Database\QueryException with message 'SQLSTATE[HY001] Unable to allocate sufficient memory (meudominio.com.br:5000) (severity 8) (SQL: select top 1 * from [View_Boleto_Prop_Condominio])'
>>> 

在我的 php.ini 中已经更改:

memory_limit = 128M

但错误仍在继续。

我的模型大致如下所示:

BaseView.php

<?php
    
namespace App\Condinvest;

use Illuminate\Database\Eloquent\Model;

class BaseView extends Model
{
    protected $connection = 'condinvest';
}

BoletoPropCondominio.php

<?php

namespace App\Condinvest;

class BoletoPropCondominio extends BaseView
{
    protected $table = 'View_Boleto_Prop_Condominio';

    protected $fillable = [
        'Id_Condo_lan',
        ...
        'Id_titular'
    ];
}

当我直接通过命令终端执行相同的查询时:

SELECT TOP 1 * FROM View_Boleto_Prop_Condominio;

成功返回我的数据。

谁能告诉我可能发生了什么,或者我可以如何更好地调试以了解错误所在。

编辑

>>> DB::connection('condinvest')->getConfig()['driver']
=> "sqlsrv"

【问题讨论】:

  • 你把memory_limit 增加到了多少?
  • 我把memory_limit = -1
  • 当我遇到内存问题时,将它设置为 -1 并没有解决它,即使我期待它。然后我尝试了 2G 之类的东西,错误被清除了。我并没有尝试使用您使用的软件包,但我想我至少会分享我一个月前遇到此错误的经验。
  • @MarciusLeandro 永远不要将内存限制设置为 -1,这意味着不再有限制。我认为这不是 php 内存限制,因为这会引发 php 错误而不是 sql 错误。无论如何,解决方案不应该是增加内存限制,而是减少内存使用量。
  • 其他查询是否有效?

标签: php sql-server laravel tinker


【解决方案1】:

由于该错误显然是由数据库进程(不是 php 进程)报告的,所以我希望更改 php.ini 中的内存限制会产生任何影响。

我发现this issue 在将不推荐使用的驱动程序与 MSSQL Server 一起使用时提到了此特定错误。 要检查 Laravel 正在使用哪个驱动程序,请在 Tinker 控制台中输入 DB::connection()-&gt;getConfig()['driver']。如果您看到sqlsrv,那么这里一切正常,但是如果您看到dblib,那么这可能是错误的根源。这个问题应该是 Laravel 5.7 中的 fixed 如果有多个可用的驱动程序更喜欢支持的驱动程序,但也有可能您的 database.php 配置文件使用了错误的驱动程序。

也有可能实际超出了数据库服务器或其所在系统的内存限制。能够在命令提示符下运行查询而不会出现错误表明这不是的情况,但它可能仍然值得调查。如果可用内存非常低,则可能不足以同时运行 php 和数据库查询。只要数据库进程与您的终端在同一台机器上运行,您就可以通过在终端中运行free -h 命令来检查可用的系统内存。但是,如果您使用的是共享托管服务提供商,那么数据库可能位于单独的计算机上。

【讨论】:

  • 我在几个地方看到可能是这个,但我在驱动器上修复了它,错误仍然存​​在
  • @MarciusLeandro 你在运行什么版本的 Laravel (php artisan --version)?另外,检查可用系统内存的结果是什么,DB 连接使用的数据库驱动程序是什么?
【解决方案2】:

如果有帮助,我遇到了同样的问题。我为了修复它所做的是检查我在 database.php 中的配置,如果您使用 sqlserver,请确保您已将 charset 设置为 utf8,如下所示。之前设置为 utf8mb4。

'sqlserver' => [
        'driver' => 'sqlsrv',
        'host' => env('DB_SQL_HOST'),
        'port' => env('DB_SQL_PORT'),
        'database' => env('DB_SQL_DATABASE', 'forge'),
        'username' => env('DB_SQL_USERNAME', 'forge'),
        'password' => env('DB_SQL_PASSWORD', ''),
        'charset' => 'utf8',
        'prefix' => '',
        'options' => [
            PDO::ATTR_TIMEOUT => 300
        ]
    ]

【讨论】:

  • 不要使用utf8,它不允许完全使用Unicode。
猜你喜欢
  • 2021-06-12
  • 2017-04-04
  • 2023-04-05
  • 2016-06-19
  • 2020-05-05
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多