页面

显示标签为“postgresql”的博文。显示所有博文
显示标签为“postgresql”的博文。显示所有博文

2008-08-07

Establishing ODBC Connection to PostgreSQL Database

The back end database of the online survey application I built for my friend is PostgreSQL, and it is time for her to analyzing the data, using R, SAS, SPSS, or Excel. All these windows apt software provide ODBC based data importing utilities, so I need to establish ODBC condition for the PostgresSQL running on one UNIX server. The work is not as easy as what it looks like. Three hours are spent on it! Now I note down the key steps on the whole process.
  1. Download and install PostgreSQL ODBC driver here.
  2. Append one line in file pg_hbc.conf:
    host all all 102.102.102.102 255.255.255.0 trust
    '102.102.102.102' is the IP4 of the Windows client.
  3. Edit postgresql.conf entries:
    listen_addresses = '*'
    port = 5432
  4. Restart PostgreSQL server

The ODBC configuration on the Windows client machine is simple and is ommitted here.
Refer: PostgreSQL Manual, Chapter about 'Client Authentication'.

2008-07-27

PostgreSQL备份

PostgreSQL提供了3种备份策略:SQL导出,文件系统级备份,和在线备份。三种备份方式各有优缺点,分别适用于不同的场合。

导出备份就是将数据库中的数据模式及其数据以SQL形式导出到文件中。该种备份方式较简单、直观,适合数据库建立初期数据备份和数据模式更改后的备份操作。由于备份数据以系统文件的形式保存,所以对海量数据库的备份操作效率低下。并且,由于备份文件中不包括诸如数据模式用户及其权限等方面的记录信息,数据恢复操作时要求重建此类对象。
最简单形式:
pg_dump dbname > outfile.bak
数据恢复:psql dbname <>当数据模式使用了诸如外键约束等对象时,需使用“-o”选项。
对集群层次的数据备份,使用pg_dumpall命令。

文件系统级备份最直观,就是把数据库物理文件(通常是名为“data”的那个目录)进行备份。这种备份方式适合相同发行版数据库重建前的、集群级备份,并且要求数据库在停止状态下操作,从而也就不适合日常维护和海量数据备份。一个常见用例:
tar -cf backup.tar /usr/local/pgsql/data

在线备份是增量备份,最复杂,但最有效,适合数据库的日常维护性备份。在线备份的另一优势是数据恢复的精准定点,即可以指定恢复数据备份前任一时刻时的数据。
要使用在线备份,必须首先开启PostgreSQL的写前日志(Write Ahead Log)功能,配置postgresql.conf文件,找到“archive_command”这一行,加入:
archive_command='cp -i %p /backup/%f'
其实就是指定了个系统命令用于日志归档操作。其中:%p指上文所指的“data”目录,%f就是备份文件名。
开启写前日志功能后,按以下步骤进行备份:
以数据库超级管理员角色登录psql,执行:
select pg_start_backup('backup_label');
用任何系统级工具(tar或zip等)备份前步生成的数据文件backup_label。
再次回到psql,执行:
select pg_stop_backup();
注意一定要按照该顺序执行。
恢复数据时,按以下步骤:
首先停止数据库运行,即终止postmaster。
备份当前的“data”目录,以防止需恢复到当前状态。该步骤可省略。
清除所有“data”下的内容,以及所有位于其它位置的表空间(tablespace)。
8888888待续7777777777

2008-05-29

PostgreSQL 8.2跨数据库查询

目前的版本已经支持跨数据库查询数据,首先得创建一系列的函数,创建脚本名称为“dblink.sql”:
$ psql -f /usr/share/dblink.sql my_database
创建完毕,一个典型的查询如下:
SELECT towns.* FROM dblink ('dbname=somedb', 'SELECT town, pop1980 FROM towns') AS towns (town varchar(21), pop1980 integer)
如果使用非标准端口,则:
SELECT p.* FROM dblink ('dbname=ma_geocoder port=5433', 'SELECT gid, fullname, the_geom_4269 FROM ma.suffolk_pointlm') AS p(gid int,fullname varchar(100), the_geom geometry)
对非本地数据库查询:
SELECT blockgroups.* INTO temp_blockgroups FROM dblink('dbname=somedb port=5432 host=someserver user=someuser password=somepwd', 'SELECT gid, area, perimeter, state, county, tract, blockgroup, block, the_geom FROM massgis.cens2000blocks') AS blockgroups(gid int,area numeric(12,3), perimeter numeric(12,3), state char(2), county char(3), tract char(6), blockgroup char(1), block char(4), the_geom geometry)
连接查询:
SELECT realestate.address, realestate.parcel, s.sale_year, s.sale_amount, FROM realestate INNER JOIN dblink('dbname=somedb port=5432 host=someserver user=someuser password=somepwd', 'SELECT parcel_id, sale_year, sale_amount FROM parcel_sales') AS s(parcel_id char(10),sale_year int, sale_amount int) ON realestate.parcel_id = s.parcel_id
参考资料:Using DbLink to access other PostgreSQL Databases and Servers

2008-05-27

jforum这个玩具

因为用的是postgres数据库,安装jforum时出现了一点小小的意外:
Returning autogenerated keys is not supported
这样解决:把WEB-INF/config/jforum-custom.conf和WEB-IFN/config/database/postgresql/postgresql.properties中的database.support.autokeys键值设为false。

