2010-11-23 63 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)