分享
 
 
 

PostgreSQL常见问题(FAQ)

王朝mssql·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

最近更新:2000

三月二十一日

星期二

16:09:11

EST

目前维护人员:Bruce

Momjian

(pgman@candle.pha.pa.us)

中文版维护人员:何伟平

(laser@zhengmai.com.cn)

本文档的最新版本可以在

postgreSQL

Web

站点上看到,http://www.PostgreSQL.org。

Linux

相关的问题在

http://www.PostgreSQL.org/docs/faq-linux.html

里回答。

Irix

相关的问题在

http://www.PostgreSQL.org/docs/faq-irix.html

里回答。

HPUX

相关的问题在

http://www.PostgreSQL.org/docs/faq-hpux.shtml

里回答。

--------------------------------------------------------------------------------

常见问题

1.1)

PostgreSQL

是什么?

1.2)

PostgreSQL

的版权是什么?

1.3)

PostgreSQL

运行在什么

Unix

平台上?

1.4)

可用的非unix平台有那些?

1.5)

我在那里能得到

PostgreSQL?

1.6)

我从那里能得到对

PostgreSQL

的支持?

1.7)

PostgreSQL

最新的版本是什么?

1.8)

可获得的

PostgreSQL

的文档有那些?

1.9)

我如何了解已知的臭虫或缺失的特性?

1.10)

我应该怎样学习

SQL

1.11)

PostgreSQL

Y2K

兼容的吗?

1.12)

我应该怎样加入开发队伍?

1.13)

我应该怎样提交一个臭虫报告?

1.14)

PostgreSQL

和其他

DBMS

比起来如何?

用户客户端问题

2.1)

PostgreSQL

ODBC

驱动程序么?

2.2)

有什么工具可以把

PostgreSQL

用于

Web

页面?

2.3)

PostgreSQL

拥有图形用户界面吗?有报表生成器吗?有嵌入的查询语言接口吗?

2.4)

我们可以用什么语言和

PostgreSQL

打交道?

管理员问题

3.1)

为什么

initdb

会失败?

3.2)

我怎样能把

PostgreSQL

装在

/usr/local/pgsql

以外的地方?

3.3)

当我运行

postmaster

时,我收到Bad

System

Call(系统调用错)或者内核倾倒消息。为什么?

3.4)

当我试图运行

postmaster

时,我收到

IpcMemoryCreate

errors3

消息。为什么?

3.5)

当我试图运行

postmaster

时,我收到

IpcSemaphoreCreate

错误。为什么?

3.6)

我如何禁止其他主机访问我的

PostgreSQL

数据库

3.7)

为什么我无法从其他机器上联接到我的数据库来?

3.8)

为什么我不能以

root

用户身份访问数据库?

3.9)

为什么在并行访问表时,我的所有(数据库)服务器都崩溃了?

3.10)

我怎样调节数据库引擎以获得更好的性能?

3.11)

PostgreSQL

里可以获得什么样的调试特性?

3.12)

当我试图联接时收到'Sorry,

too

many

clients'

消息。这是为什么?

3.13)

我的数据库目录里面的

pg_psort.XXX

文件是什么?

3.14)

我如何设置一个

pg_group?

操作问题

4.1)

系统看起来被逗号,小数点和日期格式弄糊涂了。

4.2)

二进制游标和普通游标之间准确的区别是什么?

4.3)

我如何只

select

(选取)一个查询的头几行?

4.4)

我如何获取一个表的列表,或者是其他我能在

psql

里看到的东西?

4.5)

你怎样从一个表里面删除一个列?

4.6)

一行,一个表,一个库的最大尺寸是多少?

4.7)

存储一个典型的平面文件里的数据需要多少磁盘空间?

4.8)

我如何查看一个数据库里面定义了那些索引或者操作?

4.9)

我的查询很慢或者没有利用索引。为什么?

4.10)

我如何才能看到查询优化器是怎样计算我的查询的?

4.11)

R-tree

索引是什么?

4.12)

什么是基因查询优化(Genetic

Query

Optimization)?

4.13)

我怎样做规则表达式搜索和大小写无关搜索?

4.14)

在一个查询里,我怎样检测一个字段是否为

NULL?

4.15)

各种字符类型之间有什么不同?

4.16.1)

我怎样创建一个序列号/自动递增的字段?

4.16.2)

我如何获得一个插入的序列号的值?

4.16.3)

使用

currval()

nextval()

会导致一个与其他并行后端进程之间的一个竞争条件吗?

4.17)

什么是

oid?什么是

tid?

4.18)

PostgreSQL

使用的一些术语的含义是什么?

4.19)

为什么我收到错误

"FATAL:

palloc

failure:

memory

exhausted?"

4.20)

我如何才能知道我运行的

PostgreSQL

的版本?

4.21)

为什么我的大对象操作收到invalid

large

obj

descriptor(非法大对象描述符)。?

4.22)

我如何创建一个缺省值是当前时间的字段?

4.23)

为什么我的使用

IN

的子查询这么慢?

扩展

