pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
Postgres 安装
对于全新安装或从旧版本 Postgres 升级:
阅读任何最后时刻的信息和针对特定平台的移植说明。本文件末尾有关于 Ultrix4.x、Linux、BSD/OS 和 NeXT 的一些平台特定说明。目录 /usr/src/pgsql/doc 中还有其他文件,包括 FAQ-Irix 和 FAQ-Linux。也看看目录 ftp://ftp.postgresql.org/pub。如果该目录中有一个名为 INSTALL 的文件,那么该文件包含最新的安装信息。
请注意,前面列表中的"已测试"平台只是意味着有人曾经花力气确保 Postgres 发行版能在该平台上不经修改地编译和运行。由于当前的开发者无法访问所有这些平台,其中一些可能因小问题而无法在当前版本中干净地编译并通过回归测试。任何此类已知问题及其解决方案都会公布在 ftp://ftp.postgresql.org/pub/INSTALL。
如果 Postgres 超级用户账号尚不存在,则创建它(通常使用 postgres)。
Postgres 文件的所有者可以是任何无特权的用户账号。它绝不能是 root、bin 或任何其他拥有特殊访问权限的账号,否则会造成安全风险。
以 Postgres 超级用户账号登录。安装中余下的大多数步骤都将在该账号下进行。
从 Internet 上 Ftp 文件 ftp://ftp.postgresql.org/pub/postgresql-v6.4.tar.gz。把它存放在你的主目录中。
某些平台使用 flex。如果你的系统使用 flex,请确保你有一个好的版本。要检查,输入
$ flex --version
如果找不到 flex 命令,那么你很可能不需要它。如果版本是 2.5.2、2.5.4 或更高,就没有问题。如果是 2.5.3 或低于 2.5.2,你就得升级 flex。可以从 ftp://prep.ai.mit.edu/pub/gnu/flex-2.5.4.tar.gz 获取。
如果你需要 flex 却没有它或版本不对,那么当你尝试编译程序时会被告知。如果不确定是否需要,尽可以跳过这一步。如果确实需要,当你尝试编译 Postgres 时会被告知安装/升级 flex。
你可以从 root 账号完成整个 flex 安装,尽管这并非绝对必要。假设你希望安装把文件放在常规的默认位置,输入以下命令:
$ su - $ cd /usr/local/src ftp prep.ai.mit.edu ftp> cd /pub/gnu/ ftp> binary ftp> get flex-2.5.4.tar.gz ftp> quit $ gunzip -c flex-2.5.4.tar.gz | tar xvf - $ cd flex-2.5.4 $ configure --prefix=/usr $ gmake $ gmake check # You must be root when typing the next line: $ gmake install $ cd /usr/local/src $ rm -rf flex-2.5.4
这将更新文件 /usr/man/man1/flex.1、 /usr/bin/flex、 /usr/lib/libfl.a、 /usr/include/FlexLexer.h,并添加一个指向 flex 的链接 /usr/bin/flex++。
如果你不是在升级现有系统,则跳到 步骤 9。 如果你是在升级现有系统,请备份你的数据库。对于 alpha 和 beta 级的发布,数据库格式容易变化,往往每隔几周就变一次,除了 HACKERS 邮件列表中的一句快速评论之外没有任何通知。正式发布总是要求从旧版本进行转储/重载。因此跳过这一步是很糟糕的主意。
不要使用 v6.0 的 pg_dumpall 脚本,否则所有对象都将归 Postgres 超级用户所有。
要转储你相当新的 post-v6.0 数据库安装,输入
$ pg_dumpall -z > db.out
要在升级 Postgres 之前对你现有的旧数据库使用最新的 pg_dumpall 脚本,请从新发行版中取出最新版本的 pg_dumpall:
$ cd
$ gunzip -c postgresql-v6.4.tar.gz \
| tar xvf - src/bin/pg_dump/pg_dumpall
$ chmod a+x src/bin/pg_dump/pg_dumpall
$ src/bin/pg_dump/pg_dumpall -z > db.out
$ rm -rf src
如果你想保留对象 id(oid),则在运行 pg_dumpall 时使用 -o 选项。但除非你有特殊理由这样做(例如在表中把 OID 用作键),否则不要这样做。
如果 pg_dumpall 命令似乎花了很长时间而你觉得它可能已经死掉,那么可以从另一个终端多次输入
$ ls -l db.out
看文件的大小是否在增长。
请注意,如果你是从 Postgres95 v1.09 之前的版本升级,那么你必须备份数据库、安装 Postgres95 v1.09、恢复数据库,然后再次备份。你还应当阅读发行说明,其中应该涵盖任何针对特定发行的问题。
你必须确保数据库在备份期间没有被更新。必要时,关闭 postmaster,编辑文件 /usr/local/pgsql/data/pg_hba.conf 的权限使只有你能访问,然后把 postmaster 重新启动。
如果你是在升级现有系统,则终止 postmaster。输入
$ ps -ax | grep postmaster
这会列出若干进程的进程号。输入下面这行,其中 pid 替换为 postmaster 进程的进程 id。(不要使用进程 "grep postmaster" 的 id。)输入
$ kill pid
来真正停止该进程。
在开机时自动启动 Postgres 的系统上,很可能有一个能完成同样事情的启动文件。例如,在我的 Linux 系统上我可以输入
$ /etc/rc.d/init.d/postgres.init stop
来停止 Postgres。
如果你是在升级现有系统,则把旧目录移开。如果磁盘空间紧张,你可能得备份并删除这些目录。如果这样做,请把旧数据库保存在 /usr/local/pgsql/data 目录树中。至少要保存文件 /usr/local/pgsql/data/pg_hba.conf。
输入以下命令:
$ su - $ cd /usr/src $ mv pgsql pgsql_6_0 $ cd /usr/local $ mv pgsql pgsql_6_0 $ exit
如果你不使用 /usr/local/pgsql/data 作为数据目录(检查环境变量 PGDATA 是否被设置成了别的值),那么你也应该以同样的方式移动该目录。
创建新的源代码目录和安装目录。你的安装中实际路径可以不同,但在整个过程中必须保持一致。
本安装过程中有两处可以让你指定程序、库、文档和其他文件的安装位置。通常在安装的 make install 阶段指定这些就足够了。
输入
$ su $ cd /usr/src $ mkdir pgsql $ chown postgres:postgres pgsql $ cd /usr/local $ mkdir pgsql $ chown postgres:postgres pgsql $ exit
解压并解开新的源文件。输入
$ cd /usr/src/pgsql $ gunzip -c ~/postgresql-v6.4.tar.gz | tar xvf -
为你的系统配置源代码。在这一步你可以为构建过程指定实际的安装路径(见下面的 --prefix 选项)。输入
$ cd /usr/src/pgsql/src
$ ./configure [ options ]
除其他工作外,configure 脚本会从 template 子目录中提供的文件里选择一个特定系统的"模板"文件。如果它猜不出你的系统该用哪一个,它会说明并退出。那种情况下你需要弄清楚该用哪一个,然后再次运行 configure,这次给出 --with-template=TEMPLATE 选项来选中正确的文件。
如果你的系统没有被 configure 自动识别而不得不这样做,请发电子邮件到 scrappy@hub.org,附上程序 ./config.guess 的输出。指明模板文件应该是什么。
选择配置选项。详情见 配置选项。不过,对于不带多字节字符支持或区域排序支持等额外选项的普通首次安装,选好安装区域并不加额外选项地运行 configure 也许就够了。 configure 脚本接受许多额外的选项,如果你不喜欢默认配置可以用它们。要全部看到,输入
./configure --help
一些较常用的选项有:
--prefix=BASEDIR 为 Postgres 配置的安装选择一个不同的
基目录。默认为 /usr/local/pgsql。
--with-template=TEMPLATE
使用模板文件 TEMPLATE —— 模板文件假定在目录
src/template 中,请到那里查找合适的值。
--with-tcl 构建需要 Tcl/Tk 的接口库和程序,
包括 libpgtcl、pgtclsh 和 pgtksh。
--with-perl 构建 Perl 接口库。
--with-odbc 构建 ODBC 驱动程序包。
--enable-hba 启用基于主机的认证(默认)
--disable-hba 禁用基于主机的认证
--enable-locale 启用 USE_LOCALE
--enable-cassert 启用 ASSERT_CHECKING
--with-CC=compiler
使用 configure 脚本找不到的
某个特定 C 编译器。
--with-CXX=compiler
--without-CXX
使用 configure 脚本找不到的某个特定 C++ 编译器,
或者完全排除 C++ 编译。(目前这只影响
libpq++。)
下面是在 Sparc Solaris 2.5 系统上使用的 configure 脚本,安装基目录指定为 /opt/postgres:
$ ./configure --prefix=/opt/postgres \
--with-template=sparc_solaris-gcc --with-pgport=5432 \
--enable-hba --disable-locale
当然,你可以把这三行都写在同一行上。
安装 man 和 HTML 文档。输入
$ cd /usr/src/pgsql/doc $ gmake install
文档也有 Postscript 格式。在同一目录中查找以 .ps.gz 结尾的文件。
编译程序。输入
$ cd /usr/src/pgsql/src $ gmake all >& make.log & $ tail -f make.log
但愿最后显示的一行是
All of PostgreSQL is successfully made. Ready to install.
这时(或者更早,随你愿意)输入 control-C 退出 tail。(如果以后遇到问题,你可以检查文件 make.log 中的警告和错误消息。)
你可能会在 make.log 中发现许多警告消息。除非以后遇到问题,这些消息可以放心地忽略。
如果编译器失败并给出找不到 flex 命令的消息,则按前述方法安装 flex。然后 回到本目录,输入
$ make clean
再重新编译。
编译器选项(如优化和调试)可以在命令行上用 COPT 变量指定。例如,输入
$ gmake COPT="-g" all >& make.log &
会在构建的所有步骤中调用你编译器的 -g 选项。更多细节见 src/Makefile.global.in。
安装程序。输入
$ cd /usr/src/pgsql/src $ gmake install >& make.install.log & $ tail -f make.install.log
最后显示的一行将是
gmake[1]: Leaving directory `/usr/src/pgsql/src/man'
这时(或者更早,随你愿意)输入 control-C 退出 tail。
如有必要,告诉你的系统如何找到新的共享库。你可以做下面之一,最好是第一种:
以 root 身份编辑文件 /etc/ld.so.conf。向该文件加入一行
/usr/local/pgsql/lib
然后运行命令 /sbin/ldconfig。
在 bash shell 中,输入
export LD_LIBRARY_PATH=/usr/local/pgsql/lib
在 csh shell 中,输入
setenv LD_LIBRARY_PATH /usr/local/pgsql/lib
请注意,上述命令在不同的操作系统之间可能差异极大。请查阅平台特定说明,例如 Ultrix4.x 和非 ELF Linux 的那些。
如果你创建数据库时收到消息
pg_id: can't load library 'libpq.so'
那么上面的步骤就是必要的。照做之后,再试着创建数据库。
如果你配置时用了 --with-perl 选项,请检查安装日志看 Perl 模块是否真的被安装了。如果你听从了我们的建议让 Postgres 文件归一个无特权用户所有,那么 Perl 模块会因为对 Perl 库目录没有写权限而未被安装。你可以现在或以后补装:通过 su 变成拥有 Perl 库的用户(通常是 root),然后执行
$ cd /usr/src/pgsql/src/interfaces/perl5 $ gmake install
如果尚未做过,则为使用 Postgres 准备账号 postgres。任何要使用 Postgres 的账号都必须同样地准备。
有多种方法可以影响 Postgres 服务器的运行时环境。更多信息参见管理员指南。
下面的说明针对 bash/sh shell。对其他 shell 请相应调整。
把下面几行加入你的登录环境: shell 的 ~/.bash_profile:
PATH=$PATH:/usr/local/pgsql/bin MANPATH=$MANPATH:/usr/local/pgsql/man PGLIB=/usr/local/pgsql/lib PGDATA=/usr/local/pgsql/data export PATH MANPATH PGLIB PGDATA
如果用户的区域排序方案与标准 C 区域不同,一些回归测试可能失败。
如果你用 --enable-locale 选项配置并编译了 Postgres,那么在启动 postmaster 之前,把区域环境设置为 C(或取消所有 LC_* 变量),为此把这几行额外加入你的登录环境:
LC_COLLATE=C LC_CTYPE=C LC_COLLATE=C export LC_COLLATE LC_CTYPE LC_COLLATE
在继续余下步骤之前,确保你已经定义了这些变量。最简单的做法是输入:
$ source ~/.bash_profile
以 Postgres 超级用户账号(通常是 postgres)创建数据库安装。 不要以 root 身份做下面这件事! 那会是一个重大的安全漏洞。输入
$ initdb
设置访问数据库系统的权限。编辑文件 /usr/local/pgsql/data/pg_hba.conf 来完成。说明包含在该文件中。(如果你的数据库不在默认位置,即如果 PGDATA 被设置为指向别处,那么该文件的位置也会相应改变。)完成后应把该文件重新设为只读。 如果你是从 v6.0 或更晚版本升级,可以把旧数据库中的 pg_hba.conf 文件复制到新数据库的上面,而不必从头重做该文件。
简要地测试一下后端能否启动并运行:从命令行运行它。
在后台启动 postmaster 守护进程,输入
$ cd $ postmaster -i
创建一个数据库,输入
$ createdb
连接到新数据库:
$ psql
运行一个示例查询:
postgres=> SELECT datetime 'now';
退出 psql:
postgres=> \q
删除测试数据库(除非你以后还想用它做其他测试):
$ destroydb
以 Postgres 超级用户账号(通常是 postgres)在后台运行 postmaster。不要从 root 账号运行 postmaster!
通常,你会想修改你的计算机,使其在每次启动时自动启动 postmaster。这不是必需的;Postgres 服务器可以在没有 root 干预的情况下成功地以非特权账号运行。
下面是一些关于如何做到这一点的建议,由各位用户贡献。
无论你怎么做,postmaster 都必须由 Postgres 超级用户(postgres?) 而不是 root 运行。这就是下面所有示例都先切换用户 (su)到 postgres 的原因。这些命令还考虑到了 PATH 和 PGDATA 等环境变量可能没有被正确设置的事实。 示例如下。请格外谨慎地使用它们。
如果你是从无特权账号安装且没有 root 权限,那么启动 postmaster 并把它送到后台:
$ cd $ nohup postmaster > regress.log 2>&1 &
在 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 中添加一个文件 /etc/rc.d/init.d/postgres.init,它基于 contrib/linux/ 中的示例。然后从 /etc/rc.d/rc5.d/S98postgres.init 做一个指向该文件的软链接。
在 RedHat Linux 中编辑文件 /etc/inittab,把下面的内容作为单独一行加入:
pg:2345:respawn:/bin/su - postgres -c
"/usr/local/pgsql/bin/postmaster -D/usr/local/pgsql/data
>> /usr/local/pgsql/server.log 2>&1 </dev/null"
(这个例子的作者说该例会在 postmaster 死掉时复活它,但他不知道是否有其他副作用。)
运行回归测试。文件 /usr/src/pgsql/src/test/regress/README 有运行和解释回归测试的详细说明。这里给出一个简短的版本:
输入
$ cd /usr/src/pgsql/src/test/regress $ gmake clean $ gmake all runtest
如果这是你第一次运行测试,不需要输入 gmake clean。
你应该在屏幕上(同时也写入文件 ./regress.out)看到一系列语句,说明哪些测试通过、哪些测试失败。请注意,某些测试在某些平台上"失败"可能是正常的。只要测试的实际输出与期望输出之间有任何差异,脚本就说该测试失败了。因此,由于你的系统与回归测试参考平台之间错误消息措辞的细微差别、浮点舍入的小差异等,测试可能"失败"。这类"失败"并不表示 Postgres 有问题。文件 ./regression.diffs 包含你机器上实际测试输出与"期望"输出(即参考系统产生的输出)之间的文本差异。你应当仔细检查列出的每一处差异,看它是否看起来是一个重大问题。
例如,
对于 i686/Linux-ELF 平台,没有测试失败,因为它是 v6.4 回归测试的参考平台。
对于 SPARC/Linux-ELF 平台,使用 Postgres v6.2 的 970525 beta 版时下列测试"失败":float8 和 geometry 因浮点数的微小精度差异而"失败"。select_views 产生大量不同的输出,但差异源于微小的浮点差异。
即使某个测试结果明确表明是真正的失败,它也可能是一个不影响你的局部问题。一个例子是:如果你的机器和 C 编译器不提供 64 位整数数据类型(或者虽然提供但 configure 没有发现),int8 测试会失败并产生明显错误的输出。除非你需要存储 64 位整数,否则这不需要担心。
结论?如果你确实看到了失败,试着理解这些差异的性质,然后判断这些差异是否会影响你对 Postgres 的预期用途。回归测试是一个有用的工具,但要发挥用处可能需要一些研究。
运行回归测试之后,输入
$ destroydb regression $ cd /usr/src/pgsql/src/test/regress $ gmake clean
以回收测试占用的磁盘空间。(做这件事之前,你可能想把 regression.diffs 文件保存到别处。)
如果你还没有这样做,现在是修改你的计算机进行定期维护的好时机。下面的事情应当定期进行:
最小备份过程
运行 SQL 命令 VACUUM。这会清理你的数据库。
备份你的系统。(你或许应该保留最近几次的备份。)最好在此期间没有其他人使用系统。
理想情况下,上述任务应该由一个 shell 脚本完成,由 cron 每夜或每周运行。可以看看 crontab 的手册页作为入门。(如果你这样做了,请把你的 shell 脚本用电子邮件发给我们一份。我们也想在自己的系统上这样做。)
如果你是在升级现有系统,则重新装入你的旧数据库。输入
$ cd $ psql -e template1 < db.out
如果你的 pre-v6.2 数据库使用了 path 或 polygon 几何数据类型,那么你需要升级包含这些类型的列。为此,输入(在 psql 内)
UPDATEFirstTableSETPathCol= UpgradePath(PathCol); UPDATESecondTableSETPathCol= UpgradePath(PathCol); ... VACUUM;
UpgradePath() 检查一个 path 值是否与旧语法一致,不会更新未通过该检查的列。UpgradePoly() 无法验证一个 polygon 是否确实来自旧语法,但提供了 RevertPoly() 来撤销一次误用的升级。
如果你是新用户,可以像下面描述的那样玩一玩 Postgres。
清理你留下的东西。输入
$ rm -rf /usr/src/pgsql_6_0 $ rm -rf /usr/local/pgsql_6_0 # Also delete old database directory tree if it is not in # /usr/local/pgsql_6_0/data $ rm ~/postgresql-v6.2.1.tar.gz
你可能想打印文档。如果你有 Postscript 打印机,或者你的机器已经用打印过滤器设置为可以接受 Postscript 文件,那么要打印用户指南只需输入
$ cd /usr/local/pgsql/doc $ gunzip user.ps.tz | lpr
下面是如果你的系统上有 Ghostscript 并且向激光打印机打印时的做法。
$ alias gshp='gs -sDEVICE=laserjet -r300 -dNOPAUSE' $ export GS_LIB=/usr/share/ghostscript:/usr/share/ghostscript/fonts $ gunzip user.ps.gz $ gshp -sOUTPUTFILE=user.hp user.ps $ gzip user.ps $ lpr -l -s -r manpage.hp
Postgres 团队希望让 Postgres 在所有受支持的平台上都能工作。因此我们请你告诉我们你在你的系统上有没有让 Postgres 跑起来。请发邮件到 pgsql-ports@postgresql.org 告诉我们以下内容:
Postgres 的版本(v6.4、6.3.2、beta 981014 等)。
你的操作系统(例如 RedHat v5.1 Linux v2.0.34)。
你的硬件(SPARC、i486 等)。
你是否干净地编译、安装并运行了回归测试?如果没有,你改了哪些源代码(即你应用的补丁、你做的修改等)、哪些测试失败了等。编译时出现许多警告是正常的。这些不需要报告。
现在按需要创建、访问和操纵数据库。编写访问数据库服务器的客户端程序。换句话说,尽情享受!
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。