我正在连接到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
答案 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)
我在生产和开发/测试中遇到此类错误时检查的一小部分内容(在检查日志之后)。
答案 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扩展。