17

在 docker 容器中恢复 AdventureWorks2017 数据库时出现以下错误。运行 SQL Server 2019 CTP 2.0 (mcr.microsoft.com/mssql/server:vNext-CTP2.0-ubuntu) 备份和目标数据卷都被保留。创建新数据库没有问题。检查路径,它们是正确的。使用 2017-latest docker 镜像恢复时没有任何问题。

其他人对 2019-CTP2 有此问题,解决方法?

消息 3634,级别 16,状态 1,第 7 行操作系统在“/var/opt/mssql/data/AdventureWorks2017”上尝试“RestoreContainer::ValidateTargetForCreation”时返回错误“2(系统找不到指定的文件。)” .mdf'。消息 3156,级别 16,状态 5,第 7 行文件“AdventureWorks2017”无法恢复到“/var/opt/mssql/data/AdventureWorks2017.mdf”。使用 WITH MOVE 标识文件的有效位置。消息 3634,级别 16,状态 1,第 7 行操作系统在“/var/opt/mssql/log/AdventureWorks2017_log”上尝试“RestoreContainer::ValidateTargetForCreation”时返回错误“2(系统找不到指定的文件。)” .ldf'。消息 3156,级别 16,状态 5,第 7 行文件“AdventureWorks2017_log”无法恢复为“ /var/opt/mssql/log/AdventureWorks2017_log.ldf'。使用 WITH MOVE 标识文件的有效位置。消息 3119,级别 16,状态 1,第 7 行 在规划 RESTORE 语句时发现了问题。以前的消息提供了详细信息。消息 3013,级别 16,状态 1,第 7 行 RESTORE DATABASE 异常终止。

创建容器。

$datapath = "D:\Foo";
$logpath = "D:\Foo";
$backuppath = "D:\Foo";
$pass = ":-)"

$ct = (docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=$pass" `
    -e "MSSQL_PID=Developer" -p 2017:1433 `
    -e "MSSQL_TCP_PORT=1433" `
    -v ${datapath}:/var/opt/mssql/data `
    -v ${logpath}:/var/opt/mssql/log `
    -v ${backuppath}:/var/opt/mssql/backup `
    -e "MSSQL_BACKUP_DIR=/var/opt/mssql/backup" `
    -e "MSSQL_DATA_DIR=/var/opt/mssql/data" ` 
    -e "MSSQL_LOG_DIR=/var/opt/mssql/log" `
    -d mcr.microsoft.com/mssql/server:vNext-CTP2.0-ubuntu)

恢复命令。

RESTORE DATABASE [AdventureWorks2017] FROM  DISK = N'/var/opt/mssql/backup/AdventureWorks2017.bak' 
WITH  FILE = 1,  
MOVE N'AdventureWorks2017' TO N'/var/opt/mssql/data/AdventureWorks2017.mdf',  
MOVE N'AdventureWorks2017_log' TO N'/var/opt/mssql/log/AdventureWorks2017_log.ldf', 
NOUNLOAD,  STATS = 1 
4

6 回答 6

19

能够通过首先创建一个空数据库然后使用替换选项恢复来解决此问题。

于 2018-12-14T01:39:48.877 回答
13

我已经在 Windows 1909、Docker Desktop 2.3.0.3 和 SQL Server 2019 上重现了这个问题。

我验证了 3 个解决方法

  1. Daniel 创建数据库并在其上恢复的解决方法
  2. 在恢复之前手动创建文件
  3. 使用卷映射存储而不是主机文件夹映射存储

我发现仅当您指定 docker -v 或 --mount 标志以将主机文件夹映射到容器文件夹时才会出现此问题。不幸的是,这正是我想要做的,以便利用连接到我的主机的各种存储卷。

我能够成功地将数据库恢复到其他文件夹,包括卷映射文件夹,受权限限制。确保该文件夹可由 mssql 用户写入,或者以 root 身份运行该进程。

它还可以在恢复文件之前手动创建文件。请注意,即使数据库尚不存在,您也需要在还原中使用 REPLACE选项

