๐ 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 ๆธๆ
- ๅไปฝ/้ๅ่ๆๆฏ่ผ่กจ
ๆญคๆต็จๅฏไฝ็บๆ่ฝๆธฌ่ฉฆ、ๅฃๅๆจกๆฌ、ๆฅ่ฉขๅชๅ่ๆ่ฒ่จ็ทด็ๅบ็ค็ฏๆฌ,ไบฆๅฏ่ผ้ฌๆดๅฑ่ณๆธ็พ่ฌ็ญ่ณๆๅ ดๆฏ。
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