aboutsummaryrefslogtreecommitdiff
path: root/doc/manual/admin.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/manual/admin.html')
-rw-r--r--doc/manual/admin.html539
1 files changed, 0 insertions, 539 deletions
diff --git a/doc/manual/admin.html b/doc/manual/admin.html
deleted file mode 100644
index be24aca1e60..00000000000
--- a/doc/manual/admin.html
+++ /dev/null
@@ -1,539 +0,0 @@
-<HTML>
-<HEAD>
- <TITLE>The POSTGRES95 User Manual - ADMINISTERING POSTGRES</TITLE>
-</HEAD>
-
-<BODY>
-
-<font size=-1>
-<A HREF="pg95user.html">[ TOC ]</A>
-<A HREF="rules.html">[ Previous ]</A>
-<A HREF="refs.html">[ Next ]</A>
-</font>
-<HR>
-<H1>15. ADMINISTERING POSTGRES</H1>
-<HR>
- In this section, we will discuss aspects of POSTGRES
- that are of interest to those who make extensive use of
- POSTGRES, or who are the site administrator for a group
- of POSTGRES users.
-
-<H2>15.1. Frequent Tasks</H2>
- Here we will briefly discuss some procedures that you
- should be familiar with in managing any POSTGRES
- installation.
-
-<H3>15.1.1. Starting the Postmaster</H3>
- If you did not install POSTGRES exactly as described in
- the installation instructions, you may have to perform
- some additional steps before starting the postmaster
- process.
- <UL>
- <LI>Even if you were not the person who installed POSTGRES,
- you should understand the installation
- instructions. The installation instructions explain
- some important issues with respect to where POSTGRES
- places some important files, proper settings for
- environment variables, etc. that may vary from one
- version of POSTGRES to another.<p>
- <LI>You must start the postmaster process with the userid
- that owns the installed database files. In most
- cases, if you have followed the installation
- instructions, this will be the user "<B>postgres</B>". If
- you do not start the postmaster with the right userid,
- the backend servers that are started by the
- postmaster will not be able to read the data.<p>
- <LI>Make sure that <CODE>/usr/local/postgres95/bin</CODE> is in your
- shell command path, because the postmaster will use
- your <B>PATH</B> to locate POSTGRES commands.<p>
- <LI>Remember to set the environment variable <B>PGDATA</B> to
- the directory where the POSTGRES databases are
- installed. (This variable is more fully explained
- in the POSTGRES installation instructions.)<p>
- <LI>If you do start the postmaster using non-standard
- options, such as a different TCP port number, remember
- to tell all users so that they can set their
- <B>PGPORT</B> environment variable correctly.<p>
- </UL>
-
-<H3>15.1.2. Shutting Down the Postmaster</H3>
- If you need to halt the postmaster process, you can use
- the <B>UNIX</B> <B>kill(1)</B> command. Some people habitually use
- the <B>-9</B> or <B>-KILL</B> option; this should never be necessary
- and we do not recommend that you do this, as the postmaster
- will be unable to free its various shared
- resources, its child processes will be unable to exit
- gracefully, etc.
-
-<H3>15.1.3. Adding and Removing Users</H3>
- The createuser and destroyuser commands enable and disable
- access to POSTGRES by specific users on the host
- system.
-
-<H3>15.1.4. Periodic Upkeep</H3>
- The vacuum command should be run on each database periodically.
- This command processes deleted instances<A HREF="#9"><font size=-1>[9]</font></A>
- and, more importantly, updates the system statistics
- concerning the size of each class. If these statistics
- are permitted to become out-of-date and inaccurate, the
- POSTGRES query optimizer may make extremely poor decisions
- with respect to query evaluation strategies.
- Therefore, we recommend running vacuum every night or
- so (perhaps in a script that is executed by the <B>UNIX</B>
- <B>cron(1)</B> or <B>at(1)</B> commands).
- Do frequent backups. That is, you should either back
- up your database directories using the POSTGRES copy
- command and/or the <B>UNIX</B> <B>dump(1)</B> or <B>tar(1)</B> commands.
- You may think, "Why am I backing up my database? What
- about crash recovery?" One side effect of the POSTGRES
- "no overwrite" storage manager is that it is also a "no
- log" storage manager. That is, the database log stores
- only abort/commit data, and this is not enough information
- to recover the database if the storage medium
- (disk) or the database files are corrupted! In other
- words, if a disk block goes bad or POSTGRES happens to
- corrupt a database file, you cannot recover that file.
- This can be disastrous if the file is one of the shared
- catalogs, such as pg_database.
-
-<H3>15.1.5. Tuning</H3>
- Once your users start to load a significant amount of
- data, you will typically run into performance problems.
- POSTGRES is not the fastest DBMS in the world, but many
- of the worst problems encountered by users are due to
- their lack of experience with any DBMS. Some general
- tips include:
- <OL>
- <LI> Define indices over attributes that are commonly
- used for qualifications. For example, if you
- often execute queries of the form
-
-<pre> SELECT &#42; from EMP where salary &lt; 5000
-</pre>
- then a B-tree index on the salary attribute will
- probably be useful. If scans involving equality
- are more common, as in
-
-<pre> SELECT &#42; from EMP where salary = 5000
-</pre>
- then you should consider defining a hash index
- on salary. You can define both, though it will
- use more disk space and may slow down updates a
- bit. Scans using indices are much faster than
- sequential scans of the entire class.<p>
- <LI> Run the vacuum command a lot. This command
- updates the statistics that the query optimizer
- uses to make intelligent decisions; if the
- statistics are inaccurate, the system will make
- inordinately stupid decisions with respect to
- the way it joins and scans classes.<p>
- <LI> When specifying query qualfications (i.e., the
- where part of the query), try to ensure that a
- clause involving a constant can be turned into
- one of the form range_variable operator constant, e.g.,
-
-<pre> EMP.salary = 5000
-</pre>
- The POSTGRES query optimizer will only use an
- index with a constant qualification of this
- form. It doesn't hurt to write the clause as
-
-<pre> 5000 = EMP.salary
-</pre>
- if the operator (in this case, =) has a commutator
- operator defined so that POSTGRES can
- rewrite the query into the desired form. However,
- if such an operator does not exist, POSTGRES
- will never consider the use of an index.<p>
- <LI> When joining several classes together in one
- query, try to write the join clauses in a
- "chained" form, e.g.,
-
-<pre> where A.a = B.b and B.b = C.c and ...
-</pre>
- Notice that relatively few clauses refer to a
- given class and attribute; the clauses form a
- linear sequence connecting the attributes, like
- links in a chain. This is preferable to a query
- written in a "star" form, such as
-
-<pre> where A.a = B.b and A.a = C.c and ...
-</pre>
- Here, many clauses refer to the same class and
- attribute (in this case, A.a). When presented
- with a query of this form, the POSTGRES query
- optimizer will tend to consider far more choices
- than it should and may run out of memory.<p>
- <LI> If you are really desperate to see what query
- plans look like, you can run the postmaster with
- the -d option and then run monitor with the -t
- option. The format in which query plans will be
- printed is hard to read but you should be able
- to tell whether any index scans are being performed.<br>
-</OL>
-
-<H2>15.2. Infrequent Tasks</H2>
-
- At some time or another, every POSTGRES site
- administrator has to perform all of the following actions.
-
-15.2.1. Cleaning Up After Crashes
- The <B>postgres</B> server and the <B>postmaster</B> run as two
- different processes. They may crash separately or
- together. The housekeeping procedures required to fix
- one kind of crash are different from those required to
- fix the other.
- The message you will usually see when the backend
- server crashes is:
-
-<pre> FATAL: no response from backend: detected in ...
-</pre>
- This generally means one of two things: there is a bug
- in the POSTGRES server, or there is a bug in some user
- code that has been dynamically loaded into POSTGRES.
- You should be able to restart your application and
- resume processing, but there are some considerations:
- <OL>
- <LI> POSTGRES usually dumps a core file (a snapshot
- of process memory used for debugging) in the
- database directory
-<pre> /usr/local/postgres95/data/base/&lt;database&gt;/core
-</pre>
- on the server machine. If you don't want to try
- to debug the problem or produce a stack trace to
- report the bug to someone else, you can delete
- this file (which is probably around 10MB).<p>
- <LI> When one backend crashes in an uncontrolled way
- (i.e., without calling its built-in cleanup
- routines), the postmaster will detect this situation,
- kill all running servers and reinitialize
- the state shared among all backends (e.g., the
- shared buffer pool and locks). If your server
- crashed, you will get the "no response" message
- shown above. If your server was killed because
- someone else's server crashed, you will see the
- following message:
-
-<pre> I have been signalled by the postmaster.
- Some backend process has died unexpectedly and possibly
- corrupted shared memory. The current transaction was
- aborted, and I am going to exit. Please resend the
- last query. -- The postgres backend
-</pre><br>
- <LI> Sometimes shared state is not completely cleaned
- up. Frontend applications may see errors of the
- form:
-
-<pre> WARN: cannot write block 34 of myclass [mydb] blind
-</pre>
- In this case, you should kill the postmaster and
- restart it.<p>
- <LI> When the system crashes while updating the system
- catalogs (e.g., when you are creating a
- class, defining an index, retrieving into a
- class, etc.) the B-tree indices defined on the
- catalogs are sometimes corrupted. The general
- (and non-unique) symptom is that all queries
- stop working. If you have tried all of the
- above steps and nothing else seems to work, try
- using the reindexdb command. If reindexdb succeeds
- but things still don't work, you have
- another problem; if it fails, the system catalogs
- themselves were almost certainly corrupted
- and you will have to go back to your backups.<p>
- </OL>
- The postmaster does not usually crash (it doesn't do
- very much except start servers) but it does happen on
- occasion. In addition, there are a few cases where it
- encounters problems during the reinitialization of
- shared resources. Specifically, there are race conditions
- where the operating system lets the postmaster
- free shared resources but then will not permit it to
- reallocate the same amount of shared resources (even
- when there is no contention).
- You will typically have to run the ipcclean command if
- system errors cause the postmaster to crash. If this
- happens, you may find (using the UNIX ipcs(1) command)
- that the "<B>postgres</B>" user has shared memory and/or
- semaphores allocated even though no postmaster process
- is running. In this case, you should run ipcclean as
- the "<B>postgres</B>" user in order to deallocate these
- resources. Be warned that all such resources owned by
- the "<B>postgres</B>" user will be deallocated. If you have
- multiple postmaster processes running on the same
- machine, you should kill all of them before running
- ipcclean (otherwise, they will crash on their own when
- their shared resources are suddenly deallocated).
-
-<H3>15.2.2. Moving Database Directories</H3>
- By default, all POSTGRES databases are stored in
- separate subdirectories under
- <CODE>/usr/local/postgres95/data/base</CODE>.<A HREF="#10"><font size=-1>[10]</font></A> At some point, you
- may find that you wish to move one or more databases to
- another location (e.g., to a filesystem with more free
- space).
- If you wish to move all of your databases to the new
- location, you can simply:
- <UL>
- <LI>Kill the postmaster.<p>
- <LI>Copy the entire data directory to the new location
- (making sure that the new files are owned by user
- "<B>postgres</B>").
-
-<pre> &#37; cp -rp /usr/local/postgres95/data /new/place/data
-</pre><p>
- <LI>Reset your PGDATA environment variable (as described
- earlier in this manual and in the installation
- instructions).
-
-<pre> # using csh or tcsh...
- &#37; setenv PGDATA /new/place/data
-
- # using sh, ksh or bash...
- &#37; PGDATA=/new/place/data; export PGDATA
-
-</pre><p>
- <LI>Restart the postmaster.
-
-<pre> &#37; postmaster &amp;
-</pre><p>
- <LI>After you run some queries and are sure that the
- newly-moved database works, you can remove the old
- data directory.
-<pre> &#37; rm -rf /usr/local/postgres95/data
-</pre><p>
-</UL>
- To install a single database in an alternate directory
- while leaving all other databases in place, do the following:
-<UL>
- <LI>Create the database (if it doesn't already exist)
- using the createdb command. In the following steps
- we will assume the database is named foo.<p>
- <LI>Kill the postmaster.<p>
- <LI>Copy the directory
- <CODE>/usr/local/postgres95/data/base/foo</CODE> and its contents
- to its ultimate destination. It should still be
- owned by the "<B>postgres</B>" user.
-
-<pre> &#37; cp -rp /usr/local/postgres95/data/base/foo /new/place/foo
-</pre>
- <LI>Remove the directory
- <CODE>/usr/local/postgres95/data/base/foo</CODE>:
-
-<pre> &#37; rm -rf /usr/local/postgres95/data/base/foo
-</pre>
- <LI>Make a symbolic link from
- <CODE>/usr/local/postgres95/data/base</CODE> to the new directory:
-
-<pre> &#37; ln -s /new/place/foo /usr/local/postgres95/data/base/foo
-</pre>
- <LI>Restart the postmaster.
-</UL>
-<p>
-<H3>15.2.3. Updating Databases</H3>
- POSTGRES is a research system. In general, POSTGRES
- may not retain the same binary format for the storage
- of databases from release to release. Therefore, when
- you update your POSTGRES software, you will probably
- have to modify your databases as well. This is a common
- occurrence with commercial database systems as
- well; unfortunately, unlike commercial systems, POSTGRES
- does not come with user-friendly utilities to make
- your life easier when these updates occur.
- In general, you must do the following to update your
- databases to a new software release:
- <UL>
- <LI>Extensions (such as user-defined types, functions,
- aggregates, etc.) must be reloaded by re-executing
- the <B>SQL CREATE</B> commands. See Appendix A for more
- details.
- <LI>Data must be dumped from the old classes into ASCII
- files (using the <B>COPY</B> command), the new classes created
- in the new database (using the <B>CREATE TABLE</B>
- command), and the data reloaded from the ASCII files.
- <LI>Rules and views must also be reloaded by
- reexecuting the various CREATE commands.
- </UL>
- You should give any new release a "trial period"; in
- particular, do not delete the old database until you
- are satisfied that there are no compatibility problems
- with the new software. For example, you do not want to
- discover that a bug in a type's "input" (conversion
- from ASCII) and "output" (conversion to ASCII) routines
- prevents you from reloading your data after you have
- destroyed your old databases! (This should be standard
- procedure when updating any software package, but some
- people try to economize on disk space without applying
- enough foresight.)
-
-<H2>15.3. Database Security</H2>
-
- Most sites that use POSTGRES are educational or
- research institutions and do not pay much attention to
- security in their POSTGRES installations. If desired,
- one can install POSTGRES with additional security
- features. Naturally, such features come with additional
- administrative overhead that must be dealt with.
-
-<H3>15.3.1. Kerberos</H3>
- POSTGRES can be configured to use the <B>MIT</B> <B>Kerberos</B> network
- authentication system. This prevents outside
- users from connecting to your databases over the network
- without the correct authentication information.
-<p>
-<H2>15.4. Querying the System Catalogs</H2>
- As an administrator (or sometimes as a plain user), you
- want to find out what extensions have been added to a
- given database. The queries listed below are "canned"
- queries that you can run on any database to get simple
- answers. Before executing any of the queries below, be
- sure to execute the POSTGRES <B>vacuum</B> command. (The
- queries will run much more quickly that way.) Also,
- note that these queries are also listed in
-<pre> /usr/local/postgres95/tutorial/syscat.sql
-</pre>
- so use cut-and-paste (or the <B>\i</B> command) instead of
- doing a lot of typing.
- This query prints the names of all database adminstrators
- and the name of their database(s).
-<pre> SELECT usename, datname
- FROM pg_user, pg_database
- WHERE usesysid = int2in(int4out(datdba))
- ORDER BY usename, datname;
-</pre>
- This query lists all user-defined classes in the
- database.
-<pre> SELECT relname
- FROM pg_class
- WHERE relkind = 'r' -- not indices
- and relname !~ '^pg_' -- not catalogs
- and relname !~ '^Inv' -- not large objects
- ORDER BY relname;
-</pre>
- This query lists all simple indices (i.e., those that
- are not defined over a function of several attributes).
-<pre> SELECT bc.relname AS class_name,
- ic.relname AS index_name,
- a.attname
- FROM pg_class bc, -- base class
- pg_class ic, -- index class
- pg_index i,
- pg_attribute a -- att in base
- WHERE i.indrelid = bc.oid
- and i.indexrelid = ic.oid
- and i.indkey[0] = a.attnum
- and a.attrelid = bc.oid
- and i.indproc = '0'::oid -- no functional indices
- ORDER BY class_name, index_name, attname;
-</pre>
- This query prints a report of the user-defined
- attributes and their types for all user-defined classes
- in the database.
-<pre> SELECT c.relname, a.attname, t.typname
- FROM pg_class c, pg_attribute a, pg_type t
- WHERE c.relkind = 'r' -- no indices
- and c.relname !~ '^pg_' -- no catalogs
- and c.relname !~ '^Inv' -- no large objects
- and a.attnum &gt; 0 -- no system att's
- and a.attrelid = c.oid
- and a.atttypid = t.oid
- ORDER BY relname, attname;
-</pre>
- This query lists all user-defined base types (not
- including array types).
-<pre> SELECT u.usename, t.typname
- FROM pg_type t, pg_user u
- WHERE u.usesysid = int2in(int4out(t.typowner))
- and t.typrelid = '0'::oid -- no complex types
- and t.typelem = '0'::oid -- no arrays
- and u.usename &lt;&gt; 'postgres'
- ORDER BY usename, typname;
-</pre>
- This query lists all left-unary (post-fix) operators.
-<pre> SELECT o.oprname AS left_unary,
- right.typname AS operand,
- result.typname AS return_type
- FROM pg_operator o, pg_type right, pg_type result
- WHERE o.oprkind = 'l' -- left unary
- and o.oprright = right.oid
- and o.oprresult = result.oid
- ORDER BY operand;
-</pre>
- This query lists all right-unary (pre-fix) operators.
-<pre> SELECT o.oprname AS right_unary,
- left.typname AS operand,
- result.typname AS return_type
- FROM pg_operator o, pg_type left, pg_type result
- WHERE o.oprkind = 'r' -- right unary
- and o.oprleft = left.oid
- and o.oprresult = result.oid
- ORDER BY operand;
-</pre>
- This query lists all binary operators.
-<pre> SELECT o.oprname AS binary_op,
- left.typname AS left_opr,
- right.typname AS right_opr,
- result.typname AS return_type
- FROM pg_operator o, pg_type left, pg_type right, pg_type result
- WHERE o.oprkind = 'b' -- binary
- and o.oprleft = left.oid
- and o.oprright = right.oid
- and o.oprresult = result.oid
- ORDER BY left_opr, right_opr;
-</pre>
- This query returns the name, number of arguments
- (parameters) and return type of all user-defined C
- functions. The same query can be used to find all
- built-in C functions if you change the "<B>C</B>" to "<B>internal</B>",
- or all <B>SQL</B> functions if you change the "<B>C</B>" to
- "<B>sql</B>".
-<pre> SELECT p.proname, p.pronargs, t.typname
- FROM pg_proc p, pg_language l, pg_type t
- WHERE p.prolang = l.oid
- and p.prorettype = t.oid
- and l.lanname = 'c'
- ORDER BY proname;
-</pre>
- This query lists all of the aggregate functions that
- have been installed and the types to which they can be
- applied. count is not included because it can take any
- type as its argument.
-<pre> SELECT a.aggname, t.typname
- FROM pg_aggregate a, pg_type t
- WHERE a.aggbasetype = t.oid
- ORDER BY aggname, typname;
-</pre>
- This query lists all of the operator classes that can
- be used with each access method as well as the operators
- that can be used with the respective operator
- classes.
-<pre> SELECT am.amname, opc.opcname, opr.oprname
- FROM pg_am am, pg_amop amop, pg_opclass opc, pg_operator opr
- WHERE amop.amopid = am.oid
- and amop.amopclaid = opc.oid
- and amop.amopopr = opr.oid
- ORDER BY amname, opcname, oprname;
-</pre>
-<p>
-
-<HR>
-<A NAME="9"><B>9.</B></A>
-This may mean different things depending on the archive
-mode with which each class has been created. However, the
-current implementation of the vacuum command does not perform any compaction or clustering of data. Therefore, the
-UNIX files which store each POSTGRES class never shrink and
-the space "reclaimed" by vacuum is never actually reused.
-
-<HR width=50 align=left>
-<A NAME="10"><B>10.</B></A>
-Data for certain classes may stored elsewhere if a
-non-standard storage manager was specified when they were
-created. Use of non-standard storage managers is an experimental feature that is not supported outside of Berkeley.
-<HR>
-<font size=-1>
-<A HREF="pg95user.html">[ TOC ]</A>
-<A HREF="rules.html">[ Previous ]</A>
-<A HREF="refs.html">[ Next ]</A>
-</font>
-
-