【发布时间】:2016-09-28 22:24:11
【问题描述】:
供应商提供了一个只读的 MS SQL 数据库,我们使用 PHP 与之交互。
此数据库在我们时间的上午 630 和 1230 更新其数据。这会导致数据库离线不到一分钟,但这对于运行的 cronjobs 来说已经足够了,偶尔也会让最终用户点击离线数据库。
日志显示错误是一个连接错误:
Cannot open user default database. Login failed. (severity 11)
General SQL Server error: Check messages from the SQL Server (severity 11)
Login failed for user 'USER'. (severity 14)
General SQL Server error: Check messages from the SQL Server (severity 14)
Unable to connect to server: SERVER
如果服务器在操作过程中出现故障,而不是与数据库的连接,则日志会显示以下错误:
The SELECT permission was denied on the object 'TABLE', database 'DATABASE', schema 'dbo'. (severity 14)
General SQL Server error: Check messages from the SQL Server (severity 14)
Query failed
处理此问题的最佳方法是什么?查询和连接与“或死”停止处理配对。最好抛出一个 sleep(60) 以暂停执行一分钟并重试查询/连接?这是当前的示例。该连接来自页面开头的共享 require_once 包含,因此通常在查询之前会发生一些其他操作。
$mslink = mssql_connect('SERVER', 'USER', 'PASS');
if (!$mslink || !mssql_select_db('TABLE', $mslink)) {
die('Unable to connect or select database!');
}
$strSQL = "SELECT X,Y,Z FROM TABLE WHERE FOO = 'BAR'";
$objQuery = mssql_query($strSQL) or die("Error Query [" . $strSQL . "]");
我考虑过在连接之前检测时间并延迟它(这应该意味着查询会没问题),或者让它失败然后休眠并再次尝试(这似乎是一个更糟糕的主意 - 因为它会导致记录条目)。
这是一个尝试/捕获而不是使用 if true 功能的好地方吗?我之前没有用 try/catch 做过任何事情。
我希望使用连接的解决方案是最简单的,因为这将通过一次更改覆盖代码库,而不是在每次查询时都进行。没有框架或任何东西,这是直接的 PHP(和程序,我知道,请温柔)。计划是将来某个时候从 ext\mssql 迁移到 PDO。
【问题讨论】:
-
查看时间,停机期间不要查询
-
听起来你真正应该做的是在本地创建你自己的数据库来存储你需要的信息并基本上镜像他们的信息,然后使用 cron 作业来检查你最旧的条目与源数据,并删除/相应更新
-
一句话:复制。如果您想要一个基本上 24/7 全天候运行的弹性系统,则需要多个数据库副本。
标签: php sql sql-server database data-warehouse