【问题标题】:Operating System Error 123 On Backup of SQL Database Via Subprocess通过子进程备份 SQL 数据库时出现操作系统错误 123
【发布时间】:2019-09-09 20:40:33
【问题描述】:

我目前正在尝试使用运行后台的 Python 3.7 应用程序自动备份数据库。我设法使用以下查询字符串备份数据库。

SQLCommand = ("sqlcmd -E -S %s -Q \"BACKUP DATABASE %s TO DISK=\'%s\%02d-%02d-%02d-%02d:%02d:%02d.bak\'\"" % 
("MYSERVER\SQLSERVICE", "MyDatabase", 
"C:\\Users\Malek\Documents\PYSQLBS\Backups",
CDT.year, CDT.month, CDT.day, CDT.hour, CDT.minute, CDT.second))
...
print(subprocess.Popen(SQLCommand, shell=True, stdout=subprocess.PIPE).stdout.read())

但是,我收到此错误。我 100% 确定文件夹 C:\Users\Malek\Documents\PYSQLBS\Backups 存在,因为我直接在命令行中测试了该命令,它运行良好。

消息 3201,级别 16,状态 1,服务器 MYSERVER\SQLSERVICE,第 1 行
无法打开备份设备 'C:\Users\Malek\Documents\PYSQLBS\Backups\2019-09 -09-16:24:46.bak'。操作系统错误 123(文件名、目录名或卷标语法不正确。)。
消息 3013,级别 16,状态 1,服务器 MYSERVER\SQLSERVICE, 1号线
BACKUP DATABASE 异常终止。

【问题讨论】:

  • 请注意您使用的产品标签!这个问题是关于ms sql server,不是mysql!
  • 您可以做的第一件事:将命令行作为列表而不是作为引用的字符串提交。有关许多示例,请参阅subprocess docs
  • 我相信你的问题是因为重复的\-es,但我可能错了。
  • Windows 文件夹/文件路径不能包含: 字符,除非在分隔驱动器号时,例如:C:\foo\bar.txt 可以。 C:\foo\bar:::baz.txt 不是。

标签: python sql sql-server database-backups


【解决方案1】:

问题在于备份文件名中的: 字符:2019-09 -09-16:24:46.bak

Windows 文件夹和文件路径不能包含: 字符,除非在分隔驱动器号时,例如:C:\foo\bar.txt 可以。 C:\foo\bar:::baz.txt 不是。

【讨论】:

  • 我明白了,我来自 Linux 环境,并且我以前在路径中使用 : 作为习惯。我会试一试,然后报告(希望接受你的回答)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 2022-08-03
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多