docker run `
    -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=$pwd" `
    -e "MSSQL_DATA_DIR=/home/data" `
    -e "MSSQL_LOG_DIR=/home/log" `
    -e "MSSQL_BACKUP_DIR=/home/backup" `
    --mount source=sql2019sysdatavol,target=/var/opt/mssql `
    --mount type=bind,source="E:\SQL2019\Data",target=/home/data `
    --mount type=bind,source="E:\SQL2019\Log",target=/home/log `
    --mount type=bind,source="E:\SQL2019\Backup",target=/home/backup `
    --name sql2019 --hostname sql2019 `
    -p 1433:1433 `
    -d mcr.microsoft.com/mssql/server:2019-latest

docker container exec sql2019 touch /home/data/AdventureWorks2019.mdf
docker container exec sql2019 touch /home/log/AdventureWorks2019_Log.ldf

$cmd = " `
    RESTORE DATABASE [AdventureWorks2019] `
    FROM  DISK = N'/home/backup/AdventureWorks2019.bak' `
    WITH  FILE = 1, STATS = 5, REPLACE, `
    MOVE N'AdventureWorks2017' TO  N'/home/data/AdventureWorks2019.mdf', `
    MOVE N'AdventureWorks2017_Log'  TO  N'/home/log/AdventureWorks2019_Log.ldf'"

sqlcmd '-Usa' "-P$pwd" '-S127.0.0.1,1433' "-Q"$cmd""
5 percent processed.
...
100 percent processed.
Processed 26344 pages for database 'AdventureWorks2019', file 'AdventureWorks2017' on file 1.
Processed 2 pages for database 'AdventureWorks2019', file 'AdventureWorks2017_log' on file 1.
RESTORE DATABASE successfully processed 26346 pages in 3.018 seconds (68.198 MB/sec).
于 2020-06-17T14:16:32.847 回答
2

我在这个问题上挣扎了好几个小时。问题是目录没有完全权限。

chmod 777 hds
cd hds

sqlcmd -U SA -P <db_password>  -Q "RESTORE DATABASE XSP_A0 FROM DISK=N'/home/hds/DBchema.bak' WITH REPLACE, MOVE N'XSP_A0' TO N'/home/hds/XSP_A0.mdf' , MOVE N'XSP_A0_log' TO N'/home/hds/XSP_A0.ldf'"
于 2019-11-13T03:59:01.027 回答
1

检查您是否提供了对该文件夹的完全权限以保存该数据库的 mdf 和 ldf。

于 2018-12-05T05:40:22.347 回答
0

我在 Mac 上尝试使用已安装的主机卷来存储数据,我发现这取决于文件名的情况。

于 2021-08-23T21:25:59.093 回答
-1

我在 linux 容器上运行 sql server,在 Windows 10 笔记本电脑上运行。我使用的命令如下。

docker run --name testdb3 -d -p 1433:1433 -e MSSQL_SA_PASSWORD=G52ndTOur -e ACCEPT_EULA=Y -v D:/Vivek/Trials/SqlDocker/data:/var/opt/mssql/data -v D:/Vivek/Trials/SqlDocker/log:/var/opt/mssql/log -v D:/Vivek/Trials/SqlDocker/secrets:/var/opt/mssql/secrets mcr.microsoft.com/mssql/server

一旦命令执行并且容器正在运行,这将在 Windows 机器上创建三个文件夹,如下所示。

在 linux 容器上运行带有 sql server 的挂载寡妇文件夹

现在将您的 .bak 文件复制到其中一个文件夹中,比如数据文件夹。

使用 SSMS 连接到容器中运行的服务器,如下所示。',1433' 是可选的,因为 1433 是默认值。所以一个点(。代表本地主机)也应该工作。

使用 SSMS 连接到容器中运行的 Sql Server

Next 创建您要恢复的数据库。在我的情况下,它的 SqlServerOnDocker

现在右键单击数据库并选择还原数据库

在 SSMS 中恢复数据库

选择您的数据库备份文件。

单击确定,然后再次确定。现在在同一“还原数据库”对话框中选择如下所示的选项。

在“还原数据库”对话框中选择选项

现在单击确定以恢复您的数据库。

于 2021-08-27T06:37:21.727 回答