PostgreSQL

5.1)

我写了一个用户定义函数。当我在psql

里运行它时,为什么会导致内核倾倒?

5.2)

消息:NOTICE:PortalHeapMemoryFree:

0x402251d0

not

in

alloc

set!

是什么意思?

5.3)

我如何能给

PostgreSQL

贡献一些挺不错的新类型和函数?

5.4)

我怎样写一个返回一条记录的

C

函数?

5.5)

我修改了源代码。为什么重新编译后没有看到改变?

--------------------------------------------------------------------------------

常见问题

1.1)

PostgreSQL是什么?

PostgreSQL

是一个

POSTGRES

数据库管理系统的增强版,是一个下一代

DBMS

的研究原型。PostgreSQL

在保持

POSTGRES

的强大的数据模型和丰富的数据类型的基础上,用一个扩展了的

SQL

的子集取代了原先的

PostQuel

查询语言。 PostgreSQL

是自由的并且所有源代码都可以获得。

PostgreSQL

的开发是由一个互联网相联的开发人员队伍进行的,他们都参加

PostgreSQL

开发邮件列表。目前的协调人是

Marc

G.

Fournier

(scrappy@postgreSQL.org)。(如何加入参阅下文)。这个队伍现在负责

PostgreSQL

所有目前的和未来的开发。

PostgreSQL

1.01

的作者是

Andrew

Yu

Jolly

Chen。还有许多其他人为移植,测试,调试和增强代码做了大量贡献。 PostgreSQL

起源的最初的

Postgres

的代码,是在加州大学伯克利分校的

Michael

Stonebraker

教授的指导下,由许多研究生,本科生和编程职员完成的。

这个软件最初在伯克利的名字是

Postgres。在

1995

年,当增加了

SQL

功能后,它的名字改成

Postgres95。在

1996年末,这个名字改为

PostgreSQL。

1.2)

PostgreSQL

的版权是什么?

PostgreSQL

受下面的版权约束。

PostgreSQL

数据库管理系统

(PostgreSQL

Data

Base

Management

System)

部分版权(c)1996-2000,PostgreSQL,Inc

部分版权(c)1994-6

加州大学董事

(Portions

copyright

(c)

1996-2000,

PostgreSQL,

Inc

Portions

Copyright

(c)

1994-6

Regents

of

the

University

of

California)

允许为任何目的使用,拷贝,修改和分发这个软件和它的文档而不收取任何费用,并且无须签署因此而产生的证明,前提是上面的版权声明和本段以及下面两段出现在所有拷贝中。

(Permission

to

use,

copy,

modify,

and

distribute

this

software

and

its

documentation

for

any

purpose,

without

fee,

and

without

a

written

agreement

is

hereby

granted,

provided

that

the

above

copyright

notice

and

this

paragraph

and

the

following

two

paragraphs

appear

in

all

copies.)

在任何情况下,加州大学都不承担因使用此软件及其文档而导致的对任何当事人的直接的,间接的,特殊的,附加的或者相伴而生的损坏,包括利益损失的责任,即使加州大学已经建议了这些损失的可能性时也是如此。

(IN

NO

EVENT

SHALL

THE

UNIVERSITY

OF

CALIFORNIA

BE

LIABLE

TO

ANY

PARTY

FOR

DIRECT,

INDIRECT,

SPECIAL,

INCIDENTAL,

OR

CONSEQUENTIAL

DAMAGES,

INCLUDING

LOST

PROFITS,

ARISING

OUT

OF

THE

USE

OF

THIS

SOFTWARE

AND

ITS

DOCUMENTATION,

EVEN

IF

THE

UNIVERSITY

OF

CALIFORNIA

HAS

BEEN

ADVISED

OF

THE

POSSIBILITY

OF

SUCH

DAMAGE.)

加州大学明确放弃任何保证,包括但不局限于某一特定用途的商业和利益的隐含保证。这里提供的这份软件是基于“当作是”的基础的,因而加州大学没有责任提供维护,支持,更新,增强或者修改的服务。

(THE

UNIVERSITY

OF

CALIFORNIA

SPECIFICALLY

DISCLAIMS

ANY

WARRANTIES,

INCLUDING,

BUT

NOT

LIMITED

TO,

THE

IMPLIED

WARRANTIES

OF

MERCHANTABILITY

AND

FITNESS

FOR

A

PARTICULAR

PURPOSE.

THE

SOFTWARE

PROVIDED

HEREUNDER

IS

ON

AN

"AS

IS"

BASIS,

AND

THE

UNIVERSITY

OF

CALIFORNIA

HAS

NO

OBLIGATIONS

TO

PROVIDE

MAINTENANCE,

SUPPORT,

UPDATES,

ENHANCEMENTS,

OR

MODIFICATIONS.)

1.3)

PostgreSQL

运行在什么平台上?

作者们在下面这些平台上编译和测试了

PostgreSQL

(其中有些平台的编译要求使用

gcc):

aix

-

IBM

AIX

3.2.5

4.x

alpha

-

Digital

Unix

2.0,

