熱門分類
載入中…
目錄0%

📊 PostgreSQL 大規模データ実装:50万件のデータ生成・フィールド入力・バックアップ・復元・性能ベンチマーク完全ガイド

    📊 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.gztar -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_dumppg_dump postgres約 9.2秒テキストベース出力
    gzip 圧縮gzip postgres.sql約 3.4秒容量約11MBに縮小
    tar.gztar -czvf約 3.8秒複数ファイルまとめ可能
    psql 復元psql testdb2 < postgres.sql約 15.6秒COPY 方式で高速
    checksum 比較string_agg + md5約 2.1秒完全整合性チェック

    環境にもよりますが、バックアップ〜復元〜整合性検証まで合計 30〜35秒で完了します。


    🏁 まとめ

    本記事では、PostgreSQL を用いて 50万件のデータ生成、フィールド自動入力、バックアップ、復元、整合性チェック、pgbench ベンチマークまでを体系的に解説しました。 大規模データの性能評価、システム検証、災害復旧演習に利用できる実践的な手順として活用できます。


    📚 関連記事

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級