web-dev-qa-db-ja.com

SQLServerデータベースをLinuxDockerに復元する

LinuxDockerインスタンスで大規模なSQLServerデータベースを復元する必要があります( https://hub.docker.com/r/Microsoft/mssql-server-linux/

.bakファイルをdockerに移動し、mssqlシェルで次のコマンドを実行します。

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'

必要なすべてのファイルを正しくマッピングしており、Dockerインスタンスに十分なスペースがあることは間違いありませんが、次のエラーが発生します。

エラー:バックアップまたは復元が中止されました。

このDockerのWindowsバージョンでも同じエラーが実際に発生します...そして、Expressバージョンではないはずなので、ここではデータベースサイズが問題になることはありません。

誰かがこのエラーの原因についてもっと情報を持っているなら!

ありがとう、

10
Vincent

あなたはそれについて言及しませんでしたが、私をだましていたのは、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)データベースの復元:(これは復元スクリプトに置き換えることができますが、これで十分でした)
RESTORE DATABASE [MyDatabase] FROM DISK = N'/var/opt/mssql/backup.bak' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 5

5
TabsNotSpaces

@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'

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

この問題が発生したのは、復元コマンドがmssqlのタイムアウトに十分な時間がかかっていたためです(まったく役に立たないエラーメッセージが表示されます)。接続時に長いタイムアウトを指定すると、復元が完了しました。例えば

mssql -s localhost -p "<sa_password>" -t 36000000 -T 36000000
3
Kevin Dente

言及する価値があるかどうかはわかりませんが、Windowsサーバーで作成された.bakをLinuxバージョンで実行されているDockerに移動した場合、どちらの回答も機能しませんでした。

(私は前の2つの回答のコードを使用しているため、クレジットは以下の作成者に渡される必要があることに注意してください)

TabsNotSpacesのソリューションは、パスの不一致で復元がクラッシュするステップ3(C:/path_to_mssql_serverが見つかりませんでした)。

その後、バックアップを完全に完了するためにMDFおよびLOGファイルを再マップするために、ViniciusKrauspenharの回答が必要でした。

したがって、windows-server-made.bakファイルをLinuxdockerインスタンスにインポートするときに私のために働いた解決策は次のとおりです。

DockerとSQLServerコンテナが実行されているターミナルで...

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または任意のDBソフトウェアにログインして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'

0