旧バージョンの SQL Server(2017 未満)のデータベースを Cloud SQL for SQL Server で実行
Google Cloud Japan Team
※この投稿は米国時間 2021 年 6 月 28 日に、Google Cloud blog に投稿されたものの抄訳です。
2017 より古いバージョンの SQL Server インスタンス上でデータベースを実行している場合、そのデータベースを Cloud SQL で実行できるのかどうか、またその方法についてご興味がおありなのではないでしょうか。
SQL Server の属性を、以下の主な 3 つに絞って考えてみましょう。
エディションは、SQL Server のライセンス レベルを表します。Cloud SQL では現在、Standard(デフォルト)、Enterprise、Express、Web がサポートされています。
バージョンは、SQL Server のリリースを表します。2019、2017、2016、2014、2012、2008r2 などがあります。
データベース互換性レベルは、データベースをどの SQL Server のバージョンに対応させるかを示す値です。
最近リリースされた Cloud SQL では、SQL Server 2017 に加えて SQL Server 2019 も利用できるようになりました。つまり、Cloud SQL インスタンスの作成時には、SQL Server インスタンスの作成時に選択したバージョン(2019 または 2017)とエディションの SQL Server インスタンスが起動されます。
SQL Server は常に旧バージョンとの互換性を配慮したつくりとなっており、ユーザーが最初にデータベースを作成したバージョンによる制限やパフォーマンス上の問題を受けることなく、新機能を利用できるようになっています。これを可能にしているのは、データベース互換性レベルと呼ばれる仕組みです。具体的には、サーバー全体ではなく特定のデータベースについてのみ、Transact-SQL およびクエリ最適化の動作において旧バージョンの SQL Server との下位互換性が保たれます。
簡単に言うと、データベース互換性レベルとは、サポート対象の古い SQL Server バージョンで作成された SQL Server データベースを、互換不能な変更点は除外しながら、新バージョンの SQL Server インスタンス上で実行できるようにする仕組みです。注意すべき点は、新バージョンのデータベース エンジンで廃止された機能や、レガシー サーバーのオブジェクトや機能の依存関係は、データベース互換性レベルにかかわらず、新しく復元されたデータベースでは利用できないということです。詳しくはこちらをご覧ください。
たとえば、SQL Server 2008 のデータベースを Cloud SQL for SQL Server に復元することが可能です。復元されたデータベースは、元のサーバーのデータベース互換性レベルか、移行先サーバーでサポートされている最低レベルのうち、高いほうに自動的に設定されます。SQL Server 2008 のデフォルトの互換性レベルは 80 で、SQL server 2017 および 2019 でサポートされている最も低い互換性レベルも同じく 80 なので、この場合、元の互換性レベルである 80 をそのまま維持することになります。一方、Cloud SQL で新規に作成したデータベースの互換性レベルは、選択した SQL Server バージョンのデフォルトの互換性レベルになります(SQL Server 2019 では 150、2017 では 140)。SQL Server バージョンごとのデフォルトおよびサポート対象の互換性レベルについては、こちらをご参照ください。
古い互換性レベルで復元したデータベースでも、新しい SQL Server データベース エンジンの新機能(列ストア インデックスのクラスタ化や、動的データ マスキングなど)を利用できます。クエリ オプティマイザーの機能改善の影響は受けず、クエリ パフォーマンスの想定外の変化が引き起こされることもありません。クエリ オプティマイザーの改善点の効果を得るには、SQL Server のドキュメントに沿ってデータベースの互換性レベルを上げる必要があります。データベース互換性レベルごとの破壊的変更や、データベース互換性レベルの変更に伴う影響については、Microsoft のドキュメントで詳しく説明されています。[1] [2]
例
SuperImportantSQLDB を Cloud SQL に移行するとしましょう。まず、データベース スコープのテーブル sys.databases に対して以下のようにクエリを実行して、データベース互換性レベルをチェックします。
こちらの手順に沿って、データベースをバックアップして Cloud SQL の SQL Server 2019 インスタンスに復元します。
復元したら、再び互換性レベルをチェックして、同じレベルが維持されていることを確認します。一方、「SELECT @@VERSION」を使って SQL Server のバージョンを確認すると、SQL Server 2019 に変わっていることがわかります。
互換性レベルの影響を確認する簡単な方法は、クエリを実行して、そのクエリエンジンが使用しているカーディナリティ推定(CE)のバージョンを調べるというやり方です。CE は基本的に、クエリによって返される行数を推定します。SQL Server 7.0 で導入された CE バージョン 70 は、SQL Server 2014 まで変更がありませんでしたが、それ以降の SQL Server リリースにはそれぞれ、特定の CE バージョンが付随しています(SQL Server 2014 では 120 など)。上述の例のデータベースは、互換性レベルが 110(SQL 2012)で、クエリ オプティマイザーは古い CE バージョン(70)を使用しています。もしデータベースの互換性レベルが 150 なら、クエリ オプティマイザーは CE バージョン 150 を使用するはずです。
繰り返しになりますが、互換性モードの優れている点は、上述の例でご覧いただいたように、データベースのクエリ オプティマイザーの動作は以前のままで、SQL Server 2019 で導入された新機能を使用できるという点です。新機能の一つとして、インデックスをオンラインで作成し、再開可能な操作として指定できるというものがあります。これにより、インデックス作成中のトランザクション ログの切り捨てや再利用が可能になります。
Adaptive Query Processing など、新しいクエリ オプティマイザー機能を試してみるには、サーバー全体を一度にアップグレードするのではなく、重要度の低いデータベースから徐々にアップグレードすることをおすすめします。具体的には、個々のデータベースの互換性レベルを 1 つずつ変更していくようにします。この方法は、SQL インスタンスをいくつかの目的で使用していて、複数のデータベース エンジンのバージョンをサポートしなければならないような場合に特に便利です。データベース エンジンのバージョンのリストと、サポートされている互換性レベルについては、こちらをご覧ください。なお、データベースに変更を加える際は、テストを必ず実施する必要があることにご注意ください。
データベースの互換性レベルを変更するには、ALTER DATABASE コマンドを実行して、ご希望の互換性レベルを指定します。
最後に
SQL Server のデータベース互換性は、古い SQL Server から Cloud SQL への移行計画を立てる際に重要となってきます。その理由は、単に旧バージョンのデータベースを Cloud SQL で実行できるからというだけでなく、レガシー アプリケーションをモダナイズするにあたって、制御しやすいすっきりとした道筋を提供してくれるからです。データベース互換性を意識しながら移行を進めることによって、DB 管理者やデベロッパーが Cloud SQL のマネージド プラットフォームのメリットを享受すると同時に、レガシーのデータベースの機能を維持することが可能になります。
-Google Cloud カスタマー エンジニア Joshua Vickery
-Google Cloud データ管理スペシャリスト Rahul Deshmukh