【実務・中級編】 データベースの作成と削除(CREATE/DROP DATABASE) – PostgreSQL

PostgreSQLの「データベース作成・削除」をマスターする:実務で恥をかかないための勘所

やあ、PostgreSQLの世界へようこそ。

現場に入って最初に触るのが「DBの作成」かもしれないけど、ここって意外と「なんとなく」で済ませてしまいがちな場所なんだよね。でも、大規模なシステム開発や本番環境の運用を任されるようになると、この小さなコマンド一つひとつが、実はシステムの堅牢性に直結することに気づくはず。

今回は、PostgreSQLでデータベース(DB)を扱うときの「CREATE DATABASE」と「DROP DATABASE」について、教科書には載っていないような実務的な視点を交えて解説するよ。

—

1. DB作成の基本:`CREATE DATABASE` を正しく叩く

まずは基本の構文から。単に `CREATE DATABASE my_app;` と打つこともできるけど、実務ではオプションを意識することが大切だ。

CREATE DATABASE my_app
WITH OWNER = my_user
ENCODING = ‘UTF8’
TEMPLATE = template1
CONNECTION LIMIT = 100;

ここが実務のポイント:

  • OWNERの指定: デフォルトだとコマンドを叩いたユーザーが所有者になるけど、アプリケーション用のDBなら、必ずサービス用のロール(ユーザー)を所有者にしておくこと。これを怠ると、後で権限周りで泣きを見ることになるよ。
  • ENCODING: 今の時代、ほぼ『UTF8』一択だね。ここを間違えると文字化け地獄の入り口になるから、新規作成時は必ず確認しよう。
  • CONNECTION LIMIT: これ、意外と忘れがち。本番環境で「接続しすぎてDBがパンクした」なんて事故を防ぐための防波堤として、あらかじめ制限をかけておくのは良い習慣だよ。

—

2. テンプレート機能は「時短」の武器

`TEMPLATE` オプション、使ったことあるかな? PostgreSQLは新しいDBを作る際、`template1` というDBをコピーするのがデフォルトの動作なんだ。

もし、「特定の拡張機能(例えば `pg_trgm` や `postgis` など)を最初から入れておきたい」というDBが複数あるなら、自分専用のテンプレートDBを作っておくのがおすすめ。

— 事前にベースとなるDBを作っておく
CREATE DATABASE my_template;
\c my_template
CREATE EXTENSION pg_trgm;

— 以降、これを使ってDBを作成
CREATE DATABASE new_service TEMPLATE my_template;

これで、新しいDBを作るたびにいちいち拡張機能をインストールする手間が省ける。こういう細かい効率化の積み重ねが、エンジニアとしての「手際」の良さに出るんだよね。

—

3. `DROP DATABASE` は「破壊的な操作」だと自覚する

DBを消すときは `DROP DATABASE my_app;`。これだけ。でも、実務でこれを叩くときには、ちょっとした緊張感が伴うはずだよね。

注意すべきこと:

  • 接続中のユーザーがいると消せない: 「あれ、エラーが出るぞ?」と焦る原因のほとんどはこれ。他のプロセスが繋がっていると削除できないから、強制的に終了させる必要がある場合もある(慎重にね)。
  • バックアップは済んだか?: 僕は昔、消す直前に「あ、設定値控えてなかった!」と冷や汗をかいた経験がある。消す前は、必ず環境情報のドキュメント化とバックアップを確認しよう。

もし、どうしても接続中のセッションを強制的に切って削除したいなら、こんな工夫が必要になるよ。

— 接続を強制終了してから削除(PostgreSQL 13以降推奨)
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = ‘my_app’ AND pid <> pg_backend_pid();

DROP DATABASE my_app;

(※これを本番環境でやる場合は、本当に細心の注意を払ってね!)

—

先輩からのアドバイス

「DBを作る・消す」という行為は、その環境の「最初の一歩」であり「最後の一歩」だ。

特に開発環境で遊んでいるときは気軽にやりがちだけど、本番環境を見据えるなら「自動化」を意識してほしい。AnsibleやTerraform、あるいは単なるシェルスクリプトでもいい。人間が手作業でコマンドを打つ回数を減らすことが、ヒューマンエラーを防ぐ一番の近道だよ。

それと、PostgreSQLにおいて「データベース」はあくまでデータの箱の集まり。その中にある「スキーマ」の設計の話も重要なんだけど、それはまた別の機会に話そうか。

まずは、自分のローカル環境でテンプレートDBを作ってみることから始めてみて。こういう小さな実験の積み重ねが、いずれ「PostgreSQLを自在に操れるエンジニア」になるための確かな土台になるはずだから。

それじゃ、また現場で!

コメント

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