3.2,

4.0

上的

DEC

Alpha

AXP

BSD44_derived

-

从4.4-lite

BSD

发展来的

OS

(NetBSD,FreeBSD)

bsdi

-

BSD/OS

2.x,

3.x,

4.x

dgux

-

DG/UX

5.4R4.11

hpux

-

HP

PA-RISC

上的

HP-UX

9.*,

10.*

i386_solaris

-

i386

Solaris

irix5

-

SGI

MIPS

上的

IRIX

5.3

linux

-

Intel

i86

Alpha

SPARC

PPC

M68k

sco

-

SCO

3.2v5

Unixware

sparc_solaris

-

SUN

SPARC

上的

Solaris

2.4,

2.5,

2.5.1

sunos4

-

SUN

SPARC

上的

SunOS

4.1.3

svr4

-

Intel

x86

上的

Intel

SVR4

and

MIPS

ultrix4

-

DEC

MIPS

上的

Ultrix

4.4

1.4)

可用的非

unix

平台有那些?

libpq

C

库,psql,和其他接口和二进制编译成可以在

MS

Windows

平台上运行是可能的。这种情况下,客户端在

MS

Windows

上运行,并且通过

TCP/IP

与一个运行在我们支持的

Unix

平台上的服务器进行通讯。

在发布包里面有一个

win31.mak

文件用于制作

Win32

libpq

库和

psql。

数据库服务器现在可以通过使用

Cygnus

Unix/NT

移植库在

Windows

NT

上面运行。参阅发布包里的

pgsql/doc/README.NT

文件。

还有一个

web

页在

http://www.freebsd.org/~kevlo/postgres/portNT.html。另外还有一个使用

U/Win

的移植在

http://surya.wipro.com/uwin/ported.html.

1.5)

我在那里可以得到

PostgreSQL?

PostgreSQL

的主匿名

ftp

站在

ftp://ftp.postgreSQL.org/pub

镜像站可以参考我们网站的主页。

1.6)

我从那里能得到对

PostgreSQL

的支持?

加州大学伯克利分校不对

PostgreSQL

提供任何官方支持。它是通过志愿者的行动维护的。

主要的邮件列表是:pgsql-general@postgreSQL.org。可以在那里讨论有关

PostgreSQL

的问题。要加入列表,发一封邮件内容(不是主题行)为

subscribe

end

的邮件到

pgsql-general-request@postgreSQL.org。

还可以获取摘要列表。要加入这个列表,发邮件到:pgsql-general-digest-request@postgreSQL.org,其内容为:

subscribe

end

每当主列表达到大约

30k

的消息内容时,摘要就发送给这个列表的成员。

还可以参加臭虫邮件列表。要加入这个列表,发送一个邮件到

bugs-request@postgreSQL.org,内容为:

subscribe

end

还可以参加开发人员邮件列表。要加入这个列表,发送一个邮件到

hackers-request@postgreSQL.org,内容为:

subscribe

end

其他的关于

PostgreSQL

邮件列表和其他信息可以在

PostgreSQL

WWW

主页找到:

http://postgreSQL.org

EFNet

里还有一个

IRC

频道,频道

#PostgreSQL。我用

unix

命令irc

-c

'#PostgreSQL'

"$USER"

irc.phoenix.net

PostgreSQL

的商业支持可以在

http://www.pgsql.com/

获得。

1.7)

PostgreSQL

最新的版本是什么?

PostgreSQL

最新的版本是版本

7.0。

我们计划每四个月发布一个主要版本。

1.8)

可获得的

PostgreSQL

文档有那些?

在发布包里有一些手册,手册页和一些小的测试例子。参见

/doc

目录。(译注:应为

$PGHOME/doc)。你还可以在线浏览PostgreSQL

的手册,在

http://www.postgresql.org/docs/postgres.。

psql

有一些很好的

\d

命令,显示关于类型,操作符,函数,聚集等的信息。

web

站包含更多的文档。

1.9)

我如何了解已知的臭虫和缺失的特性?

PostgreSQL

支持一个扩展了的

SQL-92

的子集。参阅我们的

TODO,获取一个已知臭虫,缺失特性和未来计划的列表。

1.10)

我应该怎样学习

SQL?

http://w3.one.net/~jhoffman/sqltut.htm

http://ourworld.compuserve.com/homepages/Graeme_Birchall/HTM_COOK.HTM.

有一个很好的教程。

另一个是

"Teach

Yourself

SQL

in

21

Days,

Second

Edition"(21天学会SQL,第二版),在

http://members.tripod.com/er4ebus/sql/index.htm

我们的许多用户喜欢

The

Practical

SQL

Handbook,

Bowman

et

al.,

Addison

Wesley.

其他的有

Lan

Times

Guide

to

SQL,

Groff

et

al.,

Osborne

McGraw-Hill.

1.11)

PostgreSQL

Y2K

兼容的吗?

是,我们很容易控制

2000AD

之后和

2000BC

之前的日期。

1.12)

我应该怎样加入开发队伍?

