PostgreSQL从菜鸟到专家 Linux和Unix上配置PostgreSQL

在Linux和Unix上配置PostgreSQL

在你安装好PostgreSQL后,无论是通过RPM包或者通过源码编译,你都需要执行一些步骤让它运行起来。第一步,你需要建立一个叫postgres的用户,然后你需要为数据库建立一个目录并初始化数据库结构。然后,你可以通过启动postmaster进程启动PostgreSQL了。

建立postgres用户

PostgreSQL的数据库主进程postmaster是一个特别的程序。它负责处理所有的用户对所有数据库的访问。它必须允许用户访问自己的数据但在没授权的情况下不允许访问其他用户的数据。为了实现这个功能,它需要能够控制所有的数据文件,因而普通用户不允许直接访问这些文件。postmaster进程将通过检查访问数据的用户的赋权情况控制对数据文件的访问。

一般来说,PostgreSQL需要用一个非管理员用户运行,也就是说可以是任何普通用户;如果你在你的home目录里头安装了数据库,这个用户可以是你自己的用户。但是,PostgreSQL通常使用一个概念上的虚拟用户来完成数据访问。通常,这个一个叫做postgres的用户被建立用来管理这些数据文件,它不需要其他的访问权限。另外,postgres虚拟用户可以提供一些其他的安全措施,例如这个用户无法登录,所以别人无法非法访问这些数据。postmaster程序代表其他用户用这个用户去访问数据库文件。

因此,建立一个可运行的PostgreSQL系统的第一步就是建立postgres用户。每个系统建立用户的方法都不同。Linux可以通过root用户使用useradd命令添加:

# useradd postgres

其他的UNIX系统中尼可能需要建立home目录,修改配置文件或者运行相关的工具。请参考你的系统的文档来获得相关管理工具的细节。

建立数据库目录

下一步,你必须通过root用户建立一个目录给PostgreSQL用来存放数据库,并将目录的所有者设置为postgres:

# mkdir /usr/local/pgsql/data

# chown postgres /usr/local/pgsql/data

在这里我们使用默认的位置给数据库。你可以选择在其他地方存储数据,就像我们前面在“PostgreSQL的安装解析”小节里讨论的一样。

初始化数据库

通过initdb工具初始化PostgreSQL数据库,初始化时需要制定你文件系统中想要存储数据库的位置。这将做很多事,包括建立PostgreSQL需要运行的数据结构以及初始化一个可工作的数据库:template1。

你需要使用postgres用户来运行initdb工具。为了做到这点,最可靠的方法是完成两步,第一步是通过su命令切换到root用户,然后切换成postgres用户,就像以下所示(作为一个普通用户,你可能无法用其他用户身份运行程序,所以你必须先变成超级用户):

$ su

# su – postgres

pg$

现在你运行的程序是以postgres用户运行的,并且你可以访问PostgreSQL的数据文件了。很明显,我们现实了postgres用户的shell的命令提示符pg$。

警告:不要为了图方便直接用root而不是postgres用户完成以上过程。由于安全原因,用root身份运行服务进程可能非常危险。如果这个进程有问题,可能导致外部通过网络非法访问你的系统。由于这个原因,postmaster将拒绝通过root运行。

通过initdb命令初始化数据库:

pg$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

The files belonging to this database system will be owned by user “postgres”.

This user must also own the server process.

The database cluster will be initialized with locale en_US.UTF-8.

The default database encoding has accordingly been set to UTF8.

The default text search configuration will be set to “english”.

WARNING: enabling “trust” authentication for local connections

You can change this by editing pg_hba.conf or using the -A option the

next time you run initdb.

Success. You can now start the database server using:

/usr/local/pgsql9/bin/postgres -D pgdata

or

/usr/local/pgsql9/bin/pg_ctl -D pgdata -l logfile start

pg$

如果一切正常,你将在initdb命令的-D参数指向的位置拥有一个全新的空白数据库。

配置连接权限

默认情况下,PostgreSQL不允许全面的远程访问。为了赋权给远程连接,你必须编辑配置文件pg_hba.conf。这个文件存在于数据库文件的区域(在本例中,位于/usr/local/pgsql/),它包含允许或者拒绝特定用户连接到数据库的权限的配置记录。默认情况下,本地用户可以连接但远程用户不允许。文件格式非常简单,PostgreSQL自带的默认文件包含大量的有用的注释用于协助添加记录。你可以根据需要给单个的用户、主机、计算机组或者单独的数据库赋权。

