将SQL Server数据库还原到Linux Docker

Vin*_*ent 10 linux sql-server database-backups docker

我需要在Linux Docker实例上恢复大型SQL Server数据库(https://hub.docker.com/r/microsoft/mssql-server-linux/)

我正在将.bak文件移动到docker并在mssql shell中执行此命令:

RESTORE DATABASE gIMM_Brag FROM DISK = '/var/opt/mssql/backup/BackupFull8H_gIMM.bak' WITH MOVE '[gIMM].Data' T'/var/opt/mssql/data/gIMM.mdf', MOVE '[gIMM].Log' TO '/var/opt/mssql/data/gIMM.ldf', MOVE 'TraceabilityData' TO '/var/opt/mssql/data/gIMM.TraceData.mdf', MOVE 'TraceabilityIndexes' TO '/var/opt/mssql/data/gIMM.TraceIndex.mdf', MOVE 'KpiData' TO '/var/opt/mssql/data/gIMM.KpiData.mdf', MOVE 'KpiIndexes' TO '/var/opt/mssql/data/gIMM.KpiIndex.mdf'
Run Code Online (Sandbox Code Playgroud)

我正确映射了需要的每个文件,我在docker实例上确实有足够的空间,但是我收到了这个错误:

错误:备份或还原已中止.

实际上这个docker的Windows版本也会出现同样的错误......而且因为它不应该是Express版本,所以数据库大小不应该是这里的问题.

如果有人有关于导致此错误的原因的更多信息!

谢谢,

小智 6

@TOUDIdel 您必须使用 linux 上的实际文件系统路径,而不是错误中显示的虚拟路径。

RESTORE DATABASE Northwind FROM DISK='/var/opt/mssql/Northwind.bak' WITH MOVE 'Northwind' TO '/var/opt/mssql/data/NORTHWND.MDF', MOVE 'Northwind_log' TO '/var/opt/mssql/data/NORTHWND_log.ldf'
Run Code Online (Sandbox Code Playgroud)

http://www.raditha.com/blog/archives/restoring-a-database-on-ms-sql-server-for-linux-docker/


Tab*_*ces 5

你没有提到它,但欺骗我的是我没有将BAK文件复制到我的Docker实例.

在终端与docker和你的mssql容器运行...

1)获取容器ID:
$docker inspect -f '{{.Id}}' <container_name>

2)将BAK文件复制到docker实例:
docker exec -i <container_id> bash -c 'cat > /var/opt/mssql/backup.bak' < '/source/path/backup.bak'

3)登录mssql:
mssql -u sa -p 'myPassword'

3)恢复db :(你可以用恢复脚本替换它,虽然这对我来说已经足够了)
RESTORE DATABASE [MyDatabase] FROM DISK = N'/var/opt/mssql/backup.bak' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 5

  • 在恢复期间,我收到:SQL错误[5133] [S0001]:文件"c:\ Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\database.mdf"的目录查找失败,出现操作系统错误2(该系统找不到指定的文件.).com.microsoft.sqlserver.jdbc.SQLServerException:文件"c:\ Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\database.mdf"的目录查找失败,出现操作系统错误2(系统找不到指定的文件.). (2认同)

Kev*_*nte 3

当我遇到这个问题时,这是因为恢复命令花费的时间足够长,导致 mssql 超时(带有完全无用的错误消息)。连接时指定较长的超时可以完成恢复。例如

mssql -s localhost -p "<sa_password>" -t 36000000 -T 36000000
Run Code Online (Sandbox Code Playgroud)