็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿ“Š PostgreSQL ๅคงๅž‹่ณ‡ๆ–™ๅบซๅฏฆไฝœ:ๆ‰นๆฌกๅปบ็ซ‹ 50 ่ฌ็ญ†่ณ‡ๆ–™、ๆฌ„ไฝๅกซๅ€ผ、ๅ‚™ไปฝ、้‚„ๅŽŸ่ˆ‡ๆ•ˆ่ƒฝๅŸบๆบ–ๅฎŒๆ•ดๆŒ‡ๅ—

    ๐Ÿ“Š PostgreSQL ๅคงๅž‹่ณ‡ๆ–™ๅบซๅฏฆไฝœ:ๆ‰นๆฌกๅปบ็ซ‹ 50 ่ฌ็ญ†่ณ‡ๆ–™、ๆฌ„ไฝๅกซๅ€ผ、ๅ‚™ไปฝ、้‚„ๅŽŸ่ˆ‡ๆ•ˆ่ƒฝๅŸบๆบ–ๅฎŒๆ•ดๆŒ‡ๅ—

    ๅœจ้€ฒ่กŒ่ณ‡ๆ–™ๅบซๆ•ˆ่ƒฝๆธฌ่ฉฆ、ๆŸฅ่ฉขๅ„ชๅŒ–、ๅฃ“ๅŠ›ๆจกๆ“ฌๆˆ–็ฝ้›ฃๅพฉๅŽŸๆผ”็ทดๆ™‚,ๅปบ็ซ‹ๅคง้‡ๆธฌ่ฉฆ่ณ‡ๆ–™ๆ˜ฏไธ€้ …ๅŸบๆœฌไธ”ๅฟ…่ฆ็š„ๆต็จ‹。ๆœฌ็ฏ‡็คบ็ฏ„ๅฆ‚ไฝ•ๅœจ PostgreSQL 17 ไธญๅปบ็ซ‹ๅฏ็”จ็š„ๆธฌ่ฉฆ็’ฐๅขƒ,ๅŒ…ๅซ่ณ‡ๆ–™่กจๅปบ็ซ‹、ๆ‰นๆฌกๆ’ๅ…ฅ 50 ่ฌ็ญ†่ณ‡ๆ–™、ๅกซๅ…ฅๅง“ๅ่ˆ‡่ฏ็ตก่ณ‡่จŠ、ๅฎŒๆˆๅ‚™ไปฝ่ˆ‡้‚„ๅŽŸ、่ณ‡ๆ–™ไธ€่‡ดๆ€ง้ฉ—่ญ‰,ไธฆๆไพ› pgbench ๆ•ˆ่ƒฝๅŸบๆบ–ๆธฌ่ฉฆ่ˆ‡ๅ‚™ไปฝ/้‚„ๅŽŸ่€—ๆ™‚ๅˆ†ๆž,ไฝœ็‚บๅฎŒๆ•ด็š„่ณ‡ๆ–™ๅบซๅฏฆ้ฉ—ๆ‰‹ๅ†Š。


    1️⃣ ็ณป็ตฑ็’ฐๅขƒ่ˆ‡ๅ‰็ฝฎๆบ–ๅ‚™

    • ไฝœๆฅญ็ณป็ตฑ:CentOS Stream 10
    • ่ณ‡ๆ–™ๅบซ็‰ˆๆœฌ:PostgreSQL 17
    • ็ฎก็†ๅทฅๅ…ท:Adminer(PHP Web UI)
    • ๆธฌ่ฉฆ็’ฐๅขƒ:4 vCPU / 8 GB 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(Web ็ฎก็†็•Œ้ข)

    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 = '09' || lpad((floor(random()*100000000))::text, 8, '0'),
    
        email = lower(substr(md5(random()::text), 1, 8)) || floor(random()*999)::text || '@example.com',
    
        address =
            (ARRAY['ๅฐๅŒ—ๅธ‚','ๆ–ฐๅŒ—ๅธ‚','ๆกƒๅœ’ๅธ‚','ๅฐไธญๅธ‚','ๅฐๅ—ๅธ‚','้ซ˜้›„ๅธ‚','ๅŸบ้š†ๅธ‚','ๆ–ฐ็ซนๅธ‚','ๅ˜‰็พฉๅธ‚'])[floor(random()*9)+1]
            || (ARRAY['ไธญๆญฃๅ€','ๅคงๅฎ‰ๅ€','ไฟก็พฉๅ€','ๆฟๆฉ‹ๅ€','ๆ–ฐ่ŽŠๅ€','ๆกƒๅœ’ๅ€','ไธญๅฃขๅ€','่ฅฟๅฑฏๅ€','ๆฑๅ€','ๆฐธๅบทๅ€','่‹“้›…ๅ€'])[floor(random()*11)+1]
            || floor(random()*300)::text || '่™Ÿ',
    
        date_value = CURRENT_DATE - (floor(random()*730))::int,
    
        randstr = substr(md5(random()::text), 1, 16);
    "
    

    6️⃣ Adminer ็ขบ่ช่ณ‡ๆ–™ๅ…งๅฎน

    ็™ปๅ…ฅ Adminer → ้ธๆ“‡่ณ‡ๆ–™ๅบซ postgres → ๆ‰“้–‹ test_table_500k,ๅณๅฏๆŸฅ็œ‹ๅฎŒๆ•ด 50 ่ฌ็ญ†่ณ‡ๆ–™。


    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️⃣ ๅŒฏๅ‡บๅ…งๅฎน้ ่ฆฝ(้ƒจๅˆ†่ณ‡ๆ–™)

    --
    -- PostgreSQL database dump
    --
    
    CREATE TABLE public.test_table_500k (
        id integer NOT NULL,
        info text,
        name_zh text,
        phone text,
        email text,
        address text,
        date_value date,
        randstr text
    );
    
    COPY public.test_table_500k (...)
    1    batch500k-1    ้™ณ้›…ๅฉท    0978453321    f3b93caa21@example.com ...
    2    batch500k-2    ้ปƒๅฟ—ๅผท    0987123399    c1ec92d889@example.com ...
    

    ๐Ÿ”Ÿ ๅปบ็ซ‹้‚„ๅŽŸ็”จ่ณ‡ๆ–™ๅบซ testdb2

    sudo -u postgres psql -c "CREATE DATABASE testdb2;"
    

    1️⃣1️⃣ ้‚„ๅŽŸ่ณ‡ๆ–™่‡ณ testdb2

    sudo -u postgres psql testdb2 < /root/postgres.sql
    

    1️⃣2️⃣ ้‚„ๅŽŸๅพŒไธ€่‡ดๆ€ง้ฉ—่ญ‰(checksum)

    ✔ ๅŽŸๅง‹่ณ‡ๆ–™ๅบซ checksum

    SELECT md5(string_agg(randstr, '' ORDER BY id)) FROM test_table_500k;
    

    ✔ ้‚„ๅŽŸๅพŒ่ณ‡ๆ–™ๅบซ checksum

    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 establishing)
    tps = 5201.92 (excluding connections establishing)
    

    1️⃣4️⃣ ๅ‚™ไปฝ่ˆ‡้‚„ๅŽŸ่€—ๆ™‚ๅˆ†ๆž(50 ่ฌ็ญ†)

    ไฝœๆฅญ้ …็›ฎๆŒ‡ไปค่€—ๆ™‚่ชชๆ˜Ž
    pg_dump ๅ‚™ไปฝ pg_dump postgres ็ด„ 9.2 ็ง’ ๆ–‡ๅญ— SQL ๅŒฏๅ‡บ้€Ÿๅบฆๅฟซ
    gzip ๅฃ“็ธฎ gzip postgres.sql ็ด„ 3.4 ็ง’ ๅฃ“็ธฎๅพŒๅƒ… 11 MB
    tar.gz ๆ‰“ๅŒ… tar -czvf ็ด„ 3.8 ็ง’ ๅฏๅญ˜ๆ”พๅคšๆช”ๆกˆ
    psql ้‚„ๅŽŸ psql testdb2 < postgres.sql ็ด„ 15.6 ็ง’ COPY ๆจกๅผ้€Ÿๅบฆๆœ€ไฝณ
    checksum ๆฏ”ๅฐ string_agg + md5 ็ด„ 2.1 ็ง’ ็ขบไฟ่ณ‡ๆ–™ไธ€่‡ดๆ€ง

    ๅฎŒๆ•ดๆต็จ‹่€—ๆ™‚็ด„ 30~35 ็ง’,่ฆ– CPU / I/O ่€Œๅฎš。


    ๐Ÿ ็ต่ซ–

    ๆœฌ็ฏ‡็คบ็ฏ„ไบ† PostgreSQL ๅœจๅคง้‡่ณ‡ๆ–™ๆƒ…ๅขƒไธ‹็š„ๅฎŒๆ•ดๆ“ไฝœๆต็จ‹,ๅŒ…ๆ‹ฌ:

    • ๅปบ็ซ‹ 50 ่ฌ็ญ†่ณ‡ๆ–™่กจ
    • ๆ‰นๆฌกๆ’ๅ…ฅ + ๆฌ„ไฝๅกซๅ€ผ(ๅง“ๅ、ๆ‰‹ๆฉŸ、Email、ๅœฐๅ€、ๆ—ฅๆœŸ、ไบ‚ๆ•ธ)
    • pg_dump ่ˆ‡ๅฃ“็ธฎๅพŒๅฎน้‡ๅˆ†ๆž
    • ่ณ‡ๆ–™ๅบซ้‚„ๅŽŸ่ˆ‡ checksum ไธ€่‡ดๆ€ง้ฉ—่ญ‰
    • pgbench ๅฃ“ๅŠ›ๆธฌ่ฉฆ่ˆ‡ TPS ๆ•ธๆ“š
    • ๅ‚™ไปฝ/้‚„ๅŽŸ่€—ๆ™‚ๆฏ”่ผƒ่กจ

    ๆญคๆต็จ‹ๅฏไฝœ็‚บๆ•ˆ่ƒฝๆธฌ่ฉฆ、ๅฃ“ๅŠ›ๆจกๆ“ฌ、ๆŸฅ่ฉขๅ„ชๅŒ–่ˆ‡ๆ•™่‚ฒ่จ“็ทด็š„ๅŸบ็คŽ็ฏ„ๆœฌ,ไบฆๅฏ่ผ•้ฌ†ๆ“ดๅฑ•่‡ณๆ•ธ็™พ่ฌ็ญ†่ณ‡ๆ–™ๅ ดๆ™ฏ。


    ๐Ÿ“š ๅปถไผธ้–ฑ่ฎ€

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš