使用pyodbc备份MSSQL至远程服务器时默认路径自动追加问题
错误信息
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot open backup device 'E:\Data\MSSQL15.MSSQLSERVER\MSSQL\Backup\REMOTESERVER\SHARE\foobar.bak'. Operating system error 3(The system cannot find the path specified.). (3201) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]BACKUP DATABASE is terminating abnormally. (3013)")
环境信息
- Python 3.10.13、pyodbc 5.0.1(Windows 10系统)
- SQL Server Express 15.0.2104
- 目标服务器:Windows Server 2019,共享权限已包含SQL Server主机名
已知情况
- 仅保留文件名时,备份命令可执行,但文件会存入SQL Server默认备份路径
- 在SSMS中执行
BACKUP DATABASE BaseData TO DISK = '\\REMOTESERVER\SHARE\foobar.bak'可正常完成备份
代码示例
import pyodbc # Connection parameters server = 'SQLServer' database = 'BaseData' username = 'User' password = 'Password' # Create a connection object conn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + server + ';DATABASE=' + database + ';UID=' + username + ';PWD=' + password) conn.autocommit = True # Create a cursor object cursor = conn.cursor() # Backup command backup_command = """BACKUP DATABASE BaseData TO DISK = '//REMOTESERVER/SHARE/foobar.bak';""" # Execute the backup command cursor.execute(backup_command) # Process return to avoid error while (cursor.nextset()): pass
解决方法
核心问题是路径格式不兼容:SQL Server在Windows环境下仅识别反斜杠\作为路径分隔符,你使用的类Unix正斜杠//会被识别为相对路径前缀,导致SQL Server自动将其追加到默认备份目录后。
修正方案有两种:
转义反斜杠:在Python字符串中用双反斜杠
\\表示单个路径反斜杠(Python中反斜杠是转义字符)backup_command = """BACKUP DATABASE BaseData TO DISK = '\\\\REMOTESERVER\\SHARE\\foobar.bak';"""使用原始字符串:在字符串前加
r,避免Python解析转义字符,直接传递正确的UNC路径给SQL Serverbackup_command = r"""BACKUP DATABASE BaseData TO DISK = '\\REMOTESERVER\SHARE\foobar.bak';"""
逻辑验证:SSMS中无需转义反斜杠即可直接使用UNC路径,但Python字符串中必须通过转义或原始字符串处理,才能让SQL Server接收到正确的远程共享路径,避免被识别为相对路径。
内容的提问来源于stack exchange,提问作者Joel-Brooks

