歡迎您光臨本站 註冊首頁

PostgreSql伺服器的配置

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  Wing


PostgreSQL最早是由UC Berkley大學計算機系開發的,當初由 Michael Stonebraker 教授領導的 Postgre 項目,是由高級防務研究項目局(Defense Advanced Research Projects Agency) (DARPA) , 陸軍研究處 (ARO ), 國家科學基金會(National Science Foundation)(NSF),和 ESL 公司贊助進行的。它的許多先進的「對象-關係」概念現在已經在一些商業資料庫里得到應用,PostgreSQL支持SQL92/SQL3,事務完整性和可擴展性。它現在是一個源於Berkley代碼並公開源代碼的資料庫。

Postgres 通過一種讓用戶可以很容易擴展系統的方法整合了下面四種基本概念,使其能提供可觀的附加功能:

類/表(classes)
繼承(inheritance)
類型(types)
函數(functions)

其他特性還提供了附加的功能和靈活性:

約束(constraints)
觸發器(triggers)
規則(rules)
事務完整(transaction integrity)

這些特性將 Postgres置於對象-關係 (object-relational) 型資料庫的範疇.儘管Postgres有一些面向對象的特性,它仍然屬於關係型資料庫的範疇, 事實上,一些商用資料庫最近已經集成了一些Postgres 所領先的特性.

1.對系統的要求:

安裝在RedHat Linux 6.0下測試通過。

要用「root」用戶進行安裝。

PostgreSQL的版本是7.0

而且一定要先安裝egcs-c++-1.1.2-24.i386.rpm軟體包。

儘管運行 PostgreSQL 的最小內存需求少到只有 8MB,如果我們把內存增加到96MB,可以看到顯著的性能改善。

檢查你有足夠的磁碟空間。你需要為源代碼樹準備大約30M位元組的空間,為安裝目錄準備大約5M位元組。為一個空資料庫準備約 1 M位元組,否則包含同樣數目數據的平面文件將大約是這個數目的五倍。在回歸測試過程中,你會暫時需要約 20 M位元組.

檢查你有足夠的磁碟空間。你需要為源代碼樹準備大約30M位元組的空間,為安裝目錄準備大約5M位元組。為一個空資料庫準備約 1 M位元組,否則包含同樣數目數據的平面文件將大約是這個數目的五倍。在回歸測試過程中,你會暫時需要約 20 M位元組.

在編譯PostgreSQL之前。首先看一下「egcs-c++-1.1.2-24.i386.rpm」是不是已經安裝。沒有的話,那就趕緊裝吧。「egcs-c++-1.1.2-24.i386.rpm」直接可從Redhat的光碟里獲得,在「RedHat/RPMS」下。

驗證egcs-c++-1.1.2-24.i386.rpm是否安裝,用命令:

#rpm -qa|grep egcs

安裝egcs用:

# rpm -Uvh egcs-c++-version.i386.rpm

2.下載Postgresql源碼包:

Postgresql到本書發表為止已經推出了7.0.2的版本:

由於postgres7.0.2不支持RPM安裝格式,故我們只介紹源碼方式的安裝

ftp://ftp.postgresql.org/pub/v7.0.2/postgresql-7.0.2.tar.gz

3.安裝Postgresql:

由於postgres7.0.2不支持RPM安裝格式,故我們只介紹源碼方式的安裝;

1、解包:

#tar xzvf postgresql-7.0.2.tar.gz
#cd postgresql-7.0.2

2、創建postgresql用戶

以 root,bin 或者其他有特殊許可權的用戶身份運行 PostgreSQL 存在安全問題,因而是不允許的。這是運行伺服器的用戶。用於生產時你可以創建一個獨立的非特權的用戶(常用 postgres)

#useradd -M -o -r -d /var/lib/pgsql -s /bin/bash -c "PostgreSQL Server" -u 40 postgres

修改好postgres用戶的密碼,以postgres用戶登錄系統;

3、設置編譯參數:

$CC="egcs"

進入解包后的postgresql源文件目錄:
$ ./configure
configure不加任何選項,系統將按默認的設置安裝postgresql,查看configre的相關選項可以使用:configure -help

一些最常用的如下:

--prefix=BASEDIR
為安裝 PostgreSQL 選擇一個不同的基礎路徑。預設是 /usr/local/pgsql。

--enable-locale
如果你想用本地化支持。

--enable-multibyte
允許使用多位元組字元編碼。這個選項主要用於象日語,韓語或中文這樣的語言。

--with-perl
添加 Perl 模塊介面。請注意 Perl 介面將安裝到 Perl 模塊的常用位置(典型的是在 /usr/lib/perl),所以要成功使用這個選項,你必須有 root 許可權。

