Azure Backup を使用したOracleデータベースのバックアップ

Oracleデータベースのバックアップは Oracleデータベースの標準機能である Recovery Manager(RMAN) を使用する場合が多いです。増分バックアップやバックアップの自動管理にも対応するなど、標準機能でありながら便利なツールです。

一方で、ストレージのスナップショット機能によるバックアップも利用されます。オンプレミスでは高機能なストレージ製品でないと利用できなかったスナップショットも、Azureではストレージサービスの一機能として利用できます。

今回は Azure Backup を利用したOracleデータベースのバックアップの取得を試します。

Oracleデータベースのバックアップについて

Oracleデータベースのオンラインバックアップでは、常に書込み処理が行われているデータベースファイルの整合性を保ちつつバックアップを取得する必要があります。

データベースを停止せずにバックアップを取得する方法として、OSコマンドによるバックアップと RMAN によるバックアップがあります。

OSコマンドによるバックアップ

データベースをバックアップモードに移行して、OSコマンド、ストレージ制御コマンドでデータベースファイルのバックアップを取得し、バックアップモードを完了します。

この間のデータベースへの書込みのデータベースブロックイメージは、データベースファイルではなく、REDOログファイルに保存され、バックアップモード完了後にREDOログファイルからデータベースファイルに保存されます。

今回行う Azure Backup によるバックアップはこちらの OSコマンドによるバックアップに分類されます。

RMAN によるバックアップ

RMAN ではデータベースブロック単位で書込み禁止にしてバックアップ完了後に書込みを再開します。

ブロック単位のバックアップなので、空き領域のバックアップのスキップやブロック破損のリストアなど、 Oracle特有の機能が存在します。

Oracleデータベース環境

仮想マシン

Red Hat Enterprise Linux(RHEL) 系の OS に Oracleデータベースをインストールしてもいいのですが、今回はインストール済みのイメージからデプロイします。

Marcketplaceから 「Oarcle Database 19.3.0.0 EE - x64 Gen 1」のイメージを選択して仮想マシンを作成します。

その際、データファイル用にディスクを1つ追加で接続します。また、仮想マシンとは別に、アーカイブログ保存先として Azure Files 共有ディスクを用意します。

アーカイブログとデータファイルを同じディスクに格納すると、リストア時にアーカイブログもバックアップ取得時にもどり、最新のアーカイブログが消失し、リストアができなくなります。そのため、 スナップショットを利用したバックアップでは必ずアーカイブログを別ディスクに格納するようにします。

今回のバックアップでは、仮想マシンに接続されているすべてのディスクがバックアップ対象となるので、バックアップ対象外の Azure Files 共有ディスクにアーカイブログを格納します。

データファイル領域 /data/oradata に追加データディスクをマウントし、アーカイブログ領域 /data/archive に Azure Files 共有ディスクをマウントしています。

dfコマンドと mountコマンドでマウント状況を確認できます。

データベース

リスナーを起動します。

lsnrctl start

dbca サイレントモードでデータベースを構築します。

dbca -silent \
-createDatabase \
-templateName General_Purpose.dbc \
-gdbname "devdb" \
-sid "devdb" \
-responseFile NO_VALUE \
-characterSet AL32UTF8 \
-sysPassword ****** \
-systemPassword ****** \
-createAsContainerDatabase false \
-databaseType MULTIPURPOSE \
-automaticMemoryManagement false \
-storageType FS \
-datafileDestination "/data/oradata/" \
-ignorePreReqs

データベース構築完了後にアーカイブログ格納場所を指定し、アーカイブログモードに変更します。

alter system set log_archive_dest_1 = 'LOCATION=/data/archive/DEVDB';
shutdown immediate
startup mount
alter database archivelog;
archive log list
alter database open;

バックアップの概要

OSコマンドによるOracleデータベースのオンラインバックアップは以下の流れで行われます。

  1. データベースのバックアップモードを開始
  2. OSコマンド、もしくはストレージコマンドによるデータベースファイルのバックアップ
  3. データベースのバックアップモードを終了
  4. バックアップモード中に書き込まれたデータをアーカイブログに出力

