25.2. 安装过程
PostgreSQL 安装
对于全新安装或从旧版本 PostgreSQL 升级:
创建 PostgreSQL 超级用户账号。服务器将以这个用户的身份运行。用于生产环境时,你应当创建一个单独的、无特权的账号(通常使用
postgres)。如果你没有 root 权限或只是想随便玩玩,使用你自己的用户账号就够了。以
root、bin或任何其他拥有特殊访问权限的账号运行 PostgreSQL 都有安全风险;不要这样做。实际上 postmaster 会拒绝以root身份启动。你不必在这个账号下进行构建和安装本身(尽管可以)。需要以数据库超级用户身份登录时,我们会告诉你。
为你的系统配置源代码。在这一步你可以为构建过程指定实际的安装路径,并选择要安装哪些内容。进入
src子目录并输入:> ./configure后面可以跟上你想给的任何选项。对于第一次安装,不带任何选项也应该没问题。要获取完整的选项列表,输入:
> ./configure --help一些较常用的选项有:
- --prefix=BASEDIR
为 PostgreSQL 的安装选择一个不同的基目录。默认值为
/usr/local/pgsql。- --enable-locale
如果你想使用区域设置。
- --enable-multibyte
允许使用多字节字符编码。这主要面向日语、韩语或汉语等语言。
- --with-perl
构建 Perl 接口和 plperl 扩展语言。请注意 Perl 接口需要被安装到 Perl 模块的常规位置(通常在
/usr/lib/perl下),因此你必须拥有 root 权限才能执行安装步骤。(通常最简单的做法是开始时不加--with-perl,在完成 PostgreSQL 本身的安装之后再构建和安装 Perl 接口。)- --with-odbc
构建 ODBC 驱动程序包。
- --with-tcl
构建需要 Tcl/Tk 的接口库和程序,包括 libpgtcl、pgtclsh 和 pgtksh。
编译程序。输入
> gmake编译过程可能需要 10 分钟到一个小时。你的耗时几乎肯定会有所不同。记住要使用 GNU make。
但愿最后显示的一行是
All of PostgreSQL is successfully made. Ready to install.如果你想在安装之前测试新构建的服务器,可以在此时运行回归测试。回归测试是一套测试用例,用于验证 PostgreSQL 在你的机器上以开发者期望的方式运行。详细说明见回归测试。(务必使用"并行回归测试"方法,因为顺序方法只适用于已安装的服务器。)
如果你不是在升级现有系统,跳到步骤 7。
如果你运行的是 7.*,跳到步骤步骤 6。
现在你需要备份现有的数据库。要转储你的数据库安装,输入:
> pg_dumpall > db.out如果你想保留对象 id(oid),则在运行 pg_dumpall 时使用 -o 选项。但除非你有特殊理由这样做(例如在表中把 OID 用作键),否则不要这样做。
务必使用你当前正在运行的版本中的 pg_dumpall 命令。7.0.3 的 pg_dumpall 不应被用于更旧的数据库。
小心
你必须确保数据库在备份期间没有被更新。必要时,关闭 postmaster,编辑文件
/usr/local/pgsql/data/pg_hba.conf的权限使只有你能访问,然后把 postmaster 重新启动。除了使用 pg_dumpall 之外,常常也可以使用 pg_upgrade。
如果你正在升级现有系统,现在就终止数据库服务器。输入
> ps ax | grep postmaster或者
> ps -e | grep postmaster(这两条中哪一条有效取决于你的系统。输错也不会造成危害。)这会列出若干进程的进程号,类似于这样:
263 ? SW 0:00 (postmaster) 777 p1 S 0:00 grep postmaster输入下面这行,其中
pid替换为postmaster进程的进程 id(上例中为 263)。(不要使用 "grep postmaster" 进程的 id。)> kill
pid提示
在开机时自动启动 PostgreSQL 的系统上,很可能有一个能完成同样事情的启动文件。例如,在 Redhat Linux 系统上你可能会发现
> /etc/rc.d/init.d/postgres.init stop可以奏效。
如果你用过 pg_dumpall,把旧目录移开。输入以下命令:
> mv /usr/local/pgsql /usr/local/pgsql.old(换成你自己的路径。)
安装 PostgreSQL 的可执行文件和库。输入
> gmake install这一步应当以你希望拥有已安装可执行文件的用户身份执行。这不必与数据库超级用户相同;有些人更喜欢让已安装的文件归 root 所有。
如有必要,告诉你的系统如何找到新的共享库。具体做法因平台而异。最普遍可用的方法是设置环境变量
LD_LIBRARY_PATH:> LD_LIBRARY_PATH=/usr/local/pgsql/lib > export LD_LIBRARY_PATH(适用于 sh、ksh、bash、zsh)或
> setenv LD_LIBRARY_PATH /usr/local/pgsql/lib(适用于 csh 或 tcsh)。你可能想把它放进某个 shell 启动文件,例如
/etc/profile。在某些系统上,下面的方法是首选的,但你必须拥有 root 权限。编辑文件
/etc/ld.so.conf,加入一行/usr/local/pgsql/lib然后运行命令
/sbin/ldconfig。如果拿不准,请查阅你系统的手册页。如果以后你收到类似这样的消息
psql: error in loading shared libraries libpq.so.2.1: cannot open shared object file: No such file or directory那么上面的步骤就是必要的。届时照做即可。
如果你已把旧目录移开,现在创建数据库安装(工作数据文件)。为此你必须以 PostgreSQL 超级用户身份登录。以 root 身份是不行的。
> mkdir /usr/local/pgsql/data > chown postgres /usr/local/pgsql/data > su - postgres > /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data-D选项指定数据将要存放的位置。你可以使用任何想要的路径,它不必位于安装目录之下。只需确保在启动initdb之前超级用户账号能够写该目录(或者如果该目录尚不存在,能够创建它)。(如果你到目前为止一直是用 PostgreSQL 超级用户进行安装的,那么要在 root 所有的目录之下创建数据目录时,你可能需要临时以 root 身份登录。)上一步应该已经告诉你如何启动数据库服务器。现在就这样做。这个命令应该类似于
> /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data这会在前台启动服务器。要让它脱离到后台,可以使用
-S选项,但这样你就看不到服务器产生的任何日志消息了。把服务器放到后台的更好方法是> nohup /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data \ </dev/null >>server.log 2>>1 &如果你做过 pg_dumpall,把你的数据重新装回去:
> /usr/local/pgsql/bin/psql -d template1 -f db.out你可能还想把旧的
pg_hba.conf文件以及你为认证设置的其他任何文件(如口令文件)复制过来。
安装本身到此结束。为了让你的生活更有成效、更愉快,你应当看看下面这些可选步骤和建议:
设置一些环境变量会让生活更方便。首先,你可能想把
/usr/local/pgsql/bin(或等效路径)加入你的PATH。为此,把下面内容加入你的 shell 启动文件,例如~/.bash_profile(或者/etc/profile,如果你想让每个用户都受影响):> PATH=$PATH:/usr/local/pgsql/bin此外,如果你在 PostgreSQL 超级用户的环境中设置了
PGDATA,就可以省略postmaster和initdb的-D。你可能想安装 man 和 HTML 文档。输入
> cd /usr/src/pgsql/postgresql-7.0.3/doc > gmake install这会把文件安装到
/usr/local/pgsql/doc和/usr/local/pgsql/man之下。要让你的系统能找到 man 文档,你需要在某个 shell 启动文件中加入类似下面的一行:> MANPATH=$MANPATH:/usr/local/pgsql/man文档也有 Postscript 格式。如果你有 Postscript 打印机,或者你的机器已经用打印过滤器设置为可以接受 Postscript 文件,那么要打印用户指南只需输入
> cd /usr/local/pgsql/doc > gunzip -c user.ps.tz | lpr下面是如果你的系统上有 Ghostscript 并且向激光打印机打印时的做法。
> gunzip -c user.ps.gz \ | gs -sDEVICE=laserjet -r300 -q -dNOPAUSE -sOutputFile=- \ | lpr各个系统的打印机设置千差万别。如果拿不准,请查阅你的手册或本地专家。
如果你完全初次接触 PostgreSQL,管理员指南很可能应该是你的第一读物,因为它包含如何设置数据库用户和认证的信息。
通常,你会想修改你的计算机,使其在每次启动时自动启动数据库服务器。这不是必需的;PostgreSQL 服务器可以在没有 root 干预的情况下成功地以非特权账号运行。
不同的系统在开机时启动守护进程有不同的惯例,因此建议你熟悉它们。大多数系统都有文件
/etc/rc.local或/etc/rc.d/rc.local,把这样的命令放在那里几乎肯定不是坏主意。无论你怎么做,postmaster 都必须由 PostgreSQL 超级用户(postgres)运行,而不是由 root 或任何其他用户。因此你大概总想按照su -c '...' postgres的形式来组织你的命令行。保留服务器输出的日志可能是明智的。要以那种方式启动服务器,试试:
> nohup su -c 'postmaster -D /usr/local/pgsql/data > server.log 2>&1' postgres &下面是另外一些针对特定操作系统的建议。
在 NetBSD 上编辑文件 rc.local,或在 SPARC Solaris 2.5.1 上编辑文件 rc2.d,使其包含下面这一行:
> su postgres -c "/usr/local/pgsql/bin/postmaster -S -D /usr/local/pgsql/data"
在 FreeBSD 2.2-RELEASE 中编辑 /usr/local/etc/rc.d/pgsql.sh,使其包含下面的行,并对它执行 chmod 755 和 chown root:bin。
#!/bin/sh [ -x /usr/local/pgsql/bin/postmaster ] && { su -l pgsql -c 'exec /usr/local/pgsql/bin/postmaster -D/usr/local/pgsql/data -S -o -F > /usr/local/pgsql/errlog' & echo -n ' pgsql' }你可以像上面那样放置换行。只要表达式未结束,shell 就足够聪明,会继续解析越过行尾的内容。exec 在 postmaster 进程之下节省了一层 shell,因此父进程是 init。
在 RedHat Linux 中添加一个基于
contrib/linux/中示例的文件/etc/rc.d/init.d/postgres.init。然后从/etc/rc.d/rc5.d/S98postgres.init做一个指向该文件的软链接。
针对已安装的服务器运行回归测试(使用顺序测试方法)。如果你在安装之前没有运行过测试,现在绝对应该做。详细说明见回归测试。
要开始体验 Postgres,按上文说明设置好路径并启动服务器。要创建一个数据库,输入
> createdb testdb
然后输入
> psql testdb
连接到该数据库。在提示符下你可以输入 SQL 命令,开始体验。