This utility allows administrators to view the file structure used by
PostgreSQL. Databases are placed in directories based on their OIDs in
pg_database, and the tables in that directory are named by original
OIDs, stored in pg_class.relfilenode. Oid2name connects to the database
and extracts the OID and table name information.
---------------------------------------------------------------------------
It can be used in four ways:
oid2name
This will connect to the template1 database and display all databases
in the system:
$ oid2name
All databases:
---------------------------------
18720 = test1
1 = template1
18719 = template0
18721 = test
18735 = postgres
18736 = cssi
oid2name -d test [-x]
This connects to the database test and shows all tables and their OIDs:
$ oid2name -d test
All tables from database "test":
---------------------------------
18766 = dns
18737 = ips
18722 = testdate
oid2name -d test -o 18737
oid2name -d test -t testdate
This will connect to the database test and display the table name for oid
18737 and the oid for table name testdate respectively:
$ oid2name -d test -o 18737
Tablename of oid 18737 from database "test":
---------------------------------
18737 = ips
$ oid2name -d test -t testdate
Oid of table testdate from database "test":
---------------------------------
18722 = testdate
Keep in mind tables over one gigabyte will be split into separate files
with numeric file extensions.
---------------------------------------------------------------------------
Sample session:
$ cd /u/pg/data/base
$ oid2name
All databases:
---------------------------------
16817 = test2
16578 = x
16756 = test
1 = template1
16569 = template0
16818 = test3
16811 = floattest
$ cd 16756
$ ls 1873*
18730 18731 18732 18735 18736 18737 18738 18739
$ oid2name -d test -o 18737
Tablename of oid 18737 from database "test":
---------------------------------
18737 = ips
$ oid2name -d test -t ips
Oid of table ips from database "test":
---------------------------------
18737 = ips
$ # show disk space for every db object
$ du * | while read SIZE OID
> do
> echo "$SIZE `oid2name -q -d test -o $OID`"
> done
24 18737 = ips
36 18722 = cities
...
$ # same as above, but sort by largest first
$ du * | while read SIZE OID
> do
> echo "$SIZE `oid2name -q -d test -o $OID`"
> done |
> sort -rn
2048 19324 = bigtable
1950 23903 = customers
...
$ # show disk usage per database
$ cd /u/pg/data/base
$ du -s * |
> while read SIZE OID
> do
> echo "$SIZE `aspg oid2name -q | grep ^$OID' '`"
> done |
> sort -rn
2256 18721 = test
2135 18735 = postgres
..
This can be done in psql with:
test=> SELECT relpages, relfilenode, relname FROM pg_class ORDER BY relpages DESC;
Each page is typically 8k. Relpages is updated by VACUUM.
---------------------------------------------------------------------------
Mail me with any problems or additions you would like to see. Clearing
house for the code will be at: http://www.crimelabs.net
b. palmer, bpalmer@crimelabs.net