文中 IP 均为脱敏后的示例地址。
一、示例环境
| 项目 | 示例信息 |
|---|---|
| 数据库服务器 IP | 10.10.10.113 |
| 异地备份服务器 IP | 10.10.20.192 |
| 数据库本地备份目录 | F:\databasebak |
| 异地服务器本地目录 | F:\10.10.10.113 |
| 异地共享访问路径 | \\10.10.20.192\f\10.10.10.113 |
| 备份文件 | ES.EMS_backup_2026_07_05_020003.bak |
异地备份服务器将本地 F:\ 共享为:
\\10.10.20.192\f
因此,异地服务器本地目录:
F:\10.10.10.113
在数据库服务器上对应的网络访问路径为:
\\10.10.20.192\f\10.10.10.113
其中,目录名 10.10.10.113 对应数据库服务器的 IP。
二、问题现象
SQL Server 本地备份文件正常生成:
F:\databasebak\ES.EMS_backup_2026_07_05_020003.bak
但传输脚本执行后,异地备份服务器目录中没有对应文件:
F:\10.10.10.113
在数据库服务器上手工执行复制命令:
copy /Y "F:\databasebak\ES.EMS_backup_2026_07_05_020003.bak" "\\10.10.20.192\f\10.10.10.113\"
提示:
用户名或密码不正确。
已复制 0 个文件。
查看返回码:
echo 返回码:%errorlevel%
结果为:
返回码:1
三、问题定位
检查确认:
-
本地备份文件存在;
-
数据库服务器与异地备份服务器网络正常;
-
异地共享目录已创建;
-
其他服务器可以正常写入该共享目录;
-
当前数据库服务器手工复制时提示用户名或密码错误。
最终确认:
当前 Windows 执行账户没有可用的异地 SMB 共享认证,或原共享连接中保存的认证信息已经不可用。
SMB 认证连接没有统一的固定失效时间,但以下情况可能导致原连接不可用:
-
数据库服务器或异地备份服务器重启;
-
Windows 用户注销或切换;
-
异地服务器账户密码发生变化;
-
Windows 保存了旧密码;
-
网络中断导致原 SMB 会话断开;
-
计划任务更换了运行账户;
-
手工认证账户与计划任务运行账户不一致。
四、处理步骤
1. 查看当前共享连接
在数据库服务器 CMD 中执行:
net use
检查是否存在异地共享连接:
\\10.10.20.192\f
2. 删除原有共享连接
net use "\\10.10.20.192\f" /delete
如果提示未找到连接,可以忽略。
检查 Windows 是否保存了旧凭据:
cmdkey /list
如存在异地服务器旧凭据,可删除:
cmdkey /delete:10.10.20.192
3. 重新认证异地共享
net use "\\10.10.20.192\f" /user:10.10.20.192\Administrator *
根据提示输入异地备份服务器账户密码。
密码输入时 CMD 不显示任何字符,属于正常现象。
认证成功后显示:
命令成功完成。
认证到共享根目录即可,不需要指定到具体子目录。
4. 验证异地目录是否可以访问
dir "\\10.10.20.192\f\10.10.10.113"
能够正常列出目录内容,说明共享路径和认证正常。
5. 验证异地目录写权限
echo test>"\\10.10.20.192\f\10.10.10.113\write_test.txt"
然后在异地备份服务器检查:
F:\10.10.10.113\write_test.txt
测试完成后删除:
del "\\10.10.20.192\f\10.10.10.113\write_test.txt"
6. 手工复制备份文件
copy /Y "F:\databasebak\ES.EMS_backup_2026_07_05_020003.bak" "\\10.10.20.192\f\10.10.10.113\"
对于几十 GB 的备份文件,copy 命令不会显示实时进度。命令窗口未返回提示符时,通常表示文件仍在传输,不要关闭窗口。
传输完成后显示:
已复制 1 个文件。
检查返回码:
echo 返回码:%errorlevel%
正常结果:
返回码:0
7. 验证异地文件
在数据库服务器执行:
dir "\\10.10.20.192\f\10.10.10.113\ES.EMS_backup_2026_07_05_020003.bak"
在异地备份服务器本机执行:
dir "F:\10.10.10.113\ES.EMS_backup_2026_07_05_020003.bak"
查看本地文件大小:
dir "F:\databasebak\ES.EMS_backup_2026_07_05_020003.bak"
本地与异地文件字节数一致,说明文件传输完整。
五、传输脚本整改
原脚本不能在复制命令执行后直接输出"传输成功",必须检查返回码。
xcopy "%source_path%\%today_file%" "%dest_path%\" /Y /Z
if errorlevel 1 (
echo [失败] 文件传输失败,返回码:%errorlevel%
exit /b 1
)
echo [成功] 文件传输完成。
建议使用 robocopy 传输大文件:
robocopy "F:\databasebak" "\\10.10.20.192\f\10.10.10.113" "ES.EMS_backup_2026_07_05_*.bak" /Z /R:3 /W:10
判断返回码:
if errorlevel 8 (
echo [失败] Robocopy传输失败,返回码:%errorlevel%
exit /b 2
)
Robocopy 返回码小于 8,通常不表示复制失败。
传输完成后,还应检查异地文件是否真实存在:
if not exist "\\10.10.20.192\f\10.10.10.113\备份文件名.bak" (
echo [失败] 异地目录未找到备份文件。
exit /b 3
)
六、计划任务注意事项
手工复制成功后,计划任务仍可能失败,因为 SMB 认证与 Windows 运行账户相关。
需要确认:
-
计划任务使用固定的 Windows 账户;
-
该账户与执行
net use的账户一致; -
不使用没有共享认证的
SYSTEM账户; -
勾选"使用最高权限运行";
-
脚本记录复制返回码;
-
传输完成后校验异地文件是否存在及大小是否一致。
七、结论
本次问题不是备份文件、网络或异地共享目录异常,而是数据库服务器当前 Windows 执行账户缺少有效的 SMB 共享认证。
重新执行:
net use "\\10.10.20.192\f" /user:10.10.20.192\Administrator *
再手工执行:
copy /Y "F:\databasebak\ES.EMS_backup_2026_07_05_020003.bak" "\\10.10.20.192\f\10.10.10.113\"
文件成功传输至异地服务器:
F:\10.10.10.113
返回码为 0,问题解决。