Azure Backup ではこの一連の作業ができるよう Oracleデータベース向けに事前・事後スクリプトフレームワークが提供されています。

Oracleデータベース向けの事前・事後スクリプトはGitHubにて公開されています。

github.com

事前・事後スクリプトはバックアップ拡張機能とともに Azure VM に直接インストールされているので、スクリプトのインストールの必要はありません。

実際のバックアップの設定を行いたいと思います。

バックアップ設定

バックアップユーザーの作成

バックアップ用OSユーザーの作成

Oracleデータベースでは OSグループに対してデータベース権限を付与しており、バックアップ権限はデフォルトで backupdba OSグループに付与されています。

もし、backupdba OSグループが存在しない場合、手動で作成します。

sudo groupadd backupdba

バックアップを実行する backupdba OSグループに属する OSユーザー azbackup を作成します。また、このユーザーがファイルにアクセスできるよう oinstall OSグループにも追加します。

sudo useradd -g backupdba -G oinstall azbackup
バックアップ用DBユーザーの作成

OSユーザー azbackup がパスワード無しでデータベースにログインできるように、外部認証のデータベースユーザーを作成します。 外部認証のデータベースユーザーには「OPS$」というプレフィックスが使用されます。

create user ops$azbackup identified externally;
grant create session, alter session, sysbackup to ops$azbackup;

バックアップメッセージ出力設定

バックアップメッセージを alert ログに記載するストアドプロシージャを作成します。

GRANT EXECUTE ON DBMS_SYSTEM TO SYSBACKUP;
CREATE PROCEDURE sysbackup.azmessage(in_msg IN VARCHAR2)
AS
  v_timestamp     VARCHAR2(32);
BEGIN
  SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')
  INTO v_timestamp FROM DUAL;
  DBMS_OUTPUT.PUT_LINE(v_timestamp || ' - ' || in_msg);
  SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.ALERT_FILE, in_msg);
END azmessage;
/

アプリケーション整合性バックアップ設定

Azure Backup の構成ファイル (/etc/azure/workload.conf) を作成・編集することで、 Azure Backup は事前、事後スクリプトを実行します。

echo "[workload]
workload_name = oracle
configuration_path = /etc/oratab
timeout = 90
linux_user = azbackup" > /etc/azure/workload.conf

バックアップジョブ設定

Azure Portal で仮想マシン ora19caz を表示し、バックアップペインでバックアップの設定を行います。

Azure Backup 設定情報

項目 設定値
Recovery Services コンテナー 新規作成
リソースグループ test-rg(仮想マシンと同じリソースグループ)
ポリシーのタイプ standard
バックアップポリシーの選択 このポリシーを編集する

ポリシーの作成

項目 設定値
ポリシー名 DailyPolicy
頻度 毎日
時間 21:00
タイムゾーン (UTC+9:00) 大阪、札幌、東京
インスタント回復スナップショットの保有期間 2日
毎日のバックアップポイントの保有期間 7日

ポリシーの作成で OKボタンをクリックすると Policy Deteils に反映されます。

バックアップの有効化をクリックするとバックアップジョブが作成され、指定した時刻にバックアップが開始されます。

バックアップの手動実行

作成したバックアップジョブは手動で実行することができます。

リソースグループからバックアップジョブ作成時に指定した Recovery Services コンテナーを選択し、バックアップタブを開きます。 バックアップアイテムの数字をクリックします。

バックアップアイテムの 「Azure Virtual Machine」のバックアップ項目の数が「1」であることを確認してクリックします。

右の3点メニューから「今すぐバックアップ」をクリックし、保持期限を指定してバックアップを開始します。 バックアップジョブからバックアップ状況を確認できます。 バックアップ中、Oracleは以下のようなログを出力します。

