服务器 频道

PostgreSQL 管理员常见问题

  【IT168 服务器学院】管理员问题
  1) 为什么 initdb 会失败?
  2) 我怎样能把 PostgreSQL 装在 /usr/local/pgsql 以外的地方?
  3) 当我运行 postmaster 时,我收到Bad System Call(系统调用错)或者内核倾倒消息。为什么?
  4) 当我试图运行 postmaster 时,我收到 IpcMemoryCreate errors3 消息。为什么?
  5) 当我试图运行 postmaster 时,我收到 IpcSemaphoreCreate 错误。为什么?
  6) 我如何禁止其他主机访问我的 PostgreSQL 数据库
  7) 为什么我无法从其他机器上联接到我的数据库来?
  8) 为什么我不能以 root 用户身份访问数据库?
  9) 为什么在并行访问表时,我的所有(数据库)服务器都崩溃了?
  10) 我怎样调节数据库引擎以获得更好的性能?
  11) PostgreSQL 里可以获得什么样的调试特性?
  12) 当我试图联接时收到''Sorry, too many clients'' 消息。这是为什么?
  13) 我的数据库目录里面的 pg_psort.XXX 文件是什么?
  14) 我如何设置一个 pg_group?
  
  1) 为什么 initdb 会失败?
  检查一下,确保你的路径里没有任何以前版本的二进制文件(如果你看到消息 WARN:heap_modifytuple: repl is \ 9,那么就是这个问题。) 
  检查一下,看看你有没有正确设置路径。 
  检查一下,看看 postgres 用户是否拥有正确的文件 
  2) 我怎样能把 PostgreSQL 装在 /usr/local/pgsql 以外的地方?
  最简单的方法是在运行 configure 的时候声明 --prefix 选项。如果你忘记这么做了,你可以编辑 Makefile.global 并相应地修改 POSTGRESDIR,或者创建一个 Makefile.custom 并且在那里定义 POSTGRESDIR。
  
  3) 当我运行 postmaster 时,我收到Bad System Call (系统调用错)或内核倾倒。为什么?
  这可能是很多方面的问题,但首先应该检查你在内核里配置安装了 system V (系统 V)扩展。PostgreSQL 需要内核支持共享内存和信号灯。
  
  4) 当我试图运行 postmaster 时,我收到 IpcMemoryCreate 错误。为什么?
  你要么是没有在内核里正确配置共享内存,要么是你需要扩大你的内核的可用共享内存。你需要的共享内存具体的数量取决于你的体系结构和你配置你的 postmaster 运行时使用的缓冲区和后端进程数目。对大多数系统,使用缺省缓冲区和进程数目时,你最少需要~1MB。
  
  5) 当我试图运行 postmaster 时,我收到 IpcSemaphoreCreate 错误。为什么?
  如果错误信息是 IpcSemaphoreCreate: semget failed (No space left on device),那么原因是你的内核没有配置足够的信号灯资源。Postgres 的每个潜在的后端进程都需要一些信号灯。一个临时的解决方法是以比较少的后端数量(参数)启动 postmaster。使用开关 -N 带一个少于缺省值 32 的参数运行 postmaster。更长久的解决方法是加大你的内核的 SEMMNS 和 SEMMNI 参数。
  
  如果错误信息是其他的什么东西,你可能就根本没有在内核里面配置信号灯支持。
  
  6) 我如何禁止其他主机访问我的 PostgreSQL 数据库?
  缺省时,PostgreSQL 只允许通过 unix 域套接字来自本机的联接。除非你使用 -i 开关启动 postmaster,并且通过对应的编辑 $PGDATA/pg_hba.conf 文件打开了主机为基础( host-based )的认证,否则其他机器是不能与你的机器联接的。这样将允许 TCP/IP 联接。
  
  7) 为什么我无法从其他机器上联接到我的数据库来?
  缺省的配置只允许从本地利用 unix 域套接字与数据库联接。要打开 TCP/IP 联接,确信你是带着 -i 开关运行 postmaster 的,并且相应的向文件 pgsql/data/pg_hba.conf 里增加了一些恰当的主机记录。参考 pg_hba.conf 手册页。
  
  8) 为什么我不能以 root 用户身份访问数据库?
  你不应以用户标识(user id)0 (root)创建数据库。他们将不能访问数据库。这是一种安全预防措施,以避免任何用户都能动态地把对象模块与数据库进行引擎链接。
  
  9) 为什么在并行访问表时,我的所有(数据库)服务器都崩溃了?
  这个问题可能是因为内核没有配置成支持信号灯引起的。
  
  10) 我怎样调节数据库引擎以获得更好的性能?
  当然,索引可以加速查询。EXPLAIN 命令允许你观察 PostgreSQL 如何解释你的查询,以及使用了哪个索引。
  
  如果你正处理一堆 INSERT,考虑使用 COPY 命令以大批量的方式进行。这样做比单独一个 INSERTS 快得多。第二,没有处于 BEGIN WORK/COMMIT 事务块之间的语句被认为处于它们自身的事务里面。试着在一个事务块里面处理更多的语句。这样可以减少事务带来的过荷。同样,在做大量的数据改变时考虑删除和重建索引。
  
  还有几件调节的方法可以使用。你可以通过带 -o -F 选项运行 postmaster 关闭 fsync()。这样将避免每次事务后调用 fsync() 把数据冲刷到磁盘上。
  
  你还可以使用 postmaster -B 选项增加后端进程使用的共享内存缓冲的数目。如果你把这个参数设置得太高,postmaster 可能无法启动,因为你已经超过了你的内核在共享内存空间上的限制。每个缓冲区是 8K 并且缺省 64 个缓冲区。
  
  你还可以使用后端的 -S 选项来增加每个后端用于临时排序用的最大内存数量。-S 值是以千字节计的,缺省是 512 (也就是说,512K)。把这个数目搞得太大也不是个好主意,因为你可能在一个查询激活多个并行排序时用光内存。
  
  你还可以使用 CLUSTER 命令来把一个基本表里的数据按照索引的匹配进行分组。参阅 cluster(l) 的手册页获取更多细节。
  
  11) PostgreSQL 里可以获得什么样的调试特性?
  PostgreSQL 有几个特性用于报告状态信息,这些信息可能对调试用途很有帮助。
  
  首先,通过附带 --enable-cassert 选项运行 configure,有很多 assert() 监控后端的过程和在发生某些未曾预料的现象时停止程序运行。
  
  postmaster 和 postgres 都有一些可用的选项。首先,当你启动 postmaster 时,确保你把标准输出和标准错误定向到了一个日志文件里去了,象:
  
  cd /usr/local/pgsql
  ./bin/postmaster >server.log 2>&1 &
  
  这样将在 PostgreSQL 优异目录下输出一个 server.log 文件。这个文件包含服务器碰到的问题和错误的有用信息。postmaster 有一个 -d 选项,该选项允许我们获得更多的细节汇报。-d 选项接受一个数字标明调试级别。需要警告的是高的调试级别可能会生成巨大的日志文件。
  
  你实际上可以直接在命令行上运行 postgres 后端,然后直接键入你的 SQL 语句。我们只推荐在调试的时候这么干。请注意这时一个新行结束一个查询,而不是一个分号。如果你带着调试符号编译,你可以使用一个调试器观看发生了什么事情。因为后端没有由 postmaster 启动的,它不是在一个典型的环境里运行而且锁定/后端交互问题可能不能复现。有些调试器可以附加到一个已运行的后端上;那是在一个正常的多后端环境下诊断问题的最方便的方法。
  
  postgres 程序有 -s,-A,和 -t 选项可能在调试和性能测量的时候非常有用。
  
  你还可以带构形文件编译后端,以便观察什么函数占据着执行时间。后端构形文件将放在 pgsql/data/base/dbname 目录下。客户端构形文件将放在客户端当前目录下。
  
  12) 当我试图联接时收到''Sorry, too many clients'' 消息。这是为什么?
  你需要增大 postmaster 关于它可以启动的并发后端进程数目的限制。
  
  在 Postgres 6.5 及以上版本,缺省限制是 32 进程。你可以通过带着适当的 -N 值开关启动 postmaster 增加这个数目。缺省配置下你最大可以把 -N 设置为 1024;如果你需要更多后端进程,增大 include/config.h 里的 MAXBACKENDS 值然后重新制作。如果你愿意,你可以在配置的时候设置 -N 的缺省值:使用 configure 的 --with-maxbackends 开关。
  
  要注意如果你把 -N 设置为大于 32,你必须同样增大 -B,超过它缺省的 64;-B 必须最少是 -N 的两倍,而且为了更好的性能可能要比那个数字要大。对于大数目的后端进程,你可能还会发现你还需要增加许多 Unix 内核配置参数值。要检查的东西包括共享内存块的最大尺寸,SHMMAX,信号灯的最大数目,SEMMNS 和 SEMMNI,最大的进程数,NPROC,单用户最大进程数,MAXUPRC,以及打开文件的最大数目,NFILE 和 NINODE。Postgres 对允许的后端进程数有限制的原因是为了确保你的系统不会用光资源。
  
  在 Postgres 早于 6.5 的版本,最大后端数目缺省是 64,并且对它的修改首先需要修改 include/storage/sinvaladt.h 里的 MaxBackendId 常量,然后重新制作。
  
  13) 我的数据库目录里面的 pg_tempNNN.NN 文件是什么?
  这些是查询执行器生成的临时文件。例如,如果需要为满足 ORDER BY 条件做排序,并且排序需要比后端的 -S 参数给出的更多的空间,那么就会创建一个临时文件保存多出来的数据。
  
  临时文件应该自动消失,不过如果在排序过程中后端崩溃了就可能不能自动消失了。如果目前没有什么事务在运行,把 pg_tempNNN.NN 文件删除是安全的。
  
  14)我如何设置一个 pg_group?
  目前,我们建立一个用户组还没有简单的接口。你不得不显式的 insert/update pg_group 表。例如:
  
  jolly=> insert into pg_group (groname, grosysid, grolist)
  jolly=>     values (''posthackers'', ''1234'', ''{5443, 8261}'');
  INSERT 548224
  jolly=> grant insert on foo to group posthackers;
  CHANGE
  jolly=>
  
  pg_group 里的字段是:
  
  groname:组名称。这是一个名称并且应该完全由字母和数字组成。不要包含下划线和其他标点。 
  grosysid:组 id,这是一个 int4。应该在所有组中唯一。 
  grolist:属于这个组的 pg_user id 的列表。这是一个 int4[]。 
0
相关文章