??xml version="1.0" encoding="utf-8" standalone="yes"?> 原因是没有正设|客L(fng)字符集?/p> 1 环境信息 2 Ҏ(gu)提示Q我试了下 configre命o(h)Q果然报q个?br style="line-height:22px" /> [root@HK81-107postgresql-9.0.0]# ./configure 3 (g)查系l是否安?readline ?br style="line-height:22px" /> [root@HK81-107postgresql-9.0.0]# rpm -qa | grep readline 4 Dependencies Resolved ============================================================================= Transaction Summary Total download size: 201 k Installed: readline-devel.i386 0:5.1-3.el5 6 再次执行 configure 成功?/strong> 7 关于 readline 的解释,来自官网 1、下载postgresql最新版Q?br /> 2、解压文Ӟ(x) 3、配|:(x) 4、编译:(x) 5、安装:(x) 6、创建用L(fng)和用P(x) 7、创建数据库库文件存储目录、给postgres赋予权限Q?/p> 8、初始化数据库目录:(x) 切换用户 初始化数?/p> 启动数据?/p> 9、配|监听地址和端口:(x) 取消以下两行的注?/p> 10、允许远E连接:(x) d 每项的具体意思在配置文g中有详细说明 d 11、让postgresql数据库随pȝ启动而启动:(x) 启动脚本拷贝到/etc/init.d/目录下,具体执行如下命o(h)Q?/p> 启动数据库:(x) 最普通的情况Q是为出现在where子句的字D徏一个烦引。ؓ(f)方便讲述Q我们先建立一个如下的表? 接着Q来个稍微复杂一点的Q如果有个ORDER BY字句呢?不管你信不信Q大多数的数据库在用order by的时候,都将?x)从索引中受益? 很简单,p为where字句中的字段建立一个烦引一P也ؓ(f)ORDER BY的字句中的字D徏立一个烦引:(x) 索引 使用索引可快速访问数据库表中的特定信息。烦引是Ҏ(gu)据库表中一列或多列的D行排序的一U结构,例如 employee 表的姓(lnameQ列。如果要按姓查找特定职员Q与必须搜烦表中的所有行相比Q烦引会(x)帮助(zhn)更快地获得该信息?/p> 索引提供指向存储在表的指定列中的数据值的指针Q然后根据?zhn)指定的排序顺序对q些指针排序。数据库使用索引的方式与(zhn)用书c中的烦引的方式很相|(x)它搜索烦引以扑ֈ特定|然后指针找到包含该值的行?/p> 在数据库关系图中Q?zhn)可以在选定表的“索引/?#8221;属性页中创建、编辑或删除每个索引cd。当保存索引所附加到的表,或保存该表所在的关系图时Q烦引将保存在数据库中。有兌l信息,请参见创建烦引?/p>注意;q所有的数据库都以相同的方式使用索引。有x多信息,请参见数据库服务器注意事,或者查阅数据库文档? 作ؓ(f)通用规则Q只有当l常查询索引列中的数据时Q才需要在表上创徏索引。烦引占用磁盘空_(d)q且降低d、删除和更新行的速度。在多数情况下,索引用于数据(g)索的速度优势大大过它的?/p>索引?/strong> 可以Z数据库表中的单列或多列创建烦引。多列烦引(zhn)可以区分其中一列可能有相同值的行?/p> 如果l常同时搜烦两列或多列或按两列或多列排序Ӟ索引也很有帮助。例如,如果l常在同一查询中ؓ(f)姓和名两列设|判据,那么在这两列上创建多列烦引将很有意义?/p> 定索引的有效性:(x) Ҏ(gu)数据库的功能Q可以在数据库设计器中创ZU烦引:(x)唯一索引、主键烦引和聚集索引。有x据库所支持的烦引功能的详细信息Q请参见数据库文档?/p>提示Q?/strong>管唯一索引有助于定位信息,但ؓ(f)获得最x能l果Q徏议改用主键或唯一U束? 唯一索引是不允许其中M两行h相同索引值的索引?/p> 当现有数据中存在重复的键值时Q大多数数据库不允许新创徏的唯一索引与表一起保存。数据库q可能防止添加将在表中创建重复键值的新数据。例如,如果?employee 表中职员的姓 (lname) 上创Z唯一索引Q则M两个员工都不能同姓?/p> 主键索引 数据库表l常有一列或列组合,其值唯一标识表中的每一行。该列称的主键?/p> 在数据库关系图中定义主键自动创Z键烦引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引Ӟ它还允许Ҏ(gu)据的快速访问?/p> 聚集索引 在聚集烦引中Q表中行的物理顺序与键值的逻辑Q烦引)序相同。一个表只能包含一个聚集烦引?/p> 如果某烦引不是聚集烦引,则表中行的物理顺序与键值的逻辑序不匹配。与非聚集烦引相比,聚集索引通常提供更快的数据访问速度?/p> mydb=> insert into test_array(phone) values (array[3,4,5]); mydb=> select * From test_array; mydb=> select phone[1],phone[2] from test_array where id=1; --equal --not equal ?常见数组函数( Array Functions ) --q接两个数组 --获得数组的维?br />mydb=> select array_ndims(array[1,2,3]); mydb=> select array_ndims(array[[1,2,3],[4,5,6]]); mydb=> select array_length(array[[1,2],[2,3]],1); mydb=> select icount(array[[1,2],[2,3]]); mydb=> select sort_desc(array[4,8,7]); mydb=> select sort_desc(array[[4,8,7],[8,9,7]]); --表数?br />mydb=> select * from test_array; 注意事项Q由于wordpress?x)自动将半角单引可{换ؓ(f)全角单引P引用代码旉要手动修改ؓ(f)单引?strong> W一步:(x)在Ubuntu下安装Postgresql [代码内容] W二步:(x)修改PostgreSQL数据库的默认用户postgres的密?注意不是linuxpȝ帐号) [代码内容] W三步:(x)修改linuxpȝ的postgres用户的密码(密码与数据库用户postgres的密码相同) [代码内容] [代码内容] W五步:(x)创徏用户和数据库 [代码内容] W六步:(x)如何安装和?/strong>pgAdmin3客户端操作postgresql数据?/strong> [代码内容]
OS 环境QCentOS 6.2
数据?QPostgreSQL 9.1.9
一、前期工作既要恢复,肯定是需要一个备份基的,否则再怎么的y妇也难ؓ(f)无米之炊?br />1.修改数据库参敎ͼ修改postgresql.confQ?br />
archive_mode = on
archive_timeout = 300 --单位是秒Q此处以5分钟为限强制归档Q仅作测?br />archive_command = 'cp %p /data/pgbackup/archive/%f' -- 注意/data/pgbackup/archive/目录权限Q?chmod -R 777 /data/pgbackup/archive/
wal_level = archive
修改完重启下reload,DB
2.Z文gU别的持l备份,
a.基础备䆾
postgres=# select pg_start_backup('backup_2012_05_20_14:22:10');
b.打包备䆾pg_data
# cd /data
# tar -cvzf pgdata.tar ./postgres
mv pgdata.tar /data/pgbackup/base/
c.l束基础备䆾q切换归?br />
postgres=# select pg_stop_backup();
postgres=# select pg_switch_xlog();
pg_switch_xlog
----------------
0/C000020
(1 row)
postgres=# select pg_current_xlog_location();
pg_current_xlog_location
--------------------------
0/C000020
(1 row)
postgres=# create table test_1(id int,name varchar(50));
postgres=# insert into test_1 values (1,'kenyon');
INSERT 0 1
此时在pg_data路径下会(x)产生一个label,可以查看内容有checkpoint旉,基础备䆾的开始和l束旉Q以?qing)标{U等。因Z前已l设|了archive的三个参敎ͼ可以在archive的备份\径pg_home/archive下看到归档的文g?x)定时传q来?br />
二、恢复过E?br />停数据库
# pg_stop
假定数据库的崩溃场景Q将pgdata数据删除
# rm -rf /database/pgdata
恢复之前备䆾的tar文g
# tar xvf pgdata.tar
删除pg_xlog文g夹ƈ重徏
# rm -rf pg_xlog
# mkdir -p pg_xlog/archive_status
新徏recovery.conf文gq修?br /># vi /data/postgres/recovery.conf
--新增内容Q指定恢复文件和路径Q?f,%p见上面说?br />restore_command = 'cp /data/pgbackup/archive/%f "%p"'
启动数据?br />
# pg_start
[postgres@localhost archive]$ psql
spsql (9.1.3)
Type "help" for help.
postgres=# select * from test_1;
id | name
----+--------
1 | kenyon
(1 rows)
--恢复成功Q会(x)恢复C前接收到的最后一个归档文件。另外recovery.conf?x)改名变成recovery.done
日志内容:
LOG: shutting down
LOG: database system is shut down
LOG: database system was interrupted; last known up at 2012-05-20 22:23:15 CST
LOG: starting archive recovery
LOG: restored log file "000000010000000000000002" from archive
LOG: redo starts at 0/8000078
LOG: consistent recovery state reached at 0/C000000
LOG: restored log file "000000010000000000000003" from archive
LOG: restored log file "000000010000000000000004" from archive
LOG: restored log file "000000010000000000000005" from archive
LOG: restored log file "000000010000000000000006" from archive
LOG: restored log file "000000010000000000000007" from archive
cp: cannot stat `/home/postgres/archive/000000010000000000000008': No such file or directory
LOG: could not open file "pg_xlog/000000010000000000000008" (log file 0, segment 8): No such file or directory
LOG: redo done at 0/1C000078
LOG: last completed transaction was at log time 2012-05-20 23:01:22.960591+08
LOG: restored log file "000000010000000000000007" from archive
cp: cannot stat `/home/postgres/archive/00000002.history': No such file or directory
LOG: selected new timeline ID: 2
cp: cannot stat `/home/postgres/archive/00000001.history': No such file or directory
LOG: archive recovery complete
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
PS:若要恢复到指定时_(d)q需要再recovery.conf中设|recovrey_target_time,recovery_target_timeline{参?br />
ȝQpitr技术对?*24时支撑是至关重要的Q但是如果数据库非常,增大pg_dump备䆾的频率可能更方便Q但对于大数据库需要了?/div>
]]>
./configure -without-zlib
make
su
make install
mkdir -p /data/postgres
ln -s /data/postgres/ /home/
groupadd postgres
useradd -d /home/postgres -g postgres postgres
chown -R postgres:postgres /data/postgres/
su - postgres
/usr/local/pgsql/bin/initdb -A md5 --locale=en_US.utf8 --lc-ctype=en_US.utf8 -E UTF-8 -W /data/postgres
ln -s /usr/local/pgsql/bin/ ./
mkdir /data/postgres/pg_log
chown -R postgres:postgres /data/postgres/pg_log
//开启pg
bin/postgres -D /data/postgres >pg_log/logfile 2>&1 &
// 设ؓ(f)开机启?br />cp /data/zc/postgresql-9.1.9/contrib/start-scripts/linux /etc/init.d/postgresql
chmod a+x /etc/init.d/postgresql
// 修改/etc/init.d/postgresql
prefix 设ؓ(f)postgres安装路径
PGDATA 设ؓ(f)数据库\?/data/postgres)
chkconfig --add postgresql
]]>
------------------------------------------------------------------------------------------
timestamp to unix
------------------------------------------------------------------------------------------
select to_timestamp(online_time)::timestamp without time zone as online_t from login_log;
------------------------------------------------------------------------------------------
列出所有数据库
\list
------------------------------------------------------------------------------------------
查看当前q接Q当前的操作
select * from pg_stat_activity;
------------------------------------------------------------------------------------------
psql 昄查询旉
\timing
------------------------------------------------------------------------------------------
查询所有的索引Q所有的?br />
select * from pg_stat_user_tables;
-------------------------------------------------------------------------------------------
client ~码
1 使用psql 里的 \encoding 命o(h)?\encoding 允许你动态修改客L(fng)~码?比如Q\encoding utf8
2 使用 libpq 函数?\encoding 在做此用途的时候实际上是调?PQsetClientEncoding()?br /> int PQsetClientEncoding(PGconn *conn, const char *encoding);q里 conn 与后端的联接Q?encoding 是你想用的编码。如果编码设|成功它q回 0Q否则返?-1。本ơ联接的当前~码可以用下面函数显C:(x)
int PQclientEncoding(const PGconn *conn);h意它只返回编?IDQ而不是象 EUC_JP q样的编码符号字丌Ӏ?要把~码 ID 转换为编码符P你可以用Q?br /> char *pg_encoding_to_char(int encoding_id);
3 使用 SET client_encoding TO ?可以?SQL 命o(h)讄客户端编码:(x)
SET CLIENT_ENCODING TO 'value';你还可以?SQL 语法里的 SET NAMES用于q个目的Q?br /> SET NAMES 'value';查询当前客户端编码:(x)
SHOW client_encoding;q回~省~码Q?br /> RESET client_encoding;
4 使用 PGCLIENTENCODING?如果在客L(fng)的环境里定义?PGCLIENTENCODING 环境变量Q?那么在与服务器进行联接时自动选择客户端编码?Q这个编码随后可以用上面谈到的Q何其它方法覆盖。)
无需手动输入密码
1 可以讄pg_hba.conf
2 可以在用L(fng)录下新徏 .pgpass文g, 内容为ip:port:dbname:username:password 例如 localhost:5432:*:postgres:321654
3 可以通过讄PGPASSWORD 环境变量
--------------------------------------------------------------------------------------------
删除所有表
1 创徏函数
DECLARE
tmp VARCHAR(512);
DECLARE names CURSOR FOR
select tablename from pg_tables where schemaname='public';
BEGIN
FOR stmt IN names LOOP
tmp := 'DROP TABLE '|| quote_ident(stmt.tablename) || ' CASCADE;';
RAISE NOTICE 'notice: %', tmp;
EXECUTE 'DROP TABLE '|| quote_ident(stmt.tablename) || ' CASCADE;';
END LOOP;
RAISE NOTICE 'finished .....';
END;
$$ LANGUAGE plpgsql;
2 执行 select drop_all_table();
----------------------------------------------------------------------------------------------
加注? l表l构加注?br />COMMENT ON COLUMN table.col IS 'this is comment';
postgresql 只能通加comment加注? 不能在create语句里加
----------------------------------------------------------------------------------------------
]]>
http://www.cnblogs.com/stephen-liu74/archive/2012/05/30/2306493.html
]]>
dblink 的安?br /> linux
#cd postgres源码安装目录/contrib/dblink
# make
# make install
注意: 如果你在安装了postgres后执行了 make clean, make distclean, 那你可能需要重?./configure make make install 一?br /> windows
windows 默认是安装的
dblink模块加蝲
PostgreSQL 有很多外部模块可以加载,例如 dblink, pg_buffercache {,?9.1 版本
以前Q只要对应的 postgresql-contrib 已经安装Q只需要将对应?sql 文g导入到目标库
卛_Q例如,要在 数据?skytf 里安?dblink 模块Q只需要执行以下操作就行;
cd $PGHOME/share/contrib
psql -d skytf -U postgresql -f dblink.sql
导入成功之后Q那?dblink 模块卛_载成功?br />
注意!!
?9.1 版本以后Q模块加载环?PostgreSQL 提供命o(h) "CREATE EXTENSION" 来替代以上操作?
通过执行 CREATE EXTENSION dblink来加?dblink
dblink 使用:
关于dblink, dblink_connect, dblink_disconnect 请参考手?br /> http://www.postgresql.org/docs/9.1/static/dblink.html
?
select dblink_connect('q接?,'host=192.168.1.27 port=1921 dbname=testdb user=test_user password=test_user' );
host, port, user{?可以跟据情况省略?br />
?
select * from tb1 inner join dblink('dbname=db2', 'select id from tb2 where id=\'20120623\'') as acc(id int) on tb1.id = acc.id order by tb1.id;
参考网?
http://blog.sina.com.cn/s/blog_538d55be01010clc.html
http://francs3.blog.163.com/blog/static/4057672720108401139868/
http://www.postgresql.org/docs/9.1/static/dblink.html
http://zhenghaoju700.blog.163.com/blog/static/135859518201251382628663/
]]>
#psql -d dsc
dsc=# insert into t values(1,'中国');
ERROR:
HINT:
dsc=# show client_encoding;
-----------------
(1 row)
dsc=# show client_encoding;
-----------------
(1 row)
INSERT 0 1
dsc=# commit;
WARNING:
COMMIT
dsc=# select * from t;
----+------
(1 row)
[postgres@dsc ~]$ export PGCLIENTENCODING=GBK
[postgres@dsc ~]$ psql
psql: FATAL:
[postgres@dsc ~]$ psql -d dsc
psql (8.4.3)
Type "help" for help.
----+------
(1 row)
INSERT 0 1
dsc=# select * from t;
----+----------
(2 rows)
]]>
OS: CentOS release 5.2(Final)
PG: postgresql-9.0.0]
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking which template to use... linux
checking whether to build with 64-bit integer date/time support...yes
checking whether NLS is wanted... no
checking for default port number... 5432
checking for block size... 8kB
checking for segment size... 1GB
checking for WAL block size... 8kB
checking for WAL segment size... 16MB
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking if gcc supports -Wdeclaration-after-statement...yes
checking if gcc supports -Wendif-labels... yes
checking if gcc supports -fno-strict-aliasing... yes
checking if gcc supports -fwrapv... yes
checking whether the C compiler still works... yes
checking how to run the C preprocessor... gcc -E
checking allow thread-safe client libraries... yes
checking whether to build with Tcl... no
checking whether to build Perl modules... no
checking whether to build Python modules... no
checking whether to build with GSSAPI support... no
checking whether to build with Kerberos 5 support... no
checking whether to build with PAM support... no
checking whether to build with LDAP support... no
checking whether to build with Bonjour support... no
checking whether to build with OpenSSL support... no
checking for grep that handles long lines and -e.../bin/grep
checking for egrep... /bin/grep -E
checking for ld used by GCC... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for ranlib... ranlib
checking for strip... strip
checking whether it is possible to strip libraries... yes
checking for ar... ar
checking for tar... /bin/tar
checking whether ln -s works... yes
checking for gawk... gawk
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for bison... no
configure: WARNING:
*** Without Bison you will not be able to build PostgreSQL from CVSnor
*** change any of the parser definition files.
*** a GNU mirror site.
*** PostgreSQL then you do not need to worry about this, becausethe Bison
*** output is pre-generated.)
checking for flex... no
configure: WARNING:
*** Without Flex you will not be able to build PostgreSQL from CVSnor
*** change any of the scanner definition files.
*** a GNU mirror site.
*** PostgreSQL then you do not need to worry about this because theFlex
*** output is pre-generated.)
checking for perl... /usr/bin/perl
configure: using perl 5.8.8
checking for main in -lm... yes
checking for library containing setproctitle... no
checking for library containing dlopen... -ldl
checking for library containing socket... none required
checking for library containing shl_load... no
checking for library containing getopt_long... nonerequired
checking for library containing crypt... -lcrypt
checking for library containing fdatasync... nonerequired
checking for library containing gethostbyname_r... nonerequired
checking for library containing shmget... none required
checking for -lreadline... no
checking for -ledit... no
configure: error: readline library notfound
If you have readline already installed, see config.log for detailson the
failure.
Use --without-readline to disable readlinesupport.
readline-5.1-3.el5
lftp.i386 : A sophisticated file transfer program
lftp.i386 : A sophisticated file transfer program
php-readline.i386 : Standard PHP module provides readline librarysupport
lftp.i386 : A sophisticated file transfer program
readline.i386 : A library for editing typed commandlines.
compat-readline43.i386 : The readline 4.3 library for compatibilitywith older software.
readline-devel.i386 : Files needed to develop programs which usethe readline library.
readline.i386 : A library for editing typed command lines.
5 安装 readline-devel ?br style="line-height:22px" /> [root@HK81-107postgresql-9.0.0]# yum -y install -y readline-devel
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package readline-devel.i386 0:5.1-3.el5 set tobe updated
--> Processing Dependency: libtermcap-devel forpackage: readline-devel
--> Running transaction check
---> Package libtermcap-devel.i386 0:2.0.8-46.1 setto be updated
--> Finished Dependency Resolution
=============================================================================
Installing:
Installing for dependencies:
=============================================================================
Install
Update
Remove
Downloading Packages:
(1/2): libtermcap-devel-2 100%|=========================|
(2/2): readline-devel-5.1 100% |=========================| 146kB
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Dependency Installed: libtermcap-devel.i386 0:2.0.8-46.1
Complete!
--without-readline
Prevents use of the Readline library (and libedit as well). Thisoption disables command-line
editing and
]]>tar zxvf postgresql-8.3.7.tar.gz cd postgresql-8.3.7
./configure --prefix=/usr/local/pgsql
make
make install
groupadd postgres useradd -g postgres postgres
mkdir /usr/local/pgsql/data cd /usr/local/pgsql chown postgres.postgres data
su - postgresql
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
vi /usr/local/pgsql/data/postgresql.conf
listen_addresses = '*' port = 5432
vi /usr/local/pgsql/data/pg_hba.conf
host all all 192.168.1.0/24 trust
配置iptables让远E主讉KQ?/p>vi /etc/sysconfig
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT service iptables restart
cd /etc/rc.d/init.d cp (W一步解压的安装文g目录)/postgresql-8.3.7/contrib/start-scripts/linux postgresql chmod +x postgresql vi postgresql prefix=/usr/local/pgsql PGDATA="/usr/local/pgsql/data" PGUSER=postgres PGLOG="/var/log/pgsql.log" chkconfig --add postgresql
service postgresql start
]]>
?
unix_timestamp() = round(date_part('epoch',now()))
from_unixtime(int) = to_timestamp(int)
d函数unix_timestamp()
CREATE FUNCTION unix_timestamp() RETURNS integer AS $$
SELECT (date_part('epoch',now()))::integer;
$$ LANGUAGE SQL IMMUTABLE;
d函数from_unixtime()
CREATE FUNCTION from_unixtime(int) RETURNS timestamp AS $$
SELECT to_timestamp($1)::timestamp;
$$ LANGUAGE SQL IMMUTABLE;
]]>
名称
pg_ctl -- 启动、停止、重?PostgreSQL
语法
pg_ctl start [-w] [-s] [-D datadir] [-l filename] [-o options] [-p path]
pg_ctl stop [-W] [-s] [-D datadir] [-m s[mart] | f[ast] | i[mmediate] ]
pg_ctl restart [-w] [-s] [-D datadir] [-m s[mart] | f[ast] | i[mmediate] ] [-o options]
pg_ctl reload [-s] [-D datadir]
pg_ctl status [-D datadir]
pg_ctl kill [signal_name] [process_id]
pg_ctl register [-N servicename] [-U username] [-P password] [-D datadir] [-w] [-o options]
pg_ctl unregister [-N servicename]
描述
pg_ctl 用于启动、停止、重?PostgreSQL 后端服务?postgres)Q或者显CZ个运行着的服务器的状态。尽可以手动启动服务器Q但?pg_ctl 装了重新定向日志输出,与终端和q程l合理分,以及(qing)另外提供了一个选项用于有控制的关闭?br />
?start 模式里会(x)启动一个新的服务器。服务器是在后台启动的,标准输入被附着C /dev/null 上。如果用了 -l Q那么标准输出和标准错误被定向C个日志文Ӟ要么是重定向到 pg_ctl 的标准输?而不是标准错?。如果没有选定日志文gQpg_ctl 的标准输出应该重定向C个文件或者用道输出到类?rotatelogs q样的日志滚动程序,否则Qpostgres 把它的输出写到控制l端(在后?q且不?x)脱?shell 的进E组?br />
?stop 模式下,那个正在特定数据目录q行的服务器被关闭。你可以?-m 选项选择三种不同的关闭模式:(x)"Smart"模式{待所有客L(fng)中断q接Q这是缺省?Fast"模式q不{待客户端中断连接,所有活跃事务都被回滚ƈ且客L(fng)都被强制断开?Immediate"模式在没有q净关闭的情况下退出。这么做导致在重新启动的时候的恢复?br />
restart 实际上是先执行一个停止,然后紧跟一个启动。它允许变换 postgres 的命令行选项?br />
reload 模式单地l?postgres 发送一?SIGHUP 信号Q导致它重新d配置文g(postgresql.conf, pg_hba.conf {?Q这样就允许修改配置文g选项而不用重启系l即可生效?br />
status 模式监查一个服务器是否在指定的数据目录q行Q如果是Q那么显C其 PID 和调用它的命令行选项?br />
kill 模式允许你给一个指定的q程发送信受这个功能对 Microsoft Windows 特别有用Q因为它没有 kill 命o(h)。?--help 查看支持的信号名字列表?br />
register 模式允许你在 Microsoft Windows 上注册一个系l服务?br />
unregister 模式允许你在 Microsoft Windows 上删除先前用 register 命o(h)注册的系l服务?br />
选项
-D datadir
声明该数据库的文件系l位|。如果忽略则使用 PGDATA 环境变量?br />
-l filename
把服务器日志输出附加?filename 文g上。如果该文g不存在则创徏它。umask 讄?077 Q因此缺省时是不允许从其它用户向日志文g讉K的?br />
-m mode
声明关闭模式。mode 可以?smart, fast, immediate 之一Q或者是q三个的首字母之一?br />
-o options
声明要直接传递给 postgres 的选项?br />
参数通常都用单或者双引号包围以保证它们作Z个整体传递?br />
-p path
声明 postgres 可执行文件的位置。缺省位?pg_ctl 自n所在目录,如果没找到则使用编码的安装目录。除非你惛_点什么特别的事情Qƈ且想得到cM没有扑ֈ postgres q样的错误,否则必须使用q个选项?br />
-s
只打印错误,而不打印提示性信息?br />
-w
{待启动或者关闭的完成(60 U超?Q这个参数是关闭时的~省倹{成功的关闭是以删除 PID 文g为标志的。对于启动而言Q一ơ成功的 psql -l 标志着成功。pg_ctl 企图用对 psql 合适的端口Q如果存?PGPORT 环境变量Q那么将用它。否则,它将查找?postgresql.conf 文g里是否设|了一个端口。如果都没有Q它?yu)?PostgreSQL ~译时的~省端口(~省 5432)。在{待的时候,pg_ctl 根据启动或者关闭的成功状况q回一个准的退Z码?br />
-W
不等待启动或者停止的完成。这是启动和重启的缺省?br />
Windows 选项
-N servicename
要注册的pȝ服务的名字。这个名字将用于服务名和昄名?br />
-P password
用户启动服务的口?br />
-U username
用于启动服务的用L(fng)用户名。对于域用户Q?DOMAIN\username 格式?br />
环境变量
PGDATA
~省数据目录位置
PGPORT
psql 的缺省端??-w 选项使用)?br />
其它的环境变量请参阅 postgres
文g
postmaster.pid
q个文g存在于数据目录中是ؓ(f)了帮?pg_ctl 判断服务器当前是否在q行?br />
postmaster.opts.default
如果q个文g存在于数据目录,pg_ctl (?start 模式?把文g地内容当作传递给 postgres 命o(h)的选项传递过去,除非?-o 选项覆盖?br />
postmaster.opts
如果q个文g存在于数据目录,pg_ctl (?start 模式?把文g地内容当作传递给 postgres 命o(h)的选项传递过去,除非?-o 选项覆盖。这个文件的内容也会(x)?status 模式里显C出来?br />
postgresql.conf
q个文g在数据目录中Q会(x)分析它以查找?psql 一L(fng)的合适的端口(?start 模式里给?-w 的时??br />
注意
{待完全启动q不是一个定义得很完整的操作Q如果访问控制设|ؓ(f)本地客户端在没有手工交互的情况下不能讉K的话q可能会(x)失效(比如口o(h)认证)?br />
例子
启动服务?br />启动服务器:(x)
$ pg_ctl start启动服务器的一个例子,{到服务器启动了才退出:(x)
$ pg_ctl -w start服务器?5433 端口Q而且不带 fsync q行Q用:(x)
$ pg_ctl -o "-F -p 5433" start停止服务?br />$ pg_ctl stop使用 -m 选项停止服务器允许用h制如何关闭后端?br />
重启服务?br />q个命o(h)几乎{于先停止服务器然后再启动它Q只不过 pg_ctl 保存qC用上一ơ运行服务器的命令行参数。重启服务器的最单的Ҏ(gu)是:(x)
$ pg_ctl restart重启服务器,{待其停止和重启Q?br />
$ pg_ctl -w restart使用 5433 端口重启q且重启后关?fsync Q?br />
$ pg_ctl -o "-F -p 5433" restart昄服务器状?br />下面是来?pg_ctl 的状态输出的例子Q?br />
$ pg_ctl statuspg_ctl: server is running (pid: 13718)Command line was:/usr/local/pgsql/bin/postgres '-D' '/usr/local/pgsql/data' '-p' '5433' '-B' '128'q就是在 restart 模式中被调用的命令行?br />
又见
postgres
pg_resetxlog
名称
pg_resetxlog -- 重置一个数据库集群的预写日志以?qing)其它控制内?br />语法
pg_resetxlog [-f] [-n] [-ooid ] [-x xid ] [-e xid_epoch ] [-m mxid ] [-O mxoff ] [-l timelineid, fileid, seg ] datadir
描述
pg_resetxlog 清理预写日志(WAL)q且可以有选择地重|其它一些存储在 pg_control 文g中的控制信息。有时候,如果q些文g崩溃了,需要这个功能。一定只把它用作最后的Ҏ(gu)Q就是说只有因ؓ(f)q样的崩溃导致服务器无法启动的时候才使用?br />
q行q个命o(h)之后Q可能就可以启动服务器了Q但是,一定要C数据库可能因为部分提交的事务而含有不完整的数据。你应该马上转储数据Q运?initdb Q然后重新加载。在重新加蝲之后Q检查不完整的部分然后根据需要进行修复?br />
q个命o(h)只能由安装服务器的用戯行,因ؓ(f)它需要对数据目录的读写权限。出于安全考虑Qpg_resetxlog 不用环境变?PGDATA Q你必须在命令行上声明数据目录?br />
如果 pg_resetxlog 抱怨说它无法判断用?pg_control 的有效数据,那么你可以强制它l箋处理Q方法是声明 -f(强制)开兟뀂在q种情况下,那些丢失了的数据用模糊的近似数gѝ大多数字段都可以匹配上Q但是下一?OID 、下一个事?ID 、下一个事?ID ?epoch(旉?、下一个多事务 ID(两阶D|交的东西)、下一个多事务偏移量、WAL 开始地址、数据库区域字段可能需要手工帮助,前面六个可以用下面讨论的开兌|。pg_resetxlog 自己的环境是猜测区域字段的来源;看看 LANG {东西,它们应该?initdb q行的环境相匚w。如果你不能判断所有这些字D늚正确数|那么 -f 仍然可以使用Q但是这h复过来的数据库正性更值得怀疑:(x)立即转储和重新加载是必须的。在转储之前不要执行M修改数据的操作,因ؓ(f)Mq样的动作都可能把事情搞得更p糕?br />
-o, -x, -e, -m, -O, -l 开兛_许手工设|下一?OID 、下一个事?ID 、下一个事?ID epoch 、下一个多事务 ID 、下一个多事务偏移量、WAL 起始位置的数倹{只有在 pg_resetxlog 无法通过d pg_control 判断合适的数值的时候才需要它。安全的数值可以用下面的方法判断:(x)
对于下一个事?ID(-x)而言Q一个安全的数值是看看数据目录里的 pg_clog 里数值最大的文g名,然后加一Q然后再乘上 1048576 。请注意那些文g名是十六q制的。通常也以十六q制的Ş式声明开兛_是最单的。比如,如果 0011 ?pg_clog 里最大的记录Q?x 0x1200000 可以了(后面的五个零提供了合适的乘积)?br />
下一个多事务 ID(-m)的安全值可以通过查看数据目录?pg_multixact/offsets 子目录里面的数字最大的文g名,加一Q然后乘?65536 得到。和上面一P文g名是十六q制的,因此最单的Ҏ(gu)是给开兛_明一个十六进制的开兛_|然后在结֊四个零?br />
下一个多事务偏移?-O)的安全值可以通过(g)查数据目录里 pg_multixact/members 子目录下的数字最大的文g名,加一Q然后乘?65536 得到。和上面一P文g名是十六q制的,因此最单的Ҏ(gu)是给开兛_明一个十六进制的开兛_|然后在结֊四个零?br />
WAL 的v始位|?-l)应该比目前存在于数据目录 pg_xlog 里面的Q何文件号都大。它的文件名也是十六q制的,q且有三部分。第一部分?旉U?ID"Q通常应该保持相同。第三部分不要选择大于 255(0xFF)Q应该是在达?255 的时候给W二部分增一然后重置W三部分?0 。比如,如果 00000001000000320000004A ?pg_xlog 里最大的条目Q那?-l 0x1,0x32,0x4B 可以了Q但如果最大的条目?000000010000003A000000FF Q那么选择 -l 0x1,0x3B,0x0 或更多?br />
没有很容易的办法来判断比数据库中最大的 OID 大一L(fng)下一?OID Q不q很走运的是获取正确的下一?OID q非常关键的事情?br />
除了?pg_resetxlog 讑֮的字D外Q事?ID epoch 实际上ƈ未存储在数据库里的Q何地斏V所以只要是涉及(qing)到数据库自n的Q何数值都有效。你可能需要调整这个g保诸如 Slony-I 之类的备份系l能够正常工作。如果是q样的话Q应当从下游已复制的数据库中获取恰当的倹{?br />
-n(无操?开xC?pg_resetxlog 打印?pg_control 重新构造的数值然后不修改M值就退出。这主要是一个调试工P但是?pg_resetxlog 真正处理前进行的整洁性检查的时候可能会(x)有用?br />
注意
在服务器q行的时候一定不要运行这个命令。如果发现在数据文g目录里有锁文Ӟ那么 pg_resetxlog 拒l启动。如果服务器崩溃Q那么可能会(x)剩下一个锁文gQ如果这P你可以删除该锁文件以便允?pg_resetxlog q行。但是在你这么做之前Q一定要保没有M后端服务器进E仍在运行?br />
postgres
名称
postgres -- PostgreSQL 数据库服务器
语法
postgres [option...]
描述
postgres ?PostgreSQL 数据库服务器。客L(fng)应用E序Z讉K数据库,通过 TCP Socket ?Unix domain socket q接C个运行中?postgres q程。然后该 postgres 实例启?fork)一个新的、独立的服务器进E来处理q个q接?br />
一?postgres L理来自同一个数据库集群的数据。一个数据库集群是一l在同一个文件系l位|?"数据?)存放数据的数据库。一个系l上可以同时q行多个 postgres q程Q只要他们用不同的数据区和不同的端口号(见下?。postgres 启动旉要知道数据区的位|,该位|必通过 -D 选项?PGDATA 环境变量指定。通常Q?D ?PGDATA 都直接指向由 initdb 创徏的集目录。其他可能的文g布局在节17.2里面有讨论?br />
~省?postgres 在前台启动ƈ日志信息输出到标准错误。但在实际应用中Qpostgres 应当作ؓ(f)后台q程启动Q而且多数是在pȝ启动时自动启动?br />
postgres q能以单用户模式q行。这U用法的主要用于 initdb 的初始化q程中。有时候它也被用于调试N性恢复。不q,单用h式运行的服务器ƈ不适合于调试,因ؓ(f)没有实际的进E间通讯和锁动作发生。当?shell 上以单用h式调用时Q用户可以输入查询,然后l果?x)在屏幕上以一U更适合开发者阅?不适合普通用?的格式显C出来。在单用h式下Q将把会(x)话用?ID 设ؓ(f) 1 q赋予超U用h限。该用户不必实际存在Q因此单用户模式q行的服务器可以用于Ҏ(gu)些意外损坏的pȝ表进行手工恢复?br />
选项
postgres 接受下列命o(h)行参数。关于这些选项的更详细讨论请参考章17。你也可以通过讄一个配|文件来减少敲击q些选项。有?安全?选项q可以从q接q来的客L(fng)讄Q以一U应用无关的Ҏ(gu)仅对该会(x)话生效。比如,如果讄?PGOPTIONS 环境变量Q那么基?libpq 的客L(fng)都把那个字W串传递给服务器,q被服务器解释成 postgres 命o(h)行选项?br />
通用用?br />-A 0|1
打开q行时断a(g)查,是检编E错误的调试帮助。只有在~译 PostgreSQL 时打开了它Q你才能使用它。如果编译时打开了,~省是打开?br />
-B nbuffers
为服务器q程分配和管理的׃n内存~冲区数量。这个参数的~省值是 initdb 自动选择的;参考节17.4.1获取更多信息?br />
-c name=value
讄一个命名的q行时参数。PostgreSQL 支持的配|参数在?7里描q。大多数其它命o(h)行选项实际上都是这L(fng)参数赋值的短Ş式?c 可以出现多次从而设|多个参数?br />
-d debug-level
讄调试U别。数D高,写到服务器日志的调试输出多。取D围是 1 ?5 。还可以针对某次单独的会(x)话?-d 0 来防止从?postgres q程l承日志U别?br />
-D datadir
声明数据目录或者配|文件的文gpȝ路径。细节详见节17.2?br />
-e
把缺省日期风D|ؓ(f)"European"Q也是说用 DMY 规则解释日期输入Qƈ且在一些日期输出格式里日子在月份前面打印。参阅节8.5获取更多l节?br />
-F
关闭 fsync 调用以提高性能Q但是要冒系l崩溃时数据毁坏的风险。声明这个选项{效关闭?fsync 参数。在使用之前阅读详细文档Q?br />
-h hostname
指定 postgres 侦听来自前端应用 TCP/IP q接?IP L名或地址。数g可以是一个用I格分隔的地址列表Q或?* 表示监听所有可用的地址。空DCZ监听M IP 地址Q而只使用 Unix 域套接字与客L(fng)通信。缺省只监听 localhost 。声明这个选项{效于设|?listen_addresses 配置参数?br />
-i
q个选项允许q程客户通过 TCP/IP(|际域套接字)与服务器通讯。没有这个选项Q服务器只接受本地q接。这个选项{效于在 postgresql.conf 中或者通过 -h 选项?listen_addresses 设ؓ(f) *
q个选项已经废弃了,因ؓ(f)它不能实?listen_addresses 的所有功能。所以最好直接设|?listen_addresses
-k directory
指定 postgres 侦听来自前端应用q接?Unix 域套接字的目录。缺省通常?/tmp Q但是可以在~译的时候修攏V?br />
-l
q个选项使用 SSL q行的安全通讯。要使用q个选项Q编?PostgreSQL 时你必须打开?SSL 支持。有关?SSL 的信息,请参考节16.7?br />
-N max-connections
讄最多允许同时连接多个客户?也就是最多同时运行多个服务器进E?。缺省gؓ(f) 32 Q不q该值最大可以设|ؓ(f)pȝ所能承受的极限。请注意 -B 的D求至两倍于 -N 的倹{参阅节16.4获取有关大量客户的系l资源需求。声明这个选项{效于声?max_connections 配置参数?br />
-o extra-options
?extra-options 里面指定的命令行选项被传递给所有由q个 postgres z的服务进E。如果选项字符串包含Q何空白,那么整个字符串必ȝ引号界定?br />
反对使用该选项Q所有服务器q程的命令行选项都可以直接在 postgres 命o(h)行上指定Q不必这么麻烦?br />
-p port
指定 postgres 侦听客户端连接的 TCP/IP 端口或本?Unix domain socket 文g的扩展。缺省的端口h环境变量 PGPORT 的倹{如?PGPORT 没有讄Q那么缺省是 PostgreSQL ~译时指定的?通常?5432)。如果你声明了一个非~省端口Q那么所有前端应用都必须用命令行选项或?PGPORT 声明同一个端口?br />
-s
在每条命令结束时打印旉信息和其它统计信息。这个开兛_试性能和调节缓冲区数量有好处?br />
-S work-mem
声明内部排序和散列在求助于(f)时磁盘文件之前可以用的内存数量。参阅节17.4.1里描q的配置变量 work_mem
--name=value
讄一个命名的q行时参敎ͼ其羃写Ş式是 -c
--describe-config
以制表符分隔?COPY 格式Q导出服务器内部配置变量、描q、缺省倹{设计它主要是给理工具使用?br />
半内部选项
q有几个其它的选项可以声明Q主要用于调试用途。这些东西在q里列出只是l?PostgreSQL pȝ开发h员用的。强烈反对用这些选项。另外这些选项的Q何一w可能在未来版本中消失而不加说明?br />
-f { s | i | m | n | h }
止某种扫描和连接方法的使用Qs ?i 分别关闭序和烦引扫描,?n, m, h 分别关闭嵌套循环Q融?merge)?Hash q接?br />
序扫描和嵌套@环都不可能完全被关闭?-fs ?-fn 选项仅仅是在存在其它Ҏ(gu)旉优化器使用q些Ҏ(gu)|了?br />
-n
该选项主要用于调试D服务器进E异常崩溃的问题。对付这U情늚一般策略是通知所有其它服务器q程l止q新初始化׃n内存和信L(fng)。这是因Z个出错的服务器进E可能在l止之前已l对׃n的东襉K成了破坏。该选项指定 postgres 不重新初始化׃n数据l构。一个有l验的系l程序员q时可以用调试器(g)查共享内存和信号灯状态?br />
-O
允许修改pȝ表的l构。这个参数用?initdb
-P
dpȝ表时忽略pȝ索引(但在更改数据时仍然更新烦?。这对于从烦引已l损坏的pȝ表中回复是很有帮助的?br />
-t pa[rser] | pl[anner] | e[xecutor]
打印与每个主要系l模块相关的查询记时l计。它不能?-s 选项一起用?br />
-T
该选项主要用于调试D服务器进E异常崩溃的问题。对付这U情늚一般策略是通知所有其它服务器q程l止q新初始化׃n内存和信L(fng)。这是因Z个出错的服务器进E可能在l止之前已l对׃n的东襉K成了破坏。该选项指定 postgres 通过发?SIGSTOP 信号停止其他所有服务器q程Q但是ƈ不让它们退出。这样就允许pȝE序员手动从所有服务器q程搜集内核转储?br />
-v protocol
声明q次?x)话使用的?后服务器协议的版本数。该选项仅在内部使用?br />
-W seconds
一旦看见这个选项Q进E就睡眠标出的秒数。这样就l开发者一些时间把调试器附着在该服务器进E上?br />
-y database
表明q是一个由?postgres q程启动的子q程Qƈ使用指定的数据库。该选项仅供内部使用?br />
单用h式的选项
下面的选项仅在单用h式下可用?br />
--single
选中单用h式。这个必L命o(h)行中的第一个选项?br />
database
要访问的数据库名字。如果忽略掉则缺省ؓ(f)用户名?br />
-E
回显所有命?br />
-j
止使用新行作ؓ(f)语句分隔W?br />
-r filename
所有服务器输出日志保存?filename 中。在多用h式下该选项被忽略Q所有进E都?stderr
环境变量
PGCLIENTENCODING
客户端用的~省字符~码。客L(fng)可以独立地覆盖它。这个g可以在配|文仉讄?br />
PGDATA
~省数据目录位置
PGDATESTYLE
q行时参?DateStyle 的缺省倹{现在反对用该环境变量?br />
PGPORT
~省端口(最好在配置文g中设|?
TZ
服务器的时区
诊断
一个提C semget ?shmget 的错误信息可能意味着你需要重新配|你的内核,提供_的共享内存和信号灯。更多讨论,参阅?6.4。你也可以通过降低 shared_buffers g减少 PostgreSQL 的共享内存的消耗,或者降?max_connections 值减?PostgreSQL 的信L(fng)的消耗?br />
如果到一个说另外一个服务器正在q行的错误信息,可以Ҏ(gu)不同的系l用命?br />
$ ps ax | grep postgres?br />
$ ps -ef | grep postgres如果信没有冲突的服务器正在q行Q那么你可以删除消息里提到的锁文件然后再ơ运行?br />
抱怨无法绑定端口的错误信息可能表明该端口已l被其它?PostgreSQL q程使用。如果终?postgres 后又马上用同一个端口运行它Q也可能得到q个错误信息Q这Ӟ你必d{几U,{操作系l关闭了该端口后再试。最后,如果你用了一个操作系l认为是保留的端口,也可能导致这个错误信息。例如,我的 Unix 版本认ؓ(f)低于 1024 的端口号?可信ȝ"Q因而只?Unix 用户可以使用它们?br />
注意
如果有可能,不要使用 SIGKILL 杀M postgres 服务器进E。这样会(x)L postgres 在退出前释放它持有的pȝ资源(例如׃n内存和信L(fng))。这样可能会(x)影响到将来启动新?postgres q程?br />
可以使用 SIGTERM, SIGINT, SIGQUIT 信号正常l束 postgres 服务器进E。第一个信号将{待所有的客户端退出后才退出。第二个强制断开所有客L(fng)Q而第三个不停止立刻退出,D在重启时的恢复运行。SIGHUP ?x)重新加载服务器配置文g。也可以向一个单独的服务器进E发?SIGHUP 信号Q但是这样做没什么意义?br />
pg_ctl 工具可以用于安全而有效地启停 postgres Q推荐用?br />
要推Z个正在运行的查询Q可以向正在执行该查询的q程发?SIGINT 信号?br />
?postgres 服务器进E向子进E发?SIGTERM 信号让它们正帔R出;发?SIGQUIT 信号立即退Z不做清理工作Q用户应当尽量避免用该信号。同Ӟ发?SIGKILL 信号也是不明智的Q主 postgres q程把q个信号当作崩溃信号Q然后会(x)强制其他兄弟q程作ؓ(f)标准的崩溃回复过E退出?br />
臭虫
-- 选项?FreeBSD ?OpenBSD 上无法运行,应该使用 -c 。这在受影响的系l里是个臭虫Q如果这个毛病没有修补好Q将来的 PostgreSQL 版本提供一个绕开的办法?br />
用法
启动一个单用户模式的服务器Q?br />
postgres --single -D /usr/local/pgsql/data other-options my_database?-D l服务器提供正确的数据库目录的\径,或者确保环境变?PGDATA 已经正确讄。同时还要声名你想用的特定数据库名字?br />
通常Q独立运行的服务器把换行W当做命令输入完成字W;它还不懂分号的作用,因ؓ(f)那些东西是在 psql 里的。要x一行分成多行写Q你必需在除最后一个换行符以外的每个换行符前面敲一个反斜杠?br />
但是如果使用?-j 命o(h)行选项Q新行将不被当作命o(h)l束W。此时服务器从标准输入一直读取到 EOF 标志为止Q然后把把所有读到的内容当作一个完整的命o(h)字符串看待,q且反斜杠与换行W也被当作普通字W来看待?br />
输入 EOF(Control+D)卛_退Z(x)话。如果你已经使用?-j 则必连l用两?EOF 才行?br />
h意单用户模式q行的服务器不会(x)提供复杂的行~辑功能(比如Q没有命令行历史)?br />
例子
用缺省值在后台启动 postgres Q?br />
$ nohup postgres >logfile 2>&1 </dev/null &在指定的端口启动 postgres Q?br />
$ postgres -p 1234q条命o(h)在端口 1234 启动 postgres 。你应该q样使用 psql 与之q接Q?br />
$ psql -p 1234或者设|环境变?PGPORT Q?br />
$ export PGPORT=1234$ psql命名的运行时参数可以用下列的风格之一讄Q?br />
$ postgres -c work_mem=1234$ postgres --work-mem=1234两种形式都覆盖那些现有的?postgresql.conf 里面?work_mem 讄。请注意在参数名里的下划U在命o(h)行上可以写成下划U,也可以写成连字符。除了用于短期的实验以外Q更好的?fn)惯是编?postgresql.conf 里面的设|,而不是倚赖命o(h)行开兌|参数?br />
又见
initdb, pg_ctl
postmaster
Name
postmaster -- PostgreSQL 数据库服务器
Synopsis
postmaster [option...]
Description
postmaster ?postgres 的别名,反对使用?br />
又见
postgres
]]>
]]>
CREATE TABLE mytable (
id serial primary key,
category_id int not null default 0,
user_id int not null default 0,
adddate int not null default 0
);
如果你在查询时常用类g下的语句Q?
SELECT * FROM mytable WHERE category_id=1;
最直接的应对之道,是ؓ(f)category_id建立一个简单的索引Q?
CREATE INDEX mytable_categoryid
ON mytable (category_id);
OK.如果你有不止一个选择条g呢?例如Q?
SELECT * FROM mytable WHERE category_id=1 AND user_id=2;
你的W一反应可能是,再给user_id建立一个烦引。不好,q不是一个最佳的Ҏ(gu)。你可以建立多重的烦引?
CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);
注意到我在命名时的习(fn)惯了吗?我?表名_字段1名_字段2?的方式。你很快׃(x)知道我ؓ(f)什么这样做了?
现在你已lؓ(f)适当的字D徏立了索引Q不q,q是有点不放心吧Q你可能?x)问Q数据库?x)真正用到这些烦引吗Q测试一下就O(jin)KQ对于大多数的数据库来说Q这是很Ҏ(gu)的,只要使用EXPLAIN命o(h)Q?
EXPLAIN
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2;
This is what Postgres 7.1 returns (exactly as I expected)
NOTICE: QUERY PLAN:
Index Scan using mytable_categoryid_userid on
mytable (cost=0.00..2.02 rows=1 width=16)
EXPLAIN
以上是postgres的数据,可以看到该数据库在查询的时候用了一个烦引(一个好开始)Q而且它用的是我创徏的第二个索引。看到我上面命名的好处了吧,你马上知道它使用适当的烦引了?/p>
SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY adddate DESC;
CREATE INDEX mytable_categoryid_userid_adddate
ON mytable (category_id,user_id,adddate);
注意: "mytable_categoryid_userid_adddate" 会(x)被截短ؓ(f)
"mytable_categoryid_userid_addda"
CREATE
EXPLAIN SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY adddate DESC;
NOTICE: QUERY PLAN:
Sort (cost=2.03..2.03 rows=1 width=16)
-> Index Scan using mytable_categoryid_userid_addda
on mytable (cost=0.00..2.02 rows=1 width=16)
EXPLAIN
看看EXPLAIN的输出,数据库多做了一个我们没有要求的排序Q这下知道性能如何受损了吧Q看来我们对于数据库的自w运作是有点q于乐观了,那么Q给数据库多一Ҏ(gu)C吧?
?了蟩q排序这一步,我们q不需要其它另外的索引Q只要将查询语句E微改一下。这里用的是postgresQ我们将l该数据库一个额外的提示--?ORDER BY语句中,加入where语句中的字段。这只是一个技术上的处理,q不是必ȝQ因为实际上在另外两个字D上Qƈ不会(x)有Q何的排序操作Q不q如果加 入,postgres会(x)知道哪些是它应该做的?
EXPLAIN SELECT * FROM mytable
WHERE category_id=1 AND user_id=2
ORDER BY category_id DESC,user_id DESC,adddate DESC;
NOTICE: QUERY PLAN:
Index Scan Backward using
mytable_categoryid_userid_addda on mytable
(cost=0.00..2.02 rows=1 width=16)
EXPLAIN
现在使用我们料想的烦引了Q而且它还明,知道可以从烦引后面开始读Q从而避免了M的排序?
?上说得细了一点,不过如果你的数据库非常巨大,q且每日的页面请求达上百万算Q我想你?x)获益良多的。不q,如果你要做更为复杂的查询呢,例如多张表l合 h查询Q特别是where限制字句中的字段是来自不止一个表格时Q应该怎样处理呢?我通常都尽量避免这U做法,因ؓ(f)q样数据库要各个表中的东西都结?hQ然后再排除那些不合适的行,搞不好开销?x)很大?
如果不能避免Q你应该查看每张要结合v来的表,q且使用以上的策略来建立索引Q然后再用EXPLAIN命o(h)验证一下是否用了你料想中的烦引。如果是的话Q就O(jin)K。不是的话,你可能要建立临时的表来将他们l合在一Pq且使用适当的烦引?
要注意的是,建立太多的烦引将?x)?jing)响更新和插入的速度Q因为它需要同h新每个烦引文件。对于一个经帔R要更新和插入的表|没有必要ؓ(f)一个很用的where字句单独建立索引了,对于比较?yu)的表,排序的开销不会(x)很大Q也没有必要建立另外的烦引?
?上介l的只是一些十分基本的东西Q其实里面的学问也不,单凭EXPLAIN我们是不能判定该Ҏ(gu)是否是最优化的,每个数据库都有自q一些优化器Q虽 然可能还不太完善Q但是它们都?x)在查询时对比过哪种方式较快Q在某些情况下,建立索引的话也未必会(x)快,例如索引攑֜一个不q箋的存储空间时Q这?x)增加读?盘的负担Q因此,哪个是最优,应该通过实际的用环境来(g)验?
在刚开始的时候,如果表不大,没有必要作烦引,我的意见是在需要的时候才作烦引,也可用一些命令来优化表,例如MySQL可用"OPTIMIZE TABLE"?
lg所qͼ在如何ؓ(f)数据库徏立恰当的索引斚wQ你应该有一些基本的概念了?
]]>
索引cd 唯一索引
--定义数组
mydb=> create table test_array(id serial primary key, phone int8[]);
NOTICE: CREATE TABLE will create implicit sequence "test_array_id_seq" for serial column "test_array.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_array_pkey" for table "test_array"
CREATE TABLE
mydb=> \d test_array
Table "mydb.test_array"
Column | Type | Modifiers
--------+----------+---------------------------------------------------------
id | integer | not null default nextval('test_array_id_seq'::regclass)
phone | bigint[] |
Indexes:
"test_array_pkey" PRIMARY KEY, btree (id)
--数组元素插入有两U方?br />mydb=> insert into test_array(phone) values ('{1,2}');
INSERT 0 1
mydb=> insert into test_array(phone) values ('{2,3}');
INSERT 0 1
INSERT 0 1
id | phone
----+---------
1 | {1,2}
2 | {2,3}
3 | {3,4,5}
(3 rows)
--数组元素的引?br />mydb=> select phone from test_array where id=1;
phone
-------
{1,2}
(1 row)
phone | phone
-------+-------
1 | 2
一 常见的数l操?Array Operators)
mydb=> select array[1,2]=array[1.1,2.1]::int[];
?column?
----------
t
(1 row)
mydb=> select array[1,2] <> array[1,2,3];
?column?
----------
t
(1 row)
--less than
mydb=> select ARRAY[1,2,3] < ARRAY[1,2,4];
?column?
----------
t
(1 row)
--greater than
mydb=> select ARRAY[1,4,3] > ARRAY[1,2,4];
?column?
----------
t
(1 row)
--contains
mydb=> select ARRAY[1,4,3] @> ARRAY[3,1];
?column?
----------
t
(1 row)
--is contained by
mydb=> select ARRAY[2,7] <@ ARRAY[1,7,4,2,6];
?column?
----------
t
(1 row)
--overlap (have elements in common)
mydb=> select ARRAY[1,4,3] && ARRAY[2,1];
?column?
----------
t
--数据元素追加到数组
mydb=> select array_append(array[2,3,4],5);
array_append
--------------
{2,3,4,5}
(1 row)
mydb=> select array_cat(array[1,2],array[3,4]);
array_cat
-----------
{1,2,3,4}
(1 row)
array_ndims
-------------
1
(1 row)
array_ndims
-------------
2
(1 row)
--获得数组的长?nbsp; ^
mydb=> select array_length(array[1,2,3],1);
array_length
--------------
3
(1 row)
array_length
--------------
2
(1 row)
?intarray 模块的数l函?br />--获取元素个数据d
mydb=> select icount(array[1,2]);
icount
--------
2
(1 row)
icount
--------
4
(1 row)
--排序
mydb=> select sort_asc(array[4,8,7]);
sort_asc
----------
{4,7,8}
(1 row)
sort_desc
-----------
{8,7,4}
(1 row)
sort_desc
-------------------
{{9,8,8},{7,7,4}}
(1 row)
?intarray 模块的数l操作符
id | phone
----+---------
1 | {1,2}
2 | {2,3}
3 | {3,4,5}
4 | {4,5,6}
5 | {4,5,7}
(5 rows)
--查找包括相同元素的记?br />mydb=> select id ,phone from test_array where phone && array[1,2]::int8[];
id | phone
----+-------
1 | {1,2}
2 | {2,3}
(2 rows)
--查找数组元素的交?br />mydb=> select array[1,2,3] & array[3,4,5];
?column?
----------
{3}
(1 row)
?索引的?br />
数组支持创徏 GiST ?GIN cd索引Q这两类索引的选择要根据场合,单的_(d) GIN cd索引在查询上要比
GiST cd索引快,但在 update 的时候要慢些Q所?GIN cd索引适合表数据不太变化的场合Q?GiST 索引适用
于表数据l常需?UPDATE 的场景?/div>
]]>
解压tar -vxf postgresql-9.1.3.tar.bz2
安装
make
su
make install
讄
mkdir /home/zc/postgresql/data
chown postgres /home/zc/postgresql/data
su - postgres
/usr/local/gpsql/bin/initdb -D /home/zc/postgresql/data
/usr/local/gpsql/bin/postgres -D /home/zc/postgresql/data >logfiel 2>&1 &
/usr/local/pgsql/bin/createdb test
/usr/local/pgsql/bin/psql test // q里修改postgres的密?
test=# \q
修改pȝ用户postgres的密?注意Q上面的是数据库用户Q这个是debian用户, 它们密码设为相同的)
root@ubuntuserver:~# sudo -u postgres passwd
修改配置文g
cd /home/zc/postgresql/data
vim postgresql.conf
配置好后重v数据?br />/usr/local/pgsql/bin/pg_ctl stop -D /home/zc/postgresql/data
Ok
查看是否有开启监?br />netstat -plunt | grep 5432
-----------------------------------------------------------
ln -s /data/postgres/ /home/
groupadd postgres
useradd -d /home/postgres -g postgres postgres
chown -R postgres:postgres /data/postgres/
mkdir /data/postgres/pg_log
chown -R postgres:postgres /data/postgres/pg_log
]]>
root@ubuntuserver:~# sudo apt-get install postgresql-8.4 postgresql-client-8.4 postgresql-contrib-8.4
[代码说明]
安装服务端和命o(h)行客L(fng)psql?br /> [功能说明]
/usr/lib/postgresql/8.4/ 存放postgresql相关的二q制文g
/usr/lib/postgresql/8.4/bin/ 可执行文?br /> /usr/lib/postgresql/8.4/lib/ ׃n库文?br /> /etc/postgres/8.4/main/ 存放postgresql配置文文?br /> /var/lib/postgresql/ postgres用户的主文g?/p>
root@ubuntuserver:~# sudo -u postgres psql
postgres=# ALTER USER postgres WITH PASSWORD ‘postgres’;
postgres=# \q
[代码说明]
‘#’?#8217;#’之前的字W是pȝ提示W,’postgres=#’是psql客户端的提示W,U色字符入命令(本文其它部分亦如此)Q?br /> W一行:(x)q行psql,psql是一个标准的postgressql客户端,也可以?#8221;sudo su postgres -c psql”Q效果是一L(fng)Q?br /> W二行:(x)修改postgres的密码ؓ(f)postgres,不要忘记d分号(回R后分号之前的sql语句才会(x)立即执行)
W三行:(x)退出psql客户?strong>
[功能说明]
PostgreSQL数据默认?x)创Z个postgres的数据库用户作ؓ(f)数据库的理员,密码是随机的Q我人需要修改ؓ(f)指定的密码,q里讑֮?#8217;postgres’?/p>
root@ubuntuserver:~# sudo passwd -d postgres
root@ubuntuserver:~# sudo -u postgres passwd
[代码说明]
W一行:(x)删除密码
W二行:(x)创徏密码
[功能说明]
PostgreSQL数据默认?x)创Z个linux用户postgresQ通过上面的代码修改密码ؓ(f)’postgres’Q这取决于第二步中的密码Q只要与其相同即可)?/p>
root@ubuntuserver:~# sudo vi /etc/postgresql/8.4/main/postgresql.conf
—>改变行:(x)#listen_addresses = ‘localhost’
—>修改为:(x)listen_addresses = ‘*’
—>改变行:(x)#password_encryption = on
—>修改为:(x)password_encryption = on
root@ubuntuserver:~# sudo vi /etc/postgresql/8.4/main/pg_hba.conf
—>文g末添加行Q? to allow your client visiting postgresql server
—>文g末添加行Qhost all all 0.0.0.0 0.0.0.0 md5
root@ubuntuserver:~# sudo /etc/init.d/postgresql-8.4 restart
[代码说明]
W一行:(x)修改postgresql.conf的目的是修改q接权限Q?br /> W二行:(x)修改pg_hba.conf的目的是讄谁才可以操作数据服务器;
W三行:(x)重启postgresql数据库的服务E序Q以使上面的配置生效?br /> 详细解释一?#8221;host all all 0.0.0.0 0.0.0.0 md5“Q?br /> host表示允许的类型是LQ?br /> W一个all是允许的数据库名字;
W二个all是允许的用户Q?br /> W一?.0.0.0是允许访问的ip addressQ?br /> W二?.0.0.0是允许访问的subnet maskQ?br /> 最后的md5表示密码的加密方式,如果md5Ҏ(gu)trust则可以让指定范围的主机数据库的时候不需要提供密码?br /> 关于ip address和subnet maskQ你也可以修改ؓ(f)你的机器IP地址(?0.13.19.53)和子|掩?? 255.255.255.255)Q这样就只有你自qL可以q程讉K数据库了? 如果要用一个IP地址范围Q只需要把子网掩码讄成合适的|如果子网掩码讄?.0.0.0Q则所有主机均可以讉K数据库(IP可以L讑֮Q,?果将md5Ҏ(gu)trust则可以让指定范围的主问指定的数据库的时候不需要提供密码?strong>
[功能说明]
实现q程讉K
root@ubuntuserver:~# psql -U postgres -h 127.0.0.1
postgres=# create user “IamJiwan” with password ‘IamJiwan’ nocreatedb;
postgres=# create database “mydatabase” with owner=”IamJiwan”;
[代码说明]
W一行:(x)q行psql客户端,q指定用户ؓ(f)postgresL?27.0.0.1Q执行此行后需要输入密?#8217;postgres’Q如不指定则默认用户为linuxpȝ当前d用户Q默认数据库服务器ؓ(f)本机Q?br /> W二行:(x)d数据库用?#8220;IamJiwan“Q?br /> W三行:(x)d数据?#8220;mydatabase”q设定所有者ؓ(f)”IamJiwan”Q?br /> 用户名和数据库名U加上引号后才区分大写Q否则会(x)自动转换成小写;
双引号作用:(x)创徏对象的时候,对象名、字D名加双引号Q则表示严格区分大小写,否则都默认小写;
单引号作用:(x)标识字符与数字的区别Qƈ不区分大写?br /> [功能说明]
创徏用户和数据库
[备注内容]
postgresq提供了命o(h)行创建用户和数据库的Ҏ(gu)Q?br /> root@ubuntuserver:~# sudo -u postgres createuser -D -P mynewuser
root@ubuntuserver:~# sudo -u postgres createdb -O mynewuser mydatabase
W一行:(x)-D该用h有创建数据库的权利,-P提示输入密码Q后面的选项都可以省略,命o(h)执行的时候会(x)提示用户选择yes或者no
W二行:(x)-O讑֮所有者ؓ(f)mynewuser
root@ubuntuserver:~# sudo apt-get install pgadmin3
[功能说明]
安装囑Ş客户端pgAdmin3
]]>
使用的Linux发行版是ubuntu server 6.06Qubuntu 自带版本最高只?.1Qؓ(f)了尝鲜,同时8.2.0已经对基于windowsq_的兼Ҏ(gu)进行了改进Q便于^台的转换。同时源码安装可以自己制定一些参?和设|,ubuntu虽然有很好的易用性和兼容性,q且部分Ҏ(gu)也较新Q但是同window有些相像Q减也闭了很多细节问题,让开发h员没有机?x)也?用尝试去理解一些程序的安装q程和参敎ͼ对于E序开发来_(d)q不一定是件好事?/p>
一 安装Postgresql8.2.0
1. 下蝲源码?br /> 到postgresq.org下蝲最新的源码?/p>
2 解压?br /> tar -vxf postgresql*.tar.gz
3 配置Q进入解压目录后可以?/configure –help来查看可用的参数。我使用的是Q?/p>
# ./configure –prefix=/home/shaken/postgresql –without-readline –without-zlib
前一个参数是把@照惯例把自己的Y件安装到/opt目录下,后面两个参数是因为我的系l里没有安装readline和zlibQ其实安装一下就可以了?/p>
在ubuntu中这样可以去掉后面的两个–without参数Q?br /> # apt-get install libreadline5-dev zlib1g-dev
解决在ubuntu安装postgresqlӞconfigure出现的问题?/p>
4 ~译后ƈ安装Q?/p>
# make
# make install
5 增加Postgresql数据库的最高用户postgresq设|密码:(x)
# adduser postgres
# mkdir /home/shaken/postgresql/data
# chown postgres /home/shaken/postgresql/data
最好再q样Q?br /> # chown -R postgres /home/shaken/postgresql
6 以用户postgres登陆Q?/p>
# su – postgres
7 初始化数据库Q?br /> $ /home/shaken/postgresql/bin/initdb -D /home/shaken/postgresql/data
8 q行数据库服务器Q?/p>
$ /home/shaken/postgresql/bin/postmaster -D /home/shaken/postgresql/data>logfile 2>&1 &
9 创徏一个数据库Q?/p>
$ /home/shaken/postgresql/bin/createdb test
10 在本Zq行客户端进行管理:(x)
$ /home/shaken/postgresql/bin/psql test
q就要求你对基础的sql语法要熟(zhn)了?/p>
到这里Postgresqlq安装完成了。但是ؓ(f)了能q程使用该数据库—比如说我要在|络上另外一台Windows?sh)脑上用pgAdmin来管 ?使用该Postgresql服务?#8212;则还需要进行一些修改,q些修改主要包括两方面的修改Q一是修改Postgresql的两个配|文Ӟ二是修改? 据库的一些用h限:(x)
11 修改Postgresql的配|文件Postgresql.confQ该文g在数据目?home/shaken/postgresql/data下,其中的一句:(x)
listen_address=’localhost’
前面的注释去掉,q把’localhost’该ؓ(f)’*’?/p>
12修改Postgresql的配|文件pg_hba.confQ该文g在数据目?home/shaken/postgresql/data下,在文件后面加一句:(x)
host all all 192.168.0.0/24 password
q句的意思是Q同|络?92.168.0.*的机器可以以密码的Ş式用所有的数据库。更具体的参数意义直接看该配|文件中的注释就可以了?/p>
q里一定要配置正确Q否则无法在q程q接postgresql数据库?/p>
13 重新启动postgresql服务器:(x)
$ /home/shaken/postgresql/bin/pg_ctl stop -D /home/shaken/postgresql/data
停止原来的服务器
$ $ /home/shaken/postgresql/bin/postmaster -i -D /home/shaken/postgresql/data >logfile 2>&1 &
再次启动Q加一?I参数
14 一些数据库用户权限的简单配|,以下是在psql中?/p>
# create userwen1 password ‘123456’;
创徏一个用户ƈ讄密码
# createdatabase data1 owner wen1;
创徏一个数据库
# create tablewen11(name varcha(10))
创徏一个数据表
# alter table wen11 owner to wen1;
修改数据表的属主?/p>
现在可以在局域网内的其他?sh)脑使用其他postgresql客户端工P以用户名wen1打开data1数据库了?/p>
q需要改q的一些问题:(x)
1 中文支持的问题:(x)使用encoding=’UTF-8’创徏数据库好不好Q?/p>
2 pȝ启动时自动启动postgresql的问题:(x)完全可以参考Debian的相应启动脚本?/p>
?phppgadmin的安装配|(可选的q程Q?/p>
Z理配置我的数据库服务器Q对于我q样的postgresql生手Q需要一个方便的理E序。这L(fng)理工具很多Q考虑自己以前使用mysql 有一?便利的phpmyadminQ我选择了phppgadmin?nbsp; phpPgAdmin是一个充分地功能Z互联|的postgresql理实用E序。它处理所有基本的功能q且某个先进的功能譬如触发器, 视图{,是一个基于B/S模式的管理YӞ必须安装在服务器端?/p>
具体的安装过Eؓ(f)Q?br /> 1 下蝲源码Q现在的最新版本ؓ(f)4.0.1
# cd
# wget http://……./phpPgAdmin-4.0.1.tar.gz
2 解压Q?br /> # tar zxvf phpPgAdmin-4.0.1.tar.gz
3 (g)查系l是否已l安装好apache+php以及(qing)php对postgresql的支持,如果没有Q以下ؓ(f)安装Q?br /> # apt-get install apache php4 php4-pgsql
注意修改apache的配|文件以使apache支持php?br /> 4 使phpPgAdmin在客L(fng)可用Q我一般是在apapche目录下徏立符可接:(x)
# ln -s /root/phpPgAdmin-4.0.1 /var/www/pgadmin
5 修改phpPgAdmin的配|文?config/config.inc.phpQ其中必要修改的参数有Q?br /> $conf['servers'][0]['host']=’localhost’;
标明数据库服务器在本?br /> $conf ['extra_security'] = false;
允许使用postgres帐号登陆?br /> 6 在客L(fng)使用览器,输入地址Q?br /> http://……/pgadmin
可以进行postgresql数据库的理了?/p>
?安装postgis
1 最好先安装proj4和OGRQ我h没有安装Q应该只是性能上打折扣吧,q不影响安装使用?br /> Debian下可以这P(x)安装postgis的时候,先:(x)
#apt-get install proj libgeos libgeos-dev
2 下蝲源码?/p>
3 解压q入目录?/p>
4 配置Q?/p>
# ./configure –prefix=/opt/postgis –with-pgsql=/home/shaken/postgresql/bin/pg_config
意思很明显
5 ~译、安装:(x)
# make
# make install
6 之后的一些工作:(x)
$ /home/shaken/postgresql/bin/createdb data1
$ /home/shaken/postgresql/bin/createlang plpgsql data1
$ /home/shaken/postgresql/bin/psql-d data1 -f lwpostgis.sql
$ /home/shaken/postgresql/bin/psql-d data1 -f spatial_ref_sys.sql
注意扑ֈq进入包含后面那两个sql文g的目录再q去执行?/p>
下面可以使用postgis了,先试试Postgis提供那两个{换shape文g和postgis数据的小E序吧?/p>
?PostGIS的初步?/p>
|络上关于PostGIS的用的文章不多Q而且说得不够详细Q今天经q一番摸索,得到一些基本应用的l验Q希望能减少一些大家入门的周折?/p>
以下假设我要把一个test.shp文g(实际上完整的应包含三个文?的数据导入到Postgresql数据库data1中的test数据表,?了安?赯Q数据库Data1?qing)相关的数据表的属主都设|ؓ(f)wen1Q然后在GIS客户端如QGIS uDig{用这个PostGIS数据。详l的q程为;
1 假设PostGreSQL数据库服务器和PostGIS都安装好。(见另?#8221;源码安装Postgresql8.1.3+PostGIS1.1.2″)
2 以数据库的超U用户postgresq入psql:
# /home/shaken/postgresql/bin/psql (注意路径)
以下的操作都是在psql控制台?br /> 3 基本讄Q?br /> # create user wen1 password ‘123456’; 创徏一个用户ƈ讄密码
# create database data1 owner wen1; 创徏一个数据库
# alter table spatial_ref_sys owner to wen1;
# alter table geometry_columns owner to wen1 ; q两句修改两个postgis相关的表的属Mؓ(f)wen1Q很重要Q一般文章中g没提到这两点?br /> 4 数据转换Q以下工作退出psqlQ在shell界面q行?br /> 先把三个test.shp文g复制?opt/postgis/bin目录下ƈ转到该目录下Q注意\径,注意目录和文件的权限—也许退出postgres用户到root用户单一些?br /> # /opt/postgis/bin/shp2pgsql test test data1 > test.sql
# /home/shaken/postgresql/bin/psql -d data1 -f test.sql
注意参数都要写对Q不明白的话一定要?#8211;help参数查看?br /> 5 在客h器上打开QGISQ依ơ选择”囑ֱ”–>”dPostGIS囑ֱ”–>”新徏”,然后讄好正的服务器IPQ数据库名data1Q用户wen1?qing)密码,再点?#8221;q接”Q然后下方会(x)出现test囑ֱ的名字,选择可以了?br /> uDig的用也大同异?/p>
一点体?x)?x)
1 要先弄懂PostgreSQL的用,其是各U权限的概念和关p,q是一般从Windows下{UL的h很缺乏的?br /> 2 最好选择一个好的PostgreSQL客户端工h帮助调试Q推荐用PgAdmin?/p>