我正在编写Python来将MS SQL数据库备份到不同的服务器。当我将 //remoteServer/share/filename 放入命令中时,我得到:
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server 驱动程序] [SQL Server] 无法打开备份设备“E:\Data\MSSQL15.MSSQLSERVER\MSSQL\Backup\REMOTESERVER\SHARE oobar.bak”。 操作系统错误3(系统找不到指定的路径。)。 (3201) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server 驱动程序][SQL Server]BACKUP DATABASE 异常终止。 (3013)")
Windows 10 上的 Python 3.10.13、pyodbc 5.0.1
SQLServer SQL Server Express 15.0.2104
远程服务器 Windows Server 2019。共享权限包括 SQL Server 的主机名
当我从命令中删除 //remoteserver/share/ 时
backup_command = """BACKUP DATABASE BaseData TO DISK = 'foobar.bak';"""
它运行,但文件最终位于默认备份位置(废话)。此外,当从 SSMS 运行并连接到 SQLServer 时,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 so that does not error
while (cursor.nextset()):
pass
与这篇文章的情况相同,除了错误不同。
感谢@Gord Thompson,我受到启发而做出了它:
backup_command = """BACKUP DATABASE BaseData TO DISK = '\\\\REMOTESERVER\\SHARE\\foobar.bak';"""
对于 Python,\ 必须用另一个 \ 进行转义。 虽然超出了这个问题的范围,但为了获得在 REMOTESERVER 上工作的权限,我必须将 SQL Server 的主机名添加到共享文件夹共享和安全性。