--with-odbc
製作 ODBC 驅動包.

--with-tcl
製作 Tcl/Tk 需要的介面庫和程序,包括 libpgtcl,pgtclsh,和 pgtksh。

這些編譯參數告訴編譯器如何編譯PostgreSQL:

4、編譯源碼:

$make

5、按照ocnfigure的配置按照程序:

#su
#make install

在這裡我們架設postgresql安裝在默認的位置/usr/local/

6、配置共享庫:

告訴你的系統如何找到共享庫。如何實現這些因平台而異。看起來可以在任何地方生效的方法是設置環境變數 LD_LIBRARY_PATH:
# LD_LIBRARY_PATH=/usr/local/pgsql/lib
# export LD_LIBRARY_PATH

你可能把這些放到一個 shell 啟動文件里,象 ~/.bash_profile。
在一些系統里,下面的方法是最好的方法,但是你必須有 root 許可權。編輯文件 /etc/ld.so.conf,增加一行

/usr/local/pgsql/lib

然後運行命令:

#/sbin/ldconfig

7、用postgres資料庫超級用戶完成資料庫的安裝:

你必須用 PostgreSQL 超級用戶帳號登錄執行這一步。以 root 是不能進行這一步的;

# mkdir /usr/local/pgsql/data
# chown postgres /usr/local/pgsql/data
#su postgres
$ /usr/local/pgsql/initdb -D /usr/local/pgsql/data
We are initializing the database system with username postgres (uid=40).
This user will own all the files and must also own the server process.
Creating Postgres database system directory /var/lib/pgsql/base
Creating template database in /var/lib/pgsql/base/template1
Creating global classes in /var/lib/pgsql/base
Adding template1 database to pg_database...
Vacuuming template1
Creating public pg_user view
Creating view pg_rules
Creating view pg_views
Creating view pg_tables
Creating view pg_indexes
Loading pg_description

-D 選項聲明數據存儲的位置。你可以使用任何你想用的路徑,它不必在安裝目錄里。在運行 initdb 前只要確保資料庫超級用戶帳戶可以寫(或者創建)那個目錄就行了。

8、啟動postgresql服務;

前面的步驟應該已經告訴你如何啟動資料庫伺服器。現在就做。
$ /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
這樣將在前台啟動資料庫伺服器。要把它放到後台,使用 -S。

4.配置Postgresql的腳本文件

配置「/etc/rc.d/ini.d/postgresql」腳本文件,用來啟動和停止PostgreSQL伺服器。

創建「postgresql」腳本文件(touch /etc/rc.d/init.d/postgresql)並加入:

#! /bin/sh
# postgresql This is the init script for starting up the PostgreSQL
# server
# chkconfig: 345 85 15
# description: Starts and stops the PostgreSQL backend daemon that handles
# all database requests.
# processname: postmaster
# pidfile: /var/run/postmaster.pid
#
# Source function library.
. /etc/rc.d/init.d/functions
# Get config.
. /etc/sysconfig/network
# Check that networking is up.
# Pretty much need it for postmaster.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /usr/bin/postmaster ] || exit 0
# This script is slightly unusual in that the name of the daemon (postmaster)
# is not the same as the name of the subsystem (postgresql)
# See how we were called.
case "$1" in
start)
echo -n "Checking postgresql installation: "
# Check for the PGDATA structure
if [ -f /var/lib/pgsql/PG_VERSION ] && [ -d /var/lib/pgsql/base/template1 ]
then
# Check version of existing PGDATA
if [ `cat /var/lib/pgsql/PG_VERSION` != 6.5 ]
then
echo "old version. Need to Upgrade."
echo "See /usr/doc/postgresql-6.5.2/README.rpm for more information."
exit 1
else
echo "looks good!"
fi
# No existing PGDATA! Initdb it.
else
echo "no database files found."
if [ ! -d /var/lib/pgsql ]
then
mkdir -p /var/lib/pgsql
chown postgres.postgres /var/lib/pgsql
fi
su -l postgres -c /usr/bin/initdb --pglib=/usr/lib/pgsql --pgdata=/var/lib/pgsql
fi
# Check for postmaster already running...
pid=`pidof postmaster`
if [ $pid ]
then
echo "Postmaster already running."
else
#all systems go -- remove any stale lock files
rm -f /tmp/.s.PGSQL.* > /dev/null
echo -n "Starting postgresql service: "
su -l postgres -c /usr/bin/postmaster -i -S -D/var/lib/pgsql
sleep 1
pid=`pidof postmaster`
if [ $pid ]
then
echo -n "postmaster [$pid]"
touch /var/lock/subsys/postgresql
echo $pid > /var/run/postmaster.pid
echo
else
echo "failed."
fi
fi
;;
stop)
echo -n "Stopping postgresql service: "
killproc postmaster
sleep 2
rm -f /var/run/postmaster.pid
rm -f /var/lock/subsys/postgresql
echo
;;
status)
status postmaster
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: postgresql {start|stop|status|restart}"
exit 1
esac
exit 0