首先,下载最新的源代码和阅读我们

web

站上的

PostgreSQL

开发者文档。第二,加入

pgsql-hackers

pgsql-patches

邮件列表。第三,向

pgsql-patches

提交高质量的补丁程序。

现在大概有十几个人有

PostgreSQL

CVS

归档

COMMIT

的权限。他们都已经提交了非常多高质量的补丁了,以至于现有的提交人很难跟上节奏,并且我们相信他们提交的补丁都是高质量的。

1.13)

我怎样提交一个臭虫报告?

填充"bug-template"(臭虫模板)文件然后发送到:bugs@postgreSQL.org

同样也要看看我们的

ftp

站点

ftp://ftp.postgreSQL.org/pub,看有没有更新的

PostgreSQL

版本或补丁。

1.14)

PostgreSQL

和其他

DBMS

比起来如何?

评价软件有好几种方法:特性,性能,可靠性和价格。

特性

PostgreSQL

拥有大型商用

DBMS

里大多数特性,例如:事务,子查询,触发器,视图和复杂的锁定等。我们还有一些它们没有的特性,如用户定义类型,继承,规则和多版本并行控制以减少锁的争用等。我们还没有外键参考完整或外部联合(foreign

key

referential

integrity

or

outer

joins),不过正在准备在下一个版本增加这些特性。

性能

PostgreSQL

在两种模式下运行。通常的

fsync

(同步)模式把每个完成的事务都冲洗到磁盘上,以保证如果

OS

崩溃了或者在下几秒钟出现掉电的情况下,你的所有数据都安全地存放在磁盘上。这种模式下,我们比大多数商用数据库都慢,部分原因是因为那些数据库缺省状态下很少这样保守地向磁盘冲洗数据。在

no-fsync

(非同步)模式下,我们一般都比商用数据库快,尽管在这种模式下,一个

OS

的崩溃将导致数据损坏。我们正在建设一种中间模式,这种模式比完全同步(fsync)模式的性能损失小,而且将保证在OS

崩溃情况下的

30

秒内的数据完整。这种模式可以由数据库管理员选择。

MySQL

或更轻便的数据库系统比较,我们在

insert/update

时慢,因为我们有额外的事务处理。当然

MySQL

不具有我们在上面的特性段里给出的任何特性。我们的主要方向是灵活性和特性,尽管我们通过优化和源码分析不断地改进性能。

我们通过创建一个

Unix

进程处理每个用户的联接。后端进程共享数据缓冲区和锁信息。在多

CPU

的条件下,多个后端很容易运行在不同的

CPU

上。

可靠性

我们知道

DBMS

必须是可靠的,否则它就一点用都没有。我们努力做到发布经过认真测试的,稳定的臭虫最少的代码。每个版本至少有一个月的

beta

测试,并且我们的发布历史显示我们可以提供稳定的,牢固的,可用于生产使用的版本。我们相信在这方面我们与其他的数据库软件是相当的。

支持

我们的邮件列表提供一个非常大的开发人员和用户的组以帮助解决所碰到的任何问题。我们不能保证肯定能解决问题,相比之下,商用

DBMS

也并不是总能够提供解决方法。直接与开发人员,用户群,手册和源程序接触令

PostgreSQL

的支持比其他

DBMS

还要好。还有一些商业性的预包装的支持,可以给提供给那些需要的人。(参阅支持

FAQ

条款。)

价格

我们对任何用途都免费,包括商用和非商用目的。你可以不加限制地向你的产品里加入我们的代码,除了那些我们在上面的版权声明里声明的

BSD

风格的版权外。

--------------------------------------------------------------------------------

用户客户问题

2.1)

PostgreSQL

ODBC

驱动么?

有两个

ODBC

驱动可以获得,PostODBC

OpenLink

ODBC.

在发布版本里面包含。关于它的更多信息可以从:http://www.insightdist.com/psqlodbc

获得。

OpenLink

ODBC

可以从

http://www.openlinksw.com

获得。它与他们的标准

ODBC

客户端软件兼容,因而你可以在任何他们支持的客户端平台(Win,

Mac,

Unix,

VMS)上使用

PostgreSQL

ODBC。

他们可能将这个产品销售给那些需要商业支持的用户,但是总是有一个

freeware

(自由软件)的版本可以得到。请询问

postgres95@openlink.co.uk。

2.2)

有什么工具可以把

PostgreSQL

用于

Web

页面?

一个介绍以数据库为后台的

Web

页面在:http://www.webtools.com。

还有一个在:http://www.phone.net/home/mwm/hotlist/。

对于

web

集成,PHP

是一个极好的接口。它在:http://www.php.net

PHP

很适合用于简单任务,但对于更复杂的任务,可以使用

perl

接口和

CGI.pm。

一个以

WDB

为基础,使用

perl

WWW

网关可以从

http://www.eol.ists.ca/~dunlop/wdb-p95

下载。

2.3)

PostgreSQL

拥有图形用户界面吗?有报表生成器吗?有嵌入的查询语言接口吗?

我们有一个叫

