[SQLのはじめ方] Part27: バックアップとリストア(pg_dump, mysqldumpなど)

SQL

はじめに:なぜバックアップが必要なの? 🤔

データベースには、アプリケーションの大切なデータがたくさん詰まっています。もし、ハードウェアの故障や操作ミス、あるいは予期せぬ災害などでデータが消えてしまったら大変ですよね? 😱 そんな万が一の事態に備えて、データのコピーを取っておくことがバックアップです。バックアップがあれば、問題が発生してもデータを元の状態に戻す(リストアする)ことができます。

バックアップは、いわばデータのお守りのようなもの。定期的に取得することで、安心してデータベースを運用できるようになります。特に、ビジネスで利用しているデータベースにとっては、バックアップは絶対に欠かせない作業です。✨

注意: データベースを構成するファイルを単純にコピーするだけでは、完全なバックアップにならない場合があります。データベースが動作中は、最新の情報がメモリ上にある可能性があるためです。専用のツールを使いましょう!

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.sql
補足: pg_dumpallというコマンドもあります。これはサーバー内の全てのデータベースや、ロール、テーブルスペースといったグローバルオブジェクトも含めてバックアップする際に使用します。出力はプレーンテキスト形式のみです。

MySQLのバックアップとリストア 🐬

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コマンドを紹介しました。

ツールの使い方やオプションは多岐にわたりますが、まずは基本的な使い方をマスターし、定期的にバックアップを取得する習慣をつけましょう。 そして、いざという時に慌てないように、バックアップファイルからのリストア手順も実際に試しておくことを強くお勧めします! 💪

これで、万が一のトラブルにも自信を持って対応できるデータベース管理者への第一歩を踏み出しましたね!🎉

コメント

タイトルとURLをコピーしました