Firebird's nbackup tool

http://www.firebirdsql.org/manual/nbackup.html」の抄訳です。

Firebird's nbackup tool
Paul Vinkenoog

5 May 2008 – Document version 1.1

Introduction

nbackupはFirebird2.0に同梱される新しいバックアップユーティリティです。既存のバックアップツールであるgbakに無い機能を提供しますが、しかしそれを置き換えるものではありません。両プログラムはそれぞれ強みと弱みを持ちますので、しばらくは共存し続けることでしょう。

nbackup features - an overview

nbackupは、二つの異なるタスクを実行することができます。

  1. フルあるいは増分バックアップの作成とリストア。増分バックアップは過去のある時点のバックアップからの変更のみを含みます。
  2. メインデータベースファイルをロックします。これにより、ユーザ自身が任意のツールを使ってコピーやバックアップを行うことができます。このモードでは、nbackupは何もバックアップしません。ユーザ自身がバックアップを行うための条件を提供するだけです。here's a provision for restoring here, too.

両モードとも、接続中のユーザの邪魔をせずにアクティブなデータベースを操作することができます。作成されるバックアップは常に操作開始時点の状態を反映します。この点において、nbackupはgbakと変わるところがありません。nbackupの優位性は、

  • 両モードにおいて:(ハードウェアやOSが許す限りの)高速性があります。なぜなら、nbackupは「実際のデータ」を見ていません。バックアップモードでは、コンテンツはおおよそ闇雲にバックアップファイルに書き込まれます。
  • バックアップ・リストアモード:時間とディスクスペースを節約します。毎回振るバックアップを作成する必要が無いからです。これはギガバイト単位のデータベースでは大きな差です。
  • ロック・アンロックモード:どのようなバックアップ・コピー・圧縮ツールを使用するのも自由です。

nbackupの制限としては、

  • gbakが行うようなSweepとCompactは行いません。
  • nbackupのバックアップ・リストアサイクルでは、gbakで行えるようなデータベースオーナーの変更はできません。
  • nbackupはトランスポータブルなバックアップを作成できません。つまり、異なるプラットフォームや異なるサーババージョンでリストア可能なバックアップは作成できません。
  • 現時点では、nbackupはマルチファイルデータベースには使用できません。
  • nbackupはローカルなデータベースのみをバックアップできます。

次以降のセクションでnbackupの様々な機能を紹介します。

Making and restoring backups

nbackup.exeは、Firebirdフォルダのbinサブディレクトリにあります。典型的な場所は例えば、 C:\Program Files\Firebird\Firebird_2_0\bin (Windows) あるいは /opt/firebird/bin (Linux)です。Firebirdに付属する多くのツールと同様に、nbackupにはグラフィカルなインターフェースがありません。コマンドプロンプトから起動してください(あるいは、バッチファイルやアプリケーションから)。

警告

ヘビーロードな環境において、nbackup 2.0.3とそれ以下のバージョンはデッドロックを起こしたり、データベース破壊をもたらすかもしれないことがわかっています。これらの問題は、必ずしも起こるわけではありませんが、Firebird 2.0.4以上にアップグレードする理由として十分なものです。

Full backups

Making full backups

フルバックアップを作成するためのコマンドシンタックスは以下です。


    nbackup [-U <user> -P <password>] -B 0 <database> [<backupfile>]

例えば


    C:\Data> nbackup -B 0 inventory.fdb inventory_1-Mar-2006.nbk

  • -Bパラメータは「backup」を意味し(gee!)、バックアップレベル0はフルバックアップを意味します。0より大きいバックアップレベルは増分バックアップとして使用されます。これについは後述します。
  • データベースファイル名の代わりにエイリアスを指定することができます。
  • バックアップファイル名の代わりにstdoutを指定することができます。これにより、バックアップを標準出力に出力します。これを使って、テープアーカイバや圧縮ツールにリダイレクトすることができます。
  • 以下の場合には、-U (user) と -P (password) を省略することができます。
    • スーパーユーザ(root, administrator)としてログインしている場合
    • 環境変数ISC_USER と ISC_PASSWORD が設定されている場合。
      For clarity and brevity, these parameters are not used in the examples.
  • 異なるパラメータ(-B, -U and -P) はどのような順番でも構いませんが、もちろんそれぞれの引数はパラメータの直後になければいけません。-Bについては、バックアップレベル、データベース、バックアップファイルがこの順番でなければなりません。
  • -Bパラメータが最後の場合は、バックアップファイル名を省略することができます。このとき、nbackupはファイル名をデータベース名、バックアップレベル、現在の日時から決定します。もし二つのバックアップコマンドが同じレベルで同じ時間に発行されると名前衝突(バックアップ失敗)の可能性があることに注意してください。
