CodeIgniter:SQL Server 2008 R2上发生数据库错误

时间:2014-03-14 07:45:57

标签: php sql sql-server sql-server-2008 codeigniter

我正在连接到MS SQL Server 2008 R2,我的php版本是5.3,我使用的是PHP Codeigniter 1.7.2。它已经在现场运行,并且有很多成员使用它。但经过几天的部署后,我总是遇到错误:

A Database Error Occurred
Unable to connect to your database server using the provided settings.

有时它工作正常,但是当许多成员访问它的时候,错误突然发生。我需要重新启动服务器才能使网站正常运行。

这是我的Database.php配置

$active_group = "default";
$active_record = TRUE;

$db['default']['hostname'] = 'liveserver\server08r2'; 
$db['default']['username'] = 'xxx';
$db['default']['password'] = 'xxxxx';
$db['default']['database'] = 'DATABASE_NAME';
$db['default']['dbdriver'] = 'mssql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

可能是许多人使用该网站时发生错误的因素?我是否需要在代码中调整某些内容以便不再遇到此问题?在这个问题上会出现什么问题。

我的错误日志在这里。也许这些可以帮助解决问题。

ERROR - 2013-08-23 11:44:07 --> Severity: Warning  --> mssql_select_db() [<a href='function.mssql-select-db'>function.mssql-select-db</a>]: Unable to select database:  [PROJECT_DATABASE] C:\xampp\htdocs\project\system\database\drivers\mssql\mssql_driver.php 112
ERROR - 2013-08-23 11:44:07 --> Unable to select database: PROJECT_DATABASE
ERROR - 2013-08-23 14:15:54 --> Severity: Warning  --> mssql_query() [<a href='function.mssql-query'>function.mssql-query</a>]: Query failed C:\xampp\htdocs\project\system\database\drivers\mssql\mssql_driver.php 143
ERROR - 2013-08-23 14:15:54 --> Severity: Warning  --> mssql_query() [<a href='function.mssql-query'>function.mssql-query</a>]: message: The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION. (severity 16) C:\xampp\htdocs\project\system\database\drivers\mssql\mssql_driver.php 143
ERROR - 2013-08-23 14:15:54 --> Severity: Warning  --> mssql_query() [<a href='function.mssql-query'>function.mssql-query</a>]: Query failed C:\xampp\htdocs\project\system\database\drivers\mssql\mssql_driver.php 143
ERROR - 2013-08-23 15:44:07 --> Severity: Warning  --> mssql_select_db() [<a href='function.mssql-select-db'>function.mssql-select-db</a>]: Unable to select database:  [PROJECT_DATABASE] C:\xampp\htdocs\project\system\database\drivers\mssql\mssql_driver.php 112
ERROR - 2013-08-23 15:44:07 --> Unable to select database: PROJECT_DATABASE

5 个答案:

答案 0 :(得分:1)

这发生在我身上几次。就我而言,PHP服务器无法随机解析SQL服务器地址。我建议硬编码&#39; liveserver \ server08r2&#39;的IP地址。在PHP服务器上的Windows主机文件(%windir%\ system32 \ drivers \ etc \ hosts)中。

此外,在CodeIgniter配置文件中将$ db [&#39;默认&#39;] [&#39; pconnect&#39;]更改为false。

答案 1 :(得分:0)

我在生产和开发/测试中遇到此类错误时检查的一小部分内容(在检查日志之后)。

  1. 检查应用程序分区上是否有足够的磁盘空间。确保你有足够的可用空间(不仅10-20MB)。
  2. 检查MSSQL(或MySQL)是否对打开的连接有任何限制。
  3. CPU / RAM?也许你的共享主机/ VPS或你正在使用的任何东西都没有内存?

答案 2 :(得分:0)

我的猜测:

您的CI应用程序与此问题无关。很可能是你的DDBB,这是因为人们使用网站的高峰期:使用网站的人越多,你必须运行的SQL就越多,所以你的DDBB说“这已经足够了!”并拒绝查询。当您重新启动服务器时,您的问题会消失,因为当您清理了查询队列时,现在可以继续启动查询。

要检查并完全确定,请记录长时间查询,如果我是对的,问题开始时会出现很多问题:http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

这将为您提供关于瓶颈位置的线索,如果您优化长时间查询,服务器将能够在更短的时间内解决更多查询,即系统中的更多用户,而不会出现问题。< / p>

无论如何,如果您的应用程序用户数正在增长,您将不得不迁移到更大的系统,雇用/购买更大的服务器,或将您的基础架构更改为云:Amazon Web服务或Google APP Engine。

答案 3 :(得分:0)

更改

$db['default']['pconnect'] = TRUE;

$db['default']['pconnect'] = FALSE;

然后重新启动您的网络服务器。

修改

鉴于问题发生在高峰时间,这意味着许多与数据库的连接导致发出许多查询,那么我最好的猜测是;你的数据库遇到了死锁或阻塞,真的无法判断,因为我不知道你的SQL Server错误日志是怎么样的。

根据您提供的信息,我可以判断它是肯定 SQL Server问题。

运行以下查询以检查您在应用程序中使用的资源是否存在任何死锁:

SELECT  L.request_session_id AS SPID, 
    DB_NAME(L.resource_database_id) AS DatabaseName,
    O.Name AS LockedObjectName, 
    P.object_id AS LockedObjectId, 
    L.resource_type AS LockedResource, 
    L.request_mode AS LockType,
    ST.text AS SqlStatementText,        
    ES.login_name AS LoginName,
    ES.host_name AS HostName,
    TST.is_user_transaction as IsUserTransaction,
    AT.name as TransactionName,
    CN.auth_scheme as AuthenticationMethod
FROM    sys.dm_tran_locks L
    JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id
    JOIN sys.objects O ON O.object_id = P.object_id
    JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id
    JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id
    JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id
    JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id
    CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST
WHERE   resource_database_id = db_id()
ORDER BY L.request_session_id

如果查询返回查询结果(在您的应用程序中使用),那么您就是在正确的路径上,您可能希望尝试优化目标查询,删除重新创建索引等。在SO中有一些有用的信息或MSDN,可以帮助您解决死锁或/和阻止。

答案 4 :(得分:0)

发生此错误是因为您可能没有在php.ini中启用php mssql扩展。请尝试启用mssql扩展。