postgresql/contrib/oid2name
Tom Lane f85f43dfb5 Backend support for autocommit removed, per recent discussions. The
only remnant of this failed experiment is that the server will take
SET AUTOCOMMIT TO ON.  Still TODO: provide some client-side autocommit
logic in libpq.
2003-05-14 03:26:03 +00:00
..
Makefile To fix the perpetually broken makefiles in the contrib tree, I have 2001-09-06 10:49:30 +00:00
README.oid2name Update README for oid2name. 2002-10-12 19:15:09 +00:00
oid2name.c Backend support for autocommit removed, per recent discussions. The 2003-05-14 03:26:03 +00:00

README.oid2name

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