无法打开备份设备“/home/ec2-user/db-name.bak”。操作系统错误 2(系统找不到指定的文件。)

无法打开备份设备“/home/ec2-user/db-name.bak”。操作系统错误 2(系统找不到指定的文件。)

最近我在还原数据库备份时遇到了一个非常奇怪的问题。当我从 /homne/ec2-user/db-name.bak 还原时失败,然后从 /var/opt/mssql/backup/db-name.bak 还原时成功。两个位置的文件所有者都是同一个 ec2-user。

权限:

-rw-rw-r-- ec2-user ec2-user db-name.bak

命令失败:

RESTORE DATABASE fomv3 FROM DISK = '/home/ec2-user/db-name.bak' WITH MOVE 'db-name' TO '/var/opt/mssql/data/db-name.mdf', MOVE 'db-name_Log' TO '/var/opt/mssql/data/db-name_Log.ldf

错误:无法打开备份设备“/home/ec2-user/db-name.bak”。操作系统错误 2(系统找不到指定的文件。)。

命令成功:

RESTORE DATABASE fomv3 FROM DISK = '/var/opt/mssql/backup/db-name.bak' WITH MOVE 'db-name' TO '/var/opt/mssql/data/db-name.mdf', MOVE 'db-name_Log' TO '/var/opt/mssql/data/db-name_Log.ldf'

RESTORE DATABASE 在 x 秒内成功处理了 x 页。

/home/ec2-user/ 下的文件有什么问题?

答案1

数据库服务可能在其自己的服务用户下运行,而不是在用户下运行ec2-user。服务用户(无论是什么)都无权访问其他用户的主目录。
就像在 Windows 上一样,例如,您将拥有 Windows 用户Dave,但大多数情况下,SQL Server 服务将以用户NT Service\MSSQLSERVER或您在安装期间指定的其他用户身份运行。

您执行的查询不是由您执行的,您只是将查询发送给服务进程,服务进程执行查询+访问 bak 文件+恢复您的数据库。

答案2

如果您使用 Microsoft SQL Server Linux 容器,请考虑以下一些事项。

假设您正在运行以下容器:

  • 容器 A(基于 mcr.microsoft.com/mssql/server:2019-latest)托管数据库服务器。
  • 容器 B(基于 mcr.microsoft.com/mssql-tools)用于使用该sqlcmd工具执行恢复脚本。

尽管sqlcmd容器 B 内部启动了恢复操作,但实际操作将由容器 A 内部的数据库服务器执行。这意味着db-name.bak必须在容器 A 内部找到该文件(例如/var/opt/mssql/backup/db-name.bak),而不是相对于容器 B 内部的位置)。

相关内容