与tomcat整合的时候费了很大事,不停地配context,其实很简单,用不着配context.xml,把jforum目录扔到web应用目录下即可(与ROOT同级)。再次提醒自己:tomcat的appBase指web应用的目录,docBase指子应用目录(该值可以指定为appBase下的相对路径),appBase下的ROOT目录是web应用的默认应用所在目录。

2008-05-14

PostgreSQL 8.2在Solaris 10上的启动脚本(init script)

写了两天,终于写好PostgreSQL 8.2在Solaris 10上的启动脚本,教训之一就是一定要注意bash脚本中的单引号和双引号,效果是不一样的,能用双引号的地方就用双引号,比较保险。

这个启动脚本可能得自己配置三个变量:POSTGRESQL_CTL,DATABASE_DIR和LOG_FILE。配置好这三个变量后把脚本搁到/etc/init.d下,然后再在/etc/rc1.d下建立K36postgres、在/etc/rc3.d下建立S64postgres两个符号连接指向该脚本就行了。
#! /bin/bash
#
# This is PostgreSQL 8.2 init script for Solaris 10.
# Author's blog: http://venturor.blogspot.com
#

# the place of pg_ctl:
POSTGRESQL_CTL=/usr/postgres/8.2/bin/pg_ctl
# database home path:
DATABASE_DIR=/var/postgres/8.2/data/pasta
# the place of log file, and the user (i.e. postgres) must have the rwx privilege over the file:
LOG_FILE=/var/log/postgres_pasta.log

case "$1" in
start)
su - postgres -c "$POSTGRESQL_CTL start -D $DATABASE_DIR -l $LOG_FILE"
;;
stop)
su - postgres -c "$POSTGRESQL_CTL stop -D $DATABASE_DIR"
;;
status)
su - postgres -c "$POSTGRESQL_CTL status -D $DATABASE_DIR"
;;
restart)
su - postgres -c "$POSTGRESQL_CTL restart -D $DATABASE_DIR -l $LOG_FILE"
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $?

Solaris 10上竟安装有两个版本的PostgreSQL

在Solaris 10上配置好PostgreSQL后发现很不稳定,有时无法启动,折腾了一天,终于找到原因:Solaris 10竟默认安装了PostgreSQL 8.1和PostgreSQL 8.2两个版本(参见http://www.sun.com/software/solaris/howtoguides/postgresqlhowto.jsp#8)!真不知道Sun出于什么目的这么做,这不是添乱嘛(我是出离愤怒了)。

找出相关的PostgreSQL包:
# pkginfo | grep SUNWpostgr
卸载所有跟PostgreSQL 8.1有关的包即可:
# pkgrm SUNWpostgr-server

2008-05-13

PostgreSQL常用指令

  1. 查看所有的数据库:
    $ psql -l
  2. 查看所有的表:
    =# \dt
  3. 查看表结构:
    =# \d table_name
  4. 显示所有用户:
    =# \du


PostgreSQL的启动、停止等命令

PostgreSQL的Solaris 10默认安装在这里:
/usr/postgres/8.2
最前端的维护工具是
$ /usr/postgres/8.2/bin/pg_ctl
可以接收start、stop、restart、status参数,分别执行启动、停止、重启、状态查询动作。比如查询当前PostgreSQL服务器状态:
$ pg_ctl status -D /var/postgres/8.2/data/my_database
该目录下的其它工具使用可以从man手册中查询。

2008-04-24

开始玩PostgreSQL

今天开始配置 postgresql 数据库,比预想的麻烦,主要是用户权限问题。

先对 postgresql 进行初始化,即运行 initdb 指令,在运行该指令前先建立数据库存储目录:/var/db。建好该目录后还得给后边运行 initdb 指令的用户指定权限(postgresql 不允许 root 用户执行相关指令):
chown uu /var/db
执行 initdb :
/usr/lib/postgresql/7.4/bin/initdb -E UTF-8 -D /var/db
初始化操作成功后,目前有个系统配置方面的 BUG :此时 postgresql 重启后应该读取的配置文件全在 /var/db 下,但实际上并不是。此时 postgresql 读取的配置文件位于 /var/lib/postgresql/7.4/main 下,执行指令 ls -l 可以看到有三个 p 打头的链接文件链的是 /etc/postgresql/7.4/main/ 下的同名文件。删除此三个链接文件,重新建立链接文件到 /var/db 目录下的配置文件,比如:
ln -s /var/db/postgresql.conf postgresql.conf
此后所作的所有有关配置文件下的更改都应是 /var/db 目录下的文件。重启 postgresql :
/usr/lib/postgresql/7.4/bin/postmaster -D /var/db
postgresql 提供一个默认超级用户(建立在操作系统级)postgres,开始只能通过该用户创建其他用户、创建数据库。这个用户的口令在系统配置文件中的定义是“*”,就是说你输什么都不行,必须切换到 root 用户再 su postgres 来使用或更改其口令。建立一个数据库用户 dbuser :
su postgres -c createuser
有了第一个用户,接下来就可以建数据库了:
postgres@unx$ createdb -O uu -e wooo 'database wooo'
更改用户口令可以在 psql 里做:
ALTER USER *username* WITH PASSWORD '*password*';
查看 postgresql 版本:
psql --version
删除数据库:
postgres@unx$ dropdb -U uu -i wooo