pgaccess

的很好的图形用户接口,它是做为发布版本的一部分发布的。Pgaccess

还有一个报表生成器。它的网页在

http://www.flex.ro/pgaccess

我们还有

ecpg,它是一个用于

C

的嵌入的

SQL

查询语言接口。

2.4)

我们可以用什么语言和

PostgreSQL

打交道?

我们有:

C(libpq)

C++(libpq++)

Embedded

C(ecpg)

Java(jdbc)

Perl(perl5)

ODBC(odbc)

Python(PyGreSQL)

TCL(libpgtcl)

C

简易

API(libpgeasy)

嵌入的

HTML(PHP,来自

http://www.php.net)

--------------------------------------------------------------------------------

管理员问题

3.1)

为什么

initdb

会失败?

检查一下,确保你的路径里没有任何以前版本的二进制文件(如果你看到消息

WARN:heap_modifytuple:

repl

is

9,那么就是这个问题。)

检查一下,看看你有没有正确设置路径。

检查一下,看看

postgres

用户是否拥有正确的文件

3.2)

我怎样能把

PostgreSQL

装在

/usr/local/pgsql

以外的地方?

最简单的方法是在运行

configure

的时候声明

--prefix

选项。如果你忘记这么做了,你可以编辑

Makefile.global

并相应地修改

POSTGRESDIR,或者创建一个

Makefile.custom

并且在那里定义

POSTGRESDIR。

3.3)

当我运行

postmaster

时,我收到Bad

System

Call

(系统调用错)或内核倾倒。为什么?

这可能是很多方面的问题,但首先应该检查你在内核里配置安装了

system

V

(系统

V)扩展。PostgreSQL

需要内核支持共享内存和信号灯。

3.4)

当我试图运行

postmaster

时,我收到

IpcMemoryCreate

错误。为什么?

你要么是没有在内核里正确配置共享内存,要么是你需要扩大你的内核的可用共享内存。你需要的共享内存具体的数量取决于你的体系结构和你配置你的

postmaster

运行时使用的缓冲区和后端进程数目。对大多数系统,使用缺省缓冲区和进程数目时,你最少需要~1MB。

3.5)

当我试图运行

postmaster

时,我收到

IpcSemaphoreCreate

错误。为什么?

如果错误信息是

IpcSemaphoreCreate:

semget

failed

(No

space

left

on

device),那么原因是你的内核没有配置足够的信号灯资源。Postgres

的每个潜在的后端进程都需要一些信号灯。一个临时的解决方法是以比较少的后端数量(参数)启动

postmaster。使用开关

-N

带一个少于缺省值

32

的参数运行

postmaster。更长久的解决方法是加大你的内核的

SEMMNS

SEMMNI

参数。

如果错误信息是其他的什么东西,你可能就根本没有在内核里面配置信号灯支持。

3.6)

我如何禁止其他主机访问我的

PostgreSQL

数据库?

缺省时,PostgreSQL

只允许通过

unix

域套接字来自本机的联接。除非你使用

-i

开关启动

postmaster,并且通过对应的编辑

$PGDATA/pg_hba.conf

文件打开了主机为基础(

host-based

)的认证,否则其他机器是不能与你的机器联接的。这样将允许

TCP/IP

联接。

3.7)

为什么我无法从其他机器上联接到我的数据库来?

缺省的配置只允许从本地利用

unix

域套接字与数据库联接。要打开

TCP/IP

联接,确信你是带着

-i

开关运行

postmaster

的,并且相应的向文件

pgsql/data/pg_hba.conf

里增加了一些恰当的主机记录。参考

pg_hba.conf

手册页。

3.8)

为什么我不能以

root

用户身份访问数据库?

你不应以用户标识(user

id)0

(root)创建数据库。他们将不能访问数据库。这是一种安全预防措施,以避免任何用户都能动态地把对象模块与数据库进行引擎链接。

3.9)

为什么在并行访问表时,我的所有(数据库)服务器都崩溃了?

这个问题可能是因为内核没有配置成支持信号灯引起的。

3.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)

的手册页获取更多细节。

3.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

目录下。客户端构形文件将放在客户端当前目录下。

3.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

常量,然后重新制作。

3.13)

我的数据库目录里面的

pg_tempNNN.NN

文件是什么?

这些是查询执行器生成的临时文件。例如,如果需要为满足

ORDER

BY

条件做排序,并且排序需要比后端的

-S

参数给出的更多的空间,那么就会创建一个临时文件保存多出来的数据。

临时文件应该自动消失,不过如果在排序过程中后端崩溃了就可能不能自动消失了。如果目前没有什么事务在运行,把

pg_tempNNN.NN

文件删除是安全的。

3.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[]。

--------------------------------------------------------------------------------

操作问题

4.1)

系统看起来被逗号,小数点和日期格式弄糊涂了。

检查你的本地化(locale)配置。PostgreSQL

使用用户的本地化配置运行

postmaster

进程。可以用

postgres

psql

SET

命令控制日期格式。根据你的操作环境设置那些值。

4.2)