現在讓腳本可執行並設置它的預設許可權:

[root@Aid]# chmod 700 /etc/rc.d/init.d/postgresql

用下面命令創建「rc.d」目錄下PostgresSQL的符號鏈接:

[root@Aid]# chkconfig --add postgresql

系統會在啟動時自動把Postgresql後台進程啟動,也可以通過

/etc/rc.d/init.d/postgresql start|stop|restart

進行人工控制;

5.Postgresql資料庫的用戶管理和存取許可權

和Mysql不同的是,Postgresql的用戶管理和許可權控制,是截然不同的一套體制,有點類似於傳統的關係資料庫;

在"pg_hba.conf"文件的PG_DATA段可以用ip地址和用戶名限制對能資料庫的連接,這裡你可以指定什麼樣的IP地址能夠連接資料庫,什麼樣的IP地址是不允許使用資料庫資源的;

在資料庫用戶以及資料庫方面postgresql用系統命令進行管理:

createuser 允許聲明可訪問 Postgres的用戶.destroyuser刪除用戶以及拒絕他們訪問Postgres。

這些命令隻影響用戶與 Postgres;而對用戶的其他操作系統級的許可權或狀態沒有影響

用「createuser」命令在資料庫中定義一個新超級用戶:

# su postgres
$ createuser
Enter name of user to add ---> admin
Enter users postgres ID or RETURN to use unix user ID: 500 ->
Is user "admin" allowed to create databases (y/n) y
Is user "admin" a superuser? (y/n) y
createuser: admin was successfully added

用「destroyuser」命令在資料庫中刪除用戶:

# su postgres
$ destroyuser
Enter name of user to delete ---> admin
destroyuser: delete of user admin was successful.

用「createdb」命令創建新的資料庫:

# su postgres
$ createdb dbname

用「destorydb」命令刪除資料庫:
# su postgres
$ destorydb dbname

6 使用psql操作postgresql資料庫

postgresql和mysql一樣擁有一套獨立的客戶端程序,使用標準的SQL語句對資料庫進行操作和管理;

$psql databasename
Welcome to the POSTGRESQL interactive sql monitor:
Please read the file COPYRIGHT for copyright terms of POSTGRESQL
[PostgreSQL 6.5.3 on i686-pc-linux-gnu, compiled by egcs ]
type ? for help on slash commands
type q to quit
type g or terminate with semicolon to execute query
You are currently connected to the database: databasename

告訴用戶已經連接到資料庫databasename

7.postgresql資料庫的備份

Postgres 提供兩個工具備份你的系統:pg_dump 備份獨立的資料庫以及 pg_dumpall 在一個步驟里備份你的資料庫節點。

可以用下面的命令備份一個獨立的資料庫:

$ pg_dump dbname > dbname.pgdump

然後可以用下面命令恢復

$cat dbname.pgdump | psql dbname

這個技巧可以用於把資料庫移動到一個新位置,然後重新命名現有資料庫。

Postgres 允許表的尺寸大於你的系統的最大文件尺寸,可能把表輸出到一個文件會有問題,生成的文件很可能比你的系統允許的最大文件大。

使用壓縮的輸出格式:

$ pg_dump dbname | gzip > filename.dump.gz

重載:

$ createdb dbname
$ gunzip -c filename.dump.gz | psql dbname



$ cat filename.dump.gz | gunzip | psql dbname

使用分割(split):

$ pg_dump dbname | split -b 1m - filename.dump.

重載:

$createdb dbname
$ cat filename.dump.* | pgsql dbname

當然,文件名(filename)和 pg_dump 輸出的內容不必與資料庫名一樣。同樣,重載的資料庫可以有任意新的名稱,所以這個機制還適用於給資料庫改名。

PostgreSQL已經是不利新聞的一個犧牲品,被列為一個學術的玩物,為真實世界使用太複雜。在過去這可能是對的,然而不再是。它有一個遠遠超過其他進展緩慢的資料庫甚至一些企業資料庫的功能集,然而, 它缺乏用來衡量達到高價產品的很多管理特徵和調節能力,這些特徵是資料庫決不會一般水平的資料庫所要求的,並且甚至他們不會注意到這很少的缺點。PostgreSQL在Unix資料庫競技場成為了一個真正的競爭者。


[火星人 ] PostgreSql伺服器的配置已經有674次圍觀

http://coctec.com/docs/linux/show-post-74190.html