2023-11-07T19:37:50.959904+09:00
NET  (PID:3471): Archived Log entry 34 added for T-1.S-38 ID 0x3f0023f4 LAD:1
INFO - AzBackup pre-script v0.2: ARCHIVE LOG CURRENT succeeded
INFO - AzBackup pre-script v0.2: starting BEGIN BACKUP...
ALTER DATABASE BEGIN BACKUP
Completed: ALTER DATABASE BEGIN BACKUP
INFO - AzBackup pre-script v0.2: BEGIN BACKUP succeeded
2023-11-07T19:37:56.154557+09:00
INFO - AzBackup post-script v0.2: starting END BACKUP...
ALTER DATABASE END BACKUP
Completed: ALTER DATABASE END BACKUP
INFO - AzBackup post-script v0.2: END BACKUP succeeded
INFO - AzBackup post-script v0.2: starting ARCHIVE LOG CURRENT...
2023-11-07T19:37:56.223789+09:00
ALTER SYSTEM ARCHIVE LOG
2023-11-07T19:37:56.289444+09:00
Thread 1 advanced to log sequence 40 (LGWR switch)
  Current log# 1 seq# 40 mem# 0: /data/oradata/DEVDB/redo01.log
2023-11-07T19:37:56.475424+09:00
NET  (PID:3522): Archived Log entry 35 added for T-1.S-39 ID 0x3f0023f4 LAD:1
INFO - AzBackup post-script v0.2: ARCHIVE LOG CURRENT succeeded

事前スクリプトで ALTER DATABASE BEGIN BACKUP が実行され、事後スクリプトで ALTER DATABASE END BACKUP が実行されていることがわかります。

リストア手順

本手順では、仮想マシンの障害を想定して、仮想マシンを削除後にリストアを実施します。

仮想マシンの復旧

Azure Portal でバックアップセンターを検索し表示します。

インスタンスのバックアップの Azure 仮想マシンの数字をクリックし、バックアップインスタンスを表示します。

右の3点メニューから「復元」をクリックします。

仮想マシンの復元の画面で復元ポイントを選択し復元の構成を入力します。(元の仮想マシンと同じにします。)

項目 設定値
復元の構成 新規作成
復元の種類 新しい仮想マシンの作成
仮想マシン名 ora19caz
サブスクリプション 利用中のサブスクリプション
リソースグループ test-rg
仮想ネットワーク test-vnet (test-rg)
サブネット default
ステージングの場所 teststorage6823 (StandardLRS)

復元をクリックするとリストアを開始します。

復元の状況はバックアップセンターのバックアップジョブから確認できます。

ネットワークインターフェイスの交換

復元された仮想マシンには新規のネットワークインターフェイスがつけられているので元に戻します。

Azure Portal で仮想マシン ora19caz を表示し、ネットワークを開き、ネットワークインターフェイスの接続から元のネットワークインターフェイスを選択し、接続します。

新しいネットワークインターフェイスをデタッチします。

デタッチしたネットワークインターフェイスとパブリックIPアドレスは削除します。

データベースの復旧

復旧直後はデータベースファイルのリカバリが必要な状態なので、データベースは起動しません。

データベースにログインして startup コマンドを実行しても、マウントはされますが、ORA-10873 が出力されてデータベースをオープンできません。

存在する最新のアーカイブログまで適用するため以下のコマンドを実行します。

適用するアーカイブログがなくなれば 「Specify log: =suggested | filename | AUTO | CANCEL }」と聞かれるので CANCEL と入力してリカバリを終了します。

recover automatic database using backup controlfile until cancel;

最後にデータベースをオープンします。

バックアップした制御ファイルを用いてリストアしているため resetlogs オプションが必要です。

alter database open resetlogs;

最後に

Azure Backup のスナップショットを利用したOracleのバックアップを紹介しました。

Azure では Paas として SQLDatabase、MySQL、PostgreSQL が利用でき自動でバックアップを取得してくれますが、Oracle は仮想マシン上に構築するしかないのでバックアップの運用を考慮する必要があります。

Oracleデータベース運用者としては、まず RMAN のバックアップを検討しますが、Azure Backup のスナップショットの取得は通常のファイルコピーに比べ時間が短縮されるので、大規模なデータベースでは効果が大きいと思われます。

執筆担当者プロフィール
三条 光暢

三条 光暢(日本ビジネスシステムズ株式会社)

Oracle、PostgreSQLを中心に各種データベースの設計・構築・運用を携わっています。

担当記事一覧