二进制游标和普通游标之间准确的区别是什么?

参阅

DECLARE

手册页获取信息。

4.3)我如何只

SELECT

(选取)一个查询的头几行?

参阅

FETCH

手册页,或者使用

SELECT

...

LIMIT....

即使你只需要开头的几行,也会涉及到整个查询。试着使用带有

ORDER

BY

的查询。如果有一个索引与

ORDER

BY

匹配,PostgreSQL

可能就只计算要求的头几条记录,否则将对整个查询进行计算直到生成需要的行。

4.4)

我如何获取一个表的列表,或者是其他我能在

psql

里看到的东西?

你可以阅读

psql

的源代码,文件

pgsql/src/bin/psql/psql.c。它包括为生成

psql

的反斜杠命令的输出的

SQL

命令。你还可以带着

-E

选项启动

psql,这样它将打印出执行你给出的命令所用的查询。

4.5)

你怎样从一个表里面删除一个列?

我们不支持

ALTER

TABLE

DROP

COLUMN,但可以这样做:

SELECT

...

--

select

all

columns

but

the

one

you

want

to

remove

INTO

TABLE

new_table

FROM

old_table;

DROP

TABLE

old_table;

ALTER

TABLE

new_table

RENAME

TO

old_table;

4.6)

一行,一个表,一个库的最大尺寸是多少?

行被限制在

8K

字节以内,但是可以通过编辑

include/config.h

和修改

BLCKSZ

而改变。要使用大于

8K

的字段,你还可以使用大对象接口。

行不会折叠

8k

的边界,所以

5k

的行将需要

8k

存储空间。

表和数据库尺寸没有限制。有许多数据库有几十G字节大,可能还有几百G字节的数据库。

4.7)存储一个典型的平面文件里的数据需要多少磁盘空间?

一个

Postgres

数据库可能需要大约相当于在一个平面文件里存储相同数据的6.5倍的磁盘空间。

假设一个文件有

300,000

行,每行有两个整数。平面文件是

2.4MB。而包含这些数据的

PostgreSQL

数据库文件的大小预计可达

14MB:

36

bytes:

each

row

header

(approximate)(每行的头,估计值)

+

8

bytes:

two

int

fields

@

4

bytes

each(两个整数字段,每个4字节)

+

4

bytes:

pointer

on

page

to

tuple(页面里指向记录的指针)

----------------------------------------

48

bytes

per

row(每行

48

字节)

The

data

page

size

in

PostgreSQL

is

8192

bytes

(8

KB),

so:(PostgreSQL

里的数据页面的尺寸是

8K,因此:)

8192

bytes

per

page

-------------------

=

171

rows

per

database

page

(rounded

up)(圆整后

117行/数据库页)

48

bytes

per

row

300000

data

rows

--------------------

=

1755

database

pages(1755数据库页面)

171

rows

per

page

1755

database

pages

*

8192

bytes

per

page

=

14,376,960

bytes

(14MB)

索引没有这么多额外的东西,但是还是包含被索引的数据,所以他们可能也很大。

4.8)

我如何查看一个数据库里面定义了那些索引或者操作?

psql

有许多反斜杠命令用于显示这些信息。用

\?

看看都有那些。

同样可以试试文件

pgsql/src/tutorial/syscat.source。它演示了许多从数据库系统表里获取信息需要的

SELECT。

4.9)

我的查询很慢或者没有利用索引。为什么?

PostgreSQL

并不自动维护统计数据。我们必须进行一次显式的

VACUUM

调用来更新统计数据。在统计数据更新之后,优化器就知道表里面有多少数据行,因而就可以更好的判断是否应该使用索引。要注意当表很小的时候优化器并不使用索引,因为这时候一次顺序扫描会更快。

对于字段相关的优化统计,使用

VACUUM

ANALYZE。VACUUM

ANALYZE

对于复杂的多联合查询是非常重要的,因为这样优化器可以计算从每个表里面返回的行的数目,然后选择合适的联合顺序。后端本身并不跟踪字段统计,因而必须周期的运行

VACUUM

ANALYZE

以便收集这些信息。

索引通常不用于

ORDER

BY

操作:对一个大表的一次顺序扫描然后跟着一个显式的排序比对所有记录的索引扫描要快,因为前者的磁盘访问更少。

当使用模糊操作符,比如

LIKE

~,只有在搜索的开始是挂在字串的开头部分时才用得到索引。因而要使用索引,LIKE

搜索不应该以

%

开头,而~(规则表达式搜索)应该以^

开头。

4.10)

我如何才能看到查询优化器是怎样计算我的查询的?

参考

EXPLAIN

手册页。

4.11)

R-tree

索引是什么?

r-tree

索引用于索引空间数据。一个哈希索引无法处理范围搜索。而

B-tree

索引只能处理一维的范围搜索。R-tree

索引可以处理多维数据。例如,如果可以在一个类型为

point

的字段上建立一个

R-tree

索引,那么系统在回答类似

select

all

points

within

a

bounding

rectangle

