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


CodeIgniter: Database Error Occured on MSSQL Server 2008 R2

我正在连接到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

这种情况在我身上发生过几次。在我的情况下,PHP服务器无法随机解析SQL服务器地址。我建议在您的PHP服务器上的Windows hosts文件(%windir%'system32'drivers'etc'hosts)中硬编码'liveserver'server08r2'的IP地址。

另外,将CodeIgniter配置文件中的$db['default']['pconnect']更改为false

当我在生产和开发/测试中有这样的错误时,我检查(在检查日志之后)的事情的小列表

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

我猜:

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

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

这将给你一个关于你的瓶颈在哪里的线索,如果你优化你的长时间查询,服务器将能够在更短的时间内解决更多的查询,也就是说,在你的系统中有更多的用户而不会出现问题。

无论如何,如果你的应用程序用户数量在增长,你将不得不转移到一个更大的系统,雇佣/购买更大的服务器,或者将你的基础设施改为云:亚马逊网络服务或谷歌应用引擎。

变化

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

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

然后重新启动web服务器。

编辑:

考虑到问题发生在高峰期,这意味着许多连接到数据库,导致发出许多查询,那么我最好的猜测是;你的数据库正在经历死锁或阻塞,真的无法判断,因为我不知道你的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中有一些有用的信息可以帮助您解决死锁或/和阻塞。

出现此错误是因为您可能没有在php.ini中启用php mssql扩展。