MSSQL 数据库在使用 PHP 时卡在"恢复"状态



我可以在SSMS中执行以下操作,数据库将以新的数据库名称进行完全备份和恢复:

USE [master]; BACKUP DATABASE PW_TEMPLATE TO DISK=N'C:PW_TEMPLATEPW_TEMPLATE_full.bak'
USE [master]; RESTORE DATABASE PW_TEST_0001 FROM DISK = N'C:PW_TEMPLATEPW_TEMPLATE_full.bak' WITH REPLACE, RECOVERY, MOVE 'PW_TEMPLATE' TO 'H:DATAPW_TEST_0001.mdf', MOVE 'PW_TEMPLATE_log' TO 'I:LOGSPW_TEST_0001_log.ldf'

如果我在PHP中使用相同的代码,它将停留在";恢复";地位

在SSMS中或通过PHP执行此操作有什么区别?如何解决此问题?

我正在使用:

Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64) 
Sep  7 2018 01:37:51 
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

PHP代码:

public function actionDeployDatabase($db_name)
{
$backup = "USE [master]; BACKUP DATABASE PW_TEMPLATE TO DISK=N'C:PW_TEMPLATEPW_TEMPLATE_full.bak'";
echo $backup . PHP_EOL;
Yii::$app->db2->createCommand($backup)->execute();
$restore = "USE [master]; RESTORE DATABASE __DBNAME__ FROM DISK = N'C:PW_TEMPLATEPW_TEMPLATE_full.bak' WITH REPLACE, RECOVERY, MOVE 'PW_TEMPLATE' TO 'H:DATA__DBNAME__.mdf', MOVE 'PW_TEMPLATE_log' TO 'I:LOGS__DBNAME___log.ldf'";
$restore = $this->str_replace2('__DBNAME__', $db_name, $restore, -1, $count);
echo $restore . PHP_EOL;
Yii::$app->db2->createCommand($restore)->execute();
echo "Done..." . PHP_EOL;
}
public function str_replace2($find, $replacement, $subject, $limit = -1, &$count = 0)
{
$ptn = '/' . preg_quote($find, '/') . '/';
return preg_replace($ptn, $replacement, $subject, $limit, $count);
}

}

你能通过在$restore上注释str_replace2()来给出这打印出的echo $restore . PHP_EOL;吗?

$restore = "USE [master]; RESTORE DATABASE __DBNAME__ FROM DISK = N'C:PW_TEMPLATEPW_TEMPLATE_full.bak' WITH REPLACE, RECOVERY, MOVE 'PW_TEMPLATE' TO 'H:DATA__DBNAME__.mdf', MOVE 'PW_TEMPLATE_log' TO 'I:LOGS__DBNAME___log.ldf'";

此语句在静态字符串中使用__DBNAME__。是否要改用PW_TEST_0001?如果是,则$restore需要是动态的。

编辑:这是PDO驱动程序的一个常见问题,这个问题可能存在于构建PDO的内部驱动程序中。更改驱动程序将有助于解决此问题。

最新更新