【问题标题】:Restore sql doesnt fire恢复sql不触发
【发布时间】:2009-04-02 09:27:04
【问题描述】:

我正在尝试使用应用程序代码从备份中动态恢复数据库

用于恢复的简单 sql 命令

con.execute("RESTORE FILELISTONLY FROM DISK='c:\old.bak' " & vbcrlf &_
        "RESTORE DATABASE newdb " & vbcrlf &_
        "FROM DISK='c:\old.bak' " & vbcrlf &_
        "WITH MOVE 'newdb' TO 'c:\newdb.mdf', " & vbcrlf &_
        "MOVE 'newdb_log' TO 'c:\newdb_log.ldf'")

但它不会触发,我的意思是没有任何错误 尝试使用 sql profiler 进行检查并正确查看

RESTORE FILELISTONLY FROM DISK='c:\old.bak' 
RESTORE DATABASE newdb 
FROM DISK='c:\old.bak' 
WITH MOVE 'newdb' TO 'c:\newdb.mdf', 
MOVE 'newdb_log' TO 'c:\newdb_log.ldf'

如果我从 sql profiler 运行 sql,它的工作原理

你怎么解释这个问题?

【问题讨论】:

    标签: asp.net sql sql-server asp-classic database-restore


    【解决方案1】:

    我猜你使用的连接是数据库的锁,所以它无法恢复。 当你直接运行它时,你没有。

    这个怎么样?

    con.execute("USE master" & vbcrlf &_
            "RESTORE FILELISTONLY FROM DISK='c:\old.bak' " & vbcrlf &_
            "RESTORE DATABASE newdb " & vbcrlf &_
            "FROM DISK='c:\old.bak' " & vbcrlf &_
            "WITH MOVE 'newdb' TO 'c:\newdb.mdf', " & vbcrlf &_
            "MOVE 'newdb_log' TO 'c:\newdb_log.ldf'")
    

    或者更改连接字符串中的数据库?

    【讨论】:

      【解决方案2】:

      尝试在运行还原之前杀死您还原到的数据库中的所有用户,如果有任何活动连接到数据库,还原将失败。有如何做到这一点的示例代码all over.

      还要确保从应用程序调用恢复时使用的连接字符串不会连接到恢复到的数据库,而是连接到 master 或 msdb 之类的东西。

      【讨论】:

        【解决方案3】:

        如果数据库正在与其他会话一起使用,您将被阻止执行还原。确保等待整整 60 秒,然后查看是否有任何超时错误。

        【讨论】:

        • 我可以用 sql server 做“等待时间”吗,比如睡眠,它是否存在于 sql server 中?
        • 我不知道在 T-SQL 中休眠,但您可以在 .NET 对象中设置 IDbCommand.CommandTimeout 属性。通常为 30 秒,而连接超时默认为 60 秒。
        • 你让它运行多久了?去吃午饭或喝杯咖啡,过一段时间再回来。此外,尝试使用 SQL Profiler 和 sp_who2 存储过程来查看是否有任何东西阻碍了您。连接池可能会使这变得棘手,因为即使您将其放回池中,它仍然是连接的。
        • 如 GBN 上面所述,请确保您的 ASP 应用程序的连接字符串用于 MASTER 数据库,而不是您要恢复的那个...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 2013-03-14
        • 2018-07-27
        • 2013-02-14
        相关资源
        最近更新 更多