警告

nbackupをマルチファイルデータベースに使用しないでください。データの破壊や喪失が起こる可能性があります。そのような使い方をしてもnbackupは何の警告も出しません。

A word on the inner workings

以下の知識はnbackupを使うのには必要ありません。nbackup -Bの実行時に起こっていることのおおまか(不完全)なイメージです。

  1. 最初に、内部的な状態フラグを変更することにより、メインデータベースファイルがロックされます。この時点からデータベースのすべての変更は一時ファイル(差分ファイルあるいはデルタファイル)に書き込まれるようになります。
  2. 実際のバックアップ操作が行われます。これは単純なファイルコピーではありませんから、これをリストアする場合もnbackupを使用しなければなりません。
  3. バックアップの完了時に、デルタファイルの内容はメインデータベースファイルに統合されます。次に、データベースがアンロックされ(フラグがノーマル状態になり)、デルタファイルが削除されます。

ステップ1と3の機能は二つの新しいSQLステートメントによって提供されます。「ALTER DATABASE BEGIN BACKUP」と「ALTER DATABASE END BACKUP」です。その名称に反して、これらの文は実際のバックアップは行いません。単に、メインデータベースを安全にバックアップできる状態を作り出すだけです。念のためですが、これらのコマンドを発行する必要はありません。適切な瞬間にnbackupがそれらを行います。

Restoring a full backup

フルバックアップは次のようにしてリストアします。


    nbackup [-U <user> -P <password>] -R <database> [<backupfile>]

例えば

    C:\Data< nbackup -R inventory.fdb inventory_1-Mar-2006.nbk

説明:

  • リストアのレベルを指定する必要はありません。
  • -Rパラメータを最初に指定してなければいけません。理由は後述します。
  • 指定されたデータベースが既に存在する場合には、リストアは失敗しエラーを表示します。
  • ここでもバックアップファイル名を省略することができます。この場合は、nbackupはそれを聞いてきます。
バグ

Firebird 2.0.0では、このインタラクティブリストア機能が壊れています。エラーを表示するだけでリストアは失敗します。2.0.1で修正されています。

Incremental backups

警告

増分バックアップ機能はFirebird 2.1においては完全に壊れています。2.1.1で修正される予定です。

Making incremental backups

増分(差分)バックアップを作成するには、バックアップレベルとして0より大きい値を指定します。レベルNの増分バックアップには、常に直近のN-1レベルバックアップからのデータベース変更が含まれます。

例:

フルバックアップ(レベル0)を作成した次の日、レベル1のバックアップを作成することにします。


    C:\Data> nbackup -B 1 inventory.fdb inventory_2-Mar-2006.nbk

このバックアップには、昨日以後の変更点だけが含まれます。

その翌日、レベル1のバックアップをもう一つ作成するとします。


    C:\Data< nbackup -B 1 inventory.fdb inventory_3-Mar-2006.nbk

このバックアップには過去二日間の、つまりフルバックアップ以後の変更が含まれます。前回のレベル1バックアップ以後だけの変更ではありません。

二時間後に、今度はレベル2のバックアップを作成するとします。


    C:\Data< nbackup -B 2 inventory.fdb inventory_3-Mar-2006_2.nbk

最も若いバックアップは、直近のレベル1以後の変更点のみ、つまり過去二時間分のみを含みます。

注意

All the comments that have been made about full backups also apply to incremental backups.

警告

マルチファイルデータベースに対してnbackupを使わないでください。再度警告します。

Restoring incremental backups

増分バックアップをリストアする際には、レベル0からリストアを望むレベルまでのすべてのバックアップファイルチェインを指定しなければなりません。データベースは常にグランドからステップバイステップでビルドされます。(It is this stepwise adding until the database is restored that gave rise to the term incremental backup.)

形式的なシンタックスは


    nbackup [-U <user> -P <password>]
            -R <database> [<backup0> [<backup1> [...] ] ]

したがって、以前の例からレベル2のバックアップをリストアする場合は


    C:\Data< nbackup -R inventory.fdb inventory_1-Mar-2006.nbk
               inventory_3-Mar-2006.nbk inventory_3-Mar-2006_2.nbk

