mirror of https://github.com/postgres/postgres
a Postgres database. Update page.sgml to match 8.0 tuple header layout.REL8_0_STABLE
parent
c7866f6645
commit
7f4b5a003b
@ -0,0 +1,161 @@ |
||||
<!-- |
||||
$PostgreSQL: pgsql/doc/src/sgml/filelayout.sgml,v 1.1 2004/11/12 21:50:53 tgl Exp $ |
||||
--> |
||||
|
||||
<chapter id="file-layout"> |
||||
|
||||
<title>Database File Layout</title> |
||||
|
||||
<abstract> |
||||
<para> |
||||
A description of the database physical storage layout. |
||||
</para> |
||||
</abstract> |
||||
|
||||
<para> |
||||
This section provides an overview of the physical format used by |
||||
<productname>PostgreSQL</productname> databases. |
||||
</para> |
||||
|
||||
<para> |
||||
All the data needed for a database cluster is stored within the cluster's data |
||||
directory, commonly referred to as <varname>PGDATA</> (after the name of the |
||||
environment variable that can be used to define it). A common location for |
||||
<varname>PGDATA</> is <filename>/var/lib/pgsql/data</>. Multiple clusters, |
||||
managed by different postmasters, can exist on the same machine. |
||||
</para> |
||||
|
||||
<para> |
||||
The <varname>PGDATA</> directory contains several subdirectories and control |
||||
files, as shown in <xref linkend="pgdata-contents-table">. In addition to |
||||
these required items, the cluster configuration files |
||||
<filename>postgresql.conf</filename>, <filename>pg_hba.conf</filename>, and |
||||
<filename>pg_ident.conf</filename> are traditionally stored in |
||||
<varname>PGDATA</> (although beginning in |
||||
<productname>PostgreSQL</productname> 8.0 it is possible to keep them |
||||
elsewhere). |
||||
</para> |
||||
|
||||
<table tocentry="1" id="pgdata-contents-table"> |
||||
<title>Contents of <varname>PGDATA</></title> |
||||
<tgroup cols="2"> |
||||
<thead> |
||||
<row> |
||||
<entry> |
||||
Item |
||||
</entry> |
||||
<entry>Description</entry> |
||||
</row> |
||||
</thead> |
||||
|
||||
<tbody> |
||||
|
||||
<row> |
||||
<entry><filename>PG_VERSION</></entry> |
||||
<entry>A file containing the major version number of <productname>PostgreSQL</productname></entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry><filename>base</></entry> |
||||
<entry>Subdirectory containing per-database subdirectories</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry><filename>global</></entry> |
||||
<entry>Subdirectory containing cluster-wide tables, such as |
||||
<structname>pg_database</></entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry><filename>pg_clog</></entry> |
||||
<entry>Subdirectory containing transaction commit status data</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry><filename>pg_subtrans</></entry> |
||||
<entry>Subdirectory containing subtransaction status data</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry><filename>pg_tblspc</></entry> |
||||
<entry>Subdirectory containing symbolic links to tablespaces</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry><filename>pg_xlog</></entry> |
||||
<entry>Subdirectory containing WAL (Write Ahead Log) files</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry><filename>postmaster.opts</></entry> |
||||
<entry>A file recording the command-line options the postmaster was |
||||
last started with</entry> |
||||
</row> |
||||
|
||||
<row> |
||||
<entry><filename>postmaster.pid</></entry> |
||||
<entry>A lock file recording the current postmaster PID and shared memory |
||||
segment ID (not present after postmaster shutdown)</entry> |
||||
</row> |
||||
|
||||
</tbody> |
||||
</tgroup> |
||||
</table> |
||||
|
||||
<para> |
||||
For each database in the cluster there is a subdirectory within |
||||
<varname>PGDATA</><filename>/base</>, named after the database's OID in |
||||
<structname>pg_database</>. This subdirectory is the default location |
||||
for the database's files; in particular, its system catalogs are stored |
||||
there. |
||||
</para> |
||||
|
||||
<para> |
||||
Each table and index is stored in a separate file, named after the table |
||||
or index's <firstterm>filenode</> number, which can be found in |
||||
<structname>pg_class</>.<structfield>relfilenode</>. |
||||
</para> |
||||
|
||||
<caution> |
||||
<para> |
||||
Note that while a table's filenode often matches its OID, this is |
||||
<emphasis>not</> necessarily the case; some operations, like |
||||
<command>TRUNCATE</>, <command>REINDEX</>, <command>CLUSTER</> and some forms |
||||
of <command>ALTER TABLE</>, can change the filenode while preserving the OID. |
||||
Avoid assuming that filenode and table OID are the same. |
||||
</para> |
||||
</caution> |
||||
|
||||
<para> |
||||
When a table or index exceeds 1Gb, it is divided into gigabyte-sized |
||||
<firstterm>segments</>. The first segment's file name is the same as the |
||||
filenode; subsequent segments are named filenode.1, filenode.2, etc. |
||||
This arrangement avoids problems on platforms that have file size limitations. |
||||
The contents of tables and indexes are discussed further in |
||||
<xref linkend="page">. |
||||
</para> |
||||
|
||||
<para> |
||||
A table that has columns with potentially large entries will have an |
||||
associated <firstterm>TOAST</> table, which is used for out-of-line storage of |
||||
field values that are too large to keep in the table rows proper. |
||||
<structname>pg_class</>.<structfield>reltoastrelid</> links from a table to |
||||
its TOAST table, if any. |
||||
</para> |
||||
|
||||
<para> |
||||
Tablespaces make the scenario more complicated. Each non-default tablespace |
||||
has a symbolic link inside the <varname>PGDATA</><filename>/pg_tblspc</> |
||||
directory, which points to the physical tablespace directory (as specified in |
||||
its <command>CREATE TABLESPACE</> command). The symbolic link is named after |
||||
the tablespace's OID. Inside the physical tablespace directory there is |
||||
a subdirectory for each database that has elements in the tablespace, named |
||||
after the database's OID. Tables within that directory follow the filenode |
||||
naming scheme. The <literal>pg_default</> tablespace is not accessed through |
||||
<filename>pg_tblspc</>, but corresponds to |
||||
<varname>PGDATA</><filename>/base</>. Similarly, the <literal>pg_global</> |
||||
tablespace is not accessed through <filename>pg_tblspc</>, but corresponds to |
||||
<varname>PGDATA</><filename>/global</>. |
||||
</para> |
||||
|
||||
</chapter> |
Loading…
Reference in new issue