-<!-- $PostgreSQL: pgsql/doc/src/sgml/manage-ag.sgml,v 2.58 2009/05/06 16:15:20 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/manage-ag.sgml,v 2.59 2009/12/10 06:32:27 petere Exp $ -->
<chapter id="managing-databases">
<title>Managing Databases</title>
<para>
A second database,
<literal>template1</literal>,<indexterm><primary>template1</></>
- is also created by
- <command>initdb</>. Whenever a new database is created within the
+ is also created during database cluster initialization. Whenever a
+ new database is created within the
cluster, <literal>template1</literal> is essentially cloned.
This means that any changes you make in <literal>template1</> are
propagated to all subsequently created databases. Therefore it is
<literal>template1</>, that is, only the standard objects
predefined by your version of
<productname>PostgreSQL</productname>. <literal>template0</>
- should never be changed after <command>initdb</>. By instructing
+ should never be changed after the database cluster has been
+ initialized. By instructing
<command>CREATE DATABASE</> to copy <literal>template0</> instead
of <literal>template1</>, you can create a <quote>virgin</> user
database that contains none of the site-local additions in
</para>
<para>
- Two tablespaces are automatically created by <literal>initdb</>. The
+ Two tablespaces are automatically created when the database cluster
+ is initialized. The
<literal>pg_global</> tablespace is used for shared system catalogs. The
<literal>pg_default</> tablespace is the default tablespace of the
<literal>template1</> and <literal>template0</> databases (and, therefore,
<!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/pg_ctl-ref.sgml,v 1.46 2008/06/26 01:12:19 momjian Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/pg_ctl-ref.sgml,v 1.47 2009/12/10 06:32:28 petere Exp $
PostgreSQL documentation
-->
<refnamediv>
<refname>pg_ctl</refname>
- <refpurpose>start, stop, or restart a <productname>PostgreSQL</productname> server</refpurpose>
+ <refpurpose>initialize, start, stop, or restart a <productname>PostgreSQL</productname> server</refpurpose>
</refnamediv>
<indexterm zone="app-pg-ctl">
<refsynopsisdiv>
<cmdsynopsis>
+ <command>pg_ctl</command>
+ <arg choice="plain">init[db]</arg>
+ <arg>-s</arg>
+ <arg>-D <replaceable>datadir</replaceable></arg>
+ <arg>-o <replaceable>options</replaceable></arg>
+ <sbr>
+
<command>pg_ctl</command>
<arg choice="plain">start</arg>
<arg>-w</arg>
<refsect1 id="app-pg-ctl-description">
<title>Description</title>
<para>
- <application>pg_ctl</application> is a utility for starting,
+ <application>pg_ctl</application> is a utility for initializing a
+ <productname>PostgreSQL</productname> database cluster, starting,
stopping, or restarting the <productname>PostgreSQL</productname>
backend server (<xref linkend="app-postgres">), or displaying the
status of a running server. Although the server can be started
controlled shutdown.
</para>
+ <para>
+ The <option>init</option> or <option>initdb</option> mode creates a
+ new
+ <productname>PostgreSQL</productname> database cluster. A database
+ cluster is a collection of databases that are managed by a single
+ server instance. This mode invokes the <command>initdb</command>
+ command. See <xref linkend="app-initdb"> for details.
+ </para>
+
<para>
In <option>start</option> mode, a new server is launched. The
server is started in the background, and standard input is attached to
option unless you are doing something unusual and get errors
that the <filename>postgres</filename> executable was not found.
</para>
+
+ <para>
+ In <literal>init</literal> mode, this option analogously
+ specifies the location of the <filename>initdb</filename>
+ executable.
+ </para>
</listitem>
</varlistentry>
<refsect1>
<title>See Also</title>
- <para>
- <xref linkend="app-postgres">
- </para>
+ <simplelist type="inline">
+ <member><xref linkend="app-initdb"></member>
+ <member><xref linkend="app-postgres"></member>
+ </simplelist>
</refsect1>
</refentry>
*
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.115 2009/11/14 15:39:36 mha Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.116 2009/12/10 06:32:28 petere Exp $
*
*-------------------------------------------------------------------------
*/
typedef enum
{
NO_COMMAND = 0,
+ INIT_COMMAND,
START_COMMAND,
STOP_COMMAND,
RESTART_COMMAND,
static char *post_opts = NULL;
static const char *progname;
static char *log_file = NULL;
-static char *postgres_path = NULL;
+static char *exec_path = NULL;
static char *register_servicename = "PostgreSQL"; /* FIXME: + version ID? */
static char *register_username = NULL;
static char *register_password = NULL;
static void do_help(void);
static void set_mode(char *modeopt);
static void set_sig(char *signame);
+static void do_init(void);
static void do_start(void);
static void do_stop(void);
static void do_restart(void);
*/
if (log_file != NULL)
snprintf(cmd, MAXPGPATH, SYSTEMQUOTE "\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1 &" SYSTEMQUOTE,
- postgres_path, pgdata_opt, post_opts,
+ exec_path, pgdata_opt, post_opts,
DEVNULL, log_file);
else
snprintf(cmd, MAXPGPATH, SYSTEMQUOTE "\"%s\" %s%s < \"%s\" 2>&1 &" SYSTEMQUOTE,
- postgres_path, pgdata_opt, post_opts, DEVNULL);
+ exec_path, pgdata_opt, post_opts, DEVNULL);
return system(cmd);
#else /* WIN32 */
if (log_file != NULL)
snprintf(cmd, MAXPGPATH, "CMD /C " SYSTEMQUOTE "\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1" SYSTEMQUOTE,
- postgres_path, pgdata_opt, post_opts, DEVNULL, log_file);
+ exec_path, pgdata_opt, post_opts, DEVNULL, log_file);
else
snprintf(cmd, MAXPGPATH, "CMD /C " SYSTEMQUOTE "\"%s\" %s%s < \"%s\" 2>&1" SYSTEMQUOTE,
- postgres_path, pgdata_opt, post_opts, DEVNULL);
+ exec_path, pgdata_opt, post_opts, DEVNULL);
if (!CreateRestrictedProcess(cmd, &pi, false))
return GetLastError();
* name */
post_opts = arg1 + 1; /* point past whitespace */
}
- if (postgres_path == NULL)
- postgres_path = optline;
+ if (exec_path == NULL)
+ exec_path = optline;
}
}
}
}
+static char *
+find_other_exec_or_die(const char *argv0, const char *target, const char *versionstr)
+{
+ int ret;
+ char *found_path;
+
+ found_path = pg_malloc(MAXPGPATH);
+
+ if ((ret = find_other_exec(argv0, target, versionstr, found_path)) < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ write_stderr(_("The program \"%s\" is needed by %s "
+ "but was not found in the\n"
+ "same directory as \"%s\".\n"
+ "Check your installation.\n"),
+ target, progname, full_path);
+ else
+ write_stderr(_("The program \"%s\" was found by \"%s\"\n"
+ "but was not the same version as %s.\n"
+ "Check your installation.\n"),
+ target, full_path, progname);
+ exit(1);
+ }
+
+ return found_path;
+}
+
+static void
+do_init(void)
+{
+ char cmd[MAXPGPATH];
+
+ if (exec_path == NULL)
+ exec_path = find_other_exec_or_die(argv0, "initdb", "initdb (PostgreSQL) " PG_VERSION "\n");
+
+ if (post_opts == NULL)
+ post_opts = "";
+
+ if (!silent_mode)
+ snprintf(cmd, MAXPGPATH, SYSTEMQUOTE "\"%s\" %s%s" SYSTEMQUOTE,
+ exec_path, pgdata_opt, post_opts);
+ else
+ snprintf(cmd, MAXPGPATH, SYSTEMQUOTE "\"%s\" %s%s > \"%s\"" SYSTEMQUOTE,
+ exec_path, pgdata_opt, post_opts, DEVNULL);
+
+ if (system(cmd) != 0)
+ {
+ write_stderr(_("%s: database system initialization failed\n"), progname);
+ exit(1);
+ }
+}
+
static void
do_start(void)
{
if (ctl_command == RESTART_COMMAND || pgdata_opt == NULL)
pgdata_opt = "";
- if (postgres_path == NULL)
- {
- char *postmaster_path;
- int ret;
-
- postmaster_path = pg_malloc(MAXPGPATH);
-
- if ((ret = find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR,
- postmaster_path)) < 0)
- {
- char full_path[MAXPGPATH];
-
- if (find_my_exec(argv0, full_path) < 0)
- strlcpy(full_path, progname, sizeof(full_path));
-
- if (ret == -1)
- write_stderr(_("The program \"postgres\" is needed by %s "
- "but was not found in the\n"
- "same directory as \"%s\".\n"
- "Check your installation.\n"),
- progname, full_path);
- else
- write_stderr(_("The program \"postgres\" was found by \"%s\"\n"
- "but was not the same version as %s.\n"
- "Check your installation.\n"),
- full_path, progname);
- exit(1);
- }
- postgres_path = postmaster_path;
- }
+ if (exec_path == NULL)
+ exec_path = find_other_exec_or_die(argv0, "postgres", PG_BACKEND_VERSIONSTR);
#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE)
if (allow_core_files)
printf(_("%s is a utility to start, stop, restart, reload configuration files,\n"
"report the status of a PostgreSQL server, or signal a PostgreSQL process.\n\n"), progname);
printf(_("Usage:\n"));
+ printf(_(" %s init[db] [-D DATADIR] [-s] [-o \"OPTIONS\"]\n"), progname);
printf(_(" %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"), progname);
printf(_(" %s stop [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"), progname);
printf(_(" %s restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"
#endif
printf(_(" -l, --log FILENAME write (or append) server log to FILENAME\n"));
printf(_(" -o OPTIONS command line options to pass to postgres\n"
- " (PostgreSQL server executable)\n"));
+ " (PostgreSQL server executable) or initdb\n"));
printf(_(" -p PATH-TO-POSTGRES normally not necessary\n"));
printf(_("\nOptions for stop or restart:\n"));
printf(_(" -m SHUTDOWN-MODE can be \"smart\", \"fast\", or \"immediate\"\n"));
post_opts = xstrdup(optarg);
break;
case 'p':
- postgres_path = xstrdup(optarg);
+ exec_path = xstrdup(optarg);
break;
case 'P':
register_password = xstrdup(optarg);
exit(1);
}
- if (strcmp(argv[optind], "start") == 0)
+ if (strcmp(argv[optind], "init") == 0
+ || strcmp(argv[optind], "initdb") == 0)
+ ctl_command = INIT_COMMAND;
+ else if (strcmp(argv[optind], "start") == 0)
ctl_command = START_COMMAND;
else if (strcmp(argv[optind], "stop") == 0)
ctl_command = STOP_COMMAND;
switch (ctl_command)
{
+ case INIT_COMMAND:
+ do_init();
+ break;
case STATUS_COMMAND:
do_status();
break;