例如,希望允许用户neil通过IP地址为192.168.0.3的主机连接到bpsimple数据库,添加以下行到pg_hba.conf文件:

host bpsimple neil 192.168.0.3/32 md5

注意,在早于8.0版本的PostgreSQL中,pg_hba.conf通过IP地址和子网掩码说明一个主机地址,所以之前的例子应该写成这样:

host bpsimple neil 192.168.0.3 255.255.255.255 md5

本例中,我们将添加一条记录来运行局域网中(本例中,子网为192.168.x.x)的任何计算机通过密码认证访问数据库。(如果你需要不同的访问策略,参考配置文件里头的注释)我们添加一行到pg_hba.conf的末尾,就像这样:

host all all 192.168.0.0/16 md5

这意味着IP地址由192.168开头的计算机可以访问所有的数据库。此外,加入我们信任网络中的所有用户,我们可以通过指定使用trust标记不受限的访问方法作为访问策略,就像这样:

host all all 192.168.0.0/16 trust

PostgreSQL的postmaster服务进程读取配置文件postgresql.conf(也存在于数据目录中)来设置一系列的运行选项,包括(如果没有另外指定-D选项或者配置PGDATA环境变量)数据库数据文件的位置。这个配置文件被很好的注释了,如果你想修改任何设置,它都提供了向导。PostgreSQL的文档有一章讲述了运行配置。

例如,我们可以设置postgresql.conf文件中的listen_addresses参数允许服务器监听网络连接,而不是通过-i选项:

listen_addresses=’*’

实际上,我们推荐通过postgresql.conf设置配置参数来控制postmaster进程的行为。

启动postmaster进程

现在,你可以启动服务进程了。再次提醒,你可以使用-D选项告诉postmaster数据库文件所在位置。如果你想允许网络上的用户访问你的数据,你可以使用-i选项启用远程访问(如果你没在postgresql.conf文件中启用listen_addresses选项,就像前面所说的):

pg$ /usr/local/pgsql/bin/postmaster -i -D /usr/local/pgsql/data >logfile 2>&1 &

这条命令启动postmaster,重定向进程输出到一个文件(名叫logfile,存放在postgres用户的home目录中),并且通过shell的2>&1合并标准输出和标准错误输出。你可以通过重定向输出到其他文件来选择不同的日志位置。

PostgreSQL提供的pg_ctl工具提供了一种简单的方法启动、停止和重启(就是停止和启动)postmaster进程。如果PostgreSQL就像之前所属的那样完全由postgresql.conf文件配置,可以简单的使用以下命令启动、停止和重启:

pg_ctl start

pg_ctl stop

pg_ctl restart

连接到数据库

现在你可以通过尝试连接到数据库测试它是否正常工作了。psql工具是用来与数据库进行交互和进行简单的管理工作例如建立用户,建立数据库以及建表。在本章后面我们将用它来建立和填充数据库,在第5章将详细讲解它的功能。现在,你可以简单地尝试连接到一个数据库。以下的反馈显示你已经运行了postmaster:

pg$ /usr/local/pgsql/bin/psql

psql: FATAL 1: Database “postgres” does not exist in the system catalog.

不要被上面显示的致命错误吓着。默认情况下,psql连接到本机的数据库并尝试用启动这个程序的用户的名称打开数据库。因为我们在这里没有建立叫postgres的数据库,所以连接失败。这象征着,postmaster进程运行了并且能够正常响应失败的细节。

为了指定连接的数据库,可以传递-d参数给psql。全新的PostgreSQL系统包含一些系统使用的数据库作为你需要新建的数据库的模板。其中有一个叫做template1。如果你需要,你可以连接到数据库这个数据库用来完成管理功能。

为了检查网络连接,你可以使用网络上其他机器安装的psql作为客户端,或者其他的PostgreSQL兼容的程序。在psql中,你可以使用-h选项指定主机(无论是名称还是IP地址),并指定一个系统数据库(如果你还没建立一个真正的数据库)。

