Laravel - SQLSTATE[HY001] 无法分配足够的内存 - MsSQL
Laravel - SQLSTATE[HY001] Unable to allocate sufficient memory - MsSQL
我正在 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;
returns我的数据成功了。
任何人都可以告诉我可能发生了什么,或者我如何才能更好地调试以了解错误所在。
编辑
>>> DB::connection('condinvest')->getConfig()['driver']
=> "sqlsrv"
由于错误显然是由数据库进程(而不是 php 进程)报告的,因此我 而不是 期望 [=27= 中的内存限制发生变化] 有什么影响。
我发现 this issue 在 MSSQL Server 中使用已弃用的驱动程序时提到了这个特定错误。
要检查 Laravel 正在使用哪个驱动程序,请在您的 Tinker 控制台中键入 DB::connection()->getConfig()['driver']
。如果您看到 sqlsrv
那么这里一切正常,但是如果您看到 dblib
那么这可能是错误的来源。这个问题应该是 fixed 在 Laravel 5.7 中优先选择支持的驱动程序(如果有多个驱动程序可用),但也有可能是您的 database.php
配置文件使用了错误的驱动程序。
也有可能实际超出了数据库服务器或其所在系统的内存限制。能够在命令提示符下 运行 查询而不会出现错误表明这 不是 情况,但它可能仍然值得调查。如果可用内存非常低,那么可能 运行 php 和同时查询数据库的内存不足。您可以在终端中通过 运行ning 命令 free -h
检查可用的系统内存,只要数据库进程与您的终端在同一台机器上 运行ning 即可。但是,如果您使用的是共享托管服务提供商,则数据库可能位于单独的计算机上。
如果有帮助,我遇到了同样的问题。为了修复它,我所做的是检查 database.php 中的配置,如果您使用 sqlserver,请确保将字符集设置为 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
]
]
我正在 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;
returns我的数据成功了。
任何人都可以告诉我可能发生了什么,或者我如何才能更好地调试以了解错误所在。
编辑
>>> DB::connection('condinvest')->getConfig()['driver']
=> "sqlsrv"
由于错误显然是由数据库进程(而不是 php 进程)报告的,因此我 而不是 期望 [=27= 中的内存限制发生变化] 有什么影响。
我发现 this issue 在 MSSQL Server 中使用已弃用的驱动程序时提到了这个特定错误。
要检查 Laravel 正在使用哪个驱动程序,请在您的 Tinker 控制台中键入 DB::connection()->getConfig()['driver']
。如果您看到 sqlsrv
那么这里一切正常,但是如果您看到 dblib
那么这可能是错误的来源。这个问题应该是 fixed 在 Laravel 5.7 中优先选择支持的驱动程序(如果有多个驱动程序可用),但也有可能是您的 database.php
配置文件使用了错误的驱动程序。
也有可能实际超出了数据库服务器或其所在系统的内存限制。能够在命令提示符下 运行 查询而不会出现错误表明这 不是 情况,但它可能仍然值得调查。如果可用内存非常低,那么可能 运行 php 和同时查询数据库的内存不足。您可以在终端中通过 运行ning 命令 free -h
检查可用的系统内存,只要数据库进程与您的终端在同一台机器上 运行ning 即可。但是,如果您使用的是共享托管服务提供商,则数据库可能位于单独的计算机上。
如果有帮助,我遇到了同样的问题。为了修复它,我所做的是检查 database.php 中的配置,如果您使用 sqlserver,请确保将字符集设置为 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
]
]