PostgreSQL یک سیستم مدیریت پایگاه داده رابطهای قدرتمند است که همه چیز در آن، از جداول گرفته تا توابع و ایندکسها، به صورت منظم در دایرکتوری دادهها نگهداری میشود. فهمیدن اینکه هر جدول و هر ستون کجا و چگونه ذخیره میشود، به ما کمک میکند عملکرد دیتابیس را بهتر درک کنیم و کار با متادیتا را سادهتر کنیم.
base/ و پایگاه دادههاوقتی PostgreSQL اجرا میشود، هر پایگاه داده در دایرکتوری base/ یک پوشه مخصوص دارد. نام پوشه همان OID پایگاه داده است:
.../base/
├── ۱ ← template0
├── ۴ ← template1
├── ۵ ← postgres
└── ۱۶۳۸۴ ← یک پایگاه داده کاربری
SELECT oid, datname
FROM pg_database
ORDER BY oid;
نتیجه مثلاً چنین چیزی خواهد بود:
oid | datname
-------+-----------
۱ | template0
۴ | template1
۱۶۳۸۴ | postgres
پس پوشه base/16384 همان پایگاه داده postgres است.
هر پایگاه داده مجموعهای از اسکیماها دارد. اسکیما مثل یک پوشه منطقی است که جداول و سایر اشیاء در آن دستهبندی میشوند.
SELECT oid, nspname
FROM pg_namespace
ORDER BY oid;
نمونه خروجی:
oid | nspname
-------+--------------------
۱۱ | pg_catalog
۹۹ | pg_toast
۲۲۰۰ | public
۱۳۲۹۳ | information_schema
text, bytea, jsonb).هر جدول یا ایندکس یک relfilenode دارد که نام فایل روی دیسک است:
SELECT
n.nspname AS schema,
c.relname AS object_name,
c.relfilenode AS file_id,
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 't' THEN 'toast table'
ELSE c.relkind
END AS object_type
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relfilenode IS NOT NULL
ORDER BY c.relfilenode;
مثلاً فایل base/16384/24576 مربوط به جدول یا ایندکس خاصی است و با این کوئری میتوان نام آن را پیدا کرد:
SELECT pg_relation_filepath('public.my_table'::regclass) AS file_path;
pg_toast میسازد.pg_class.reltoastrelid ذخیره میشود.SELECT relname, reltoastrelid
FROM pg_class
WHERE reltoastrelid <> 0;
| نام | نوع | توضیح |
|---|---|---|
pg_database | جدول | لیست پایگاه دادهها و OID آنها |
pg_namespace | جدول | اسکیماها |
pg_class | جدول | تمام روابط: جداول، ایندکسها، sequenceها |
pg_attribute | جدول | ستونها |
pg_index | جدول | ایندکسها |
pg_constraint | جدول | محدودیتها (PK, FK, UNIQUE, CHECK) |
pg_proc | جدول | توابع و stored procedureها |
pg_trigger | جدول | triggerها |
pg_toast | schema | جداول مخفی برای مقادیر بزرگ |
information_schema | view | نمای استاندارد SQL برای متادیتا |
PGDATA/
├── base/ ← دیتابیسها (هر DB یک پوشه OID)
├── global/ ← جداول اشتراکی cluster-wide
├── pg_tblspc/ ← جداولی که در tablespace ذخیره شدهاند
├── pg_wal/ ← لاگ تراکنشها
└── pg_stat/ ← فایلهای آماری
pg_authid و pg_database.CREATE DATABASE mydb TEMPLATE template1:
pg_database اضافه میشود.برای پیدا کردن فایل ذخیره جدول:
SELECT pg_relation_filepath('public.my_table'::regclass) AS file_path;
PGDATA نشان میدهد.SELECT
n.nspname AS schema,
c.relname AS table_name,
c.relfilenode,
pg_relation_filepath(c.oid) AS path
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
ORDER BY n.nspname, c.relname;
SELECT datname, oid, pg_tablespace_location(dattablespace) AS tablespace_path
FROM pg_database;
SELECT attnum, attname, atttypid::regtype AS data_type
FROM pg_attribute
WHERE attrelid = 'public.my_table'::regclass
AND attnum > 0
ORDER BY attnum;