SQL Server データ暗号化とバックアップ圧縮率

データ暗号化をした場合圧縮率が下がるという情報があったため検証してみました。Microsoftの情報では以下の通り記載されています。

バックアップの圧縮 (SQL Server) | Microsoft Docs

暗号化されたデータは、暗号化されていない同等のデータより、圧縮比率が大幅に下がります。 

前提

  • SQL Server 2017
  • Transparent Data Encryption (TDE)を使用
  • 対象データは一般的なDBデータ約100GB

結果 

以下パターンで試してみました。元データに対する比率で結果を示します。(だいたいの値です)

  • 暗号化なし、バックアップ圧縮なし :100%
  • 暗号化なし、バックアップ圧縮あり :20%
  • 暗号化あり、バックアップ圧縮あり :90%

まとめ

思っていた以上に暗号化による圧縮率低下がみられました。ただ、暗号化の仕組みを考えれば当然かと思われます。暗号化されていない平文では、人間が意図して格納した意味のあるデータなので、規則性が出やすくその分圧縮率が高くなります。暗号化するとその規則性が乏しくなるため圧縮率が低くなります。

AlwaysOn 可用性グループのフェールオーバー優先度について

前提

  • SQL Server 2017
  • AlwaysOn可用性グループを3台以上で構成

やりたいこと

AlwaysOn可用性グループでフェールオーバー先のノードを制御したいと思いました。ノードの優先順みたいなものを設定したいです。WSFCだと「優先する所有者」でできると思います。

調べてみた

できるはずだと思ったのですが、SQL Server側に設定が見つかりませんでした。 Webで調べても「バックアップ優先度」の情報ばかりがヒットして求めている情報はでてきません。

やってみた

WSFC側に「優先する所有者」という設定がありますが、そちらで設定をすることで制御できることは動作が確認できました。しかしAlwaysOn可用性グループとしてはWSFC側の設定を直接変更することは推奨されていないはずです。

結論

サポータブルな方法ではできないと思われます。推奨されない方法ですがWSFC側で設定するしかないのでしょうか。

トランザクション分離レベルについて

前提

  • SQL Serverについてです
  • ややこしいとこだけ書きます

 

 スナップショット関係

SQL Serverにはスナップショット関係のトランザクション分離レベルが以下の2つ存在します。

  • READ_COMMITTED_SNAPSHOT
  • スナップショット分離レベル

 この2つはよく似ていて、どちらもテーブルレベルのSCH-Sロックのみを取得し、行ロックやページロックは行いません。違いはREAD_COMMITTED_SNAPSHOTではステートメントレベルでの読み取り一貫性を担保するのに対し、スナップショット分離レベルではトランザクションレベルでの読み取り一貫性を担保するという所だけです。

 

既定の分離レベル

SQL Serverでは既定のトランザクション分離レベルを以下の2つから選択できます。

  • READ_COMMITTED
  • READ_COMMITTED_SNAPSHOT

 既定のトランザクション分離レベルはデータベースのプロパティの「Is Read Committed Snapshot On」で設定ができます。無効(既定)の場合はREAD_COMMITTED、有効の場合はREAD_COMMITTED_SNAPSHOTになります。

 

スナップショット関係の設定

「READ_COMMITTED_SNAPSHOT」は前述の通り、データベースのプロパティで「Is Read Committed Snapshot On」を有効にすれば、既定のトランザクション分離レベル(トランザクションで明示的に指定しない場合の分離レベル)が「READ_COMMITTED_SNAPSHOT」になります。

「スナップショット分離レベル」はデータベースのプロパティで「スナップショット分離を許可」を有効にし、かつトランザクションで明示的に「SET TRANSACTION ISOLATION LEVEL SNAPSHOT」を指定した際に有効になります。

 

参考

データベース エンジンにおける分離レベル