我正在尝试使用PHP脚本还原SQL Server数据库并且它一直在失败。我使用的是PHP 7.0.4 NTS x86。由于我的代码在框架内运行,我决定隔离并运行我在此处找到的代码(在StackOverflow的另一个答案中也已经指出):https://blogs.msdn.microsoft.com/brian_swan/2010/07/01/restoring-a-sql-server-database-from-php/
代码如下:
// Set error mode to make sure errors throw exceptions
sqlsrv_configure('WarningsReturnAsErrors', 1);
// Try to connect
$conn = sqlsrv_connect(
'localhost',
['Database'=>'master', 'UID'=>'sa', 'PWD'=>'mypassword', 'ReturnDatesAsStrings'=>true, 'CharacterSet'=>'UTF-8']
);
$sql = "RESTORE DATABASE MYDB FROM DISK='c:\\MYDB.bak' WITH RECOVERY";
echo $sql."<br>";
$stmt = sqlsrv_query($conn, $sql);
if($stmt === false)
{
die(print_r(sqlsrv_errors()));
}
else
{
echo "Database restored</br>";
}
//Put DB into usable state.
$sql = "USE MYDB";
echo $sql."<br>";
$stmt = sqlsrv_query($conn, $sql);
if($stmt === false)
{
die(print_r(sqlsrv_errors()));
}
else
{
echo "Using MYDB</br>";
}
这是输出,第一个$ stmt === false为true,它会输出错误:
RESTORE DATABASE MYDB FROM DISK='c:\MYDB.bak' WITH RECOVERY
Array
(
[0] => Array
(
[0] => 01000
[SQLSTATE] => 01000
[1] => 4035
[code] => 4035
[2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Processed 5496 pages for database 'MYDB', file 'DB_Data' on file 1.
[message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Processed 5496 pages for database 'MYDB', file 'DB_Data' on file 1.
)
)
1
数据库已创建,但只显示在恢复模式下。如果我尝试使用同一个用户从SSMS运行相同的命令,它可以正常工作。另一个有趣的事情是,如果我查看SQL Server日志,我会在每次尝试后看到这一点:
2017-03-10 09:33:12.37 spid57 The database 'MYDB' is marked RESTORING and is in a state that does not allow recovery to be run.
2017-03-10 09:33:34.76 spid57 Starting up database 'AdventureWorks2008R2'.
2017-03-10 09:33:34.80 spid57 Starting up database 'ReportServer'.
2017-03-10 09:33:34.83 spid57 Starting up database 'ReportServerTempDB'.
不确定为什么每次尝试恢复后它都会启动相同的3个数据库。
我也尝试使用PDO进行恢复,结果相同,数据库停留在恢复模式。
答案 0 :(得分:0)
SQL Server以相同的方式打印警告和错误 - 只是具有不同的严重性级别,因此客户端软件可以知道差异并采取适当的措施。
我不懂PHP,所以我不确定你要用这条线完成什么
sqlsrv_configure('WarningsReturnAsErrors', 1);
但从它的声音来看,这就是降低严重性&#34;警告&#34;来自SQL Server的邮件被客户端代码视为实际错误。将其设置为0,我猜测您的脚本将继续通过还原数据库消息,并将它们视为信息而非异常。