【问题标题】:Using CodeCeption (PHP) to restore a database is leaving the database in "restoring" state使用 CodeCeption (PHP) 恢复数据库会使数据库处于“恢复”状态
【发布时间】:2016-03-03 09:29:58
【问题描述】:

我正在尝试在使用 CodeCeption (PHP) 编写的验收测试运行开始时恢复 MSSQL 数据库。对于那些知道 CodeCeption 的人,我正在使用转储文件来运行恢复。

我使用的恢复命令在 SQL Management Studio 中运行时运行良好,但从测试套件运行时,它保持在“正在恢复”状态,因此无法使用。运行

RESTORE DATABASE [dbname] WITH RECOVERY

此时将失败并显示消息

“无法恢复数据库,因为日志没有恢复” 但是运行完整的恢复命令(RESTORE DATABASE [dbname] 从磁盘....)

此时在 Management Studio 中将起作用。我在恢复命令上使用 WITH REPLACERECOVERY

我还查看了以下博客文章 (https://blogs.msdn.microsoft.com/brian_swan/2010/07/01/restoring-a-sql-server-database-from-php/),但那里发布的解决方案似乎也不起作用。我也尝试使用 xp_cmdshell 和 sqlcmd 的组合运行还原,但仍然没有成功。

我推测 CodeCeption 运行转储文件的方式已经与打开的数据库建立了连接,所以我添加了一个

USE [master] 

在恢复之前立即检查活动监视器中的进程以确保没有与正在恢复的数据库的连接。

我确信这是 PHP CodeCeption 代码中的一个问题,可以在这里看到 - https://github.com/Codeception/Codeception/blob/2.1/src/Codeception/Module/Db.php

有什么建议吗?

【问题讨论】:

  • 这个问题没有多大意义。什么是“恢复状态”?

标签: php sql-server codeception


【解决方案1】:

Codeception 只是从您使用dump 参数配置的 SQL 文件中执行 SQL 语句: https://github.com/Codeception/Codeception/blob/2.1/src/Codeception/Lib/Driver/Db.php#L105

SqlSrv 具体代码在https://github.com/Codeception/Codeception/blob/2.1/src/Codeception/Lib/Driver/SqlSrv.php

如果您知道如何改进它,欢迎您贡献。
请将您的 SQL 文件的内容添加到问题中。
如果它只包含一个 RESTORE DATABASE 语句,那么它可能是 pdo_sqlsrv 驱动程序的问题。

我唯一的建议是使用 SQL 语句 CREATE TABLE 和 INSERT 来填充您的数据库。

【讨论】:

  • 我使用的恢复命令是 RESTORE DATABASE [dbname] FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\backup_name.bak' WITH REPLACE,恢复 我确信这是 PDO _sqlsrv 驱动程序的问题,但找不到它。不过,我现在已经通过使用数据库快照解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多