我有一个Yii控制台应用程序(使用Yii v1.1.14),我想要包含数据库备份和恢复命令功能。
对于备份功能,代码如下:
$backupDir = "C:\\mssql_backup\\backup.bak";
// Grab the db name from the config values
$dbName = $this->dbConfig['dbMainDatabaseName'];
$cmd = "USE [master] BACKUP DATABASE [$dbName] TO DISK = '$backupDir' WITH FORMAT";
$this->mssql->createCommand($cmd)->execute();
该命令执行但永远不会创建备份。我不确定命令在哪里出错,因为它使用SQL Server Management Studio执行得很好。
对于恢复功能,代码如下:
$backupDir = "C:\\mssql_backup\\backup.bak";
// Grab the db name from the config values
$dbName = $this->dbConfig['dbMainDatabaseName'];
$singleUserCmd = "USE [master] ALTER DATABASE [$dbName] SET single_user WITH ROLLBACK IMMEDIATE";
$restoreCmd = "USE [master] RESTORE DATABASE [$dbName] FROM DISK ='$backupDir' WITH REPLACE, RECOVERY";
$this->mssql->createCommand($singleUserCmd)->execute();
$this->mssql->createCommand($restoreCmd)->execute();
数据库似乎已恢复,但仍处于恢复状态(WITH RECOVERY
应该处理的状态)。我尝试过切换RECOVERY
和REPLACE
选项的不同变体,甚至将命令拆分为2个命令来执行,看到的结果相同。同样,命令在SQL Server Management Studio中按预期运行。
值得注意的是,我还有一个删除数据库的命令:
$singleUserCmd = "USE [master] ALTER DATABASE [$name] SET single_user WITH ROLLBACK IMMEDIATE";
$dropCmd = "USE [master] DROP DATABASE [$name]";
$this->mssql->createCommand($singleUserCmd)->execute();
$this->mssql->createCommand($dropCmd)->execute();
drop database命令使用相同的连接,用户等完美地工作,这让我觉得它可能不是权限问题。
我不确定从哪里开始,任何建议都将不胜感激。
答案 0 :(得分:1)
这不是Yii的问题,它实际上是PHP中PDO层的已知问题,请参阅SQL Server: Database stuck in “Restoring” state with PHP