Linux コンテナーに SQL Server データベースを復元する
適用対象: SQL Server - Linux
このチュートリアルでは、Docker 上で実行している SQL Server 2017 (14.x) の Linux コンテナー イメージに SQL Server のバックアップ ファイルを移動して、復元する方法について説明します。
このチュートリアルでは、Docker 上で実行している SQL Server 2019 (15.x) の Linux コンテナー イメージに SQL Server のバックアップ ファイルを移動して、復元する方法について説明します。
このチュートリアルでは、Docker 上で実行している SQL Server 2022 (16.x) の Linux コンテナー イメージに SQL Server のバックアップ ファイルを移動して、復元する方法について説明します。
- 最新の SQL Server Linux コンテナー イメージをプルして実行する。
- Wide World Importers のデータベース ファイルをコンテナーにコピーする。
- コンテナーにデータベースを復元する。
- Transact-SQL ステートメントを実行してデータベースの表示と変更を行う。
- 変更したデータベースをバックアップする。
前提条件
- Docker や Podman などのコンテナーランタイムのインストール
- 最新の sqlcmd のインストール
- SQL Server on Linux のシステム要件
配置オプション
このセクションでは、環境のデプロイ オプションについて説明します。
sqlcmd は現在、コンテナーの作成時に MSSQL_PID
パラメーターをサポートしていません。 このチュートリアルの sqlcmdの手順を使用する場合は、SQL Server の Developer エディションでコンテナーを作成します。 コマンド ライン インターフェイス (CLI) の手順を使用して、任意のライセンスを使用してコンテナーを作成します。 詳細については、「SQL Server Linux コンテナーの配置と接続」を参照してください。
コンテナー イメージをプルして実行する
Linux で Bash ターミナルを開きます。
Microsoft Container Registry から SQL Server 2017 (14.x) Linux コンテナー イメージをプルします。
sudo docker pull mcr.microsoft.com/mssql/server:2017-latest
Docker を使ってコンテナー イメージを実行するには、次のコマンドを使います。
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \ --name 'sql1' -p 1401:1433 \ -v sql1data:/var/opt/mssql \ -d mcr.microsoft.com/mssql/server:2017-latest
このコマンドにより、Developer エディションの SQL Server 2017 (14.x) コンテナー (規定値) が作成されます。 SQL Server のポート
1433
は、ホスト上ではポート1401
として公開されています。 省略可能な-v sql1data:/var/opt/mssql
パラメーターを使うと、sql1data
という名前のデータ ボリューム コンテナーが作成されます。 これは、SQL Server によって作成されたデータを永続化するために使われます。重要
この例では、Docker 内のデータ ボリューム コンテナーが使用されます。 詳細については、「Docker で SQL Server コンテナーイメージを構成する」を参照してください。
コンテナーを表示するには、
docker ps
コマンドを使います。sudo docker ps -a
STATUS
列にUp
の状態が表示されている場合、SQL Server はコンテナーで実行されており、PORTS
列に指定されたポートでリッスンしています。 SQL Server コンテナーのSTATUS
列にExited
と表示されている場合、「SQL Server Docker コンテナーのトラブルシューティングを行う」を参照してください。
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
941e1bdf8e1d mcr.microsoft.com/mssql/server/mssql-server-linux "/bin/sh -c /opt/m..." About an hour ago Up About an hour 0.0.0.0:1401->1433/tcp sql1
Linux で Bash ターミナルを開きます。
Microsoft Container Registry から SQL Server 2019 (15.x) Linux コンテナー イメージをプルします。
sudo docker pull mcr.microsoft.com/mssql/server:2019-latest
Docker を使ってコンテナー イメージを実行するには、次のコマンドを使います。
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \ --name 'sql1' -p 1401:1433 \ -v sql1data:/var/opt/mssql \ -d mcr.microsoft.com/mssql/server:2019-latest
このコマンドにより、Developer エディションの SQL Server 2019 (15.x) コンテナー (規定値) が作成されます。 SQL Server のポート
1433
は、ホスト上ではポート1401
として公開されています。 省略可能な-v sql1data:/var/opt/mssql
パラメーターを使うと、sql1data
という名前のデータ ボリューム コンテナーが作成されます。 これは、SQL Server によって作成されたデータを永続化するために使われます。重要
この例では、Docker 内のデータ ボリューム コンテナーが使用されます。 詳細については、「Docker で SQL Server コンテナーイメージを構成する」を参照してください。
コンテナーを表示するには、
docker ps
コマンドを使います。sudo docker ps -a
STATUS
列にUp
の状態が表示されている場合、SQL Server はコンテナーで実行されており、PORTS
列に指定されたポートでリッスンしています。 SQL Server コンテナーのSTATUS
列にExited
と表示されている場合、「SQL Server Docker コンテナーのトラブルシューティングを行う」を参照してください。$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 941e1bdf8e1d mcr.microsoft.com/mssql/server/mssql-server-linux "/bin/sh -c /opt/m..." About an hour ago Up About an hour 0.0.0.0:1401->1433/tcp sql1
Linux で Bash ターミナルを開きます。
Microsoft Container Registry から SQL Server 2022 (16.x) Linux コンテナー イメージをプルします。
sudo docker pull mcr.microsoft.com/mssql/server:2022-latest
Docker を使ってコンテナー イメージを実行するには、次のコマンドを使います。
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \ --name 'sql1' -p 1401:1433 \ -v sql1data:/var/opt/mssql \ -d mcr.microsoft.com/mssql/server:2022-latest
このコマンドにより、Developer エディションの SQL Server 2022 (16.x) コンテナー (規定値) が作成されます。 SQL Server のポート
1433
は、ホスト上ではポート1401
として公開されています。 省略可能な-v sql1data:/var/opt/mssql
パラメーターを使うと、sql1data
という名前のデータ ボリューム コンテナーが作成されます。 これは、SQL Server によって作成されたデータを永続化するために使われます。重要
この例では、Docker 内のデータ ボリューム コンテナーが使用されます。 詳細については、「Docker で SQL Server コンテナーイメージを構成する」を参照してください。
コンテナーを表示するには、
docker ps
コマンドを使います。sudo docker ps -a
STATUS
列にUp
の状態が表示されている場合、SQL Server はコンテナーで実行されており、PORTS
列に指定されたポートでリッスンしています。 SQL Server コンテナーのSTATUS
列にExited
と表示されている場合、「SQL Server Docker コンテナーのトラブルシューティングを行う」を参照してください。$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 941e1bdf8e1d mcr.microsoft.com/mssql/server/mssql-server-linux "/bin/sh -c /opt/m..." About an hour ago Up About an hour 0.0.0.0:1401->1433/tcp sql1
SA パスワードの変更
SA
アカウントは、セットアップ時に作成される SQL Server インスタンスのシステム管理者です。 SQL Server のコンテナーを作成した後、そのコンテナーで echo $MSSQL_SA_PASSWORD
を実行すると、指定した環境変数 MSSQL_SA_PASSWORD
が検索できるようになります。 セキュリティのため、SA のパスワードを変更してください。
SA ユーザーに使用する強力なパスワードを選択します。
Transact-SQL ステートメントを使用してパスワードを変更するには、
docker exec
を使用して sqlcmd ユーティリティを実行します。<YourStrong!Passw0rd>
と<YourNewStrong!Passw0rd>
は、実際のパスワードの値に置き換えます。重要
SA_PASSWORD
環境変数は非推奨です。 代わりにMSSQL_SA_PASSWORD
を使用してくださいsudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U SA -P '<YourStrong!Passw0rd>' \ -Q 'ALTER LOGIN SA WITH PASSWORD="<YourNewStrong!Passw0rd>"'
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd ` -S localhost -U SA -P "<YourStrong!Passw0rd>" ` -Q "ALTER LOGIN SA WITH PASSWORD='<YourNewStrong!Passw0rd>'"
バックアップ ファイルをコンテナーにコピーする
このチュートリアルでは、Microsoft SQL 用の Wide World Importers のサンプル データベースを使います。 以下の手順に従って、Wide World Importers のデータベース バックアップ ファイルをダウンロードし、お使いの SQL Server コンテナーにコピーします。
まず、
docker exec
を使ってバックアップ フォルダーを作成します。 次のコマンドを実行すると、SQL Server コンテナー内に/var/opt/mssql/backup
ディレクトリが作成されます。sudo docker exec -it sql1 mkdir /var/opt/mssql/backup
次に、ホスト コンピューターに WideWorldImporters-Full.bak ファイルをダウンロードします。 次のコマンドでは、home/user ディレクトリに移動し、バックアップ ファイルを
wwi.bak
としてダウンロードします。cd ~ curl -L -o wwi.bak 'https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak'
docker cp
を使って、/var/opt/mssql/backup
ディレクトリ内のコンテナーにバックアップ ファイルをコピーします。sudo docker cp wwi.bak sql1:/var/opt/mssql/backup
データベースを復元する
これで、コンテナー内にバックアップ ファイルが配置されました。 バックアップを復元する前に、バックアップ内の論理ファイル名とファイルの種類を把握しておくことが重要です。 以下の Transact-SQL コマンドでは、バックアップを検査し、コンテナーで sqlcmd を使って復元を実行します。
ヒント
コンテナーには sqlcmd が事前にインストールされているため、このチュートリアルではコンテナー内でこのツールを使います。 ただし、 Visual Studio Code の SQL Server 拡張機能 または Linux 上の SQL Server を管理するために Windows 上で SQL Server Management Studioなど、コンテナーの外部にある他のクライアント ツールを使って Transact-SQL ステートメントを実行することもできます。 接続するには、コンテナーのポート 1433 にマップされたホストのポートを使います。 この例では、ホスト コンピューター上の localhost,1401
とリモートの Host_IP_Address,1401
が該当します。
コンテナー内で sqlcmd を実行し、バックアップ内の論理ファイル名とパスを一覧表示します。 これを行うには、Transact-SQL ステートメントの
RESTORE FILELISTONLY
を使います。sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost \ -U SA -P '<YourNewStrong!Passw0rd>' \ -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/wwi.bak"' \ | tr -s ' ' | cut -d ' ' -f 1-2
次のような出力が表示されます。
LogicalName PhysicalName ------------------------------------------ WWI_Primary D:\Data\WideWorldImporters.mdf WWI_UserData D:\Data\WideWorldImporters_UserData.ndf WWI_Log E:\Log\WideWorldImporters.ldf WWI_InMemory_Data_1 D:\Data\WideWorldImporters_InMemory_Data_1
RESTORE DATABASE
コマンドを呼び出し、コンテナー内でデータベースを復元します。 前の手順のファイルごとに、新しいパスを指定します。sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \ -Q 'RESTORE DATABASE WideWorldImporters FROM DISK = "/var/opt/mssql/backup/wwi.bak" WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", MOVE "WWI_UserData" TO "/var/opt/mssql/data/WideWorldImporters_userdata.ndf", MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"'
次のような出力が表示されます。
Processed 1464 pages for database 'WideWorldImporters', file 'WWI_Primary' on file 1. Processed 53096 pages for database 'WideWorldImporters', file 'WWI_UserData' on file 1. Processed 33 pages for database 'WideWorldImporters', file 'WWI_Log' on file 1. Processed 3862 pages for database 'WideWorldImporters', file 'WWI_InMemory_Data_1' on file 1. Converting database 'WideWorldImporters' from version 852 to the current version 869. Database 'WideWorldImporters' running the upgrade step from version 852 to version 853. Database 'WideWorldImporters' running the upgrade step from version 853 to version 854. Database 'WideWorldImporters' running the upgrade step from version 854 to version 855. Database 'WideWorldImporters' running the upgrade step from version 855 to version 856. Database 'WideWorldImporters' running the upgrade step from version 856 to version 857. Database 'WideWorldImporters' running the upgrade step from version 857 to version 858. Database 'WideWorldImporters' running the upgrade step from version 858 to version 859. Database 'WideWorldImporters' running the upgrade step from version 859 to version 860. Database 'WideWorldImporters' running the upgrade step from version 860 to version 861. Database 'WideWorldImporters' running the upgrade step from version 861 to version 862. Database 'WideWorldImporters' running the upgrade step from version 862 to version 863. Database 'WideWorldImporters' running the upgrade step from version 863 to version 864. Database 'WideWorldImporters' running the upgrade step from version 864 to version 865. Database 'WideWorldImporters' running the upgrade step from version 865 to version 866. Database 'WideWorldImporters' running the upgrade step from version 866 to version 867. Database 'WideWorldImporters' running the upgrade step from version 867 to version 868. Database 'WideWorldImporters' running the upgrade step from version 868 to version 869. RESTORE DATABASE successfully processed 58455 pages in 18.069 seconds (25.273 MB/sec).
復元されたデータベースを確認する
次のクエリを実行して、コンテナー内のデータベース名の一覧を表示します。
sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
-S localhost -U SA -P '<YourNewStrong!Passw0rd>' \
-Q 'SELECT Name FROM sys.Databases'
データベースのリストに WideWorldImporters
のデータの一覧が表示されます。
変更を加える
データベースを変更するには、次の手順に従います。
クエリを実行して、
Warehouse.StockItems
テーブルの上位 10 項目を表示します。sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \ -Q 'SELECT TOP 10 StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems ORDER BY StockItemID'
項目の識別子と名前の一覧が表示されます。
StockItemID StockItemName ----------- ----------------- 1 USB missile launcher (Green) 2 USB rocket launcher (Gray) 3 Office cube periscope (Black) 4 USB food flash drive - sushi roll 5 USB food flash drive - hamburger 6 USB food flash drive - hot dog 7 USB food flash drive - pizza slice 8 USB food flash drive - dim sum 10 drive variety pack 9 USB food flash drive - banana 10 USB food flash drive - chocolate bar
次の
UPDATE
ステートメントを使用して、最初の項目の説明を更新します。sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \ -Q 'UPDATE WideWorldImporters.Warehouse.StockItems SET StockItemName="USB missile launcher (Dark Green)" WHERE StockItemID=1; SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
次のテキストのような出力が表示されます。
(1 rows affected) StockItemID StockItemName ----------- ------------------------------------ 1 USB missile launcher (Dark Green)
新しいバックアップの作成
コンテナー内にデータベースを復元した後は、実行しているコンテナー内にデータベースのバックアップを定期的に作成することもできます。 その手順は以前の手順のパターンと似ていますが、向きが逆になります。
Transact-SQL コマンド
BACKUP DATABASE
を使って、コンテナー内にデータベースのバックアップを作成します。 このチュートリアルでは、以前に作成した/var/opt/mssql/backup
ディレクトリに、新しいバックアップ ファイルwwi_2.bak
を作成します。sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \ -Q "BACKUP DATABASE [WideWorldImporters] TO DISK = N'/var/opt/mssql/backup/wwi_2.bak' WITH NOFORMAT, NOINIT, NAME = 'WideWorldImporters-full', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
次のような出力が表示されます。
10 percent processed. 20 percent processed. 30 percent processed. 40 percent processed. 50 percent processed. 60 percent processed. 70 percent processed. Processed 1200 pages for database 'WideWorldImporters', file 'WWI_Primary' on file 1. Processed 53096 pages for database 'WideWorldImporters', file 'WWI_UserData' on file 1. 80 percent processed. Processed 3865 pages for database 'WideWorldImporters', file 'WWI_InMemory_Data_1' on file 1. Processed 938 pages for database 'WideWorldImporters', file 'WWI_Log' on file 1. 100 percent processed. BACKUP DATABASE successfully processed 59099 pages in 25.056 seconds (18.427 MB/sec).
次に、そのバックアップ ファイルを、コンテナーからホスト コンピューター上にコピーします。
cd ~ sudo docker cp sql1:/var/opt/mssql/backup/wwi_2.bak wwi_2.bak ls -l wwi*
永続化されたデータの使用
データを保護するためにデータベースのバックアップを作成するだけでなく、データ ボリューム コンテナーを使用することもできます。 このチュートリアルの冒頭では、-v sql1data:/var/opt/mssql
パラメーターを指定して sql1
コンテナーを作成しました。 sql1data
データ ボリューム コンテナーによって /var/opt/mssql
のデータが永続化され、コンテナーが削除された後でも保持されます。 以下の手順では、sql1
コンテナーを完全に削除した後、永続化されたデータを含む新しいコンテナー sql2
を作成します。
sql1
コンテナーの停止sudo docker stop sql1
コンテナーを削除します。 これによって、以前に作成した
sql1data
データ ボリューム コンテナーと、その中に永続化されているデータが削除されることはありません。sudo docker rm sql1
新しいコンテナー
sql2
を作成し、sql1data
データ ボリューム コンテナーを再利用します。sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \ --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \ -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2017-latest
これで Wide World Importers のデータベースが新しいコンテナーに追加されました。 クエリを実行して、以前に加えた変更を確認します。
sudo docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \ -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Note
SA パスワードは、
sql2
コンテナーに対して指定したパスワードMSSQL_SA_PASSWORD=<YourStrong!Passw0rd>
ではありません。 SQL Server のデータは、チュートリアルの前半で変更したパスワードを含め、すべてsql1
から復元されました。 実際には、このような一部のオプションは、/var/opt/mssql にデータを復元することが原因で無視されます。 このため、パスワードはここに示されているように<YourNewStrong!Passw0rd>
となります。
sql1
コンテナーの停止sudo docker stop sql1
コンテナーを削除します。 これによって、以前に作成した
sql1data
データ ボリューム コンテナーと、その中に永続化されているデータが削除されることはありません。sudo docker rm sql1
新しいコンテナー
sql2
を作成し、sql1data
データ ボリューム コンテナーを再利用します。sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \ --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \ -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2019-latest
これで Wide World Importers のデータベースが新しいコンテナーに追加されました。 クエリを実行して、以前に加えた変更を確認します。
sudo docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \ -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Note
SA パスワードは、
sql2
コンテナーに対して指定したパスワードMSSQL_SA_PASSWORD=<YourStrong!Passw0rd>
ではありません。 SQL Server のデータは、チュートリアルの前半で変更したパスワードを含め、すべてsql1
から復元されました。 実際には、このような一部のオプションは、/var/opt/mssql にデータを復元することが原因で無視されます。 このため、パスワードはここに示されているように<YourNewStrong!Passw0rd>
となります。
sql1
コンテナーの停止sudo docker stop sql1
コンテナーを削除します。 これによって、以前に作成した
sql1data
データ ボリューム コンテナーと、その中に永続化されているデータが削除されることはありません。sudo docker rm sql1
新しいコンテナー
sql2
を作成し、sql1data
データ ボリューム コンテナーを再利用します。sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \ --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \ -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2022-latest
これで Wide World Importers のデータベースが新しいコンテナーに追加されました。 クエリを実行して、以前に加えた変更を確認します。
sudo docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U SA -P '<YourNewStrong!Passw0rd>' \ -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Note
SA パスワードは、
sql2
コンテナーに対して指定したパスワードMSSQL_SA_PASSWORD=<YourStrong!Passw0rd>
ではありません。 SQL Server のデータは、チュートリアルの前半で変更したパスワードを含め、すべてsql1
から復元されました。 実際には、このような一部のオプションは、/var/opt/mssql にデータを復元することが原因で無視されます。 このため、パスワードはここに示されているように<YourNewStrong!Passw0rd>
となります。
次のステップ
このチュートリアルでは、Windows でデータベースをバックアップし、コンテナー内の SQL Server 2017 (14.x) を実行している Linux サーバーにそれを移動する方法について学習しました。 以下の方法を学習しました。
このチュートリアルでは、Windows でデータベースをバックアップし、コンテナー内の SQL Server 2019 (15.x) を実行している Linux サーバーにそれを移動する方法について学習しました。 以下の方法を学習しました。
このチュートリアルでは、Windows でデータベースをバックアップし、コンテナー内の Server 2022 (16.x) を実行している Linux サーバーにそれを移動する方法について学習しました。 以下の方法を学習しました。
- SQL Server の Linux コンテナー イメージを作成する。
- SQL Server データベースのバックアップをコンテナーにコピーする。
- sqlcmd を使ってコンテナー内で Transact-SQL ステートメントを実行します。
- コンテナーからバックアップ ファイルを作成して抽出する。
- データ ボリューム コンテナーを使って SQL Server データを永続化する。
次に、コンテナーのその他の構成とトラブルシューティングのシナリオを確認します。
SQL ドキュメントへの投稿
SQL コンテンツを自分で編集できることはご存じですか。 これにより、ドキュメントが改善されるだけでなく、ページの共同作成者としてもクレジットされます。
詳細については、「SQL Server のドキュメントに投稿する方法」を参照してください。