声明文件时如何还原数据库?

时间:2019-09-09 19:19:13

标签: sql-server docker

我必须还原数据库,并且正在遵循此官方文档,在此我们遵循两个步骤: -列出文件 -对上述文件运行“恢复”命令。

但是,我遇到了“已声明”错误。

我尝试使用其他名称,但是由于备份中包含某些文件,因此无法使用。我还尝试了跨不同域的其他答案,都具有GUI。

我运行的第一个命令是:

sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost \
   -U SA -P '<YourStrong@Passw0rd>' \
   -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/us_national_statistics.bak"' \
   | tr -s ' ' | cut -d ' ' -f 1-2

我得到以下输出:

LogicalName PhysicalName
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
us_national_statistics C:\Program
us_national_statistics_log C:\Program

然后,根据文档,我运行以下命令:

sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P '<YourStrong@Passw0rd>' \
   -Q 'RESTORE DATABASE US_NATIONAL FROM DISK = "/var/opt/mssql/backup/us_national_statistics.bak" WITH MOVE "us_national_statistics" TO "C:\Program", MOVE "us_national_statistics_log" TO "C:\Program"'

在这里,出现以下错误:

Msg 3176, Level 16, State 1, Server 0a6a6aac7476, Line 1
File 'C:\Program\New' is claimed by 'us_national_statistics_log'(2) and 'us_national_statistics'(1). The WITH MOVE clause can be used to relocate one or more files.
Msg 3013, Level 16, State 1, Server 0a6a6aac7476, Line 1
RESTORE DATABASE is terminating abnormally.

我希望数据库可以恢复。

1 个答案:

答案 0 :(得分:2)

由于多种原因,您无法还原到C:\Program。那不是完整的路径(您似乎在Program Files的第一个空格之后丢失了字符串);数据和日志不能都放在同一个文件中;您通常没有对任何驱动器根目录的写权限;并且C:\在Docker或Linux中无效。

您需要LogicalName,但在要还原到Docker或Linux的情况下,或者要与要保留的现有副本一起还原数据库的情况下,请不要直接使用PhysicalName ,或者要将数据库还原到其他实例(很有可能具有不同的数据文件夹结构)。

尝试:

RESTORE DATABASE US_NATIONAL_COPY 
  FROM DISK = "/var/opt/mssql/backup/us_national_statistics.bak" 
  WITH REPLACE, RECOVERY,
  MOVE "us_national_statistics"      TO "/var/opt/mssql/data/usns_copy.mdf",
  MOVE "us_national_statistics_log"  TO "/var/opt/mssql/data/usns_copy.ldf";