はじめに:なぜバックアップが必要なの?
データベースには、アプリケーションの大切なデータがたくさん詰まっています。もし、ハードウェアの故障や操作ミス、あるいは予期せぬ災害などでデータが消えてしまったら大変ですよね? そんな万が一の事態に備えて、データのコピーを取っておくことがバックアップです。バックアップがあれば、問題が発生してもデータを元の状態に戻す(リストアする)ことができます。
バックアップは、いわばデータのお守りのようなもの。定期的に取得することで、安心してデータベースを運用できるようになります。特に、ビジネスで利用しているデータベースにとっては、バックアップは絶対に欠かせない作業です。
PostgreSQLのバックアップとリストア
PostgreSQLでは、主にpg_dumpというコマンドラインツールを使って論理バックアップを取得します。
pg_dumpコマンドによるバックアップ
pg_dumpは、データベースの内容をSQL文の集まり(スクリプトファイル)や、専用のアーカイブ形式で出力します。データベースが稼働中でも一貫性のあるバックアップを取得できます。
基本的な使い方(データベース全体のバックアップ)
最も一般的なのは、カスタム形式(圧縮され、リストア時に柔軟な対応が可能)でバックアップファイルを作成する方法です。
pg_dump -U [ユーザー名] -h [ホスト名] -p [ポート番号] -Fc -f [バックアップファイル名].dump [データベース名]例:
pg_dump -U postgres -h localhost -p 5432 -Fc -f myapp_backup.dump myapp_db実行すると、パスワードの入力を求められます。
よく使うオプション
| オプション | 説明 |
|---|---|
-U, --username | 接続ユーザー名を指定します。 |
-h, --host | データベースサーバーのホスト名を指定します。ローカルの場合はlocalhostなど。 |
-p, --port | データベースサーバーのポート番号を指定します。デフォルトは5432。 |
-W, --password | パスワードの入力を強制します。 |
-f, --file | 出力ファイル名を指定します。指定しない場合は標準出力に出力されます。 |
-F, --format | 出力形式を指定します。p (プレーンテキスト), c (カスタム), d (ディレクトリ), t (tar)があります。-Fc (カスタム形式)が推奨されます。 |
-t, --table | 指定したテーブルのみをダンプします。複数指定可能。 |
-n, --schema | 指定したスキーマのみをダンプします。複数指定可能。 |
-j, --jobs | 指定した数のジョブで並列にダンプを実行します。大規模なデータベースのバックアップ時間を短縮できますが、サーバー負荷が増加します。 |
--verbose | 詳細なメッセージを出力します。 |
リストア方法
バックアップファイルの形式によってリストア方法が異なります。
カスタム形式・tar形式・ディレクトリ形式の場合 (pg_restore)
pg_dumpでカスタム形式(-Fc)、tar形式(-Ft)、ディレクトリ形式(-Fd)で作成したバックアップは、pg_restoreコマンドを使ってリストアします。pg_restoreは、リストア対象を選択したり、並び替えたりできる柔軟なツールです。
リストア先のデータベースは事前に作成しておく必要があります。
# 事前にリストア先の空のデータベースを作成
createdb -U [ユーザー名] -h [ホスト名] -p [ポート番号] [リストア先データベース名]
# pg_restoreコマンドでリストア
pg_restore -U [ユーザー名] -h [ホスト名] -p [ポート番号] -d [リストア先データベース名] [バックアップファイル名].dump例:
createdb -U postgres -h localhost -p 5432 myapp_restore_db
pg_restore -U postgres -h localhost -p 5432 -d myapp_restore_db myapp_backup.dumpよく使うpg_restoreのオプション:
-d,--dbname: リストア先のデータベース名を指定します。-c,--clean: リストア前にデータベースオブジェクトを削除します。既存のデータベースに上書きする場合に便利です。-C,--create: リストア前にデータベース自体を作成します。-j,--jobs: 並列処理でリストアを実行します。-t,--table: 指定したテーブルのみをリストアします。
プレーンテキスト形式の場合 (psql)
pg_dumpでプレーンテキスト形式(デフォルト、または-Fp)で作成したバックアップファイル(SQLスクリプト)は、psqlコマンドを使ってリストアします。
# 事前にリストア先の空のデータベースを作成
createdb -U [ユーザー名] -h [ホスト名] -p [ポート番号] [リストア先データベース名]
# psqlコマンドでリストア
psql -U [ユーザー名] -h [ホスト名] -p [ポート番号] -d [リストア先データベース名] -f [バックアップファイル名].sql例:
createdb -U postgres -h localhost -p 5432 myapp_restore_db
psql -U postgres -h localhost -p 5432 -d myapp_restore_db -f myapp_backup.sqlMySQLのバックアップとリストア
MySQLでは、主にmysqldumpというコマンドラインツールを使って論理バックアップを取得します。
mysqldumpコマンドによるバックアップ
mysqldumpは、データベースの構造(テーブル定義など)とデータをSQL文としてファイルに出力します。
基本的な使い方(単一データベースのバックアップ)
mysqldump -u [ユーザー名] -p[パスワード] -h [ホスト名] [データベース名] > [バックアップファイル名].sqlパスワードをコマンドラインに直接書く代わりに-pだけを指定すると、実行時にパスワードを尋ねられます(こちらの方が安全です)。
mysqldump -u [ユーザー名] -p -h [ホスト名] [データベース名] > [バックアップファイル名].sql例:
mysqldump -u root -p -h localhost myapp_db > myapp_backup.sql複数のデータベースや全てのデータベースをバックアップ
# 複数のデータベースを指定
mysqldump -u [ユーザー名] -p -h [ホスト名] --databases [DB名1] [DB名2] > multiple_db_backup.sql
# 全てのデータベース
mysqldump -u [ユーザー名] -p -h [ホスト名] --all-databases > all_db_backup.sqlよく使うオプション
| オプション | 説明 |
|---|---|
-u, --user | 接続ユーザー名を指定します。 |
-p, --password | パスワードを指定します。-pの直後にパスワードを書かずに実行すると、対話的に入力できます。 |
-h, --host | データベースサーバーのホスト名を指定します。 |
--databases | 指定した複数のデータベースをダンプします。CREATE DATABASE IF NOT EXISTS文が含まれます。 |
--all-databases | サーバー上の全てのデータベースをダンプします。 |
--tables | (データベース名に続けて)指定したテーブルのみをダンプします。 |
--no-data | テーブル定義(スキーマ)のみをダンプし、データは含めません。 |
--no-create-info | データのみをダンプし、テーブル定義(CREATE TABLE文)は含めません。 |
--single-transaction | トランザクション内でダンプを実行します (InnoDBテーブルの場合)。これにより、ダンプ開始時点での一貫性のある状態が保証され、テーブルロックなしでバックアップできます。 |
--quick | 大きなテーブルをダンプする際に、行ごとにデータを取得しメモリ消費を抑えます(デフォルトで有効なことが多い)。 |
--add-drop-table | 各CREATE TABLE文の前にDROP TABLE IF EXISTS文を追加します。リストア時に既存のテーブルを削除してから作成するのに便利です。 |
リストア方法 (mysqlコマンド)
mysqldumpで作成したバックアップファイル(SQLスクリプト)は、mysqlコマンドラインクライアントを使ってリストアします。
リストア先のデータベースは事前に作成しておく必要があります(ただし、--databasesや--all-databasesオプション付きでダンプしたファイルにはCREATE DATABASE文が含まれている場合があります)。
# 事前にリストア先の空のデータベースを作成 (必要な場合)
mysql -u [ユーザー名] -p -h [ホスト名] -e "CREATE DATABASE IF NOT EXISTS [リストア先データベース名];"
# mysqlコマンドでリストア
mysql -u [ユーザー名] -p -h [ホスト名] [リストア先データベース名] < [バックアップファイル名].sql例:
mysql -u root -p -h localhost -e "CREATE DATABASE IF NOT EXISTS myapp_restore_db;"
mysql -u root -p -h localhost myapp_restore_db < myapp_backup.sql--all-databasesや--databasesでダンプしたファイルをリストアする場合は、データベース名を指定せずに入力します。
mysql -u [ユーザー名] -p -h [ホスト名] < [バックアップファイル名].sqlまとめ
データベースのバックアップとリストアは、データを安全に守るための基本であり、非常に重要な運用作業です。 今回は代表的なツールとしてPostgreSQLのpg_dump / pg_restoreとMySQLのmysqldump / mysqlコマンドを紹介しました。
ツールの使い方やオプションは多岐にわたりますが、まずは基本的な使い方をマスターし、定期的にバックアップを取得する習慣をつけましょう。 そして、いざという時に慌てないように、バックアップファイルからのリストア手順も実際に試しておくことを強くお勧めします!
これで、万が一のトラブルにも自信を持って対応できるデータベース管理者への第一歩を踏み出しましたね!