AlwaysOn 可用性グループでデータの同期をしているデータベースをリストアする際の流れなどをつらつらとまとめてみたいと思います。
■可用性データベースのリストア
AlwaysOn 可用性グループでデータの同期をしているデータベースは 可用性データベース と呼ばれます。
可用性データベースとして設定したデータベースに関してはデータベースのリストアを行うことができません。
可用性グループでは SQL Server 2008 以降のデータベースミラーリングで使用できるようになった ページの自動修復 を使用することができますのでページに破損があった場合のリカバリーなどについてはプライマリ / セカンダリが同期されていれば修復をすることができます。
ただし、これは破損ページの修復であってデータを明示的に消してしまった場合のリストア等には使用することができません。
このような場合はデータベースのリストアが必要となってきます。
可用性グループで設定しているデータベースをリストアしたい場合には以下の作業を実施する必要があります。
- 可用性データベースからデータベースを削除
- バックアップをリストア
- セカンダリサーバーにデータベースを WITH NORECOVERY でリストア
- 可用性データベースとしてリストアしたデータベースを追加し同期の再設定を行う
リストアするためにはリストア対象のデータベースを一度可用性データベースから外す必要があります。
可用性データベースから外せばデータベースをリストアすることができますので、この状態でリストアを実行します。
この場合、削除される設定は可用性データベースとしてのエントリのみとなりますので、リスナーの設定や可用性レプリカについては残ったままとなります。
# 可用性データベースを削除するとプライマリ / セカンダリの全サーバーから可用性データベースとしてのエントリのみが消えます。
可用性データベースの削除をしてもプライマリ / セカンダリでデータベースの実体は残ったままとなりますのでこの状態でプライマリをリストアし、セカンダリは既存のデータベースの状態で可用性データベースに結合を使用としてもエラーとなります。
データベースをリストアした場合、同様のバックアップを使用してセカンダリにもデータベースをリストアする必要が出てきます。
リストアを実施する場合は、セカンダリへの影響を考慮して作業をする必要があります。
スキーマ更新等のメンテナンス作業のオペレーションミスに備えるのであれば、少しイレギュラーな方法になるかもしれませんが以下のような方法も考えられると思います。
- セカンダリでデータ移動を中断する
- プライマリで更新作業を実施
- 更新作業中に誤りがあり、作業前の状態 (1.) の状態に戻す必要が発生
- セカンダリに強制フェールオーバーを実施
- プライマリでロールバックが行われる
- プライマリ / セカンダリでデータ同期が中断状態になっている場合は再開
このような手順を踏むことでオペレーションミスに備えてデータ移動を中断していたセカンダリを起点としてリストアをすることもできます。
# かなりトリッキーな手順だと思いますので事前に検証し、自己責任でご実施ください。また、このような手順でロールバックする方法が確立できたとしても日々のバックアップは大変重要であり、作業前バックアップはかならず取得することをお勧めいたします。(途中でトランザクションログのバックアップが実行された場合の動きも少し気になります。)
データベースのサイズが大きいとリストアにも時間がかかるかと思いますので、リストアを行わずに作業をロールバックする手順を確立しておくのが良いかと思います。