2010-11-23 45 views
3

我试图在SQL Server 2008上使用TSQL,使用sqlalchemy和pyodbc作为传输,在开发过程中自动执行数据库恢复。等待数据库恢复在SQL Server 2008上使用sqlalchemy完成

我执行的命令是:

“”“CREATE DATABASE DBNAME

恢复数据库DBNAME FROM DISK = 'C:\备份\ dbname.bak' 替换,MOVE 'dbname_data' TO 'C:\ Databases \ dbname_data.mdf',MOVE'dbname_log'TO'C:\ Databases \ dbname_log.ldf'“”“

不幸的是,在SQL Management Studio中,代码运行后,我看到数据库保持“正在恢复...”状态。

如果我通过管理工作室恢复,它的工作原理。如果我使用子进程调用“sqlcmd”,它可以工作。 pymssql在身份验证方面存在问题,甚至无法实现。

什么可能会出错?

+0

我有完全相同的问题,SQLSERVER 2012,甚至使用Django提供的连接`cursor`。没有工作:`RESTORE`前的`DROP`,`RESTORE`前的'RESTORE`,`WITH REPLACE,RECOVERY,NOUNLOAD`,`SET SINGLE_USER`,'SET_MULTI_USER`之前'`主````` SINGLE_USER WITH ROLLBACK IMMEDIATE`。像您一样,在Management Studio中运行这些工具时都可以工作。 – hobs 2014-01-08 19:05:01

回答

2

无法重现直接从pyodbc(不SQLAlchemy的)恢复执行以下问题:

  • 什么是用做密码的恢复:需要澄清的

    connection = pyodbc.connect(connection_string) # ensure autocommit is set to `True` in connection string 
    cursor = connection.cursor() 
    affected = cursor.execute("""CREATE DATABASE test 
    RESTORE DATABASE test FROM DISK = 'D:\\test.bak' WITH REPLACE, MOVE 'test_data' TO 'D:\\test_data.mdf', MOVE 'test_log' to 'D:\\test_log.ldf' """) 
    while cursor.nextset(): 
        pass 
    

    一些问题使用sqlalchemy?

  • 正在使用哪种版本的SQL Server ODBC驱动程序?
  • SQL Server日志中是否存在与还原相关的消息?

感谢geographika对于Cursor.nextset()示例!

+0

如果恢复事务日志是滞留,那么在Management Studio中不运行TSQL会失败吗? – hobs 2014-01-08 19:07:38

0

五件事固定我的问题有相同的症状。

  1. 发现我test.bak文件包含错误的MDF和LDF文件:

    >>> cursor.execute(r"RESTORE FILELISTONLY FROM DISK = 'test.bak'").fetchall()  
    [(u'WRONGNAME', u'C:\\Program Files\\Microsoft SQL ...), 
    (u'WRONGNAME_log', u'C:\\Program Files\\Microsoft SQL ...)] 
    
  2. 创建一个新的文件,李明博并提出一定要设置copy-only backup选项

  3. 设置自动提交选项为我的连接。

    connection = pyodbc.connect(connection_string, autocommit=True) 
    
  4. 使用的connection.cursor仅适用于单个RESTORE命令,并没有别的

  5. 更正了test_data MOVE到test我RESTORE命令(@beargle提供)。

    affected = cursor.execute("""RESTORE DATABASE test FROM DISK = 'test.bak' WITH REPLACE, MOVE 'test' TO 'C:\\test.mdf', MOVE 'test_log' to 'C:\\test_log.ldf' """) 
    
0

对于SQL炼金术的用户,并感谢geographika的答案:我结束了使用“原始” DBAPI connection从连接池。

正是因为geographika的解决方案,但有一些附加件:

import sqlalchemy as sa 
driver = 'SQL+Server' 
name = 'servername' 
sql_engine_str = 'mssql+pyodbc://'\ 
        + name\ 
        + '/'\ 
        + 'master'\ 
        + '?driver='\ 
        + driver 
engine = sa.create_engine(sql_engine_str, connect_args={'autocommit': True}) 

connection = engine.raw_connection() 
try: 
    cursor = connection.cursor() 
    sql_cmd = """ 
     RESTORE DATABASE [test] 
     FROM DISK = N'...\\test.bak' 
     WITH FILE = 1, 
     MOVE N'test' 
     TO N'...\\test_Primary.mdf', 
     MOVE N'test_log' 
     TO N'...\\test_log.ldf', 
     RECOVERY, 
     NOUNLOAD, 
     STATS = 5, 
     REPLACE 
     """ 
    cursor.execute(sql_cmd) 
    while cursor.nextset(): 
     pass 
except Exception as e: 
    logger.error(str(e), exc_info=True) 
相关问题