(选择在一个长方形范围内的所有点)这样的查询时有更高的效率。

描述最初的

R-Tree

的设计的规范里面写到:

Guttman,

A.

"R-Trees:

A

Dynamic

Index

Structure

for

Spatial

Searching."

Proc

of

the

1984

ACM

SIGMOD

Int'l

Conf

on

Mgmt

of

Data,

45- 57.

你还可以在

Stonebraker

"Readings

in

Database

Systems"

找到这篇文章。

建立

R-Trees

可以处理多边形和方形。理论上说,R-trees

可以扩展为处理更多维数。不过在实践上,扩展

R-trees

需要一定的工作量,而我们目前没有如何做的文档。

4.12)

什么是基因查询优化(Genetic

Query

Optimization)?

PostgreSQL

里面的

GEQO

模块试图使用一种叫基因算法(

Genetic

Algorithm

(GA))解决联合许多表的查询优化问题。它允许通过非穷尽搜索处理大的联合查询。

更多信息请参考文档。

4.13)

我怎样做规则表达式搜索和大小写无关搜索?

操作符

~

处理规则表达式匹配,而

~*

处理大小写无关的规则表达式匹配。LIKE

操作符里面没有大小写无关的用法,不过你可以通过下面的用法获得大小写无关的

LIKE:

WHERE

lower(textfield)

LIKE

lower(pattern)

4.14)

在一个查询里,我怎样检测一个字段是否为

NULL?

你用

IS

NULL

IS

NOT

NULL

测试这个字段。

4.15)

各种字符类型之间有什么不同?

Type

Internal

Name

Notes

--------------------------------------------------

"char"

char

1

character

CHAR(#)

bpchar

blank

padded

to

the

specified

fixed

length

VARCHAR(#)

varchar

size

specifies

maximum

length,

no

padding

TEXT

text

length

limited

only

by

maximum

row

length

BYTEA

bytea

variable-length

array

of

bytes

在查看系统表和在一些错误信息里你将看到内部名称。

上面最后四种类型是"varlena"(变长)类型(也就是说,开头的四个字节是长度,后面跟着数据)。char(#)

分配最多个数字节,不管在数据域里面有多少数据。

text,varchar(#),和

bytea

都在磁盘上有变长的长度,因此,使用它们有一点点的性能损失。准确地说,性能损失发生在第一个这种类型的字段后对所有其他字段的访问的时候。

4.16.1)

我怎样创建一个序列号/自动递增的字段?

PostgreSQL

支持

SERIAL

数据类型。它在字段上自动创建一个序列和索引。例如,这样...

CREATE

TABLE

person

(

id

SERIAL,

name

TEXT

);

...会自动转换为这样...

CREATE

SEQUENCE

person_id_seq;

CREATE

TABLE

person

(

id

INT4

NOT

NULL

DEFAULT

nextval('person_id_seq'),

name

TEXT

);

CREATE

UNIQUE

INDEX

person_id_key

ON

person

(

id

);

参考

create_sequence

手册页获取关于序列的更多信息。你还可以用每行的

oid

字段作为一个唯一值。不过,如果你需要倾倒和重载数据库,你需要使用

pg_dump

-o

选项或者

COPY

WITH

OIDS

选项以保留

oid。

更多信息,参阅

Bruce

Momjian

行计数

章节。

4.16.2)

我如何获得一个插入后生成的序列号(

SERIAL

)的值?

可能实现这个要求的最简单的方法是:在插入之前先用函数

nextval()

从序列对象里检索出下一个

SERIAL

值,然后再显式插入。利用

4.16.1

里的例子表,这样做看起来象下面这样:

$newSerialID

=

nextval('person_id_seq');

INSERT

INTO

person

(id,

name)

VALUES

($newSerialID,

'Blaise

Pascal');

你还能获得存储在

$newSerialID

里面的新值,可以用于其他查询(例如,作为

person

表的外键)。要注意自动创建的

SEQUENCE

对象的名称将会是命名为

__seq,这里

table

serialcolumn

分别是你的表的名称和你的

SERIAL

字段的名称。

类似的,在

SERIAL

对象缺省插入后你可以用函数

currval()

检索刚赋值的

SERIAL

值,例如,

INSERT

INTO

person

(name)

VALUES

('Blaise

Pascal');

$newID

=

currval('person_id_seq');

最后,你可以使用从

INSERT

语句返回的

oid

查找缺省值,尽管这可能是最缺乏移植性的方法。在

perl

里,使用带有

Edmund

Mergl

DBD::Pg

模块的

DBI,oid

值可以通过

$sth->execute()

后的

$sth-> {pg_oid_status}

获得。

4.16.3)

使用

currval()

nextval()

会导致一个与其他并行后端进程之间的一个竞争条件吗?

不会。这个问题由后端处理。

4.17)

什么是

oid?什么是

tid?

Oid

PostgreSQL

的唯一行标识。PostgreSQL

里创建的每一行都获得一个唯一的

oid。所有在

initdb

过程中创建的

oid

都小于

16384

(来自

backend/access/transam.h)。所有用户创建的

oid

都大于或等于这个值。缺省时,所有这些

oid

不仅在一个表,一个数据库里面唯一,而且在整个

PostgreSQL

安装里也是唯一的。

PostgreSQL

在它的内部系统表里使用

oid

在表之间联接行。这些

oid

可以用于标识特定的用户行以及用在联合里。我们建议你使用字段类型

oid

存储

oid

值。参阅

sql(l)

手册页查找其他内部字段。你可以在

oid

字段上创建一个索引以获取快速访问。

Oid

从被所有数据库使用的某个区域里赋值给所有新行。如果你想把

oid

该成别的值,或者你想做一份表的带着原始

oid

的拷贝,你可以做到:

CREATE

TABLE

new_table(old_oid

oid,

mycol

int);

SELECT

INTO

new

SELECT

old_oid,

mycol

FROM

old;

COPY

new

TO

'/tmp/pgtable';

DELETE

FROM

new;

COPY

new

WITH

OIDS

FROM

'/tmp/pgtable';

Tid

用于标识带着数据块和偏移量值的特定的物理行。Tid

在每行的更改或者重载后被改变。它们被索引记录用于指引物理行。

4.18)

PostgreSQL

使用的一些术语的含义是什么?

一些源代码和一些旧一点的文档使用一些有更常用用法的术语。下面是其中一部分:

table,

relation,

class

row,

record,

tuple

column,

field,

attribute

retrieve,

select

replace,

update

append,

insert

oid,

serial

value

portal,

cursor

range

variable,

table

name,

table

alias

4.19)