remote$ psql -h 192.168.0.111 -d template1

Welcome to psql 8.0.0,the PostgreSQL interactive terminal.

Type: \copyright for distribution terms

\h for help with SQL commands

\? for help with psql commands

\g or terminate with semicolon to execute query

\q to quit

template1=# \q

remote$

配置自动启动

最后一步需要做的是安排postmaster服务进程在机器重启的时候自动启动。实际上你所有要做的就是确保postmaster在启动后被运行了。再次,对于Linux和UNIX变种系统,这里都有一些小标准可以遵从。请参考你的系统文档的细节。

如果你是从Linux发行版安装的PostgreSQL,启动脚本应该已经通过RPM包安装的时候完成配置了。在SuSE Linux中,PostgreSQL在系统进入多用户模式的时候通过/etc/rc.d/init.d下面的一个叫做postgresql的脚本启动。

如果你想自己写启动脚本,最简单的办法是建立一个简单的脚步使用你需要的参数启动postmaster,并且在一个自动启动的脚本里头添加一个到你的脚本的调用就OK,例如在/etc/rc.d里面的脚本。需要确保postmaster是由postgres用户启动的。以下是从源码安装的一个默认安装的PostgreSQL的可以完成以上工作的示例脚本:

#!/bin/sh

# Script to start and stop PostgreSQL

SERVER=/usr/local/pgsql/bin/postmaster

PGCTL=/usr/local/pgsql/bin/pg_ctl

PGDATA=/usr/local/pgsql/data

OPTIONS=-i

LOGFILE=/usr/local/pgsql/data/postmaster.log

case “$1″ in

start)

echo -n “Starting PostgreSQL…”

su -l postgres -c “nohup $SERVER $OPTIONS -D $PGDATA >$LOGFILE 2>&1 &”

;;

stop)

echo -n “Stopping PostgreSQL…”

su -l postgres -c “$PGCTL -D $PGDATA stop”

;;

*)

echo “Usage: $0 {start|stop}”

exit 1

;;

esac

exit 0

注:在Debian Linux中,在su -l的地方,你需要使用su -。

建立一个包含以上脚本的可执行脚本。给它命名为MyPostgreSQL。使用chmod命令给它赋予执行权限,就像以下的情况:

# chmod a+rx MyPostgreSQL

然后,你需要安排脚本在服务器启动和关机的时候启动和停止PostgreSQL:

MyPostgreSQL start

MyPostgreSQL stop

对于使用System V类型的init脚本的系统(例如很多Linux发行版),你可以把脚本放在适当的位置。例如在SuSE Linux中,你应该把脚本放在/etc/rc.d/init.d/MyPostgreSQL,并且建立以下位置的软连接到这个脚本来实现在服务器进入和离开多用户模式的时候启动和停止PostgreSQL:

/etc/rc.d/rc2.d/S25MyPostgreSQL

/etc/rc.d/rc2.d/K25MyPostgreSQL

/etc/rc.d/rc3.d/S25MyPostgreSQL

/etc/rc.d/rc3.d/K25MyPostgreSQL

请参考你的系统文档关于启动脚本的部分的详细信息。

停止PostgreSQL

PostgreSQL服务进程有序关闭非常重要,这将允许它将任何未写入数据库的数据写入数据库并释放它使用的共享内存资源。

为了安全地关闭数据库,可以通过postgres用户或者root用户使用pg_ctrl工具这样做:

# /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data stop

如果有启动脚本,你可以像下面这样使用它们。

# /etc/rc.d/init.d/MyPostgreSQL stop

这些脚本能保证数据库在机器关机或者重启的时候能正常关闭。

相关资源

为了在使用PostgreSQL时方便一点,最好添加PostgreSQL应用程序路径到执行程序的搜索路径中,手册文件也需要这么做。在标准UNIX shell中,添加以下代码到你的启动脚本中(.profile or .bashrc):

PATH=$PATH:/usr/local/pgsql/bin

MANPATH=$MANPATH:/usr/local/pgsql/man

export PATH MANPATH

当前和最新测试版本的PostgreSQL的源码可以在http://www.postgresql.org找到。更多的PostgreSQL资源信息在本书附录G中列出来了。

相关文章

文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,...
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb...
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才...
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation...
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgr...
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解...