Dan*_*l N 14 sql-server docker sql-server-2019
在 docker 容器中恢复 AdventureWorks2017 数据库时出现以下错误。运行 SQL Server 2019 CTP 2.0 (mcr.microsoft.com/mssql/server:vNext-CTP2.0-ubuntu) 备份和目标数据量都被持久化。创建新数据库没有问题。检查了路径,它们是正确的。使用 2017 年最新的 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)
Run Code Online (Sandbox Code Playgroud)
恢复命令。
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
Run Code Online (Sandbox Code Playgroud)
我已经在 Windows 1909、Docker Desktop 2.3.0.3 和 SQL Server 2019 上重现了这个问题。
我验证了 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""
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)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).
| 归档时间: |
|
| 查看次数: |
5588 次 |
| 最近记录: |