为什么我收到错误

"FATAL:

palloc

failure:

memory

exhausted?"

这很可能是你系统的虚拟内存用光了,或者你的内核对这样的资源有较底的限制值。在启动

postmaster

之前试试下面的命令:

ulimit

-d

65536

limit

datasize

64m

取决于你用的

shell,上面命令只有一条能成功,但是它将把你的进程数据段设置得比较高,因而也许能让查询能够运行完成。这条命令应用于当前进程,以及所有在这条命令运行后创建的子进程。如果你碰到了因为后端运行返回了太多数据的客户端

SQL

的问题,试着先运行这些命令再运行客户端。

4.20)

我如何才能知道我运行的

PostgreSQL

的版本?

psql

里,键入

select

version();

4.21)

为什么我的大对象操作收到invalid

large

obj

descriptor(非法大对象描述符)。?

你需要在任何操作大对象的周围放上

BEGIN

WORK

COMMIT,也就是说,包围

lo_open

...

lo_close。

目前

PostgreSQL

强制这样的规则:在事务提交时关闭大对象句柄,这样,如果你没有处于一个事务里面,就会是紧跟在一个

lo_open

命令完成的后面。所以对这个句柄做任何事情的企图都会导致一个

invalid

large

obj

descriptor。所以,如果你没有使用一个事务,以前能工作的代码(至少是大多数时间)将会生成这么一个错误信息。

如果你使用客户端接口,如

ODBC,你可能需要

set

auto-commit

off。

4.22)

我如何创建一个缺省值是当前时间的字段?

下面的方法总可以工作:

CREATE

TABLE

test

(x

int,

modtime

timestamp

default

now()

);

在版本

7.0

或更新,你可以使用:

create

table

test

(x

int,

modtime

timestamp

default

'now');

4.23)

为什么我的使用

IN

的子查询这么慢?

目前,我们通过为外层查询的每一行顺序扫描子查询的结果来联合子查询和外层查询。可以用

EXISTS

替换

IN

来绕开这个限制。例如,把:

SELECT

*

FROM

tab

WHERE

col1

IN

(SELECT

col2

FROM

TAB2)

改为:

SELECT

*

FROM

tab

WHERE

EXISTS

(SELECT

col2

FROM

TAB2

WHERE

col1

=

col2)

我们希望在未来的版本里修补这个限制。

--------------------------------------------------------------------------------

扩展

PostgreSQL

5.1)

我写了一个用户定义函数。当我在psql

里运行它时,为什么会导致内核倾倒?

问题可能出在很多方面。首先试着在一个独立的测试程序里面测试你的用户定义函数。

5.2)

消息:NOTICE:PortalHeapMemoryFree:

0x402251d0

not

in

alloc

set!

是什么意思?

你正用

pfree

释放一些不是

palloc

分配的东西。不要混用

malloc/free

palloc/pfree。

5.3)

我如何能给

PostgreSQL

贡献一些挺不错的新类型和函数?

把你的扩展发送到

pgsql-hackers

邮件列表,它们最终会放到

contrib/

子目录里面。

5.4)

我怎样写一个返回一条记录的

C

函数?

解决这个问题需要很高的技巧,作者本人从来没有试过,尽管理论上是可能的。

5.5)

我修改了源代码。为什么重新编译后没有看到改变?

Makefiles

对包含文件没有正确的依赖性规则。你必须做一次

make

clean

然后是另一次

make。你必须做一次

make

clean

然后做另一次

make。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有