On 17.04.20 20:40, Erik Rijkers wrote:
Very good stuff, and useful. I think.
I mean that but nevertheless here is a lot of comment :)
(I didn't fully compile as docs, just read the 'text' from the patch
file)
Thanks. Added nearly all of the suggestions.
--
Jürgen Purtz
diff --git a/doc/src/sgml/advanced.sgml b/doc/src/sgml/advanced.sgml
index ae5f3fac75..965eb751c0 100644
--- a/doc/src/sgml/advanced.sgml
+++ b/doc/src/sgml/advanced.sgml
@@ -1,7 +1,7 @@
<!-- doc/src/sgml/advanced.sgml -->
<chapter id="tutorial-advanced">
- <title>Advanced Features</title>
+ <title>Advanced SQL Features</title>
<sect1 id="tutorial-advanced-intro">
<title>Introduction</title>
diff --git a/doc/src/sgml/architecture.sgml b/doc/src/sgml/architecture.sgml
new file mode 100644
index 0000000000..81dedc90b4
--- /dev/null
+++ b/doc/src/sgml/architecture.sgml
@@ -0,0 +1,449 @@
+<!-- doc/src/sgml/architecture.sgml -->
+
+ <chapter id="tutorial-architecture">
+ <title>The Architecture</title>
+
+ <para>
+ Every DBMS implements basic strategies to achieve a fast and
+ robust system. This chapter provides an overview of what
+ techniques <productname>PostgreSQL</productname> uses to
+ reach this aim.
+ </para>
+
+ <sect1 id="tutorial-ram-proc-file">
+ <title>Collaboration of Processes, RAM, and Files</title>
+ <para>
+ As is a matter of course, in a client/server architecture
+ clients do not have direct access to the database. Instead,
+ they merely send requests to the server side and receives
+ according information from there. In the case of
+ <productname>PostgreSQL</productname>, at the server
+ side there is one process per client, the so-called
+ <glossterm linkend="glossary-backend">Backend process</glossterm>.
+ It acts in close cooperation with the
+ <glossterm linkend="glossary-instance">Instance</glossterm> which
+ is a group of tightly coupled other server side processes plus a
+ <glossterm linkend="glossary-shared-memory">Shared Memory</glossterm>
+ area.
+ </para>
+
+ <para>
+ At start time, an instance is initiated by the
+ <glossterm linkend="glossary-postmaster">Postmaster</glossterm> process.
+ It loads the configuration files, allocates the
+ <firstterm>Shared Memory</firstterm>
+ and starts the comprehensive network of processes:
+ <glossterm linkend="glossary-background-writer">Background Writer</glossterm>,
+ <glossterm linkend="glossary-checkpointer">Checkpointer</glossterm>,
+ <glossterm linkend="glossary-wal-writer">WAL Writer</glossterm>,
+ <glossterm linkend="glossary-wal-archiver">WAL Archiver</glossterm>,
+ <glossterm linkend="glossary-autovacuum">Autovacuum processes</glossterm>,
+ <glossterm linkend="glossary-stats-collector">Statistics Collector</glossterm>,
+ <glossterm linkend="glossary-logger">Logger</glossterm>, and more.
+ <xref linkend="tutorial-ram-proc-file-figure"/> visualizes
+ main aspects of their collaboration.
+ </para>
+
+ <figure id="tutorial-ram-proc-file-figure">
+ <title>Architecture</title>
+ <mediaobject>
+ <imageobject role="html">
+ <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+ in correlation with font-size of surrounding HTML -->
+ <imagedata fileref="images/ram-proc-file-raw.svg" format="SVG" width="900px" />
+ </imageobject>
+ <imageobject role="fo">
+ <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+ on the page, which has a fixed width. Font sizes will be adopted. -->
+ <imagedata fileref="images/ram-proc-file-raw.svg" format="SVG" width="100%" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>
+ Whenever a client application tries to connect to a
+ <glossterm linkend="glossary-database">database</glossterm>, this request is handled
+ in a first step by the <firstterm>Postmaster
+ process</firstterm>. It checks the authorization, starts a
+ new <firstterm>Backend process</firstterm>,
+ and instructs the client application to connect to it. All further
+ client requests go to this process and are handled
+ by it.
+ </para>
+
+ <para>
+ Client requests (SELECT, UPDATE, ...) usually leads to the
+ necessity to read or write some data. In a first attempt
+ the client's <firstterm>Backend process</firstterm> tries
+ to get the information out of <firstterm>Shared
+ Memory</firstterm>. This <firstterm>Shared
+ Memory</firstterm> is a mirror of parts of the
+ <glossterm linkend="glossary-heap">heap</glossterm> and
+ <glossterm linkend="glossary-index">index</glossterm> files. Because files are
+ much larger than memory, it's likely that
+ the desired information is not (completely) available
+ in the RAM. In this case the <firstterm>Backend process
+ </firstterm> must transfer additional file pages to
+ <firstterm>Shared Memory</firstterm>. Files are physically
+ organized in pages. Every transfer between files and
+ RAM is performed in units of complete pages, retaining
+ their size and layout.
+ </para>
+
+ <para>
+ Reading file pages is notedly slower than reading
+ RAM. This is the main motivation for the existence of
+ <firstterm>Shared Memory</firstterm>. As soon as one
+ of the <firstterm>Backend processes</firstterm> has done
+ the job those pages are available for all other
+ <firstterm>Backend processes</firstterm> for direct
+ access in RAM.
+ </para>
+
+ <para>
+ <firstterm>Shared Memory</firstterm> is limited in size.
+ Sooner or later it becomes necessary to overwrite old RAM
+ pages. As long as the content of such pages hasn't
+ changed this is not a problem. But in
+ <firstterm>Shared Memory</firstterm> also write
+ actions take place
+ - performed by any of the <firstterm>Backend
+ processes</firstterm> (or an
+ <glossterm linkend="glossary-autovacuum">autovacuum process</glossterm>,
+ or other processes). Such modified pages are called
+ <firstterm>dirty pages</firstterm>.
+ Before <firstterm>dirty pages</firstterm> can be overwritten,
+ they must be transferred back to disk. This is a two-step process.
+ </para>
+
+ <para>
+ First, whenever the content of a page changes, a
+ <glossterm linkend="glossary-wal-record">WAL record</glossterm> is created out
+ of the delta-information (difference between old and
+ new content) and stored in another area of the
+ <firstterm>Shared Memory</firstterm>. These
+ <firstterm>WAL records</firstterm> are read by the
+ <firstterm>WAL Writer</firstterm> process,
+ which runs in parallel to the <firstterm>Backend
+ processes</firstterm> and all other processes of
+ the <firstterm>Instance</firstterm>. It writes
+ the continuously arising <firstterm>WAL records</firstterm> to
+ the end of the current
+ <glossterm linkend="glossary-wal-record">WAL file</glossterm>.
+ Because of the sequential nature of this writing, it is much
+ faster than the more or less random access
+ to data files with <firstterm>heap</firstterm>
+ and <firstterm>index</firstterm> information.
+ As mentioned, this WAL-writing happens
+ in an independent process. Nevertheless all
+ <firstterm>WAL records</firstterm> created out of one
+ <firstterm>dirty page</firstterm> must be transferred
+ to disk before the <firstterm>dirty page</firstterm>
+ itself can be transferred to disk (???).
+ </para>
+
+ <para>
+ Second, the transfer of <firstterm>dirty pages</firstterm>
+ from <firstterm>Shared Memory</firstterm> to files must
+ take place. This is the primary duty of the
+ <firstterm>Background Writer</firstterm> process. Because
+ huge I/O activities can block other processes significantly,
+ it starts periodically and acts only for a short period.
+ Doing so, his expensive I/O activities are spread over
+ time avoiding huge I/O peaks. Also the <firstterm>
+ Checkpointer</firstterm> process transfers
+ <firstterm>dirty pages</firstterm> to files, see next
+ paragraph.
+ </para>
+
+ <para>
+ The <firstterm>Checkpointer</firstterm> has a special
+ duty. As its name suggests, he has to create
+ <firstterm>Checkpoints</firstterm>. Such a
+ <glossterm linkend="glossary-checkpoint">Checkpoint</glossterm> is a point in time
+ when all older <firstterm>dirty pages</firstterm>,
+ all older <firstterm>WAL records</firstterm>, and
+ lastly a special <firstterm>Checkpoint record
+ </firstterm> have been written and flushed to disk.
+ In consequence, after a <firstterm>Checkpoint</firstterm>
+ data files and <firstterm>WAL files</firstterm> are in sync.
+ In case of a recovery (after a crash of the instance)
+ it is known that the information of all
+ <firstterm>WAL records</firstterm> preceding
+ the last <firstterm>Checkpoint record</firstterm>
+ is already integrated into the data files. This
+ speeds up a possibly occurring recovery.
+ </para>
+
+ <para>
+ In correlation with data changes,
+ <firstterm>WAL records</firstterm> arise and are written
+ to <firstterm>WAL files</firstterm>.
+ Those <firstterm>WAL files</firstterm> - in combination with
+ a previously taken <firstterm>Base Backup</firstterm> -
+ are necessary to restore a database after a crash of the
+ disk, where data files have been stored. Therefore it is
+ recommended to transfer a copy of the <firstterm>
+ WAL files</firstterm>
+ to a second, independent place. The purpose of the
+ <firstterm>WAL Archiver</firstterm> process is to perform
+ this copy action.
+ </para>
+
+ <para>
+ The <glossterm linkend="glossary-stats-collector">Stats Collector</glossterm>
+ collects counters about accesses to <firstterm>SQL
+ objects</firstterm> like tables, rows, indexes, pages,
+ and more. It stores the obtained information in system
+ tables.
+ </para>
+
+ <para>
+ The <glossterm linkend="glossary-logger">Logger</glossterm> writes
+ text lines about serious and non-serious events which can happen
+ during database access, e.g.: wrong password, no permission,
+ long-running queries, ... .
+ </para>
+
+ </sect1>
+
+ <sect1 id="tutorial-cluster-db-schema">
+ <title>Cluster, Database, Schema</title>
+
+ <para>
+ On a <glossterm linkend="glossary-server">Server</glossterm>
+ exists one or more <glossterm linkend="glossary-cluster">Cluster</glossterm>,
+ each of them contains three or more
+ <glossterm linkend="glossary-database">databases</glossterm>, each
+ database contains many <glossterm linkend="glossary-schema">schema</glossterm>,
+ a schema contains <glossterm linkend="glossary-table">tables</glossterm>,
+ <glossterm linkend="glossary-view">views</glossterm>, and a lot of other objects.
+ Each <firstterm>table</firstterm> or <firstterm>view</firstterm>
+ belongs to a certain <firstterm>schema</firstterm>, they cannot
+ belong to another <firstterm>schema</firstterm>. The same is
+ true for the schema/database and database/cluster relation.
+ <xref linkend="tutorial-cluster-db-schema-figure"/> visualizes
+ this hierarchy.
+ </para>
+
+ <figure id="tutorial-cluster-db-schema-figure">
+ <title>Cluster, Database, Schema</title>
+ <mediaobject>
+ <imageobject role="html">
+ <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+ in correlation with font-size of surrounding HTML -->
+ <imagedata fileref="images/cluster-db-schema-raw.svg" format="SVG" width="900px" />
+ </imageobject>
+ <imageobject role="fo">
+ <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+ on the page, which has a fixed width. Font sizes will be adopted. -->
+ <imagedata fileref="images/cluster-db-schema-raw.svg" format="SVG" width="100%" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>
+ A <firstterm>Cluster</firstterm> is the outer frame for a
+ collection of databases. Clusters are created by the command
+ <xref linkend="app-initdb"/>.
+ </para>
+
+ <para>
+ <literal>template0</literal> is the very first
+ <firstterm>database</firstterm> of any
+ <firstterm>cluster</firstterm>. C-routines create
+ <literal>template0</literal> during the initialization phase of
+ the <firstterm>cluster</firstterm>.
+ In a second step <literal>template1</literal> is generated
+ as a copy of <literal>template0</literal> and finally
+ <literal>postgres</literal> as a copy of
+ <literal>template1</literal>. All other
+ <glossterm linkend="app-createdb">new databases</glossterm>
+ of this <firstterm>cluster</firstterm>,
+ such as <literal>my_db</literal>, are also copied from
+ <literal>template1</literal>. Due to the special
+ role of <literal>template0</literal> as the origin
+ of all other <firstterm>databases</firstterm>, no client
+ can connect to it.
+ </para>
+
+ <para>
+ Every database contains <glossterm linkend="glossary-schema">
+ schemas</glossterm>, and
+ <firstterm>schemas</firstterm> contain the other
+ <glossterm linkend="glossary-sql-object">SQL Objects</glossterm>.
+ <firstterm>Schemas</firstterm> are namespaces for
+ their <firstterm>SQL objects</firstterm> and ensure - with one
+ exception - that within their scope names are used only once across all
+ types of <firstterm>SQL objects</firstterm>. E.g., it is not possible
+ to have a table <literal>employee</literal> and a view
+ <literal>employee</literal> within the same
+ <firstterm>schema</firstterm>. But it is possible to have
+ two tables <literal>employee</literal> in different
+ <firstterm>schemas</firstterm>. In this case the two tables
+ are different objects and absolutely independent from each
+ other. The only exception to this cross-type uniqueness is that
+ <glossterm linkend="glossary-unique-constraint">unique constraints
+ </glossterm> and the according <firstterm>unique index</firstterm>
+ use the same name.
+ </para>
+
+ <para>
+ Some <firstterm>schemas</firstterm> are predefined.
+ <literal>public</literal> acts as the default
+ <firstterm>schema</firstterm> and contains all such
+ <firstterm>SQL objects</firstterm>, which are created
+ within <literal>public</literal> or without using any schema
+ name. <literal>public</literal> shall not contain user defined
+ <firstterm>SQL objects</firstterm>. Instead, it is recommended to
+ create a separate <firstterm>schema</firstterm> which
+ holds individual objects like application-specific tables or
+ views. <literal>pg_catalog</literal> is a schema for all tables
+ and views of the <glossterm linkend="glossary-system-catalog">
+ System Catalog</glossterm>.
+ <literal>information_schema</literal> is a schema for several
+ tables and views of the <firstterm>System Catalog</firstterm>
+ in a way which conforms to the SQL standard.
+ </para>
+
+ <para>
+ There are a lot of different <firstterm>SQL object</firstterm>
+ types: <firstterm>database, schema, table, view, materialized
+ view, index, constraint, sequence, function, procedure,
+ trigger, role, data type, operator, tablespace, extension,
+ foreign data wrapper</firstterm>, and more. A few of them, the
+ <glossterm linkend="glossary-global-sql-object">Global SQL Objects</glossterm>,
+ are outside of the strict hierarchy:
+ All database names, all tablespace names, and all role names
+ are automatically known and available throughout the
+ complete <firstterm>cluster</firstterm>, independent from
+ the database or schema in which they where originally
+ defined. <xref linkend="tutorial-internal-objects-hierarchy-figure"/>
+ shows the relation between the object types.
+ </para>
+
+ <figure id="tutorial-internal-objects-hierarchy-figure">
+ <title>Hierarchy of Internal Objects</title>
+ <mediaobject>
+ <imageobject role="html">
+ <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+ in correlation with font-size of surrounding HTML -->
+ <imagedata fileref="images/internal-objects-hierarchy-raw.svg" format="SVG" width="720px" />
+ </imageobject>
+ <imageobject role="fo">
+ <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+ on the page, which has a fixed width. Font sizes will be adopted. -->
+ <imagedata fileref="images/internal-objects-hierarchy-raw.svg" format="SVG" width="100%" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ </sect1>
+
+ <sect1 id="tutorial-directories">
+ <title>Directory Structure</title>
+
+ <para>
+ <productname>PostgreSQL</productname> organizes long lasting
+ data as well as volatile state information about transactions
+ or replication actions in the file system. Every
+ <firstterm>Cluster</firstterm> has its own root directory
+ anywhere in the file system. In many cases, the environment
+ variable <literal>PGDATA</literal> points to this directory.
+ The example of the following survey, which is shown in
+ <xref linkend="tutorial-directories-figure"/>, uses
+ <literal>data</literal> as the name of this root directory.
+ </para>
+
+ <figure id="tutorial-directories-figure">
+ <title>Directory Structure</title>
+ <mediaobject>
+ <imageobject role="html">
+ <!-- attribute 'width=..px' is necessary to keep font-size of SVG text
+ in correlation with font-size of surrounding HTML -->
+ <imagedata fileref="images/directories-raw.svg" format="SVG" width="900px" />
+ </imageobject>
+ <imageobject role="fo">
+ <!-- For PDF attribute 'width=100%' is necessary to keep complete SVG visible
+ on the page, which has a fixed width. Font sizes will be adopted. -->
+ <imagedata fileref="images/directories-raw.svg" format="SVG" width="100%" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>
+ <literal>data</literal> contains many subdirectories and
+ some files, all of which are necessary to store long lasting
+ as well as temporary data. The following paragraphs
+ describe the files and subdirectories in
+ <literal>data</literal>.
+ </para>
+
+ <para>
+ <literal>base</literal> is a subdirectory in which one
+ subdirectory per <firstterm>database</firstterm> exists.
+ The names of those subdirectories consist of numbers.
+ These are the internal
+ <firstterm>Object Identifiers (OID)</firstterm>, which are
+ numbers to identify the database definition in the
+ <glossterm linkend="glossary-system-catalog">System Catalog</glossterm>.
+ </para>
+
+ <para>
+ Within the <firstterm>database</firstterm>-specific
+ subdirectories there are many files. Primarily they contain
+ the <firstterm>heap</firstterm> and <firstterm>
+ index</firstterm>. But there are also optimization information
+ like <link linkend="storage-fsm">Free Space Maps</link> or
+ <link linkend="storage-vm">Visibility Maps</link>.
+ </para>
+
+ <para>
+ Another important subdirectory is <literal>global</literal>.
+ In analogy to the <firstterm>database</firstterm>-specific
+ subdirectories, there are files containing information about
+ <glossterm linkend="glossary-global-sql-object">Global SQL objects</glossterm>.
+ One type
+ of such <firstterm>Global Objects</firstterm> are
+ <firstterm>tablespaces</firstterm>. In
+ <literal>global</literal> there is information about
+ the <firstterm>tablespaces</firstterm>, not the
+ <firstterm>tablespaces</firstterm> itself.
+ </para>
+
+ <para>
+ The subdirectory <literal>pg_wal</literal> contains the
+ <glossterm linkend="glossary-wal-file">WAL files</glossterm>.
+ They arise and grow parallel to data changes in the
+ <firstterm>cluster</firstterm> and remain alive as long as
+ they are required for recovery, archiving, or replication.
+ </para>
+
+ <para>
+ The subdirectory <literal>pg_xact</literal> contains
+ information about the status of each transaction
+ (IN_PROGRESS, COMMITTED, ABORTED, or SUB_COMMITTED).
+ </para>
+
+ <para>
+ In <literal>pg_tblspc</literal> there are symbolic links
+ that point to directories containing such<firstterm>
+ SQL objects</firstterm> that are created within
+ <firstterm>tablespaces</firstterm>.
+ </para>
+
+ <para>
+ In the directory <literal>data</literal>
+ there are also some files.
+ In many cases, the configuration
+ files of this <firstterm>cluster</firstterm>
+ are stored here. As long as the <firstterm>
+ cluster</firstterm> is up and running, the file
+ <literal>postmaster.pid</literal> exists here
+ and contains the ID (pid) of the
+ <firstterm>Postmaster</firstterm> process.
+ </para>
+
+ </sect1>
+
+ </chapter>
diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 68179f71cd..ca29c8bc4e 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -8,9 +8,10 @@
<!ENTITY problems SYSTEM "problems.sgml">
<!-- tutorial -->
-<!ENTITY advanced SYSTEM "advanced.sgml">
-<!ENTITY query SYSTEM "query.sgml">
-<!ENTITY start SYSTEM "start.sgml">
+<!ENTITY start SYSTEM "start.sgml">
+<!ENTITY architecture SYSTEM "architecture.sgml">
+<!ENTITY query SYSTEM "query.sgml">
+<!ENTITY advanced SYSTEM "advanced.sgml">
<!-- user's guide -->
<!ENTITY array SYSTEM "array.sgml">
diff --git a/doc/src/sgml/glossary.sgml b/doc/src/sgml/glossary.sgml
index 8c6cb6e942..25762b7c3a 100644
--- a/doc/src/sgml/glossary.sgml
+++ b/doc/src/sgml/glossary.sgml
@@ -208,15 +208,6 @@
</glossdef>
</glossentry>
- <glossentry id="glossary-checkpointer">
- <glossterm>Checkpointer (process)</glossterm>
- <glossdef>
- <para>
- A specialized process responsible for executing checkpoints.
- </para>
- </glossdef>
- </glossentry>
-
<glossentry id="glossary-checkpoint">
<glossterm>Checkpoint</glossterm>
<glossdef>
@@ -244,6 +235,15 @@
</glossdef>
</glossentry>
+ <glossentry id="glossary-checkpointer">
+ <glossterm>Checkpointer (process)</glossterm>
+ <glossdef>
+ <para>
+ A specialized process responsible for executing checkpoints.
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry>
<glossterm>Class (archaic)</glossterm>
<glosssee otherterm="glossary-relation" />
@@ -761,25 +761,6 @@
</glossdef>
</glossentry>
- <glossentry id="glossary-logger">
- <glossterm>Logger (process)</glossterm>
- <glossdef>
- <para>
- If activated, the
- <glossterm linkend="glossary-logger">Logger</glossterm> process
- writes information about database events into the current
- <glossterm linkend="glossary-log-file">log file</glossterm>.
- When reaching certain time- or
- volume-dependent criteria, a new log file is created.
- Also called <firstterm>syslogger</firstterm>.
- </para>
- <para>
- For more information, see
- <xref linkend="runtime-config-logging"/>.
- </para>
- </glossdef>
- </glossentry>
-
<glossentry id="glossary-log-record">
<glossterm>Log Record</glossterm>
<glossdef>
@@ -803,6 +784,25 @@
</glossdef>
</glossentry>
+ <glossentry id="glossary-logger">
+ <glossterm>Logger (process)</glossterm>
+ <glossdef>
+ <para>
+ If activated, the
+ <glossterm linkend="glossary-logger">Logger</glossterm> process
+ writes information about database events into the current
+ <glossterm linkend="glossary-log-file">log file</glossterm>.
+ When reaching certain time- or
+ volume-dependent criteria, a new log file is created.
+ Also called <firstterm>syslogger</firstterm>.
+ </para>
+ <para>
+ For more information, see
+ <xref linkend="runtime-config-logging"/>.
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry>
<glossterm>Master (server)</glossterm>
<glosssee otherterm="glossary-primary-server" />
@@ -1651,6 +1651,11 @@
</glossdef>
</glossentry>
+ <glossentry>
+ <glossterm>WAL</glossterm>
+ <glosssee otherterm="glossary-wal" />
+ </glossentry>
+
<glossentry id="glossary-wal-archiver">
<glossterm>WAL Archiver (process)</glossterm>
<glossdef>
@@ -1696,11 +1701,6 @@
</glossdef>
</glossentry>
- <glossentry>
- <glossterm>WAL</glossterm>
- <glosssee otherterm="glossary-wal" />
- </glossentry>
-
<glossentry id="glossary-wal-record">
<glossterm>WAL Record</glossterm>
<glossdef>
@@ -1728,8 +1728,8 @@
<glossdef>
<para>
A process that writes <glossterm linkend="glossary-wal-record">WAL records</glossterm>
- from <glossterm id="linkend-shared-memory">shared memory</glossterm> to
- <glossterm id="linkend-wal-file">WAL files</glossterm>.
+ from <glossterm linkend="glossary-shared-memory">shared memory</glossterm> to
+ <glossterm linkend="glossary-wal-file">WAL files</glossterm>.
</para>
<para>
For more information, see
diff --git a/doc/src/sgml/images/cluster-db-schema-ink-svgo.svg b/doc/src/sgml/images/cluster-db-schema-ink-svgo.svg
new file mode 100644
index 0000000000..6acb2b69fe
--- /dev/null
+++ b/doc/src/sgml/images/cluster-db-schema-ink-svgo.svg
@@ -0,0 +1,160 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900" height="685" viewBox="0 0 900 685">
+ <title>
+ Server (Hardware, Container, or VM)
+ </title>
+ <style>
+ .text_normal,.text_small{font-style:normal;font-weight:400;font-family:"Open Sans",sans-serif;fill:#000}.text_small{font-size:12px}.text_normal{font-size:16px}
+ </style>
+ <defs>
+ <symbol id="rectangles_special_0">
+ <rect width="225" height="155" rx="10" stroke="blue" fill="none"/>
+ <rect x="15" y="40" width="195" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2"/>
+ <text class="text_normal" x="20" y="60">
+ schema 'public'
+ </text>
+ <text class="text_small" x="20" y="80">
+ tables, views, ...
+ </text>
+ <rect x="15" y="105" width="195" height="30" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2"/>
+ <text class="text_small" x="20" y="125">
+ (more system schemas)
+ </text>
+ </symbol>
+ <symbol id="rectangles_special_1">
+ <rect width="245" height="225" rx="10" stroke="blue" fill="none"/>
+ <rect x="15" y="40" width="205" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2"/>
+ <text class="text_normal" x="20" y="60">
+ schema 'public'
+ </text>
+ <text class="text_small" x="20" y="80">
+ tables, views, ...
+ </text>
+ <rect x="15" y="105" width="205" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2"/>
+ <text class="text_normal" x="20" y="125">
+ 'my_schema' (optional)
+ </text>
+ <text class="text_small" x="20" y="145">
+ tables, views, ...
+ </text>
+ <rect x="15" y="170" width="205" height="30" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2"/>
+ <text class="text_small" x="20" y="190">
+ (more system schemas)
+ </text>
+ </symbol>
+ <symbol id="note" stroke="black" fill="lightyellow">
+ <title>
+ UML Note
+ </title>
+ <path d="M450 10v230H0V0h440v10h10L440 0"/>
+ </symbol>
+ <marker id="arrowhead_end" markerWidth="10" markerHeight="10" refX="6" refY="3" orient="auto">
+ <path d="M0 0l6 3-6 3" stroke="black" fill="none"/>
+ </marker>
+ </defs>
+ <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none"/>
+ <text x="270" y="40" font-weight="400" font-size="24" font-family=""Open Sans",sans-serif">
+ Server (Hardware, Container, or VM)
+ </text>
+ <path stroke="blue" stroke-width="2" fill="none" d="M20 110h790v555H20z"/>
+ <text class="text_normal" x="180" y="25" transform="translate(20 110)">
+ cluster 'data' (default, managed by one instance)
+ </text>
+ <path d="M50 110V80h790v555h-30" stroke="blue" stroke-width="2" fill="none"/>
+ <text class="text_normal" x="190" y="-10" transform="translate(45 110)">
+ cluster 'cluster_2' (optional, managed by a different instance)
+ </text>
+ <g transform="translate(40 155)">
+ <use xlink:href="#rectangles_special_0"/>
+ <text class="text_normal" x="10" y="25">
+ database 'template0'
+ </text>
+ </g>
+ <g transform="translate(290 155)">
+ <use xlink:href="#rectangles_special_0"/>
+ <text class="text_normal" x="10" y="25">
+ database 'template1'
+ </text>
+ </g>
+ <g transform="translate(540 155)">
+ <use xlink:href="#rectangles_special_1"/>
+ <text class="text_normal" x="10" y="25">
+ database 'postgres'
+ </text>
+ </g>
+ <g transform="translate(40 350)">
+ <use xlink:href="#rectangles_special_1"/>
+ <text class="text_normal" x="10" y="25">
+ database 'my_db' (optional)
+ </text>
+ </g>
+ <g transform="translate(320 330)">
+ <rect width="180" height="45" rx="10" stroke="blue" fill="none" stroke-dasharray="10 4 4 4"/>
+ <text class="text_normal" x="15" y="27">
+ Global SQL objects
+ </text>
+ <path d="M0 5l-65-35" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M80 0v-30" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M180 40h50" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M0 40l-45 20" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ </g>
+ <g transform="translate(335 405)">
+ <use xlink:href="#note"/>
+ <text class="text_small" x="10" y="20">
+ 1)
+ </text>
+ <text class="text_small" x="30" y="20">
+ By default, you work in the cluster 'data', database 'postgres',
+ </text>
+ <text class="text_small" x="30" y="35">
+ schema 'public'.
+ </text>
+ <text class="text_small" x="10" y="55">
+ 2)
+ </text>
+ <text class="text_small" x="30" y="55">
+ More system schemas: pg_catalog, information_schema,
+ </text>
+ <text class="text_small" x="30" y="70">
+ pg_temp, pg_toast.
+ </text>
+ <text class="text_small" x="10" y="90">
+ 3)
+ </text>
+ <text class="text_small" x="30" y="90">
+ Global SQL objects: Some SQL objects are automatically active
+ </text>
+ <text class="text_small" x="30" y="105">
+ and known database- or even cluster-wide.
+ </text>
+ <text class="text_small" x="10" y="125">
+ 4)
+ </text>
+ <text class="text_small" x="30" y="125">
+ The command 'initdb' creates a new cluster with the three
+ </text>
+ <text class="text_small" x="30" y="140">
+ databases 'template0', 'template1', and 'postgres'. The command
+ </text>
+ <text class="text_small" x="30" y="155">
+ 'createdb' creates a new database.
+ </text>
+ <text class="text_small" x="10" y="175">
+ 5)
+ </text>
+ <text class="text_small" x="30" y="175">
+ If multiple clusters are active on one server at the same time,
+ </text>
+ <text class="text_small" x="30" y="190">
+ each one is managed by an individual instance. Each such instance
+ </text>
+ <text class="text_small" x="30" y="205">
+ uses a different port.
+ </text>
+ <text class="text_small" x="10" y="225">
+ 6)
+ </text>
+ <text class="text_small" x="30" y="225">
+ No client application is allowed to connect to 'template0'.
+ </text>
+ </g>
+</svg>
diff --git a/doc/src/sgml/images/cluster-db-schema-ink.svg b/doc/src/sgml/images/cluster-db-schema-ink.svg
new file mode 100644
index 0000000000..a70fbe2102
--- /dev/null
+++ b/doc/src/sgml/images/cluster-db-schema-ink.svg
@@ -0,0 +1,482 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="900px"
+ height="685px"
+ viewBox="0 0 900 685"
+ id="svg147"
+ sodipodi:docname="cluster-db-schema-ink.svg"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)">
+ <metadata
+ id="metadata151">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Server (Hardware, Container, or VM)</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="640"
+ inkscape:window-height="480"
+ id="namedview149"
+ showgrid="false"
+ inkscape:zoom="0.34452555"
+ inkscape:cx="450"
+ inkscape:cy="342.5"
+ inkscape:window-x="61"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg147" />
+ <title
+ id="title2">Server (Hardware, Container, or VM)</title>
+ <!-- common text classes -->
+ <style
+ type="text/css"
+ id="style4">
+ .text_small {font-style:normal;
+ font-weight:normal;
+ font-size:12px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_normal {font-style:normal;
+ font-weight:normal;
+ font-size:16px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_big {font-style:normal;
+ font-weight:normal;
+ font-size:24px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ </style>
+ <defs
+ id="defs49">
+ <!-- a rectangle with rounded corners and inner definitions for schemas -->
+ <symbol
+ id="rectangles_special_0">
+ <!-- the database -->
+ <rect
+ width="225"
+ height="155"
+ rx="10"
+ stroke="blue"
+ fill="none"
+ id="rect6" />
+ <!-- schemas -->
+ <rect
+ x="15"
+ y="40"
+ width="195"
+ height="50"
+ rx="10"
+ stroke="blue"
+ fill="none"
+ stroke-dasharray="4 2"
+ id="rect8" />
+ <text
+ class="text_normal"
+ x="20"
+ y="60"
+ id="text10">schema 'public'</text>
+ <text
+ class="text_small"
+ x="20"
+ y="80"
+ id="text12">tables, views, ...</text>
+ <rect
+ x="15"
+ y="105"
+ width="195"
+ height="30"
+ rx="10"
+ stroke="blue"
+ fill="none"
+ stroke-dasharray="4 2"
+ id="rect14" />
+ <text
+ class="text_small"
+ x="20"
+ y="125"
+ id="text16">(more system schemas)</text>
+ </symbol>
+ <!-- same as before, but one more schema -->
+ <symbol
+ id="rectangles_special_1">
+ <!-- the database -->
+ <rect
+ width="245"
+ height="225"
+ rx="10"
+ stroke="blue"
+ fill="none"
+ id="rect19" />
+ <!-- schemas -->
+ <rect
+ x="15"
+ y="40"
+ width="205"
+ height="50"
+ rx="10"
+ stroke="blue"
+ fill="none"
+ stroke-dasharray="4 2"
+ id="rect21" />
+ <text
+ class="text_normal"
+ x="20"
+ y="60"
+ id="text23">schema 'public'</text>
+ <text
+ class="text_small"
+ x="20"
+ y="80"
+ id="text25">tables, views, ...</text>
+ <rect
+ x="15"
+ y="105"
+ width="205"
+ height="50"
+ rx="10"
+ stroke="blue"
+ fill="none"
+ stroke-dasharray="4 2"
+ id="rect27" />
+ <text
+ class="text_normal"
+ x="20"
+ y="125"
+ id="text29">'my_schema' (optional)</text>
+ <text
+ class="text_small"
+ x="20"
+ y="145"
+ id="text31">tables, views, ...</text>
+ <rect
+ x="15"
+ y="170"
+ width="205"
+ height="30"
+ rx="10"
+ stroke="blue"
+ fill="none"
+ stroke-dasharray="4 2"
+ id="rect33" />
+ <text
+ class="text_small"
+ x="20"
+ y="190"
+ id="text35">(more system schemas)</text>
+ </symbol>
+ <symbol
+ id="note"
+ stroke="black"
+ fill="lightyellow">
+ <title
+ id="title38">UML Note</title>
+ <path
+ d="M 450,10 v 230 h -450 v -240 h 440 v 10 h 10 l -10,-10"
+ id="path40" />
+ </symbol>
+ <!-- marker start/end -->
+ <marker
+ id="arrowhead_start"
+ markerWidth="10"
+ markerHeight="10"
+ refX="0"
+ refY="3"
+ orient="auto">
+ <path
+ d="M 6,0 l -6,3 l 6,3"
+ stroke="black"
+ fill="none"
+ id="path43" />
+ </marker>
+ <marker
+ id="arrowhead_end"
+ markerWidth="10"
+ markerHeight="10"
+ refX="6"
+ refY="3"
+ orient="auto">
+ <path
+ d="M 0,0 l 6,3 l -6,3"
+ stroke="black"
+ fill="none"
+ id="path46" />
+ </marker>
+ </defs>
+ <!-- start of rendering area -->
+ <!-- enclosing rectangle -->
+ <rect
+ x="1"
+ y="1"
+ rx="5"
+ width="99%"
+ height="99%"
+ stroke="black"
+ fill="none"
+ id="rect51" />
+ <text
+ class="text_big"
+ x="270"
+ y="40"
+ id="text53">Server (Hardware, Container, or VM)</text>
+ <!-- two clusters -->
+ <g
+ transform="translate(20 110)"
+ id="g59">
+ <rect
+ x="0"
+ y="0"
+ width="790"
+ height="555"
+ stroke="blue"
+ stroke-width="2px"
+ fill="none"
+ id="rect55" />
+ <text
+ class="text_normal"
+ x="180"
+ y="25"
+ id="text57">cluster 'data' (default, managed by one instance)</text>
+ </g>
+ <g
+ transform="translate(45 110)"
+ id="g65">
+ <path
+ d="M 5,0 v -30 h 790 v 555 h -30"
+ stroke="blue"
+ stroke-width="2px"
+ fill="none"
+ id="path61" />
+ <text
+ class="text_normal"
+ x="190"
+ y="-10"
+ id="text63">cluster 'cluster_2' (optional, managed by a different instance)</text>
+ </g>
+ <!-- database template 0 -->
+ <g
+ transform="translate(40 155)"
+ id="g71">
+ <use
+ xlink:href="#rectangles_special_0"
+ id="use67" />
+ <text
+ class="text_normal"
+ x="10"
+ y="25"
+ id="text69">database 'template0'</text>
+ </g>
+ <!-- database template 1 -->
+ <g
+ transform="translate(290 155)"
+ id="g77">
+ <use
+ xlink:href="#rectangles_special_0"
+ id="use73" />
+ <text
+ class="text_normal"
+ x="10"
+ y="25"
+ id="text75">database 'template1'</text>
+ </g>
+ <!-- database postgres -->
+ <g
+ transform="translate(540 155)"
+ id="g83">
+ <use
+ xlink:href="#rectangles_special_1"
+ id="use79" />
+ <text
+ class="text_normal"
+ x="10"
+ y="25"
+ id="text81">database 'postgres'</text>
+ </g>
+ <!-- database my_db -->
+ <g
+ transform="translate(40 350)"
+ id="g89">
+ <use
+ xlink:href="#rectangles_special_1"
+ id="use85" />
+ <text
+ class="text_normal"
+ x="10"
+ y="25"
+ id="text87">database 'my_db' (optional)</text>
+ </g>
+ <!-- global objects -->
+ <g
+ transform="translate(320 330)"
+ id="g103">
+ <rect
+ x="0"
+ y="0"
+ width="180"
+ height="45"
+ rx="10"
+ stroke="blue"
+ fill="none"
+ stroke-dasharray="10 4 4 4"
+ id="rect91" />
+ <text
+ class="text_normal"
+ x="15"
+ y="27"
+ id="text93">Global SQL objects</text>
+ <path
+ d="M 0,5 l-65,-35"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path95" />
+ <path
+ d="M 80,0 v-30"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path97" />
+ <path
+ d="M 180,40 h50"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path99" />
+ <path
+ d="M 0,40 l-45,20"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path101" />
+ </g>
+ <!-- Some comments -->
+ <g
+ transform="translate(335 405)"
+ id="g145">
+ <use
+ xlink:href="#note"
+ x="0"
+ y="0"
+ id="use105" />
+ <text
+ class="text_small"
+ x="10"
+ y="20"
+ id="text107">1)</text>
+ <text
+ class="text_small"
+ x="30"
+ y="20"
+ id="text109">By default, you work in the cluster 'data', database 'postgres',</text>
+ <text
+ class="text_small"
+ x="30"
+ y="35"
+ id="text111">schema 'public'.</text>
+ <text
+ class="text_small"
+ x="10"
+ y="55"
+ id="text113">2)</text>
+ <text
+ class="text_small"
+ x="30"
+ y="55"
+ id="text115">More system schemas: pg_catalog, information_schema,</text>
+ <text
+ class="text_small"
+ x="30"
+ y="70"
+ id="text117">pg_temp, pg_toast.</text>
+ <text
+ class="text_small"
+ x="10"
+ y="90"
+ id="text119">3)</text>
+ <text
+ class="text_small"
+ x="30"
+ y="90"
+ id="text121">Global SQL objects: Some SQL objects are automatically active</text>
+ <text
+ class="text_small"
+ x="30"
+ y="105"
+ id="text123">and known database- or even cluster-wide.</text>
+ <text
+ class="text_small"
+ x="10"
+ y="125"
+ id="text125">4)</text>
+ <text
+ class="text_small"
+ x="30"
+ y="125"
+ id="text127">The command 'initdb' creates a new cluster with the three</text>
+ <text
+ class="text_small"
+ x="30"
+ y="140"
+ id="text129">databases 'template0', 'template1', and 'postgres'. The command</text>
+ <text
+ class="text_small"
+ x="30"
+ y="155"
+ id="text131">'createdb' creates a new database.</text>
+ <text
+ class="text_small"
+ x="10"
+ y="175"
+ id="text133">5)</text>
+ <text
+ class="text_small"
+ x="30"
+ y="175"
+ id="text135">If multiple clusters are active on one server at the same time,</text>
+ <text
+ class="text_small"
+ x="30"
+ y="190"
+ id="text137">each one is managed by an individual instance. Each such instance</text>
+ <text
+ class="text_small"
+ x="30"
+ y="205"
+ id="text139">uses a different port.</text>
+ <text
+ class="text_small"
+ x="10"
+ y="225"
+ id="text141">6)</text>
+ <text
+ class="text_small"
+ x="30"
+ y="225"
+ id="text143">No client application is allowed to connect to 'template0'.</text>
+ </g>
+</svg>
diff --git a/doc/src/sgml/images/cluster-db-schema-raw.svg b/doc/src/sgml/images/cluster-db-schema-raw.svg
new file mode 100644
index 0000000000..a4919165e2
--- /dev/null
+++ b/doc/src/sgml/images/cluster-db-schema-raw.svg
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="900px" height="685px"
+ viewBox="0 0 900 685" >
+
+ <title>Server (Hardware, Container, or VM)</title>
+
+ <!-- common text classes -->
+ <style type="text/css">
+ .text_small {font-style:normal;
+ font-weight:normal;
+ font-size:12px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_normal {font-style:normal;
+ font-weight:normal;
+ font-size:16px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_big {font-style:normal;
+ font-weight:normal;
+ font-size:24px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ </style>
+
+ <defs>
+ <!-- a rectangle with rounded corners and inner definitions for schemas -->
+ <symbol id="rectangles_special_0">
+
+ <!-- the database -->
+ <rect width="225" height="155" rx="10" stroke="blue" fill="none"/>
+
+ <!-- schemas -->
+ <rect x="15" y="40" width="195" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2" />
+ <text class="text_normal" x="20" y="60">schema 'public'</text>
+ <text class="text_small" x="20" y="80">tables, views, ...</text>
+
+ <rect x="15" y="105" width="195" height="30" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2" />
+ <text class="text_small" x="20" y="125">(more system schemas)</text>
+ </symbol>
+
+ <!-- same as before, but one more schema -->
+ <symbol id="rectangles_special_1">
+ <!-- the database -->
+ <rect width="245" height="225" rx="10" stroke="blue" fill="none"/>
+
+ <!-- schemas -->
+ <rect x="15" y="40" width="205" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2" />
+ <text class="text_normal" x="20" y="60">schema 'public'</text>
+ <text class="text_small" x="20" y="80">tables, views, ...</text>
+
+ <rect x="15" y="105" width="205" height="50" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2" />
+ <text class="text_normal" x="20" y="125">'my_schema' (optional)</text>
+ <text class="text_small" x="20" y="145">tables, views, ...</text>
+
+ <rect x="15" y="170" width="205" height="30" rx="10" stroke="blue" fill="none" stroke-dasharray="4 2" />
+ <text class="text_small" x="20" y="190">(more system schemas)</text>
+ </symbol>
+
+ <symbol id="note" stroke="black" fill="lightyellow">
+ <title>UML Note</title>
+ <path d="M 450,10 v 230 h -450 v -240 h 440 v 10 h 10 l -10,-10" />
+ </symbol>
+
+ <!-- marker start/end -->
+ <marker id="arrowhead_start"
+ markerWidth="10"
+ markerHeight="10"
+ refX="0"
+ refY="3"
+ orient="auto">
+ <path d="M 6,0 l -6,3 l 6,3" stroke="black" fill="none" />
+ </marker>
+ <marker id="arrowhead_end"
+ markerWidth="10"
+ markerHeight="10"
+ refX="6"
+ refY="3"
+ orient="auto">
+ <path d="M 0,0 l 6,3 l -6,3" stroke="black" fill="none" />
+ </marker>
+
+ </defs>
+
+
+ <!-- start of rendering area -->
+ <!-- enclosing rectangle -->
+ <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none" />
+ <text class="text_big" x="270" y="40">Server (Hardware, Container, or VM)</text>
+
+ <!-- two clusters -->
+ <g transform="translate(20 110)">
+ <rect x="0" y="0" width="790" height="555" stroke="blue" stroke-width="2px" fill="none" />
+ <text class="text_normal" x="180" y="25">cluster 'data' (default, managed by one instance)</text>
+ </g>
+ <g transform="translate(45 110)">
+ <path d="M 5,0 v -30 h 790 v 555 h -30" stroke="blue" stroke-width="2px" fill="none" />
+ <text class="text_normal" x="190" y="-10">cluster 'cluster_2' (optional, managed by a different instance)</text>
+ </g>
+
+
+ <!-- database template 0 -->
+ <g transform="translate(40 155)">
+ <use xlink:href="#rectangles_special_0" />
+ <text class="text_normal" x="10" y="25">database 'template0'</text>
+ </g>
+
+ <!-- database template 1 -->
+ <g transform="translate(290 155)">
+ <use xlink:href="#rectangles_special_0" />
+ <text class="text_normal" x="10" y="25">database 'template1'</text>
+ </g>
+
+ <!-- database postgres -->
+ <g transform="translate(540 155)">
+ <use xlink:href="#rectangles_special_1" />
+ <text class="text_normal" x="10" y="25">database 'postgres'</text>
+ </g>
+
+ <!-- database my_db -->
+ <g transform="translate(40 350)">
+ <use xlink:href="#rectangles_special_1" />
+ <text class="text_normal" x="10" y="25">database 'my_db' (optional)</text>
+ </g>
+
+ <!-- global objects -->
+ <g transform="translate(320 330)">
+ <rect x="0" y="0" width="180" height="45" rx="10" stroke="blue" fill="none" stroke-dasharray="10 4 4 4" />
+ <text class="text_normal" x="15" y="27">Global SQL objects</text>
+ <path d="M 0,5 l-65,-35" stroke="black" fill="none" marker-end="url(#arrowhead_end)" />
+ <path d="M 80,0 v-30" stroke="black" fill="none" marker-end="url(#arrowhead_end)" />
+ <path d="M 180,40 h50" stroke="black" fill="none" marker-end="url(#arrowhead_end)" />
+ <path d="M 0,40 l-45,20" stroke="black" fill="none" marker-end="url(#arrowhead_end)" />
+ </g>
+
+ <!-- Some comments -->
+ <g transform="translate(335 405)">
+ <use xlink:href="#note" x="0" y="0" />
+
+ <text class="text_small" x="10" y="20">1)</text>
+ <text class="text_small" x="30" y="20">By default, you work in the cluster 'data', database 'postgres',</text>
+ <text class="text_small" x="30" y="35">schema 'public'.</text>
+
+ <text class="text_small" x="10" y="55">2)</text>
+ <text class="text_small" x="30" y="55">More system schemas: pg_catalog, information_schema,</text>
+ <text class="text_small" x="30" y="70">pg_temp, pg_toast.</text>
+
+ <text class="text_small" x="10" y="90">3)</text>
+ <text class="text_small" x="30" y="90">Global SQL objects: Some SQL objects are automatically active</text>
+ <text class="text_small" x="30" y="105">and known database- or even cluster-wide.</text>
+
+ <text class="text_small" x="10" y="125">4)</text>
+ <text class="text_small" x="30" y="125">The command 'initdb' creates a new cluster with the three</text>
+ <text class="text_small" x="30" y="140">databases 'template0', 'template1', and 'postgres'. The command</text>
+ <text class="text_small" x="30" y="155">'createdb' creates a new database.</text>
+
+ <text class="text_small" x="10" y="175">5)</text>
+ <text class="text_small" x="30" y="175">If multiple clusters are active on one server at the same time,</text>
+ <text class="text_small" x="30" y="190">each one is managed by an individual instance. Each such instance</text>
+ <text class="text_small" x="30" y="205">uses a different port.</text>
+
+ <text class="text_small" x="10" y="225">6)</text>
+ <text class="text_small" x="30" y="225">No client application is allowed to connect to 'template0'.</text>
+
+ </g>
+
+</svg>
diff --git a/doc/src/sgml/images/directories-ink-svgo.svg b/doc/src/sgml/images/directories-ink-svgo.svg
new file mode 100644
index 0000000000..95fa76b9c6
--- /dev/null
+++ b/doc/src/sgml/images/directories-ink-svgo.svg
@@ -0,0 +1,164 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900" height="640" viewBox="0 0 900 640">
+ <title>
+ Directory structure of a cluster
+ </title>
+ <style>
+ .text_normal{font-style:normal;font-weight:400;font-size:16px;font-family:"Open Sans",sans-serif;fill:#000}
+ </style>
+ <defs>
+ <symbol id="directory" stroke="blue" stroke-width=".3" fill="aqua">
+ <title>
+ Directory
+ </title>
+ <path d="M0 10h110v20H0z"/>
+ <path d="M0 10V8l3-3h35l3 3v2"/>
+ </symbol>
+ <symbol id="file" stroke="black" fill="none">
+ <title>
+ File
+ </title>
+ <path stroke="blue" d="M0 0h40v50H0z"/>
+ <path d="M5 10h20" stroke-dasharray="4 2"/>
+ <path d="M5 17h15" stroke-dasharray="6 2"/>
+ <path d="M5 24h25" stroke-dasharray="4 2"/>
+ <path d="M5 31h20" stroke-dasharray="5 2"/>
+ </symbol>
+ </defs>
+ <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none"/>
+ <text x="200" y="50" font-weight="400" font-size="24" font-family=""Open Sans",sans-serif">
+ Directory Structure
+ </text>
+ <g transform="translate(20 100)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ ... /pg/
+ </text>
+ <text x="300" y="26" class="text_normal">
+ An arbitrary directory
+ </text>
+ </g>
+ <g transform="translate(70 130)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ data/
+ </text>
+ <text x="250" y="26" class="text_normal">
+ Root of cluster 'data' (see: PGDATA)
+ </text>
+ </g>
+ <g transform="translate(120 160)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ base/
+ </text>
+ <text x="200" y="26" class="text_normal">
+ Subdirectory containing per-database subdirectories
+ </text>
+ </g>
+ <g transform="translate(170 190)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ 1/
+ </text>
+ <text x="150" y="26" class="text_normal">
+ Subdirectory for data of first database 'template0'
+ </text>
+ </g>
+ <g transform="translate(170 220)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ 12992/
+ </text>
+ <text x="150" y="26" class="text_normal">
+ Subdirectory for data of second database 'template1'
+ </text>
+ </g>
+ <g transform="translate(170 250)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ 12999/
+ </text>
+ <text x="150" y="26" class="text_normal">
+ Subdirectory for data of third database 'postgres'
+ </text>
+ </g>
+ <g transform="translate(170 280)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ nnnnn/
+ </text>
+ <text x="150" y="26" class="text_normal">
+ Optional: more subdirectories for databases, e.g. 'my_db'
+ </text>
+ </g>
+ <g transform="translate(120 310)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ global/
+ </text>
+ <text x="200" y="26" class="text_normal">
+ Subdirectory with information about Global SQL Objects
+ </text>
+ </g>
+ <g transform="translate(120 340)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ pg_wal/
+ </text>
+ <text x="200" y="26" class="text_normal">
+ Subdirectory for Write Ahead Log files ('pg_xlog' before version 10)
+ </text>
+ </g>
+ <g transform="translate(120 370)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ pg_xact/
+ </text>
+ <text x="200" y="26" class="text_normal">
+ Subdirectory for transaction commit status ('pg_clog' before version 10)
+ </text>
+ </g>
+ <g transform="translate(120 400)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ pg_tblspc/
+ </text>
+ <text x="200" y="26" class="text_normal">
+ Subdirectory containing symbolic links to tablespaces
+ </text>
+ </g>
+ <g transform="translate(120 430)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ pg_... /
+ </text>
+ <text x="200" y="26" class="text_normal">
+ Some more subdirectories
+ </text>
+ </g>
+ <g transform="translate(120 465)">
+ <use xlink:href="#file"/>
+ <use xlink:href="#file" x="50"/>
+ <text x="200" y="26" class="text_normal">
+ 'postmaster.pid' and other files with cluster-wide relevance
+ </text>
+ </g>
+ <g transform="translate(20 540)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ ... /xyz/
+ </text>
+ <text x="300" y="26" class="text_normal">
+ Same or another arbitrary directory
+ </text>
+ </g>
+ <g transform="translate(70 570)">
+ <use xlink:href="#directory"/>
+ <text x="10" y="26" class="text_normal">
+ cluster_2/
+ </text>
+ <text x="250" y="26" class="text_normal">
+ Root of another cluster 'cluster_2'
+ </text>
+ </g>
+</svg>
diff --git a/doc/src/sgml/images/directories-ink.svg b/doc/src/sgml/images/directories-ink.svg
new file mode 100644
index 0000000000..4661ef13fb
--- /dev/null
+++ b/doc/src/sgml/images/directories-ink.svg
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="900px"
+ height="640px"
+ viewBox="0 0 900 640"
+ id="svg303"
+ sodipodi:docname="directories-ink.svg"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)">
+ <metadata
+ id="metadata307">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Directory structure of a cluster</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="640"
+ inkscape:window-height="480"
+ id="namedview305"
+ showgrid="false"
+ inkscape:zoom="0.36875"
+ inkscape:cx="450"
+ inkscape:cy="320"
+ inkscape:window-x="61"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg303" />
+ <title
+ id="title153">Directory structure of a cluster</title>
+ <style
+ type="text/css"
+ id="style155">
+ .text_normal {font-style:normal;
+ font-weight:normal;
+ font-size:16px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_big {font-style:normal;
+ font-weight:normal;
+ font-size:24px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ </style>
+ <defs
+ id="defs177">
+ <!-- Directory -->
+ <symbol
+ id="directory"
+ stroke="blue"
+ stroke-width="0.3px"
+ fill="aqua">
+ <title
+ id="title157">Directory</title>
+ <rect
+ x="0"
+ y="10"
+ width="110"
+ height="20"
+ id="rect159" />
+ <path
+ d="M 0,10 l 0,-2 3,-3 35,0, 3,3 0,2"
+ id="path161" />
+ </symbol>
+ <!-- File -->
+ <symbol
+ id="file"
+ stroke="black"
+ fill="none">
+ <title
+ id="title164">File</title>
+ <rect
+ x="0"
+ y="0"
+ width="40"
+ height="50"
+ stroke="blue"
+ id="rect166" />
+ <path
+ d="M 5,10 h 20"
+ stroke-dasharray="4 2"
+ id="path168" />
+ <path
+ d="M 5,17 h 15"
+ stroke-dasharray="6 2"
+ id="path170" />
+ <path
+ d="M 5,24 h 25"
+ stroke-dasharray="4 2"
+ id="path172" />
+ <path
+ d="M 5,31 h 20"
+ stroke-dasharray="5 2"
+ id="path174" />
+ </symbol>
+ </defs>
+ <!-- start of rendering area -->
+ <!-- enclosing rectangle -->
+ <rect
+ x="1"
+ y="1"
+ rx="5"
+ width="99%"
+ height="99%"
+ stroke="black"
+ fill="none"
+ id="rect179" />
+ <!-- caption -->
+ <text
+ x="200"
+ y="50"
+ class="text_big"
+ id="text181">Directory Structure</text>
+ <!-- the directories -->
+ <g
+ transform="translate(20, 100)"
+ id="g189">
+ <use
+ xlink:href="#directory"
+ id="use183" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text185">... /pg/</text>
+ <text
+ x="300"
+ y="26"
+ class="text_normal"
+ id="text187">An arbitrary directory</text>
+ </g>
+ <g
+ transform="translate(70, 130)"
+ id="g197">
+ <use
+ xlink:href="#directory"
+ id="use191" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text193">data/</text>
+ <text
+ x="250"
+ y="26"
+ class="text_normal"
+ id="text195">Root of cluster 'data' (see: PGDATA)</text>
+ </g>
+ <g
+ transform="translate(120, 160)"
+ id="g205">
+ <use
+ xlink:href="#directory"
+ id="use199" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text201">base/</text>
+ <text
+ x="200"
+ y="26"
+ class="text_normal"
+ id="text203">Subdirectory containing per-database subdirectories</text>
+ </g>
+ <!-- -->
+ <g
+ transform="translate(170, 190)"
+ id="g213">
+ <use
+ xlink:href="#directory"
+ id="use207" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text209">1/</text>
+ <text
+ x="150"
+ y="26"
+ class="text_normal"
+ id="text211">Subdirectory for data of first database 'template0'</text>
+ </g>
+ <g
+ transform="translate(170, 220)"
+ id="g221">
+ <use
+ xlink:href="#directory"
+ id="use215" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text217">12992/</text>
+ <text
+ x="150"
+ y="26"
+ class="text_normal"
+ id="text219">Subdirectory for data of second database 'template1'</text>
+ </g>
+ <g
+ transform="translate(170, 250)"
+ id="g229">
+ <use
+ xlink:href="#directory"
+ id="use223" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text225">12999/</text>
+ <text
+ x="150"
+ y="26"
+ class="text_normal"
+ id="text227">Subdirectory for data of third database 'postgres'</text>
+ </g>
+ <g
+ transform="translate(170, 280)"
+ id="g237">
+ <use
+ xlink:href="#directory"
+ id="use231" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text233">nnnnn/</text>
+ <text
+ x="150"
+ y="26"
+ class="text_normal"
+ id="text235">Optional: more subdirectories for databases, e.g. 'my_db'</text>
+ </g>
+ <g
+ transform="translate(120, 310)"
+ id="g245">
+ <use
+ xlink:href="#directory"
+ id="use239" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text241">global/</text>
+ <text
+ x="200"
+ y="26"
+ class="text_normal"
+ id="text243">Subdirectory with information about Global SQL Objects</text>
+ </g>
+ <g
+ transform="translate(120, 340)"
+ id="g253">
+ <use
+ xlink:href="#directory"
+ id="use247" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text249">pg_wal/</text>
+ <text
+ x="200"
+ y="26"
+ class="text_normal"
+ id="text251">Subdirectory for Write Ahead Log files ('pg_xlog' before version 10)</text>
+ </g>
+ <g
+ transform="translate(120, 370)"
+ id="g261">
+ <use
+ xlink:href="#directory"
+ id="use255" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text257">pg_xact/</text>
+ <text
+ x="200"
+ y="26"
+ class="text_normal"
+ id="text259">Subdirectory for transaction commit status ('pg_clog' before version 10)</text>
+ </g>
+ <g
+ transform="translate(120, 400)"
+ id="g269">
+ <use
+ xlink:href="#directory"
+ id="use263" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text265">pg_tblspc/</text>
+ <text
+ x="200"
+ y="26"
+ class="text_normal"
+ id="text267">Subdirectory containing symbolic links to tablespaces</text>
+ </g>
+ <g
+ transform="translate(120, 430)"
+ id="g277">
+ <use
+ xlink:href="#directory"
+ id="use271" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text273">pg_... /</text>
+ <text
+ x="200"
+ y="26"
+ class="text_normal"
+ id="text275">Some more subdirectories</text>
+ </g>
+ <g
+ transform="translate(120, 465)"
+ id="g285">
+ <use
+ xlink:href="#file"
+ x="0"
+ y="0"
+ id="use279" />
+ <use
+ xlink:href="#file"
+ x="50"
+ y="0"
+ id="use281" />
+ <text
+ x="200"
+ y="26"
+ class="text_normal"
+ id="text283">'postmaster.pid' and other files with cluster-wide relevance</text>
+ </g>
+ <!-- next cluster -->
+ <g
+ transform="translate(20, 540)"
+ id="g293">
+ <use
+ xlink:href="#directory"
+ id="use287" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text289">... /xyz/</text>
+ <text
+ x="300"
+ y="26"
+ class="text_normal"
+ id="text291">Same or another arbitrary directory</text>
+ </g>
+ <g
+ transform="translate(70, 570)"
+ id="g301">
+ <use
+ xlink:href="#directory"
+ id="use295" />
+ <text
+ x="10"
+ y="26"
+ class="text_normal"
+ id="text297">cluster_2/</text>
+ <text
+ x="250"
+ y="26"
+ class="text_normal"
+ id="text299">Root of another cluster 'cluster_2'</text>
+ </g>
+</svg>
diff --git a/doc/src/sgml/images/directories-raw.svg b/doc/src/sgml/images/directories-raw.svg
new file mode 100644
index 0000000000..8869eb9390
--- /dev/null
+++ b/doc/src/sgml/images/directories-raw.svg
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="900px" height="640px"
+ viewBox="0 0 900 640">
+
+ <title>Directory structure of a cluster</title>
+
+ <style type="text/css">
+ .text_normal {font-style:normal;
+ font-weight:normal;
+ font-size:16px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_big {font-style:normal;
+ font-weight:normal;
+ font-size:24px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ </style>
+
+ <defs>
+
+ <!-- Directory -->
+ <symbol id="directory" stroke="blue" stroke-width="0.3px" fill="aqua">
+ <title>Directory</title>
+ <rect x="0" y="10" width="110" height="20" />
+ <path d="M 0,10 l 0,-2 3,-3 35,0, 3,3 0,2" />
+ </symbol>
+
+ <!-- File -->
+ <symbol id="file" stroke="black" fill="none" >
+ <title>File</title>
+ <rect x="0" y="0" width="40" height="50" stroke="blue" />
+ <path d="M 5,10 h 20" stroke-dasharray="4 2" />
+ <path d="M 5,17 h 15" stroke-dasharray="6 2" />
+ <path d="M 5,24 h 25" stroke-dasharray="4 2" />
+ <path d="M 5,31 h 20" stroke-dasharray="5 2" />
+ </symbol>
+
+ </defs>
+
+
+ <!-- start of rendering area -->
+ <!-- enclosing rectangle -->
+ <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none" />
+
+ <!-- caption -->
+ <text x="200" y="50" class="text_big">Directory Structure</text>
+
+ <!-- the directories -->
+ <g transform="translate(20, 100)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">... /pg/</text>
+ <text x="300" y="26" class="text_normal">An arbitrary directory</text>
+ </g>
+
+ <g transform="translate(70, 130)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">data/</text>
+ <text x="250" y="26" class="text_normal">Root of cluster 'data' (see: PGDATA)</text>
+ </g>
+
+ <g transform="translate(120, 160)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">base/</text>
+ <text x="200" y="26" class="text_normal">Subdirectory containing per-database subdirectories</text>
+ </g>
+
+ <!-- -->
+ <g transform="translate(170, 190)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">1/</text>
+ <text x="150" y="26" class="text_normal">Subdirectory for data of first database 'template0'</text>
+ </g>
+ <g transform="translate(170, 220)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">12992/</text>
+ <text x="150" y="26" class="text_normal">Subdirectory for data of second database 'template1'</text>
+ </g>
+ <g transform="translate(170, 250)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">12999/</text>
+ <text x="150" y="26" class="text_normal">Subdirectory for data of third database 'postgres'</text>
+ </g>
+ <g transform="translate(170, 280)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">nnnnn/</text>
+ <text x="150" y="26" class="text_normal">Optional: more subdirectories for databases, e.g. 'my_db'</text>
+ </g>
+
+ <g transform="translate(120, 310)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">global/</text>
+ <text x="200" y="26" class="text_normal">Subdirectory with information about Global SQL Objects</text>
+ </g>
+
+ <g transform="translate(120, 340)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">pg_wal/</text>
+ <text x="200" y="26" class="text_normal">Subdirectory for Write Ahead Log files ('pg_xlog' before version 10)</text>
+ </g>
+
+ <g transform="translate(120, 370)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">pg_xact/</text>
+ <text x="200" y="26" class="text_normal">Subdirectory for transaction commit status ('pg_clog' before version 10)</text>
+ </g>
+
+ <g transform="translate(120, 400)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">pg_tblspc/</text>
+ <text x="200" y="26" class="text_normal">Subdirectory containing symbolic links to tablespaces</text>
+ </g>
+
+ <g transform="translate(120, 430)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">pg_... /</text>
+ <text x="200" y="26" class="text_normal">Some more subdirectories</text>
+ </g>
+
+ <g transform="translate(120, 465)">
+ <use xlink:href="#file" x="0" y="0" />
+ <use xlink:href="#file" x="50" y="0" />
+ <text x="200" y="26" class="text_normal">'postmaster.pid' and other files with cluster-wide relevance</text>
+ </g>
+
+ <!-- next cluster -->
+ <g transform="translate(20, 540)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">... /xyz/</text>
+ <text x="300" y="26" class="text_normal">Same or another arbitrary directory</text>
+ </g>
+
+ <g transform="translate(70, 570)">
+ <use xlink:href="#directory" />
+ <text x="10" y="26" class="text_normal">cluster_2/</text>
+ <text x="250" y="26" class="text_normal">Root of another cluster 'cluster_2'</text>
+ </g>
+
+</svg>
diff --git a/doc/src/sgml/images/internal-objects-hierarchy-ink-svgo.svg b/doc/src/sgml/images/internal-objects-hierarchy-ink-svgo.svg
new file mode 100644
index 0000000000..4156bbc834
--- /dev/null
+++ b/doc/src/sgml/images/internal-objects-hierarchy-ink-svgo.svg
@@ -0,0 +1,83 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="720" height="430" viewBox="0 0 720 430">
+ <title>
+ Hierarchy of Internal Objects
+ </title>
+ <style>
+ .text_normal{font-style:normal;font-weight:400;font-size:16px;font-family:"Open Sans",sans-serif;fill:#000}
+ </style>
+ <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none"/>
+ <text x="200" y="40" font-weight="400" font-size="24" font-family=""Open Sans",sans-serif">
+ Hierarchy of Internal Objects
+ </text>
+ <g fill="none">
+ <g transform="translate(350 240)">
+ <ellipse rx="320" ry="170" stroke="blue"/>
+ <text class="text_normal" x="-140" y="-130">
+ Cluster
+ </text>
+ <g transform="translate(40 -125)">
+ <ellipse rx="80" ry="20" stroke="blue"/>
+ <text class="text_normal" x="-60" y="5">
+ Database Names
+ </text>
+ </g>
+ <g transform="translate(180 -70)">
+ <ellipse rx="60" ry="20" stroke="blue"/>
+ <text class="text_normal" x="-40" y="5">
+ Tablespace
+ </text>
+ </g>
+ <g transform="translate(230 -5)">
+ <ellipse rx="80" ry="20" stroke="blue"/>
+ <text class="text_normal" x="-70" y="5">
+ Replication Origins
+ </text>
+ </g>
+ <g transform="translate(200 70)">
+ <ellipse rx="78" ry="27" stroke="blue"/>
+ <text class="text_normal" x="-60" y="-3">
+ Subscription for
+ </text>
+ <text class="text_normal" x="-68" y="10">
+ Logical Replication
+ </text>
+ </g>
+ <g transform="translate(100 120)">
+ <ellipse rx="40" ry="20" stroke="blue"/>
+ <text class="text_normal" x="-15" y="5">
+ Role
+ </text>
+ </g>
+ </g>
+ <g transform="translate(270 250)">
+ <ellipse rx="220" ry="110" stroke="blue" stroke-width="2"/>
+ <text class="text_normal" x="-60" y="-80">
+ Database
+ </text>
+ <g transform="translate(-150 -30)">
+ <ellipse rx="50" ry="20" stroke="blue"/>
+ <text class="text_normal" x="-35" y="5">
+ Extension
+ </text>
+ </g>
+ <g transform="translate(-155 35)">
+ <ellipse rx="40" ry="20" stroke="blue"/>
+ <text class="text_normal" x="-35" y="5">
+ Collation
+ </text>
+ </g>
+ <g transform="translate(30 20)">
+ <ellipse rx="140" ry="70" stroke="blue"/>
+ <text class="text_normal" x="-80" y="-35">
+ Schema
+ </text>
+ <g transform="translate(20 10)">
+ <ellipse rx="90" ry="30" stroke="blue"/>
+ <text class="text_normal" x="-50" y="5">
+ Table, View, ...
+ </text>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/doc/src/sgml/images/internal-objects-hierarchy-ink.svg b/doc/src/sgml/images/internal-objects-hierarchy-ink.svg
new file mode 100644
index 0000000000..cf03d6a701
--- /dev/null
+++ b/doc/src/sgml/images/internal-objects-hierarchy-ink.svg
@@ -0,0 +1,255 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="720px"
+ height="430px"
+ viewBox="0 0 720 430"
+ id="svg389"
+ sodipodi:docname="internal-objects-hierarchy-ink.svg"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)">
+ <metadata
+ id="metadata395">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Hierarchy of Internal Objects</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs393" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="906"
+ inkscape:window-height="678"
+ id="namedview391"
+ showgrid="false"
+ inkscape:zoom="0.51944444"
+ inkscape:cx="360"
+ inkscape:cy="215"
+ inkscape:window-x="502"
+ inkscape:window-y="91"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg389" />
+ <title
+ id="title309">Hierarchy of Internal Objects</title>
+ <!-- common text classes -->
+ <style
+ type="text/css"
+ id="style311">
+ .text_normal {font-style:normal;
+ font-weight:normal;
+ font-size:16px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_big {font-style:normal;
+ font-weight:normal;
+ font-size:24px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ </style>
+ <!-- start of rendering area -->
+ <!-- enclosing rectangle -->
+ <rect
+ x="1"
+ y="1"
+ rx="5"
+ width="99%"
+ height="99%"
+ stroke="black"
+ fill="none"
+ id="rect313" />
+ <text
+ class="text_big"
+ x="200"
+ y="40"
+ id="text315">Hierarchy of Internal Objects</text>
+ <!-- set centre of figure and default values -->
+ <g
+ transform="translate(350 240)"
+ fill="none"
+ id="g387">
+ <g
+ id="g353">
+ <ellipse
+ rx="320"
+ ry="170"
+ stroke="blue"
+ id="ellipse317" />
+ <text
+ class="text_normal"
+ x="-140"
+ y="-130"
+ id="text319">Cluster</text>
+ <g
+ transform="translate(40 -125)"
+ id="g325">
+ <ellipse
+ rx="80"
+ ry="20"
+ stroke="blue"
+ id="ellipse321" />
+ <text
+ class="text_normal"
+ x="-60"
+ y="5"
+ id="text323">Database Names</text>
+ </g>
+ <g
+ transform="translate(180 -70)"
+ id="g331">
+ <ellipse
+ rx="60"
+ ry="20"
+ stroke="blue"
+ id="ellipse327" />
+ <text
+ class="text_normal"
+ x="-40"
+ y="5"
+ id="text329">Tablespace</text>
+ </g>
+ <g
+ transform="translate(230 -5)"
+ id="g337">
+ <ellipse
+ rx="80"
+ ry="20"
+ stroke="blue"
+ id="ellipse333" />
+ <text
+ class="text_normal"
+ x="-70"
+ y="5"
+ id="text335">Replication Origins</text>
+ </g>
+ <g
+ transform="translate(200 70)"
+ id="g345">
+ <ellipse
+ rx="78"
+ ry="27"
+ stroke="blue"
+ id="ellipse339" />
+ <text
+ class="text_normal"
+ x="-60"
+ y="-3"
+ id="text341">Subscription for</text>
+ <text
+ class="text_normal"
+ x="-68"
+ y="10"
+ id="text343">Logical Replication</text>
+ </g>
+ <g
+ transform="translate(100 120)"
+ id="g351">
+ <ellipse
+ rx="40"
+ ry="20"
+ stroke="blue"
+ id="ellipse347" />
+ <text
+ class="text_normal"
+ x="-15"
+ y="5"
+ id="text349">Role</text>
+ </g>
+ </g>
+ <g
+ transform="translate(-80 10)"
+ id="g385">
+ <ellipse
+ rx="220"
+ ry="110"
+ stroke="blue"
+ stroke-width="2px"
+ id="ellipse355" />
+ <text
+ class="text_normal"
+ x="-60"
+ y="-80"
+ id="text357">Database</text>
+ <g
+ transform="translate(-120 -50)"
+ id="g383">
+ <g
+ transform="translate(-30 20)"
+ id="g363">
+ <ellipse
+ rx="50"
+ ry="20"
+ stroke="blue"
+ id="ellipse359" />
+ <text
+ class="text_normal"
+ x="-35"
+ y="5"
+ id="text361">Extension</text>
+ </g>
+ <g
+ transform="translate(-35 85)"
+ id="g369">
+ <ellipse
+ rx="40"
+ ry="20"
+ stroke="blue"
+ id="ellipse365" />
+ <text
+ class="text_normal"
+ x="-35"
+ y="5"
+ id="text367">Collation</text>
+ </g>
+ <g
+ transform="translate(150 70)"
+ id="g381">
+ <ellipse
+ rx="140"
+ ry="70"
+ stroke="blue"
+ id="ellipse371" />
+ <text
+ class="text_normal"
+ x="-80"
+ y="-35"
+ id="text373">Schema</text>
+ <g
+ transform="translate(20 10)"
+ id="g379">
+ <ellipse
+ rx="90"
+ ry="30"
+ stroke="blue"
+ id="ellipse375" />
+ <text
+ class="text_normal"
+ x="-50"
+ y="5"
+ id="text377">Table, View, ...</text>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/doc/src/sgml/images/internal-objects-hierarchy-raw.svg b/doc/src/sgml/images/internal-objects-hierarchy-raw.svg
new file mode 100644
index 0000000000..45387bbd9b
--- /dev/null
+++ b/doc/src/sgml/images/internal-objects-hierarchy-raw.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="720px" height="430px"
+ viewBox="0 0 720 430" >
+
+ <title>Hierarchy of Internal Objects</title>
+
+ <!-- common text classes -->
+ <style type="text/css">
+ .text_normal {font-style:normal;
+ font-weight:normal;
+ font-size:16px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_big {font-style:normal;
+ font-weight:normal;
+ font-size:24px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ </style>
+
+ <!-- start of rendering area -->
+ <!-- enclosing rectangle -->
+ <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none" />
+ <text class="text_big" x="200" y="40">Hierarchy of Internal Objects</text>
+
+
+ <!-- set centre of figure and default values -->
+ <g transform="translate(350 240)" fill="none">
+
+ <g>
+ <ellipse rx="320" ry="170" stroke="blue" />
+ <text class="text_normal" x="-140" y="-130">Cluster</text>
+
+ <g transform="translate(40 -125)">
+ <ellipse rx="80" ry="20" stroke="blue" />
+ <text class="text_normal" x="-60" y="5">Database Names</text>
+ </g>
+
+ <g transform="translate(180 -70)">
+ <ellipse rx="60" ry="20" stroke="blue" />
+ <text class="text_normal" x="-40" y="5">Tablespace</text>
+ </g>
+
+ <g transform="translate(230 -5)">
+ <ellipse rx="80" ry="20" stroke="blue" />
+ <text class="text_normal" x="-70" y="5">Replication Origins</text>
+ </g>
+
+ <g transform="translate(200 70)">
+ <ellipse rx="78" ry="27" stroke="blue" />
+ <text class="text_normal" x="-60" y="-3">Subscription for</text>
+ <text class="text_normal" x="-68" y="10">Logical Replication</text>
+ </g>
+
+ <g transform="translate(100 120)">
+ <ellipse rx="40" ry="20" stroke="blue" />
+ <text class="text_normal" x="-15" y="5">Role</text>
+ </g>
+
+ </g>
+
+ <g transform="translate(-80 10)">
+ <ellipse rx="220" ry="110" stroke="blue" stroke-width="2px" />
+ <text class="text_normal" x="-60" y="-80">Database</text>
+
+ <g transform="translate(-120 -50)">
+ <g transform="translate(-30 20)">
+ <ellipse rx="50" ry="20" stroke="blue" />
+ <text class="text_normal" x="-35" y="5">Extension</text>
+ </g>
+
+ <g transform="translate(-35 85)">
+ <ellipse rx="40" ry="20" stroke="blue" />
+ <text class="text_normal" x="-35" y="5">Collation</text>
+ </g>
+
+ <g transform="translate(150 70)">
+ <ellipse rx="140" ry="70" stroke="blue" />
+ <text class="text_normal" x="-80" y="-35">Schema</text>
+
+ <g transform="translate(20 10)">
+ <ellipse rx="90" ry="30" stroke="blue" />
+ <text class="text_normal" x="-50" y="5">Table, View, ...</text>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+
+</svg>
diff --git a/doc/src/sgml/images/ram-proc-file-ink-svgo.svg b/doc/src/sgml/images/ram-proc-file-ink-svgo.svg
new file mode 100644
index 0000000000..bf638f6c63
--- /dev/null
+++ b/doc/src/sgml/images/ram-proc-file-ink-svgo.svg
@@ -0,0 +1,285 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900" height="600" viewBox="0 0 900 600">
+ <title>
+ PG Overall Server Architecture
+ </title>
+ <style>
+ .text_big{font-style:normal}.text_big,.text_comment,.text_normal,.text_small{font-weight:400;font-family:"Open Sans",sans-serif;fill:#000}.text_normal,.text_small{font-style:normal}.text_small{font-size:12px}.text_normal{font-size:16px}.text_big{font-size:24px}.text_comment{font-style:italic;font-size:16px}
+ </style>
+ <defs>
+ <symbol id="note_200x20" stroke="black" fill="lightyellow">
+ <title>
+ UML Note (200 x 20 px)
+ </title>
+ <path d="M200 10v10H0V0h190v10h10L190 0"/>
+ </symbol>
+ <symbol id="note_250x20" stroke="black" fill="lightyellow">
+ <title>
+ UML Note (250 x 20 px)
+ </title>
+ <path d="M250 10v10H0V0h240v10h10L240 0"/>
+ </symbol>
+ <symbol id="note_100x35" stroke="black" fill="lightyellow">
+ <title>
+ UML Note (100 x 35 px)
+ </title>
+ <path d="M100 10v25H0V0h90v10h10L90 0"/>
+ </symbol>
+ <symbol id="note_170x50" stroke="black" fill="lightyellow">
+ <title>
+ UML Note (170 x 50 px)
+ </title>
+ <path d="M170 10v40H0V0h160v10h10L160 0"/>
+ </symbol>
+ <symbol id="state_300x120">
+ <title>
+ UML State, big
+ </title>
+ <rect width="300" height="120" rx="10" stroke="blue" fill="none"/>
+ </symbol>
+ <symbol id="state_350x120">
+ <title>
+ UML State, big
+ </title>
+ <rect width="350" height="120" rx="10" stroke="blue" fill="none"/>
+ </symbol>
+ <symbol id="disc" stroke="blue" fill="none">
+ <title>
+ Disc
+ </title>
+ <ellipse cx="51" cy="13" rx="50" ry="12"/>
+ <path d="M1 13v60"/>
+ <path d="M101 13v60"/>
+ <path d="M1 73a50 12 0 00100 0"/>
+ </symbol>
+ <symbol id="laptop" stroke="black" fill="none">
+ <title>
+ Laptop
+ </title>
+ <path d="M20 40V0h54v40l15 15H5l15-15h54"/>
+ <path d="M23 3h48v34H23z"/>
+ <path d="M30 10h20"/>
+ <path d="M30 15h25"/>
+ <path d="M30 20h10"/>
+ <path d="M30 30h20"/>
+ <path d="M25 50h45l2 2H22z"/>
+ </symbol>
+ <marker id="arrowhead_start" markerWidth="10" markerHeight="10" refX="0" refY="3" orient="auto">
+ <path d="M6 0L0 3l6 3" stroke="black" fill="none"/>
+ </marker>
+ <marker id="arrowhead_end" markerWidth="10" markerHeight="10" refX="6" refY="3" orient="auto">
+ <path d="M0 0l6 3-6 3" stroke="black" fill="none"/>
+ </marker>
+ </defs>
+ <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none"/>
+ <text x="15" y="40" class="text_big">
+ Client
+ </text>
+ <text x="140" y="40" class="text_big">
+ Server
+ </text>
+ <use xlink:href="#laptop" x="5" y="210"/>
+ <g transform="translate(130 70)">
+ <use xlink:href="#state_350x120"/>
+ <text x="5" y="20" class="text_normal">
+ maintenance_work_mem (per connection)
+ </text>
+ <text x="5" y="45" class="text_normal">
+ work_mem (per query operation)
+ </text>
+ <text x="5" y="70" class="text_normal">
+ autovacuum_work_mem (per worker process)
+ </text>
+ <text x="5" y="95" class="text_normal">
+ temp_buffer (per connection)
+ </text>
+ <text x="5" y="110" class="text_normal">
+ ...
+ </text>
+ <use xlink:href="#note_200x20" x="140" y="-15"/>
+ <text x="150" class="text_comment">
+ Individual Memory
+ </text>
+ </g>
+ <g transform="translate(520 70)">
+ <use xlink:href="#state_300x120"/>
+ <text x="10" y="30" class="text_normal">
+ shared_buffers (heap and index)
+ </text>
+ <text x="10" y="70" class="text_normal">
+ wal_buffers (WAL records)
+ </text>
+ <text x="10" y="100" class="text_normal">
+ ...
+ </text>
+ <use xlink:href="#note_250x20" x="40" y="-15"/>
+ <text x="50" class="text_comment">
+ Shared Memory (per Cluster)
+ </text>
+ </g>
+ <path stroke="blue" fill="none" d="M190 215h200v30H190z"/>
+ <text x="10" y="20" class="text_normal" transform="translate(190 215)">
+ Postmaster process
+ </text>
+ <path d="M90 230h85" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <g transform="translate(140 230)">
+ <circle r="8" stroke="black" fill="lightyellow"/>
+ <text x="-4" y="4" class="text_small">
+ 1
+ </text>
+ </g>
+ <path stroke="blue" fill="none" d="M150 315h370v30H150z"/>
+ <text x="10" y="20" class="text_normal" transform="translate(150 315)">
+ Backend processes (one per connection)
+ </text>
+ <path d="M155 315v-5h370v30h-5" stroke="blue" fill="none"/>
+ <path d="M160 310v-5h370v30h-5" stroke="blue" fill="none"/>
+ <path d="M90 240l63 63" stroke="black" fill="none" marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+ <g transform="translate(140 290)">
+ <circle r="8" stroke="black" fill="lightyellow"/>
+ <text x="-4" y="4" class="text_small">
+ 3
+ </text>
+ </g>
+ <path d="M360 250v50" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <g transform="translate(190 255)">
+ <use xlink:href="#note_250x20"/>
+ <text x="10" y="15" class="text_comment">
+ Creates backend processes
+ </text>
+ </g>
+ <g transform="translate(360 281)">
+ <circle r="8" stroke="black" fill="lightyellow"/>
+ <text x="-4" y="4" class="text_small">
+ 2
+ </text>
+ </g>
+ <path d="M460 300V200" stroke="black" fill="none" marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+ <path d="M498 300V95h30" stroke="black" fill="none" marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+ <path d="M508 300V135h20" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path stroke="blue" fill="none" d="M550 220h120v30H550z"/>
+ <text x="10" y="20" class="text_normal" transform="translate(550 220)">
+ WAL Writer
+ </text>
+ <path d="M590 150v65" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M590 255v230" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path stroke="blue" fill="none" d="M610 340h140v30H610z"/>
+ <text x="10" y="20" class="text_normal" transform="translate(610 340)">
+ Checkpointer
+ </text>
+ <path d="M740 110v220" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M605 355H475v130" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M700 330V150" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <g transform="translate(570 330)">
+ <use xlink:href="#note_100x35" x="50" y="-50"/>
+ <text x="60" y="-35" class="text_comment">
+ Checkpoint
+ </text>
+ <text x="60" y="-20" class="text_comment">
+ Record
+ </text>
+ </g>
+ <path stroke="blue" fill="none" d="M610 380h180v30H610z"/>
+ <text x="10" y="20" class="text_normal" transform="translate(610 380)">
+ Background Writer
+ </text>
+ <path d="M770 110v260" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M605 395H485v90" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path stroke="blue" fill="none" d="M610 420h180v30H610z"/>
+ <text x="10" y="20" class="text_normal" transform="translate(610 420)">
+ WAL Archiver
+ </text>
+ <path d="M620 485l30-30" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M740 455v30" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path stroke="blue" fill="none" d="M135 380h120v30H135z"/>
+ <text x="10" y="20" class="text_normal" transform="translate(135 380)">
+ AutoVacuum
+ </text>
+ <path d="M140 380v-5h120v30h-5" stroke="blue" fill="none"/>
+ <path d="M145 375v-5h120v30h-5" stroke="blue" fill="none"/>
+ <path stroke="blue" fill="none" d="M135 430h120v30H135z"/>
+ <text x="10" y="20" class="text_normal" transform="translate(135 430)">
+ Log Writer
+ </text>
+ <path stroke="blue" fill="none" d="M290 370h140v30H290z"/>
+ <text x="10" y="20" class="text_normal" transform="translate(290 370)">
+ Stats Collector
+ </text>
+ <g transform="translate(145 490)">
+ <use xlink:href="#disc"/>
+ <text x="35" y="45" class="text_normal">
+ Log
+ </text>
+ <text x="20" y="60" class="text_small">
+ text lines,
+ </text>
+ <text x="20" y="75" class="text_small">
+ sequential
+ </text>
+ </g>
+ <path d="M195 465v20" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <g transform="translate(410 490)">
+ <use xlink:href="#disc"/>
+ <text x="10" y="40" class="text_normal">
+ Heap and
+ </text>
+ <text x="25" y="55" class="text_normal">
+ Index
+ </text>
+ <text x="15" y="70" class="text_small">
+ binary blocks,
+ </text>
+ <text x="30" y="80" class="text_small">
+ random
+ </text>
+ </g>
+ <path d="M450 485V350" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <g transform="translate(295 420)">
+ <use xlink:href="#note_170x50"/>
+ <text x="5" y="15" class="text_comment">
+ Read heap and index
+ </text>
+ <text x="5" y="30" class="text_comment">
+ pages and transfer
+ </text>
+ <text x="5" y="45" class="text_comment">
+ them to shared_buffers
+ </text>
+ </g>
+ <g transform="translate(550 490)">
+ <use xlink:href="#disc"/>
+ <text x="30" y="45" class="text_normal">
+ WAL
+ </text>
+ <text x="10" y="60" class="text_small">
+ binary records,
+ </text>
+ <text x="20" y="75" class="text_small">
+ sequential
+ </text>
+ </g>
+ <g transform="translate(690 490)">
+ <use xlink:href="#disc"/>
+ <text x="16" y="45" class="text_normal">
+ Archived
+ </text>
+ <text x="36" y="60" class="text_normal">
+ WAL
+ </text>
+ </g>
+ <path d="M110 20v550" stroke="black" fill="none"/>
+ <g transform="rotate(90 -33.5 156.5)">
+ <use xlink:href="#note_200x20"/>
+ <text class="text_comment" x="10" y="15">
+ Via TCP/IP or socket
+ </text>
+ </g>
+ <text class="text_big" x="95" transform="rotate(90 425 425)">
+ RAM
+ </text>
+ <text class="text_big" x="250" transform="rotate(90 425 425)">
+ PROCESSES
+ </text>
+ <text class="text_big" x="500" transform="rotate(90 425 425)">
+ FILES
+ </text>
+</svg>
diff --git a/doc/src/sgml/images/ram-proc-file-ink.svg b/doc/src/sgml/images/ram-proc-file-ink.svg
new file mode 100644
index 0000000000..6c960702a0
--- /dev/null
+++ b/doc/src/sgml/images/ram-proc-file-ink.svg
@@ -0,0 +1,841 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="900px"
+ height="600px"
+ viewBox="0 0 900 600"
+ id="svg701"
+ sodipodi:docname="ram-proc-file-ink.svg"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)">
+ <metadata
+ id="metadata705">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>PG Overall Server Architecture</dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="846"
+ inkscape:window-height="675"
+ id="namedview703"
+ showgrid="false"
+ inkscape:zoom="0.39333333"
+ inkscape:cx="450"
+ inkscape:cy="300"
+ inkscape:window-x="503"
+ inkscape:window-y="91"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg701" />
+ <title
+ id="title397">PG Overall Server Architecture</title>
+ <style
+ type="text/css"
+ id="style399">
+ .text_small {font-style:normal;
+ font-weight:normal;
+ font-size:12px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_normal {font-style:normal;
+ font-weight:normal;
+ font-size:16px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_big {font-style:normal;
+ font-weight:normal;
+ font-size:24px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_comment {font-style:italic;
+ font-weight:normal;
+ font-size:16px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ </style>
+ <defs
+ id="defs465">
+ <!-- Some notes in different sizes -->
+ <symbol
+ id="note_200x20"
+ stroke="black"
+ fill="lightyellow">
+ <title
+ id="title401">UML Note (200 x 20 px)</title>
+ <path
+ d="M 200,10 v 10 h -200 v -20 h 190 v 10 h 10 l -10,-10"
+ id="path403" />
+ </symbol>
+ <symbol
+ id="note_250x20"
+ stroke="black"
+ fill="lightyellow">
+ <title
+ id="title406">UML Note (250 x 20 px)</title>
+ <path
+ d="M 250,10 v 10 h -250 v -20 h 240 v 10 h 10 l -10,-10"
+ id="path408" />
+ </symbol>
+ <symbol
+ id="note_100x35"
+ stroke="black"
+ fill="lightyellow">
+ <title
+ id="title411">UML Note (100 x 35 px)</title>
+ <path
+ d="M 100,10 v 25 h -100 v -35 h 90 v 10 h 10 l -10,-10"
+ id="path413" />
+ </symbol>
+ <symbol
+ id="note_170x50"
+ stroke="black"
+ fill="lightyellow">
+ <title
+ id="title416">UML Note (170 x 50 px)</title>
+ <path
+ d="M 170,10 v 40 h -170 v -50 h 160 v 10 h 10 l -10,-10"
+ id="path418" />
+ </symbol>
+ <!-- UML states (used for buffers) -->
+ <symbol
+ id="state_300x120">
+ <title
+ id="title421">UML State, big</title>
+ <rect
+ x="0"
+ y="0"
+ width="300"
+ height="120"
+ rx="10"
+ stroke="blue"
+ fill="none"
+ id="rect423" />
+ </symbol>
+ <symbol
+ id="state_350x120">
+ <title
+ id="title426">UML State, big</title>
+ <rect
+ x="0"
+ y="0"
+ width="350"
+ height="120"
+ rx="10"
+ stroke="blue"
+ fill="none"
+ id="rect428" />
+ </symbol>
+ <!-- Discs -->
+ <symbol
+ id="disc"
+ stroke="blue"
+ fill="none">
+ <title
+ id="title431">Disc</title>
+ <ellipse
+ cx="51"
+ cy="13"
+ rx="50"
+ ry="12"
+ id="ellipse433" />
+ <!-- top -->
+ <path
+ d="M 1,13 v 60"
+ id="path435" />
+ <!-- left -->
+ <path
+ d="M 101,13 v 60"
+ id="path437" />
+ <!-- right -->
+ <path
+ d="M 1,73 A 50, 12, 0, 0, 0, 101,73"
+ id="path439" />
+ <!-- bottom -->
+ </symbol>
+ <!-- Laptop -->
+ <symbol
+ id="laptop"
+ stroke="black"
+ fill="none">
+ <title
+ id="title442">Laptop</title>
+ <path
+ d="M 20,40 v -40 h 54 v 40 l 15,15 h -84 l 15,-15 h 54"
+ id="path444" />
+ <rect
+ x="23"
+ y="3"
+ width="48"
+ height="34"
+ id="rect446" />
+ <!-- symbolize some lines -->
+ <path
+ d="M 30,10 h 20"
+ id="path448" />
+ <path
+ d="M 30,15 h 25"
+ id="path450" />
+ <path
+ d="M 30,20 h 10"
+ id="path452" />
+ <path
+ d="M 30,30 h 20"
+ id="path454" />
+ <!-- symbolize keyboard -->
+ <path
+ d="M 25,50 h 45 l 2,2 h -50 z "
+ id="path456" />
+ </symbol>
+ <!-- marker start/end -->
+ <marker
+ id="arrowhead_start"
+ markerWidth="10"
+ markerHeight="10"
+ refX="0"
+ refY="3"
+ orient="auto">
+ <path
+ d="M 6,0 l -6,3 l 6,3"
+ stroke="black"
+ fill="none"
+ id="path459" />
+ </marker>
+ <marker
+ id="arrowhead_end"
+ markerWidth="10"
+ markerHeight="10"
+ refX="6"
+ refY="3"
+ orient="auto">
+ <path
+ d="M 0,0 l 6,3 l -6,3"
+ stroke="black"
+ fill="none"
+ id="path462" />
+ </marker>
+ </defs>
+ <!-- start of rendering area -->
+ <!-- enclosing rectangle -->
+ <rect
+ x="1"
+ y="1"
+ rx="5"
+ width="99%"
+ height="99%"
+ stroke="black"
+ fill="none"
+ id="rect467" />
+ <!-- caption, client side -->
+ <text
+ x="15"
+ y="40"
+ class="text_big"
+ id="text469">Client</text>
+ <text
+ x="140"
+ y="40"
+ class="text_big"
+ id="text471">Server</text>
+ <use
+ xlink:href="#laptop"
+ x="5"
+ y="210"
+ id="use473" />
+ <!-- individual memory -->
+ <g
+ transform="translate(130, 70)"
+ id="g491">
+ <use
+ xlink:href="#state_350x120"
+ x="0"
+ y="0"
+ id="use475" />
+ <text
+ x="5"
+ y="20"
+ class="text_normal"
+ id="text477">maintenance_work_mem (per connection)</text>
+ <text
+ x="5"
+ y="45"
+ class="text_normal"
+ id="text479">work_mem (per query operation)</text>
+ <text
+ x="5"
+ y="70"
+ class="text_normal"
+ id="text481">autovacuum_work_mem (per worker process)</text>
+ <text
+ x="5"
+ y="95"
+ class="text_normal"
+ id="text483">temp_buffer (per connection)</text>
+ <text
+ x="5"
+ y="110"
+ class="text_normal"
+ id="text485">...</text>
+ <use
+ xlink:href="#note_200x20"
+ x="140"
+ y="-15"
+ id="use487" />
+ <text
+ x="150"
+ y="0"
+ class="text_comment"
+ id="text489">Individual Memory</text>
+ </g>
+ <!-- shared memory -->
+ <g
+ transform="translate(520, 70)"
+ id="g505">
+ <use
+ xlink:href="#state_300x120"
+ x="0"
+ y="0"
+ id="use493" />
+ <text
+ x="10"
+ y="30"
+ class="text_normal"
+ id="text495">shared_buffers (heap and index)</text>
+ <text
+ x="10"
+ y="70"
+ class="text_normal"
+ id="text497">wal_buffers (WAL records)</text>
+ <text
+ x="10"
+ y="100"
+ class="text_normal"
+ id="text499">...</text>
+ <use
+ xlink:href="#note_250x20"
+ x="40"
+ y="-15"
+ id="use501" />
+ <text
+ x="50"
+ y="0"
+ class="text_comment"
+ id="text503">Shared Memory (per Cluster)</text>
+ </g>
+ <!-- postmaster -->
+ <g
+ transform="translate(190, 215)"
+ id="g511">
+ <rect
+ width="200"
+ height="30"
+ stroke="blue"
+ fill="none"
+ id="rect507" />
+ <text
+ x="10"
+ y="20"
+ class="text_normal"
+ id="text509">Postmaster process</text>
+ </g>
+ <path
+ d="M 90,230 h 85"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path513" />
+ <g
+ transform="translate(140, 230)"
+ id="g519">
+ <circle
+ r="8"
+ stroke="black"
+ fill="lightyellow"
+ id="circle515" />
+ <text
+ x="-4"
+ y="4"
+ class="text_small"
+ id="text517">1</text>
+ </g>
+ <!-- backend processes -->
+ <g
+ transform="translate(150, 315)"
+ id="g529">
+ <rect
+ width="370"
+ height="30"
+ stroke="blue"
+ fill="none"
+ id="rect521" />
+ <text
+ x="10"
+ y="20"
+ class="text_normal"
+ id="text523">Backend processes (one per connection)</text>
+ <path
+ d="M 5,0 v -5 h 370 v 30 h -5"
+ stroke="blue"
+ fill="none"
+ id="path525" />
+ <path
+ d="M 10,-5 v -5 h 370 v 30 h -5"
+ stroke="blue"
+ fill="none"
+ id="path527" />
+ </g>
+ <path
+ d="M 90,240 153,303"
+ stroke="black"
+ fill="none"
+ marker-start="url(#arrowhead_start)"
+ marker-end="url(#arrowhead_end)"
+ id="path531" />
+ <g
+ transform="translate(140, 290)"
+ id="g537">
+ <circle
+ r="8"
+ stroke="black"
+ fill="lightyellow"
+ id="circle533" />
+ <text
+ x="-4"
+ y="4"
+ class="text_small"
+ id="text535">3</text>
+ </g>
+ <!-- connection between postmaster and backend processes -->
+ <path
+ d="M 360,250 v 50"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path539" />
+ <g
+ transform="translate(190, 255)"
+ id="g545">
+ <use
+ xlink:href="#note_250x20"
+ id="use541" />
+ <text
+ x="10"
+ y="15"
+ class="text_comment"
+ id="text543">Creates backend processes</text>
+ </g>
+ <g
+ transform="translate(360, 281)"
+ id="g551">
+ <circle
+ r="8"
+ stroke="black"
+ fill="lightyellow"
+ id="circle547" />
+ <text
+ x="-4"
+ y="4"
+ class="text_small"
+ id="text549">2</text>
+ </g>
+ <!-- backend process' access to individual memory -->
+ <path
+ d="M 460,300 v -100"
+ stroke="black"
+ fill="none"
+ marker-start="url(#arrowhead_start)"
+ marker-end="url(#arrowhead_end)"
+ id="path553" />
+ <!-- its access to shared buffers and WAL buffers -->
+ <path
+ d="M 498,300 v -205 h 30"
+ stroke="black"
+ fill="none"
+ marker-start="url(#arrowhead_start)"
+ marker-end="url(#arrowhead_end)"
+ id="path555" />
+ <path
+ d="M 508,300 v -165 h 20"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path557" />
+ <!-- WAL writer -->
+ <g
+ transform="translate(550, 220)"
+ id="g563">
+ <rect
+ width="120"
+ height="30"
+ stroke="blue"
+ fill="none"
+ id="rect559" />
+ <text
+ x="10"
+ y="20"
+ class="text_normal"
+ id="text561">WAL Writer</text>
+ </g>
+ <path
+ d="M 590,150 v 65"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path565" />
+ <path
+ d="M 590,255 v 230"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path567" />
+ <!-- Checkpoiner -->
+ <g
+ transform="translate(610, 340)"
+ id="g573">
+ <rect
+ width="140"
+ height="30"
+ stroke="blue"
+ fill="none"
+ id="rect569" />
+ <text
+ x="10"
+ y="20"
+ class="text_normal"
+ id="text571">Checkpointer</text>
+ </g>
+ <path
+ d="M 740,110 v 220"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path575" />
+ <path
+ d="M 605,355 h -130 v 130"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path577" />
+ <path
+ d="M 700,330 v -180"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path579" />
+ <g
+ transform="translate(570, 330)"
+ id="g587">
+ <use
+ xlink:href="#note_100x35"
+ x="50"
+ y="-50"
+ id="use581" />
+ <text
+ x="60"
+ y="-35"
+ class="text_comment"
+ id="text583">Checkpoint</text>
+ <text
+ x="60"
+ y="-20"
+ class="text_comment"
+ id="text585">Record</text>
+ </g>
+ <!-- BG writer -->
+ <g
+ transform="translate(610, 380)"
+ id="g593">
+ <rect
+ width="180"
+ height="30"
+ stroke="blue"
+ fill="none"
+ id="rect589" />
+ <text
+ x="10"
+ y="20"
+ class="text_normal"
+ id="text591">Background Writer</text>
+ </g>
+ <path
+ d="M 770,110 v 260"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path595" />
+ <path
+ d="M 605,395 h -120 v 90"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path597" />
+ <!-- Archiver -->
+ <g
+ transform="translate(610, 420)"
+ id="g603">
+ <rect
+ width="180"
+ height="30"
+ stroke="blue"
+ fill="none"
+ id="rect599" />
+ <text
+ x="10"
+ y="20"
+ class="text_normal"
+ id="text601">WAL Archiver</text>
+ </g>
+ <path
+ d="M 620,485 l 30,-30"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path605" />
+ <path
+ d="M 740,455 v 30"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path607" />
+ <!-- Vacuum -->
+ <g
+ transform="translate(135, 380)"
+ id="g617">
+ <rect
+ width="120"
+ height="30"
+ stroke="blue"
+ fill="none"
+ id="rect609" />
+ <text
+ x="10"
+ y="20"
+ class="text_normal"
+ id="text611">AutoVacuum</text>
+ <path
+ d="M 5,0 v -5 h 120 v 30 h -5"
+ stroke="blue"
+ fill="none"
+ id="path613" />
+ <path
+ d="M 10,-5 v -5 h 120 v 30 h -5"
+ stroke="blue"
+ fill="none"
+ id="path615" />
+ </g>
+ <!-- Log Writer -->
+ <g
+ transform="translate(135, 430)"
+ id="g623">
+ <rect
+ width="120"
+ height="30"
+ stroke="blue"
+ fill="none"
+ id="rect619" />
+ <text
+ x="10"
+ y="20"
+ class="text_normal"
+ id="text621">Log Writer</text>
+ </g>
+ <!-- Stats Collector (135, 460) -->
+ <g
+ transform="translate(290, 370)"
+ id="g629">
+ <rect
+ width="140"
+ height="30"
+ stroke="blue"
+ fill="none"
+ id="rect625" />
+ <text
+ x="10"
+ y="20"
+ class="text_normal"
+ id="text627">Stats Collector</text>
+ </g>
+ <!-- -->
+ <!-- files -->
+ <!-- -->
+ <g
+ transform="translate(145, 490)"
+ id="g639">
+ <use
+ xlink:href="#disc"
+ id="use631" />
+ <text
+ x="35"
+ y="45"
+ class="text_normal"
+ id="text633">Log</text>
+ <text
+ x="20"
+ y="60"
+ class="text_small"
+ id="text635">text lines,</text>
+ <text
+ x="20"
+ y="75"
+ class="text_small"
+ id="text637">sequential</text>
+ </g>
+ <path
+ d="M 195,465 v 20"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path641" />
+ <g
+ transform="translate(410, 490)"
+ id="g653">
+ <use
+ xlink:href="#disc"
+ id="use643" />
+ <text
+ x="10"
+ y="40"
+ class="text_normal"
+ id="text645">Heap and</text>
+ <text
+ x="25"
+ y="55"
+ class="text_normal"
+ id="text647">Index</text>
+ <text
+ x="15"
+ y="70"
+ class="text_small"
+ id="text649">binary blocks,</text>
+ <text
+ x="30"
+ y="80"
+ class="text_small"
+ id="text651">random</text>
+ </g>
+ <path
+ d="M 450,485 v -135"
+ stroke="black"
+ fill="none"
+ marker-end="url(#arrowhead_end)"
+ id="path655" />
+ <g
+ transform="translate(295, 420)"
+ id="g665">
+ <use
+ xlink:href="#note_170x50"
+ id="use657" />
+ <text
+ x="5"
+ y="15"
+ class="text_comment"
+ id="text659">Read heap and index</text>
+ <text
+ x="5"
+ y="30"
+ class="text_comment"
+ id="text661">pages and transfer</text>
+ <text
+ x="5"
+ y="45"
+ class="text_comment"
+ id="text663">them to shared_buffers</text>
+ </g>
+ <g
+ transform="translate(550, 490)"
+ id="g675">
+ <use
+ xlink:href="#disc"
+ id="use667" />
+ <text
+ x="30"
+ y="45"
+ class="text_normal"
+ id="text669">WAL</text>
+ <text
+ x="10"
+ y="60"
+ class="text_small"
+ id="text671">binary records,</text>
+ <text
+ x="20"
+ y="75"
+ class="text_small"
+ id="text673">sequential</text>
+ </g>
+ <g
+ transform="translate(690, 490)"
+ id="g683">
+ <use
+ xlink:href="#disc"
+ id="use677" />
+ <text
+ x="16"
+ y="45"
+ class="text_normal"
+ id="text679">Archived</text>
+ <text
+ x="36"
+ y="60"
+ class="text_normal"
+ id="text681">WAL</text>
+ </g>
+ <!-- boarder between client and server side -->
+ <path
+ d="M 110,20 v 550"
+ stroke="black"
+ fill="none"
+ id="path685" />
+ <g
+ transform="translate(123, 190) rotate(90)"
+ id="g691">
+ <use
+ xlink:href="#note_200x20"
+ id="use687" />
+ <text
+ class="text_comment"
+ x="10"
+ y="15"
+ id="text689">Via TCP/IP or socket</text>
+ </g>
+ <!-- right side -->
+ <g
+ transform="translate(850, 0) rotate(90)"
+ id="g699">
+ <text
+ class="text_big"
+ x="95"
+ id="text693">RAM</text>
+ <text
+ class="text_big"
+ x="250"
+ id="text695">PROCESSES</text>
+ <text
+ class="text_big"
+ x="500"
+ id="text697">FILES</text>
+ </g>
+</svg>
diff --git a/doc/src/sgml/images/ram-proc-file-raw.svg b/doc/src/sgml/images/ram-proc-file-raw.svg
new file mode 100644
index 0000000000..26eacde411
--- /dev/null
+++ b/doc/src/sgml/images/ram-proc-file-raw.svg
@@ -0,0 +1,301 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="900px" height="600px"
+ viewBox="0 0 900 600">
+
+ <title>PG Overall Server Architecture</title>
+
+ <style type="text/css">
+ .text_small {font-style:normal;
+ font-weight:normal;
+ font-size:12px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_normal {font-style:normal;
+ font-weight:normal;
+ font-size:16px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_big {font-style:normal;
+ font-weight:normal;
+ font-size:24px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ .text_comment {font-style:italic;
+ font-weight:normal;
+ font-size:16px;
+ font-family:"Open Sans", sans-serif;
+ fill:black;
+ }
+ </style>
+
+ <defs>
+
+ <!-- Some notes in different sizes -->
+ <symbol id="note_200x20" stroke="black" fill="lightyellow">
+ <title>UML Note (200 x 20 px)</title>
+ <path d="M 200,10 v 10 h -200 v -20 h 190 v 10 h 10 l -10,-10" />
+ </symbol>
+ <symbol id="note_250x20" stroke="black" fill="lightyellow">
+ <title>UML Note (250 x 20 px)</title>
+ <path d="M 250,10 v 10 h -250 v -20 h 240 v 10 h 10 l -10,-10" />
+ </symbol>
+ <symbol id="note_100x35" stroke="black" fill="lightyellow">
+ <title>UML Note (100 x 35 px)</title>
+ <path d="M 100,10 v 25 h -100 v -35 h 90 v 10 h 10 l -10,-10" />
+ </symbol>
+ <symbol id="note_170x50" stroke="black" fill="lightyellow">
+ <title>UML Note (170 x 50 px)</title>
+ <path d="M 170,10 v 40 h -170 v -50 h 160 v 10 h 10 l -10,-10" />
+ </symbol>
+
+ <!-- UML states (used for buffers) -->
+ <symbol id="state_300x120">
+ <title>UML State, big</title>
+ <rect x="0" y="0" width="300" height="120" rx="10" stroke="blue" fill="none"/>
+ </symbol>
+ <symbol id="state_350x120">
+ <title>UML State, big</title>
+ <rect x="0" y="0" width="350" height="120" rx="10" stroke="blue" fill="none"/>
+ </symbol>
+
+ <!-- Discs -->
+ <symbol id="disc" stroke="blue" fill="none" >
+ <title>Disc</title>
+ <ellipse cx="51" cy="13" rx="50" ry="12" /> <!-- top -->
+ <path d="M 1,13 v 60" /> <!-- left -->
+ <path d="M 101,13 v 60" /> <!-- right -->
+ <path d="M 1,73 A 50, 12, 0, 0, 0, 101,73" /> <!-- bottom -->
+ </symbol>
+
+ <!-- Laptop -->
+ <symbol id="laptop" stroke="black" fill="none" >
+ <title>Laptop</title>
+ <path d="M 20,40 v -40 h 54 v 40 l 15,15 h -84 l 15,-15 h 54" />
+ <rect x="23" y="3" width="48" height="34" />
+ <!-- symbolize some lines -->
+ <path d="M 30,10 h 20" />
+ <path d="M 30,15 h 25" />
+ <path d="M 30,20 h 10" />
+ <path d="M 30,30 h 20" />
+ <!-- symbolize keyboard -->
+ <path d="M 25,50 h 45 l 2,2 h -50 z " />
+ </symbol>
+
+ <!-- marker start/end -->
+ <marker id="arrowhead_start"
+ markerWidth="10"
+ markerHeight="10"
+ refX="0"
+ refY="3"
+ orient="auto">
+ <path d="M 6,0 l -6,3 l 6,3" stroke="black" fill="none" />
+ </marker>
+ <marker id="arrowhead_end"
+ markerWidth="10"
+ markerHeight="10"
+ refX="6"
+ refY="3"
+ orient="auto">
+ <path d="M 0,0 l 6,3 l -6,3" stroke="black" fill="none" />
+ </marker>
+
+ </defs>
+
+
+ <!-- start of rendering area -->
+ <!-- enclosing rectangle -->
+ <rect x="1" y="1" rx="5" width="99%" height="99%" stroke="black" fill="none" />
+
+ <!-- caption, client side -->
+ <text x="15" y="40" class="text_big">Client</text>
+ <text x="140" y="40" class="text_big">Server</text>
+ <use xlink:href="#laptop" x="5" y="210" />
+
+
+ <!-- individual memory -->
+ <g transform="translate(130, 70)">
+ <use xlink:href="#state_350x120" x="0" y="0" />
+ <text x="5" y="20" class="text_normal">maintenance_work_mem (per connection)</text>
+ <text x="5" y="45" class="text_normal">work_mem (per query operation)</text>
+ <text x="5" y="70" class="text_normal">autovacuum_work_mem (per worker process)</text>
+ <text x="5" y="95" class="text_normal">temp_buffer (per connection)</text>
+ <text x="5" y="110" class="text_normal">...</text>
+ <use xlink:href="#note_200x20" x="140" y="-15" />
+ <text x="150" y="0" class="text_comment">Individual Memory</text>
+ </g>
+
+ <!-- shared memory -->
+ <g transform="translate(520, 70)">
+ <use xlink:href="#state_300x120" x="0" y="0" />
+ <text x="10" y="30" class="text_normal">shared_buffers (heap and index)</text>
+ <text x="10" y="70" class="text_normal">wal_buffers (WAL records)</text>
+ <text x="10" y="100" class="text_normal">...</text>
+ <use xlink:href="#note_250x20" x="40" y="-15" />
+ <text x="50" y="0" class="text_comment">Shared Memory (per Cluster)</text>
+ </g>
+
+ <!-- postmaster -->
+ <g transform="translate(190, 215)">
+ <rect width="200" height="30" stroke="blue" fill="none" />
+ <text x="10" y="20" class="text_normal">Postmaster process</text>
+ </g>
+ <path d="M 90,230 h 85" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <g transform="translate(140, 230)">
+ <circle r="8" stroke="black" fill="lightyellow" />
+ <text x="-4" y="4" class="text_small">1</text>
+ </g>
+
+ <!-- backend processes -->
+ <g transform="translate(150, 315)">
+ <rect width="370" height="30" stroke="blue" fill="none" />
+ <text x="10" y="20" class="text_normal">Backend processes (one per connection)</text>
+ <path d="M 5,0 v -5 h 370 v 30 h -5" stroke="blue" fill="none" />
+ <path d="M 10,-5 v -5 h 370 v 30 h -5" stroke="blue" fill="none" />
+ </g>
+
+ <path d="M 90,240 153,303" stroke="black" fill="none"
+ marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+ <g transform="translate(140, 290)">
+ <circle r="8" stroke="black" fill="lightyellow" />
+ <text x="-4" y="4" class="text_small">3</text>
+ </g>
+
+ <!-- connection between postmaster and backend processes -->
+ <path d="M 360,250 v 50" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <g transform="translate(190, 255)">
+ <use xlink:href="#note_250x20" />
+ <text x="10" y="15" class="text_comment">Creates backend processes</text>
+ </g>
+ <g transform="translate(360, 281)">
+ <circle r="8" stroke="black" fill="lightyellow" />
+ <text x="-4" y="4" class="text_small">2</text>
+ </g>
+
+ <!-- backend process' access to individual memory -->
+ <path d="M 460,300 v -100" stroke="black" fill="none"
+ marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+ <!-- its access to shared buffers and WAL buffers -->
+ <path d="M 498,300 v -205 h 30" stroke="black" fill="none"
+ marker-start="url(#arrowhead_start)" marker-end="url(#arrowhead_end)"/>
+ <path d="M 508,300 v -165 h 20" stroke="black" fill="none"
+ marker-end="url(#arrowhead_end)"/>
+
+ <!-- WAL writer -->
+ <g transform="translate(550, 220)">
+ <rect width="120" height="30" stroke="blue" fill="none" />
+ <text x="10" y="20" class="text_normal">WAL Writer</text>
+ </g>
+ <path d="M 590,150 v 65" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M 590,255 v 230" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+
+ <!-- Checkpoiner -->
+ <g transform="translate(610, 340)">
+ <rect width="140" height="30" stroke="blue" fill="none" />
+ <text x="10" y="20" class="text_normal">Checkpointer</text>
+ </g>
+ <path d="M 740,110 v 220" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M 605,355 h -130 v 130" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M 700,330 v -180" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <g transform="translate(570, 330)">
+ <use xlink:href="#note_100x35" x="50" y="-50" />
+ <text x="60" y="-35" class="text_comment">Checkpoint</text>
+ <text x="60" y="-20" class="text_comment">Record</text>
+ </g>
+
+ <!-- BG writer -->
+ <g transform="translate(610, 380)">
+ <rect width="180" height="30" stroke="blue" fill="none" />
+ <text x="10" y="20" class="text_normal">Background Writer</text>
+ </g>
+ <path d="M 770,110 v 260" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M 605,395 h -120 v 90" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+
+ <!-- Archiver -->
+ <g transform="translate(610, 420)">
+ <rect width="180" height="30" stroke="blue" fill="none" />
+ <text x="10" y="20" class="text_normal">WAL Archiver</text>
+ </g>
+ <path d="M 620,485 l 30,-30" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+ <path d="M 740,455 v 30" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+
+ <!-- Vacuum -->
+ <g transform="translate(135, 380)">
+ <rect width="120" height="30" stroke="blue" fill="none" />
+ <text x="10" y="20" class="text_normal">AutoVacuum</text>
+ <path d="M 5,0 v -5 h 120 v 30 h -5" stroke="blue" fill="none" />
+ <path d="M 10,-5 v -5 h 120 v 30 h -5" stroke="blue" fill="none" />
+ </g>
+
+ <!-- Log Writer -->
+ <g transform="translate(135, 430)">
+ <rect width="120" height="30" stroke="blue" fill="none" />
+ <text x="10" y="20" class="text_normal">Log Writer</text>
+ </g>
+
+ <!-- Stats Collector (135, 460) -->
+ <g transform="translate(290, 370)">
+ <rect width="140" height="30" stroke="blue" fill="none" />
+ <text x="10" y="20" class="text_normal">Stats Collector</text>
+ </g>
+
+ <!-- -->
+ <!-- files -->
+ <!-- -->
+ <g transform="translate(145, 490)">
+ <use xlink:href="#disc" />
+ <text x="35" y="45" class="text_normal">Log</text>
+ <text x="20" y="60" class="text_small">text lines,</text>
+ <text x="20" y="75" class="text_small">sequential</text>
+ </g>
+ <path d="M 195,465 v 20" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+
+ <g transform="translate(410, 490)">
+ <use xlink:href="#disc" />
+ <text x="10" y="40" class="text_normal">Heap and</text>
+ <text x="25" y="55" class="text_normal">Index</text>
+ <text x="15" y="70" class="text_small">binary blocks,</text>
+ <text x="30" y="80" class="text_small">random</text>
+ </g>
+ <path d="M 450,485 v -135" stroke="black" fill="none" marker-end="url(#arrowhead_end)"/>
+
+ <g transform="translate(295, 420)">
+ <use xlink:href="#note_170x50" />
+ <text x="5" y="15" class="text_comment">Read heap and index</text>
+ <text x="5" y="30" class="text_comment">pages and transfer</text>
+ <text x="5" y="45" class="text_comment">them to shared_buffers</text>
+ </g>
+
+ <g transform="translate(550, 490)">
+ <use xlink:href="#disc" />
+ <text x="30" y="45" class="text_normal">WAL</text>
+ <text x="10" y="60" class="text_small">binary records,</text>
+ <text x="20" y="75" class="text_small">sequential</text>
+ </g>
+
+ <g transform="translate(690, 490)">
+ <use xlink:href="#disc" />
+ <text x="16" y="45" class="text_normal">Archived</text>
+ <text x="36" y="60" class="text_normal">WAL</text>
+ </g>
+
+ <!-- boarder between client and server side -->
+ <path d="M 110,20 v 550" stroke="black" fill="none" />
+ <g transform="translate(123, 190) rotate(90)">
+ <use xlink:href="#note_200x20" />
+ <text class="text_comment" x="10" y ="15">Via TCP/IP or socket</text>
+ </g>
+
+ <!-- right side -->
+ <g transform="translate(850, 0) rotate(90)">
+ <text class="text_big" x="95">RAM</text>
+ <text class="text_big" x="250">PROCESSES</text>
+ <text class="text_big" x="500">FILES</text>
+ </g>
+
+</svg>
diff --git a/doc/src/sgml/postgres.sgml b/doc/src/sgml/postgres.sgml
index c41ce9499b..6254bf9376 100644
--- a/doc/src/sgml/postgres.sgml
+++ b/doc/src/sgml/postgres.sgml
@@ -60,6 +60,7 @@ break is not needed in a wider output rendering.
</partintro>
&start;
+ &architecture;
&query;
&advanced;