もちろん、レイアウト上の理由から二行に分けれているだけです。実際には最後まで一行に記述してください。

説明 (in addition to the comments with restoring a full backup):

  • あらかじめ幾つのファイルが-Rスイッチの後に続くかわからないため(リストア時はレベルを指定しませんので)、nbackupは-Rの後の引数をすべてバックアップファイル名称であると想定します。ですから、ファイル名称の後に他のパラメータ(-Uや-P)を続けることはできません。
  • バックアップファイルの数は形式的には限界がありませんが、実際には3あるいは4を越えることは意味が無いでしょう。

Non-connecting links

必要なファイルを指定し忘れたり、一緒に指定すべきでないファイルを指定しまった場合はどうなるでしょうか?例えば、inventory_2-Mar-2006.nbkを、間違えてinventory_3-Mar-2006.nbkの代わりに指定したとします。双方ともレベル1のバックアップファイルですから、どちらの場合でも0、1、2の連続したファイルが指定されることになります。しかしながら、レベル2のファイルは「3 March」からの増分であって、「2 March」からの増分ではありません。

幸運なことに、このような間違いによって不正なデータベースがリストアされることはありません。
各バックアップファイルはそれぞれにユニークなIDを持っており、レベル1以降のバックアップファイルは、元となるバックアップのIDを保持しているからです。リストア時にnbackupはこれらのIDをチェックし、茶印が接続していない場合にはオペレーションを中止しエラーメッセージを発生します。

Suppressing database triggers (Firebird 2.1+)

Firebird 2.1ではデータベーストリガという概念が導入されました。nbackup実行中にこれらが起動しないよう、nbackupに新しいスイッチ -T が追加されました。このスイッチはデータベースオーナーかsysdbaによってのみ使用することができます。gbakとisqlでの対応するスイッチは-nodbtriggersであることに注意してください。

A practical application

nbackupによる増分バックアップは以下のようなものになる。

  • 毎月フルバックアップ(レベル0)を作成する。
  • 毎週レベル1バックアップ
  • 毎日レベル2バックアップ
  • 毎時レベル3バックアップ

すべてのバックアップが保持されていれば、過去の任意の時刻のデータベースをリストアすることができる。それぞれのリストア操作では最大4つのファイルが用いられる。もちろん、大きく時間のかかるバックアップはオフピーク時間帯に行わなければならない。このケースではレベル0と1は週末に、レベル2は夜間である。

もしすべてを永遠に保管する必要がなければ、削除スケジュールを加えることができる。

  • レベル3バックアップは8日間経過したら削除する。
  • レベル2sは一ヶ月後
  • レベル1sは半年後
  • フルバックアップは二年後。ただし、各年の最初のものは保持する。

もちろん、以上は単なる例である。個々のケースで何が必要かは、アプリケーション、データベースサイズ、そのアクティビティ等に依存する。

Read on?

この時点で、nbackupによるフル及び増分のバックアップとリストアを行うためのすべての知識を得た。
You only need to read any further if you want to use backup tools of your own choice for your Firebird databases (see Locking and unlocking), or if you want to override the default name or location of the delta file (see Setting the delta file).

If you have no craving for any of that: good luck in your work with nbackup!

Locking and unlocking

もし、あなた自身のバックアップツールを使うか、あるいはただのファイルコピーをしたいとき、nbackupのロック・アンロックモードが必要になります。「ロック」とはメインデータベースファイルが一時的に凍らせられることであって、データベースする変更がされないということではありません(訳注:データベース変更は起こるが、メインデータベースファイルは変更されない)。バックアップモードと同様に変更は一時的なデルタファイルに書き込まれます。アンロック時にデルタファイルの内容はメインファイルにマージされます。

念のためですが、nbackup.exeはFirebirdフォルダのサブディレクトリにあります。典型的な場所としては例えば C:\Program Files\Firebird\Firebird_2_0\bin (Windows) あるいは /opt/firebird/bin (Linux)です。このプログラムにはGUIがありません。コマンドプロンプトから実行する必要があります(あるいはバッチファイルかアプリケーションから)。

Locking the database and backing up yourself

