用于还原SQL Server数据库的脚本失败

时间:2017-03-10 14:30:47

标签: php sql-server

我正在尝试使用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进行恢复,结果相同,数据库停留在恢复模式。

1 个答案:

答案 0 :(得分:0)

SQL Server以相同的方式打印警告和错误 - 只是具有不同的严重性级别,因此客户端软件可以知道差异并采取适当的措施。

我不懂PHP,所以我不确定你要用这条线完成什么

sqlsrv_configure('WarningsReturnAsErrors', 1);

但从它的声音来看,这就是降低严重性&#34;警告&#34;来自SQL Server的邮件被客户端代码视为实际错误。将其设置为0,我猜测您的脚本将继续通过还原数据库消息,并将它们视为信息而非异常。

相关问题