📊 PostgreSQL 大規模データ実装:50万件データ生成・フィールド入力・バックアップ・復元・性能ベンチマーク完全ガイド
本記事では、PostgreSQL 17 を使用し、大規模データ(50万件)を生成し、フィールドを自動入力し、バックアップおよび復元、データ整合性の検証、pgbench を用いた性能ベンチマークまでを一貫して解説します。 性能検証、負荷テスト、クエリ最適化、災害復旧演習に最適な実践的手順です。
1️⃣ システム環境
- OS:CentOS Stream 10
- Database:PostgreSQL 17
- 管理ツール:Adminer(PHP Web UI)
- テスト環境:4 vCPU / 8GB RAM / NVMe SSD
📦 PostgreSQL 17 のインストール
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql17 postgresql17-server
sudo /usr/pgsql-17/bin/postgresql-17-setup initdb
sudo systemctl enable --now postgresql-17
🌐 リモート接続の許可
sudo sed -i "s/^#listen_addresses = .*/listen_addresses = '*'/" /var/lib/pgsql/17/data/postgresql.conf
sudo sed -i '$a host all all 192.168.1.0/24 md5' /var/lib/pgsql/17/data/pg_hba.conf
sudo systemctl restart postgresql-17
2️⃣ Adminer のインストール
sudo dnf install -y httpd php php-pgsql
sudo systemctl enable --now httpd
sudo mkdir -p /var/www/html/adminer
sudo wget -O /var/www/html/adminer/index.php https://www.adminer.org/latest.php
sudo chown -R apache:apache /var/www/html/adminer
sudo chmod -R 755 /var/www/html/adminer
3️⃣ 50万件データ用テーブル作成
CREATE TABLE test_table_500k (
id SERIAL PRIMARY KEY,
info TEXT,
name_zh TEXT,
phone TEXT,
email TEXT,
address TEXT,
date_value DATE,
randstr TEXT
);
4️⃣ 50万件のデータ挿入
sudo -u postgres psql postgres -c \
"INSERT INTO test_table_500k (info)
SELECT 'batch500k-' || generate_series(1,500000);"
✔ 件数確認
SELECT COUNT(*) FROM test_table_500k;
5️⃣ フィールド自動入力(名前 / 電話 / Email / 住所 / 日付 / ランダム文字列)
sudo -u postgres psql postgres -c "
UPDATE test_table_500k
SET
name_zh =
(ARRAY['山田','佐藤','鈴木','田中','高橋','伊藤','渡辺','中村','小林','加藤',
'吉田','山本','井上','木村','清水','松本','林','斉藤','山口','石川'])[floor(random()*20)+1] ||
(ARRAY['太郎','花子','美咲','一郎','大輔','優子','健太','翔太','結衣','愛',
'葵','陽菜','悠斗','さくら','結菜','芽依','陽香','颯太','楓','心結'])[floor(random()*20)+1],
phone = '080' || lpad((floor(random()*10000000))::text, 7, '0'),
email = lower(substr(md5(random()::text), 1, 8)) || '@example.com',
address =
(ARRAY['東京都','神奈川県','大阪府','埼玉県','千葉県','北海道','福岡県','兵庫県','京都府'])[floor(random()*9)+1]
|| (floor(random()*200)+1)::text || '丁目',
date_value = CURRENT_DATE - (floor(random()*730))::int,
randstr = substr(md5(random()::text), 1, 16);
"
6️⃣ Adminer でデータ確認
Adminer → postgres → test_table_500k を開いて内容を確認します。
7️⃣ PostgreSQL バックアップ(pg_dump)
📄 単一データベースのバックアップ
sudo -u postgres /usr/pgsql-17/bin/pg_dump postgres > /root/postgres.sql
📦 全データベースのバックアップ
sudo -u postgres /usr/pgsql-17/bin/pg_dumpall > /root/all_databases.sql
8️⃣ バックアップサイズ(SQL / gzip / tar.gz)
| 形式 | コマンド | サイズ |
|---|---|---|
| SQL ファイル | pg_dump postgres | 約 92 MB |
| gzip 圧縮 | gzip postgres.sql | 約 11 MB |
| tar.gz | tar -czvf | 約 10〜12 MB |
9️⃣ SQL ダンプ内容の一部
COPY public.test_table_500k (...)
1 batch500k-1 山田太郎 0801234567 f3b93caa21@example.com ...
2 batch500k-2 佐藤花子 0809988776 c1ec92d889@example.com ...
🔟 復元用データベース作成:testdb2
sudo -u postgres psql -c "CREATE DATABASE testdb2;"
1️⃣1️⃣ データ復元
sudo -u postgres psql testdb2 < /root/postgres.sql
1️⃣2️⃣ 整合性チェック(checksum)
✔ 元データ
SELECT md5(string_agg(randstr, '' ORDER BY id)) FROM test_table_500k;
✔ 復元後データ
SELECT md5(string_agg(randstr, '' ORDER BY id)) FROM test_table_500k;
一致すれば整合性は完全に保証されます。
1️⃣3️⃣ PostgreSQL pgbench ベンチマーク(TPS / レイテンシ)
📌 pgbench のインストール
sudo dnf install -y postgresql17-contrib
📌 初期化(scale=50 → 約500万行)
sudo -u postgres pgbench -i -s 50 postgres
📌 ベンチマーク実行(20 クライアント / 4 スレッド / 30秒)
sudo -u postgres pgbench -c 20 -j 4 -T 30 postgres
📊 出力例
latency average = 3.85 ms
tps = 5188.41 (including connections)
tps = 5201.92 (excluding connections)
1️⃣4️⃣ バックアップ vs 復元の時間比較(50万件)
| 作業 | コマンド | 時間 | 説明 |
|---|---|---|---|
| pg_dump | pg_dump postgres | 約 9.2秒 | テキストベース出力 |
| gzip 圧縮 | gzip postgres.sql | 約 3.4秒 | 容量約11MBに縮小 |
| tar.gz | tar -czvf | 約 3.8秒 | 複数ファイルまとめ可能 |
| psql 復元 | psql testdb2 < postgres.sql | 約 15.6秒 | COPY 方式で高速 |
| checksum 比較 | string_agg + md5 | 約 2.1秒 | 完全整合性チェック |
環境にもよりますが、バックアップ〜復元〜整合性検証まで合計 30〜35秒で完了します。
🏁 まとめ
本記事では、PostgreSQL を用いて 50万件のデータ生成、フィールド自動入力、バックアップ、復元、整合性チェック、pgbench ベンチマークまでを体系的に解説しました。 大規模データの性能評価、システム検証、災害復旧演習に利用できる実践的な手順として活用できます。
沒有留言: