Sql server 还原docker容器中的数据库

Sql server 还原docker容器中的数据库,sql-server,docker,sql-server-2019,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有这个问题吗 Msg 3634,级别16,状态1,第7行操作系统返回 尝试时出现错误“2(系统找不到指定的文

在docker容器中还原AdventureWorks2017数据库时出现以下错误。 运行SQL Server 2019 CTP 2.0(mcr.microsoft.com/mssql/Server:vNext-CTP2.0-ubuntu) 备份和目标数据卷都被持久化。 创建新数据库没有问题。 检查路径是否正确。使用2017年最新docker映像恢复时没有任何问题

还有人对2019-CTP2有这个问题吗

Msg 3634,级别16,状态1,第7行操作系统返回 尝试时出现错误“2(系统找不到指定的文件)。” 上的“RestoreContainer::ValidateTargetForCreation” “/var/opt/mssql/data/AdventureWorks2017.mdf”。Msg 3156,第16级, 无法将状态5第7行文件“AdventureWorks2017”还原到 “/var/opt/mssql/data/AdventureWorks2017.mdf”。与移动到一起使用 标识文件的有效位置。Msg 3634,16级,状态1, 第7行操作系统返回错误“2”(系统无法 查找指定的文件。),同时尝试 上的“RestoreContainer::ValidateTargetForCreation” “/var/opt/mssql/log/AdventureWorks2017_log.ldf”。Msg 3156,第16级, 状态5,第7行文件“AdventureWorks2017_日志”无法还原到 “/var/opt/mssql/log/AdventureWorks2017_log.ldf”。与移动到一起使用 标识文件的有效位置。Msg 3119,16级,状态1, 在规划恢复时发现了第7行问题 陈述以前的消息提供了详细信息。味精3013,16级, 状态1,第7行还原数据库异常终止

创建容器

$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 

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

能够解决此问题,方法是先创建一个空数据库,然后使用“替换”选项进行还原。

我为此问题挣扎了数小时。问题是该目录没有完全权限

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'"
chmod 777硬盘
cd硬盘
sqlcmd-U SA-P-Q“使用REPLACE从DISK=N'/home/hds/DBchema.bak'还原数据库XSP_A0',将N'XSP_A0'移动到N'/home/hds/XSP_A0.mdf',将N'XSP_A0_log'移动到N'/home/hds/XSP_A0.ldf'”

我在Windows 1909、Docker Desktop 2.3.0.3和SQL Server 2019上复制了这个问题

我验证了3种解决方法

  • Daniel创建数据库并在其上进行恢复的变通方法
  • 在恢复之前手动创建文件
  • 使用卷映射存储而不是主机文件夹映射存储
  • 我发现只有在指定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""
    

    你在运行什么命令?如何将AdventureWorks2017文件放入容器?添加到问题中如果不从主机映射目录,则不会发生此错误。Docker容器应在linux中具有根权限。主机上也设置了完全权限。这在Windows 1909、Docker Desktop 2.1.0.5和SQL Server 2019上仍然是一个问题。你的变通方法是我发现唯一有效的解决方案。
    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).