Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在docker容器上还原sql server DB时出现问题_Sql Server_Linux_Docker_Database Restore - Fatal编程技术网

Sql server 在docker容器上还原sql server DB时出现问题

Sql server 在docker容器上还原sql server DB时出现问题,sql-server,linux,docker,database-restore,Sql Server,Linux,Docker,Database Restore,我正在尝试创建一个docker容器,以从docker for windows用作sql server数据库的测试实例。我有一个备份文件MyDb.bak,我想在创建容器时恢复它 目前我的dockerfile看起来像这样 FROM microsoft/mssql-server-linux:latest ENV ACCEPT_EULA="Y" ENV SA_PASSWORD="<my_sa_password>" COPY ./MyDb.bak /var/opt/mssql/data/MyD

我正在尝试创建一个docker容器,以从docker for windows用作sql server数据库的测试实例。我有一个备份文件MyDb.bak,我想在创建容器时恢复它

目前我的dockerfile看起来像这样

FROM microsoft/mssql-server-linux:latest
ENV ACCEPT_EULA="Y"
ENV SA_PASSWORD="<my_sa_password>"
COPY ./MyDb.bak /var/opt/mssql/data/MyDb.bak
ENTRYPOINT /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P <my_sa_password> -Q "RESTORE DATABASE [MyDb] FROM DISK = N'/var/opt/mssql/data/MyDb.bak'"

sql server
中的数据库设置中,应列出三个字段,分别为
Data
Log
Backup
,确保路径正确有效。

我无法帮助您解决docker问题,但此sql命令不完整:

RESTORE DATABASE [MyDb] FROM DISK = N'/var/opt/mssql/data/MyDb.bak'
您需要指定数据库在恢复后应该放在哪里,以及数据库日志文件应该放在哪里。如果不提供,则数据库将尝试将数据库文件和日志还原到其在原始服务器上的相同位置

您的命令应如下所示:

RESTORE DATABASE YourDB
FROM DISK = '/var/opt/mssql/backup/YourDB.bak'
WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf',
MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf'
另见

如果要查看备份文件中存储的逻辑名称和路径,可以运行:

RESTORE FILELISTONLY FROM DISK = N'/var/opt/mssql/data/MyDb.bak'

这将返回一个结果集,表示已备份数据库的内容和组织

Linux版本不适用于Windows样式的文件路径,如C:\SQLData\MyDb.mdf,但需要类似于/SQLData/MyDb.mdf的文件路径,因此您需要使用with MOVE选项来执行还原,因为有人已经在注释中写过了。 此外,由于您尝试还原的文件来自Windows MS-SQL Server系统,请仔细检查Windows Server上运行的版本是否为2014或更高版本。由于Linux引擎是最近开发的,所以从旧版windows MS-SQL加载数据时会出现问题。
有一次,我必须首先使用Developer Edition在Windows Ms SQL Server 2014上上传.bak,然后我就能够制作一个可以加载到Linux设备上的备份。

在执行恢复时,是否存在文件夹:“C:\SQLData\?我认为文件夹必须首先存在,很难让它存在于linux容器中。我知道,当我使用SSMS手动恢复时,我可以告诉它将内容移动到新文件夹中,但我能找到的t-sql恢复命令的每一个变体仍然会给我相同的错误。。这对于等待容器准备好sqlcmd连接非常有用,但我认为这无助于告诉restore命令不要使用C:\SqlData。我想我需要结束这个问题并问一个更具体的问题什么是
SQLServer
,它是像sqlcmd这样的命令行工具,还是指SQLServerManagementStudio?我需要从bash进行恢复,就像我在问备份文件的bash移动:
mv/home/user1/MyDB.bak/var/opt/mssql/data
(这应该是自然的位置)。另外,我想如果您没有目录
mkdir-p/var/opt/mssql/data
(您需要先这样做),
restore filelistonly
的输出由于格式问题非常难以读取,但我最终发现我需要'MyDb_dat'来处理WITH MOVE行,并且能够restore@KelsonBall是 啊我强烈建议只从比sqlcmd更有用的工具运行RESTORE FILELISTONLY。Sqlcmd函数,但在这一点上它是一个非常旧的工具。SQL Server Management Studio是首选方法,但
-Q“仅从磁盘恢复文件列表=N'/var/opt/mssql/data/MyDb.bak'-w 2048-o myfile.txt
并在文本编辑器中查看,或
-Q“设置无计数;仅从磁盘恢复文件列表=N'/var/opt/mssql/data/MyDb.bak'-w 2048-w-s”-o myfile.csv
和在电子表格程序中查看要容易得多。
RESTORE FILELISTONLY FROM DISK = N'/var/opt/mssql/data/MyDb.bak'