独自にバックアップを行う際の典型的なセッションとしては以下になります。

  1. -L(Lock)スイッチでデータベースをロックします。
    
              nbackup [-U <user> -P <password>] -L <database>
    
    
  2. 好きなツールでコピー・バックアップ・ZIP化等を行うことができます。単純なファイルコピーも可能です。

  3. -N(uNlock)スイッチでデータベースをアンロックします。
    
              nbackup [-U <user> -P <password>] -N <database>
    
    

    最後のコマンドで、デルタファイルに書き込まれていたあらゆる変更がメインファイルにマージされます。

作成されたバックアップは、データベースがロックされた瞬間のデータ内容になります。たとえ、ロック状態がどれほど長く続こうと、あるいは(ロックしてから)実際にバックアップを行うまでどれほど長く待とうとも。

警告

What goes for backup/restore also applies to the lock/unlock switches: do not use them on multi-file databases. Until things have changed, don't let nbackup loose on multi-file databases at all!

Restoring a backup made after “nbackup -L”

ロック中のデータベースのコピーはそれ自身がロック中の状態ですから、その状態で使用開始することはできません。
Should your original database get lost or damaged and the self-made copy needs to be restored (or should you wish to install the copy on another machine), proceed like this:

  1. バックアップされたファイルについて必要なツールをコピー・リストア・unzipしてください。
  2. データベースをアンロックしますが、-Nスイッチではなく、-F(Fixup)を使います。
    
              nbackup -F <database>
    
    

なぜ二つのアンロックスイッチ、-Nと-Fがあるのでしょうか?

    • -Nでは最初に、-Lにてロックされた後に加えられた変更をメインデータベースファイルにマージします。その後で、データベースは通常のリードライトモードに戻り、一時ファイルは削除されます。
    • -Fではself-restoredデータベースの状態フラグを「通常」に変更するだけです。

    したがって、

    • ご自分でコピー・バックアップをした後は-Nを使ってください(以前に発行した-Lを元に戻す)。
    • バックアップされたファイルをリストアした後は-Fを使ってください。
    注意

    It is a bit unfortunate that the last switch should be called -F for Fixup. After all, it doesn't fix anything; it only unlocks the database. The -N (uNlock) flag on the other hand performs not only an unlock, but also a fixup (integration of mutations into the main file). But we'll have to live with that.

    Under the hood

    注意

    このセクションには、必須情報は含まれていません。様々なスイッチについての理解を深めるための追加情報です。

    nbackup -Lは以下のことを行います。

    • 1.データベースに接続します。
    • 2.トランザクションをスタートします。
    • 3.「ALTER DATABASE BEGIN BACKUP」を呼び出します(この文については以前にnbackup -Bの追加情報として紹介しました)。
    • 4.トランザクションをコミットします。
    • 5.データベースから切断します。

    nbackup -Nも全く同じですが、ただしステップ3で発行する文は「...END BACKUP」になります。

    nbackup -Fは次のようになります。

    • 1.リストアされたデータベースファイルをオープンする。
    • 2.そのファイル中の状態フラグをロック状態(nbak_state_stalled)から通常状態(nbak_state_normal)に変更する。
    • 3.ファイルを閉じる。
    注意

    nbackup -F は純粋にファイルレベルでの操作ですから、Firebirdサーバが起動していなくとも実行することができます。-U あるいは -P パラメータが指定されていても完全に無視されます。

    Setting the delta file

    デフォルトでは、デルタファイルはデータベースそれ自身と同じディレクトリに置かれます。また、名称もデータベースファイルと同じですが、ただし最後に「.delta」が付加されます。通常はこれを変更する必要はありませんが、必要であれば行えなければなりません、nbackupを経由せずに。任意のクライアントからデータベースに接続し、次のSQLを投入してください。

    
        alter database add difference file 'path-and-filename'
    
    

    カスタムデルタファイルの指定はデータベース中に永続化されます。RDB$FILESシステムテーブルに書き込まれるわけです。これをデフォルトに戻すには次のコマンドを投入します。

    
        alter database drop difference file
    
    
    注意

    • 「ADD DIFFERENCE FILE」にてファイル名だけを指定すると、デルタファイルはデータベースと同じディレクトリには作成されず、サーバにとってのカレントディレクトリに作成されます。Windows上ではこれは例えば、システムディレクトリである。同じ論理が相対パスの場合にも適用されます。
    • 全ディレクトリパスは存在しなければなりません。Firebirdは存在しないディレクトリを作成したりはしません。
    • カスタムデルタ指定を変更したい場合は、最初に古い指定をDROPしてから新しい指定をADDしてください。