【手順】AutonomousDBの手動バックアップ

作業手順

  1. オブジェクトストレージユーザ用の認証トークン生成
  2. swfitコンパートメントにバケット作成
  3. DEFAULT_BACKUP_BUCKETプロパティの設定
  4. オブジェクトストレージアカウント資格証明書の作成
  5. default_credentialプロパティの設定

    1. オブジェクトストレージユーザ用の認証トークン生成
    プロファイル > ユーザ設定 > 認証トークン > トークンの生成 f:id:meisou-tsuru:20210920133142p:plain

    ダイアログを閉じる前に、トークンをコピーしておきます。 f:id:meisou-tsuru:20210920133131p:plain

    認証トークンはユーザアカウントに紐づいてしまうみたいなので、専用のアカウントを作成した方がいいのかもしれません。その場合、「ユーザ機能の編集」ボタンから、認証トークン以外の認証機能を無効にすれば良さそうです。

    2.swfitコンパートメントにバケット作成

    あとで「オブジェクト・ストレージ・ネームスペース」と「SWIFT APIで指定されたコンパートメント」の値が必要になるので、これらをテナンシ詳細画面で事前に確認しておきます。 f:id:meisou-tsuru:20210920133152p:plain

    SWIFT APIで指定されたコンパートメントは、デフォルトではルートコンパートメントに設定されています。変更することもできますが、テナンシ全体に影響するので変えない方がいいかもしれないですね。今回使用しているのは個人の勉強用テナンシではありますが、変更なしで進めます。
    ルートコンパートメントにバケット名"atp-backup"でバケットを作成しました。ストレージ層は「標準」を指定しています。

    *権限が限定されたアカウントを使用している場合、ルートコンパートメントにバケットを作成できない可能性があります。そんな時はポリシーを追加しましょう。

allow group <group-name> to read buckets in tenancy
allow group <group-name> to manage objects in tenancy where any {target.bucket.name='<bucket-name>'}

any {}を使わないと権限エラーになったのがちょっと謎です。ポリシー自体は作成できるのですが、オブジェクトストレージ画面でエラーとなります。anyはor条件なので、条件を複数指定しないといけないのでしょうか、、?

3.DEFAULT_BACKUP_BUCKETプロパティの設定

Autonomous Databaseに接続し、下記コマンドを実行します。

ALTER DATABASE PROPERTY SET default_backup_bucket='<swiftコンパートメントに作成したバケットURL>';

バケットURLサンプル

https://swiftobjectstorage.<region>.oraclecloud.com/v1/<namespace_string>/<bucket_name>

<namespace_string>は、オブジェクト・ストレージ・ネームスペースのことです。手順2の冒頭で確認した文字列を入れておきます。

4.オブジェクトストレージアカウント資格証明書の作成

DBMS_CLOUD.CREATE_CREDENTIALプロシージャをでオブジェクトストレージアカウントの資格証明を作成します。このプロシージャはADMINユーザで実行する必要があります。

BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'DEF_CRED_NAME',
username => '<username>',
password => '<credential>'
);
END;
/

passwordには、手順1で生成した認証トークンを記述します。
リファレンスの説明によると、『このプロシージャは、Oracle資格証明というデータベース・オブジェクトに、保存済のユーザー名とパスワードのペアを作成します。』とあるため、usernameには(DBユーザ名ではなく)認証トークンを生成したときのユーザ名を入れました。

5.default_credentialプロパティの設定

default_credentialプロパティを設定します。

SQL> ALTER DATABASE PROPERTY SET DEFAULT_CREDENTIAL = 'ADMIN.DEF_CRED_NAME';

Database altered.


リファレンスには、以下のコマンドで「デフォルト・バケットの現在の値をリスト表示」とあるのですが、実際に実行してみると"no rows selected"と言われてしまいます。

SQL> SELECT PROPERTY_VALUE from database_properties WHERE PROPERTY_NAME='DEFAULT_BUCKET';

no rows selected

Always FreeのAutonomous Databaseが手動バックアップ対象外だからでしょうか?f:id:meisou-tsuru:20210920135115p:plain ↑Always Freeが手動バックアップ対象外だということにことのき初めて気がついてショックでした。。

それでも手順5を実行すると、コンソール画面の「手動バックアップ・ストア」の値が「未構成」から「atp-backup」に変わったことが確認できていたので、有料DBにアップグレードすればSELECTできるのかも。 f:id:meisou-tsuru:20210920140019p:plain

まとめ

最初は認証トークンだとか、swiftコンパートメントだとか言われてげんなりしていたのですが、やってみたら意外とすんなり進めることができました。まぁリファレンス通りなんですけど、実際にやってみて初めて気付くこともあるので自分でやってみることは大切です。

あとはAlways FreeではないAutonomous Databaseで最後まで確認できればいいかなぁという感じです。これは料金をしっかり確認してからやらねば。

追記

有償版にアップグレードしたDBで試したら、上記手順で手動バックアップに成功しました。
先日は認証トークン専用のアカウントを作ることを検討していましたが、認証トークンを払い出したアカウントが、SWIFT APIで指定されたコンパートメント(たいていルートコンパートメント)のバケットに対して権限を持っていないと「手動バックアップ・ストア」の構成に失敗するので、そこは気に留めておく必要があると思いました。

/*** Original ***/