MSSQL 数据库卡在“正在恢复”状态 PHP
MSSQL database stuck in 'restoring" state with PHP
我可以在 SSMS 中执行以下操作,数据库将完全备份并以新的数据库名称恢复:
USE [master]; BACKUP DATABASE PW_TEMPLATE TO DISK=N'C:\PW_TEMPLATE\PW_TEMPLATE_full.bak'
USE [master]; RESTORE DATABASE PW_TEST_0001 FROM DISK = N'C:\PW_TEMPLATE\PW_TEMPLATE_full.bak' WITH REPLACE, RECOVERY, MOVE 'PW_TEMPLATE' TO 'H:\DATA\PW_TEST_0001.mdf', MOVE 'PW_TEMPLATE_log' TO 'I:\LOGS\PW_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_TEMPLATE\PW_TEMPLATE_full.bak'";
echo $backup . PHP_EOL;
\Yii::$app->db2->createCommand($backup)->execute();
$restore = "USE [master]; RESTORE DATABASE __DBNAME__ FROM DISK = N'C:\PW_TEMPLATE\PW_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_TEMPLATE\PW_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 的内部驱动程序中。更改驱动程序将有助于解决问题。
我可以在 SSMS 中执行以下操作,数据库将完全备份并以新的数据库名称恢复:
USE [master]; BACKUP DATABASE PW_TEMPLATE TO DISK=N'C:\PW_TEMPLATE\PW_TEMPLATE_full.bak'
USE [master]; RESTORE DATABASE PW_TEST_0001 FROM DISK = N'C:\PW_TEMPLATE\PW_TEMPLATE_full.bak' WITH REPLACE, RECOVERY, MOVE 'PW_TEMPLATE' TO 'H:\DATA\PW_TEST_0001.mdf', MOVE 'PW_TEMPLATE_log' TO 'I:\LOGS\PW_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_TEMPLATE\PW_TEMPLATE_full.bak'";
echo $backup . PHP_EOL;
\Yii::$app->db2->createCommand($backup)->execute();
$restore = "USE [master]; RESTORE DATABASE __DBNAME__ FROM DISK = N'C:\PW_TEMPLATE\PW_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_TEMPLATE\PW_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 的内部驱动程序中。更改驱动程序将有助于解决问题。