0. はじめに
オンプレミス SQL Server 上のデータベースを Cloud SQL for SQL Server に移行する方法として、SQL Server の バックアップファイル (.bak) を利用することができます。
【Google Cloud】Cloud SQL for SQL Server へのデータ移行 (Google Cloud コンソール) では、Google Cloud コンソールから SQL Server の バックアップファイルを利用したデータベースのインポートの方法についてまとめてみましたが、現時点 (2024年7月時点) において、Google Cloud コンソール上から トランザクション ログのバックアップを利用したデータベースのインポート処理を実施することが出来ません。
しかしながら、gcloud CLI から データベースのインポートコマンドを実行することで、SQL Server 完全バックアップとトランザクション ログ (以下 TLOG) バックアップを組み合わせたデータベースのインポート処理を実施することが可能となっています。
今回、gcloud CLI を利用してSQL Server 完全バックアップと TLOG バックアップを組み合わせたデータベースのインポート処理を実施する方法についてまとめてみようと思います。
目次
0. はじめに
1. Cloud SQL へのデータ移行
- 1.1 オンプレミス SQL Server 上で完全バックアップを作成
- 1.2 完全バックアップファイル を Cloud Storage バケットにアップロード
- 1.3 完全バックアップファイル を Cloud SQL for SQL Server へインポート
- 1.4 オンプレミス SQL Server 上で TLOG バックアップを作成
- 1.5 TLOG バックアップファイルを Cloud Storage バケットにアップロード
- 1.6 TLOG バックアップファイル を Cloud SQL for SQL Server へインポート
- 1.7 インポートしたデータベースのステータスを ONLINE に変更
2. 制約事項
1. Cloud SQL へのデータ移行
1.1. オンプレミス SQL Server 上で完全バックアップを作成
1) SQL Server Management Studio (以下 SSMS) , SQLCMD などのツールからオンプレミス SQL Server に接続します。
2) データ移行対象のデータベースの完全バックアップを作成します。
use master
go
backup database GCSDB to disk = 'c:\backup\GCSDB.bak'
go
1.2. 完全バックアップファイルを Cloud Storage バケットにアップロード
1) Google Cloud コンソールにログインします。
2) Cloud Storage - バケット - 任意のバケットを選択します。
3) 「ファイルをアップロード」を選択し、作成した SQL Server 完全バックアップファイル (.bak) をアップロードします。
1.3. 完全バックアップファイル を Cloud SQL for SQL Server へインポート
1) gcloud CLI コマンドを実行可能な環境にログインします。
※ Google Cloud コンソール から Cloud Shell を起動、もしくは CLI ツールがインストールされた環境にログインします。
2) 「gcloud sql import ... --bak-type=FULL --no-recovery」 コマンドを実行し、完全バックアップファイル (.bak) からデータベースを 「NORECOVERY」 モードでインポートします。
gcloud sql import bak <インスタンス名> gs://<バックアップファイル (.bak) を配置したCloud Storageのパス> --database=<データベース名> --bak-type=FULL --no-recovery
$ gcloud sql import bak gcsql01 gs://sql*******/backup/GCSDB.bak --database=GCSDB --bak-type=FULL --no-recovery
Data from [gs://sql*******/backup/GCSDB.bak] will be imported to [gcsql01].
Do you want to continue (Y/n)? y
Importing data into Cloud SQL instance...done.
Imported data from [gs://sql*******/backup/GCSDB.bak] into [https://*******.googleapis.com/sql/v1beta4/projects/*******004/instances/gcsql01].
【補足】
- 「NORECOVERY」モードでインポートすると、Cloud SQL for SQL Server 上のデータベースのステータスは「RESTORING」 になります。
- データベースのステータスが「RESTORING」 の状態時にのみ、完全バックアップからインポートしたデータベースに対して、差分データベース、TLOG ログ バックアップを追加でインポートが可能となります。
1.4. オンプレミス SQL Server 上で TLOG バックアップを作成
1) SQL Server Management Studio (以下 SSMS) , SQLCMD などのツールからオンプレミス SQL Server に接続します。
2) データ移行対象のデータベースの TLOG バックアップを作成します。
use master
go
backup log GCSDB to disk = 'c:\backup\GCSDB_LOG.bak'
go
※ TLOG バックアップファイルの識別子に「.bak」を指定していますが、識別子に「.trn」を指定したとしても、この後の データベース インポート処理を実施することは可能。
1.5. TLOG バックアップファイルを Cloud Storage バケットにアップロード
1) Google Cloud コンソールにログインします。
2) Cloud Storage - バケット - 任意のバケットを選択します。
3) 「ファイルをアップロード」を選択し、作成した SQL Server TLOG バックアップファイル (_LOG.bak) をアップロードします。
1.6. TLOG バックアップファイル を Cloud SQL for SQL Server へインポート
1) gcloud CLI コマンドを実行可能な環境にログインします。
※ Google Cloud コンソール から Cloud Shell を起動、もしくは CLI ツールがインストールされた環境にログインします。
2) 「gcloud sql import ... --bak-type=TLOG --no-recovery」 コマンドを実行し、TLOG バックアップファイル (_LOG.bak) からデータベースを 「NORECOVERY」 モードでインポートします。
gcloud sql import bak <インスタンス名> gs://<バックアップファイル (.bak) を配置したCloud Storageのパス> --database=<データベース名> --bak-type=TLOG --no-recovery
$ gcloud sql import bak gcsql01 gs://sql*******/backup/GCSDB_LOG.bak --database=GCSDB --bak-type=TLOG --no-recovery
Data from [gs://sql*******/backup/GCSDB_LOG.bak] will be imported to [gcsql01].
Do you want to continue (Y/n)? y
Importing data into Cloud SQL instance...done.
Imported data from [gs://sql*******/backup/GCSDB_LOG.bak] into [https://*******.googleapis.com/sql/v1beta4/projects/*******004/instances/gcsql01].
【補足】
- データ移行完了までに、複数回 オンプレミス SQL Server TLOG バックアップを Cloud SQL for SQL Server へ適用する必要がある場合、TLOG バックアップについても「NORECOVERY」モードでインポートする必要があります。
1.7. インポートしたデータベースのステータスを ONLINE に変更
データベースのステータスが「RESTORING」 の状態時には、データベース上のテーブルに対して SELECT/UPDATE/DELETE/INSERT などのクエリ処理を実施することができません。
そのため、クエリ処理を実施できるようにするため、適用が必要なバックアップのインポート処理がすべて完了した後、「gcloud sql import bak ... --recovery-only」コマンドを実行して、データベースのステータスを 「ONLINE」 に変更します。
gcloud sql import bak gcsql01 --database=GCSDB --recovery-only
$ gcloud sql import bak gcsql01 --database=GCSDB --recovery-only
Bring database [GCSDB] online with recovery-only.
Do you want to continue (Y/n)? y
Bring database online...done.
Bring database [GCSDB] online with recovery-only.
2. 制約事項
Cloud SQL for SQL Server インスタンスで 「ポイントインタイムリカバリを有効にする」 が有効な状態で、バックアップからデータベースを「NORECOVERY」モードでインポート実施すると、以下のエラーで処理が失敗します。
ERROR: (gcloud.sql.import.bak) HTTPError 400: This operation is not valid for this instance.
そのため、バックアップからデータベースを「NORECOVERY」モードでインポートを実施する必要がある場合、事前に 「ポイントインタイムリカバリを有効にする」 を無効にする必要があるようです。
※ 本ブログに記載した内容は個人の見解であり、所属する会社、組織とは全く関係ありません。
※ 2024年7月時点