Postgresql8.3數據庫在linux編譯安裝說明

有些部分是我自己寫的,有些摘抄的,感謝開源社區的支持

一,編譯

安裝軟件包:

sudo apt-get install binutils cpp fetchmail flex gcc libarchive-zip-perl libc6-dev libcompress-zlib-perl libdb4.3-dev libpcre3 libpopt-dev lynx m4 make ncftp nmap perl perl-modules unzip zip zlib1g-dev autoconf automake1.9 libtool bison autotools-dev g++ build-essential

安裝libncurses5-dev

sudo apt-get install libncurses5-dev

 

編譯安裝:

adduser postgres
tar -vxf postgresql*.tar.gz
./configure --prefix=/usr/local/postgresql
make
make install
mkdir /usr/local/postgresql/data
chown postgres /usr/local/postgresql/data
chown -R postgres /usr/local/postgresql 
su  postgres

初始化數據庫:

/usr/local/postgresql/bin/initdb -D /usr/local/postgresql/data
運行數據庫服務器:
/usr/local/postgresql/bin/postmaster -D /usr/local/postgresql/data>logfile 2>&1 &
創建一個數據庫:
/usr/local/postgresql/bin/createdb test
在本機上運行客戶端進行管理:
/usr/local/postgresql/bin/psql test

 

postgresql設置:

根據需要對Postgresql的配置文件Postgresql.conf進行修改,該文件在數據目錄/usr/local/postgresql/data下,
比如你需要用局域網或通過互聯網遠程管理Postgresql進行管理,就需要把# listen_address=localhost’改爲
listen_address='*'
,記住要去掉註釋,這點用過MySQL的用戶比較好理解,

接下來修改Postgresql的配置文件pg_hba.conf,該文件在數據目錄/usr/local/postgresql/data下,在文件後面加一句:
host   all all  192.168.0.0/24   password

就是允許192.168.0.0網段的所有用戶通過密碼來訪問數據庫。
 
重新啓動postgresql服務器:
/usr/local/postgresql/bin/pg_ctl stop -D /usr/local/postgresql/data

停止原來的服務器
/usr/local/postgresql/bin/postmaster -i -D /usr/local/postgresql/data >logfile 2>&1 &

,Postgresql訪問認證

安裝postgresql是一件很簡單的事,但是當我第一次安裝了postgresql以後,它的安全設置曾經讓我困擾過一陣,現在我將以我的經歷爲線索來講述如何配置postgresql的訪問認證,postgresql的版本是7.3.1,老一點的版本在配置文件上會有稍許不同,請自己注意區別。另外,在閱讀中,請注意區分數據庫用戶和系統用戶的區別,以免混淆。
postgresql
的訪問認證配置主要涉及到兩個主要的配置文件:postgresql.confpg_hba.conf
postgresql.conf
包含了許多的選項,這些選項控制了postgresql.conf的方方面面,中間影響訪問認證的選項是:

unix_socket_group
設置 Unix 域套接字的組所有人,(套接字的所有權用戶總是啓動 postmaster 的用戶)與 UNIX_SOCKET_PERMISSIONS 選項一起使用可以給這種套接字類型增加額外的訪問控制機制,缺省時是一個空字串,也就是使用當前用戶的缺省的組, 這個選項只能在服務器啓動時設置。

unix_socket_permissions
Unix 域套接字設置訪問權限,Unix 域套接字使用通常的 Unix 文件系統權限集。可選的值可以是一個 chmod umask 系統調用可以接受的數字模式。(要使用客戶化的八進制格式,該數字必須以 0 (零)開頭)
缺省權限是 0777,意即任何人都可以聯接,合理的選則可能是0770 (只有用戶和組, 參閱UNIX_SOCKET_GROUP)和 0700 (只有用戶)。(請注意對於 Unix 套接字而言,實際上只有寫權限有意義,而且 也沒有辦法設置或者取消讀或執行權限)
這個選項只能在服務器啓動時設置。

pg_hba.conf
是設置訪問認證的主要文件,格式爲每條記錄一行,每行指定一條訪問認證。設定一條訪問認證包含了7個部分:連接方式(type)、數據庫(database)、用戶名(user)、ip地址(ip-address)、子網掩碼(ip-mask)、認證方法(authentication method)、認證配置(authentication-option),以下是這7個部分的詳細說明:

連接方式(type
連接方式共有三種:localhosthostssl

local
這條記錄匹配通過 Unix 域套接字進行的聯接企圖, 沒有這種類型的記錄,就不允許 Unix 域套接字的聯接。

host
這條記錄匹配通過 TCP/IP 網絡進行的聯接嘗試,請注意,除非服務器是 帶着 -i 選項或者打開了 postgresql.conf 裏面的 tcpip_socket 配置參數集啓動的,否則 TCP/IP 聯接是被禁止掉的。

hostssl
這條記錄匹配通過在 TCP/IP 上進行的 SSL 聯接企圖, host 記錄可以匹配 SSL 和非 SSL 的聯接企圖, hostssl 記錄需要 SSL 聯接。

數據庫(database
聲明記錄所匹配的數據庫。值 all 表明該記錄匹配所有數據庫, sameuser表示如果被請求的數據庫和請求的用戶同名,則匹配。 samegroup 表示請求的用戶必須是一個與數據庫同名的組中的成員。 在其他情況裏,這就是一個特定的 PostgreSQL 的名字。我們可以通過用逗號分隔的方法聲明多個數據庫。 一個包含數據庫名的文件可以 通過對該文件前綴 @ 來聲明.該文件必需和 pg_hba.conf 在同一個目錄。

用戶名(user
爲這條記錄聲明所匹配的 PostgreSQL 用戶,值 all 表明它匹配 於所有用戶。否則,它就是特定 PostgreSQL 用戶的名字,多個用戶名可以通過用逗號分隔的方法聲明,組名字 可以通過用 + 做組名字前綴來聲明。一個包含用戶名的文件可以 通過在文件名前面前綴 @ 來聲明,該文件必需和 pg_hba.conf 在同一個目錄。

ip
地址(ip-address
子網掩碼(ip-mask
這兩個字段包含標準的點分十進制表示的 IP地址/掩碼值。 IP地址只能用數字的方式聲明,而不能用域名或者主機名)它們倆放在一起,聲明瞭這條記錄匹配的客戶機的 IP 地址。 準確的邏輯是:
(actual-IP-address xor IP-address-field) and IP-mask-field
對於要匹配的記錄必需爲零。
如果連接方式是host或者hostssl的話,這兩項必須指定,否則可以不填。

認證方法(authentication method
trust
無條件地允許聯接,這個方法允許任何可以與PostgreSQL 數據庫聯接的用戶以他們期望的任意 PostgreSQL 數據庫用戶身份進行聯接,而不需要口令。

reject
聯接無條件拒絕,常用於從一個組中"過濾"某些主機。

md5
要求客戶端提供一個 MD5 加密的口令進行認證,這個方法是允許加密口令存儲在pg_shadow裏的唯一的一個方法。

crypt
類似 md5 方法,只是用的是老式的 crypt 加密認證, 用於 7.2 以前的客戶端,對於 7.2 以及以後的客戶端,我們建議使用 md5

password
"md5"一樣,但是口令是以明文形式在網絡上傳遞的,我們不應該在不安全的網絡上使用這個方式。

krb4
Kerberos V4 認證用戶,只有在進行 TCP/IP 聯接的時候才能用。(譯註:Kerberos"克爾波洛斯",故希臘神話冥王哈得斯的多頭看門狗。Kerberos MIT 開發出來的基與對稱加密算法的認證協議和/或密鑰 交換方法,其特點是需要兩個不同用途的服務器,一個用於認證身份,一個用於通道兩端用戶的密鑰交換。同時 Kerberos 對網絡時間同步 要求比較高,以防止回放攻擊,因此通常伴隨 NTP 服務。)

krb5
Kerberos V5 認證用戶.只有在進行 TCP/IP 聯接的時候才能用。(譯註:Kerberos V5 是上面 V4 的改良,主要是不再依賴 DES 算法, 同時增加了一些新特性。)

ident
獲取客戶的操作系統名(對於 TCP/IP 聯接,用戶的身份是通過與運行在客戶端上的 ident 服務器聯接進行判斷的,對於本地聯接,它是從操作系統獲取的。) 然後檢查一下,看看用戶是否允許以要求的數據庫用戶進行聯接, 方法是參照在 ident 關鍵字後面聲明的映射。
/pg_ident.conf
如果你使用了 sameuser 映射,那麼假設用戶名 是相等的。如果沒有聲明這個關鍵字,則在  文件中找出映射名。如果這個文件裏包含一條記錄標識着ident提供的用戶名 和請求的 PostgreSQL 用戶名的映射, 那麼聯接被接受。
對於本地聯接,只有在系統支持Unix域套接字信任證的情況下 才能使用(目前是 Linux FreeBSD NetBSD BSD/OS)。

pam
使用操作系統提供的可插入的認證模塊服務 Pluggable Authentication Modules PAM)來認證。


認證配置(authentication-option
這個可選的字段的含義取決與選擇的認證方法。


瞭解了以上的內容以後,我們可以開始設置自己的訪問認證。和mysql一樣,postgresql默認安裝的訪問認證是不安全的,當我第一次安裝好我的postgresql以後,我發現只要輸入`psql -U pgsql -d template1`就可以不需要任何密碼的進入我的數據庫,並且使用的是pgsql用戶(數據庫的最高權限),即使在我使用ALTER USER爲我的數據庫用戶添加了密碼以後情況也沒有得到改善,經過一番查找,我發現我的pg_hba.conf內容如下:

local all all trust
host all all 0.0.0.0 0.0.0.0 trust

這說明無論在本地還是通過tcp/ip,任何人都可以不加任何限制的使用任何他想用的身份訪問我的數據庫,於是我爲所有的訪問都使用了md5認證方法,我的pg_hba.conf變爲:

local all all md5
host all all 0.0.0.0 0.0.0.0 md5

事情似乎得到了解決,任何人想訪問我的數據庫都需要通過密碼這一關,我的數據庫安全了。但是當我有一天重新啓動計算機的以後發現我的 postgresql並沒有被正常的啓動,在終端前我發現啓動到postgresql服務啓動腳本時,提示需要輸入密碼,原來在設置了md5認證方式以後我的pgsql需要密碼才能夠啓動服務,爲了不每次啓動都跑到終端前去輸入一次密碼,我的pgsql用戶的認證方法必須爲trust

local pgsql all trust
local all all md5
host all all 0.0.0.0 0.0.0.0 md5

在隨後的檢測中我發現,雖然通過網絡得到了保護,但是如果在本地通過Unix域套接字進行連接的話,任何人都還是可以使用`psql -U pgsql -d template1`的方式輕鬆的進入我的數據庫,這樣做顯而易見不是我想要的結果,現在我需要unix_socket_permissions的協助,當我把這個項設置爲0700以後,就只有套接字的所有人,即系統用戶pgsql可以使用套接字進行連接,另外如果我的數據庫有幾個管理員需要最高權限的話,0770也是一個選擇,不過暫時只有我一個管理員,所以我選擇了0700,現在我的pg_hba.conf改變爲:

local pgsql all trust
host all all 0.0.0.0 0.0.0.0 md5

結合了unix_socket_permissions以後,現在只有系統用戶pgsql可以無任何限制的連接(當然,偉大的root例外),並且我也不用每次啓動的時候都跑到終端前去輸入一次密碼了,而其他人只能通過網絡連接,即使登錄到了本地計算機上,其他用戶也只能使用`psql -U xx -d template1 -h 127.0.0.1`的方式連接,這種連接是受到密碼認證的保護的,這一切正是我想要的。

以上就是我的設置過程,我們還可以使用pam等認證方法實現更加複雜的訪問認證,不過那些內容已經不在本文的討論範圍以內了。

本文引用了來自http://laser.zhengmai.com.cn/翻譯的postgresql中文手冊中的內容,在此聲明並表示感謝
,postgresql備份存儲

您是否遇到過因爲不小心而刪除了某個數據庫表,或者是存放數據庫的磁盤損壞了的情況呢?如果碰到這種情況,我相信您會覺得非常的沮喪,因爲您努力了幾個星期的工作成果可能就付之東流了。和任何包含珍貴數據的東西一樣,PostgreSQL數據庫也應該經常備份。如果您將數據存放在 PostgreSQL 表中,您就可以定時的進行數據庫備份,從而避免發生上面的悲劇。PostgreSQL 自帶有內置工具來執行備份工作,而且在系統出現損壞或是意外時,您可以通過這些工具進行回滾,並通過以前保存的快照將系統恢復到其初始的狀態。


1.
綜述;

PostgreSQL
數據庫從備份 PostgreSQL 數據有三種完全不同的方法:

SQL
轉儲

文件系統級別備份

在線備份

每種備份都有自己的優點和缺點,下面主要介紹SQl轉儲的方法;


2.
數據備份;

SQL
轉儲的方法是創建一個文本文件,這個文本里面都是 SQL 命令,當把這個文件回饋給服務器時,將重建與轉儲時狀態一樣的數據庫。


2.1 pg_dump;

PostgreSQL
自帶的內置備份工具叫做 pg_dump。這個工具是通過一系列的SQL語句讀取某個指定的數據庫並複製其中的內容,以它作爲快照並用於日後的數據恢復。客戶端到服務器端的連接是用於執行備份工作。這些備份文件就是前面所講的快照並可以用於日後的數據恢復。而保證客戶端與服務器端的連接是執行備份所必需的。這條命令的基本用法是:

pg_dump dbname > outfile

注:在進行上述工作之前,首先請確保您具有登錄到服務器並訪問您將要備份的數據庫或表的權限。您可以通過使用PostgreSQL 命令行客戶端——psql,進行服務器登錄。在客戶端中輸入主機名(-h),用戶名(-u)和密碼(-p),以及數據庫名,然後就可以校驗您是否被授權訪問。

使用 pg_dump 非常的簡單——只需要在命令提示符後面輸入將要導出的數據庫名就可以進行備份工作了,如下例所示(根據您自己的安裝路經更改PostgreSQL 路徑):

xiaop@xiaop-laptop:~$ /usr/lib/postgresql/8.2/bin/pg_dump -D -h localhost -U xiaop(
用戶名) mydb(數據庫名稱) > mydb.bak

通過上面的命令就會創建一個名爲 mydb.bak的文件,文件中記錄了用於恢復數據庫的SQL命令。

正如您所見,pg_dump 把結果輸出到標準輸出。 我們下面就可以看到這樣做有什麼好處。

pg_dump
是一個普通的 PostgreSQL 客戶端應用(儘管是個相當聰明的東西。)這就意味着您可以從任何可以訪問該數據庫的遠端主機上面進行備份工作。 但是請記住 pg_dump 不會以任何特殊權限運行。具體說來, 就是它必須要有您想備份的表的讀權限,因此,實際上您幾乎總是要成爲數據庫超級用戶。

要聲明 pg_dump 應該以哪個用戶身份進行聯接,使用命令行選項 -h host -p port。缺省主機是本地主機或您的環境變量PGHOST聲明的值。類似,缺省端口是環境變量PGPORT或(如果它不存在的話)編譯好了的缺省值。(服務器通常有相同的缺省,所以還算方便。)

和任何其他 PostgreSQL 客戶端應用一樣, pg_dump 缺省時用與當前操作系統用戶名同名的數據庫用戶名進行聯接。要覆蓋這個名字,要麼聲明 -U 選項, 要麼設置環境變量PGUSER 請注意 pg_dump 的聯接也和普通客戶應用一樣要通過客戶認證機制。

pg_dump 創建的備份在內部是一致的, 也就是說,在pg_dump運行的時候對數據庫的更新將不會被轉儲。 pg_dump 工作的時候並不阻塞其他的對數據庫的操作。 (但是會阻塞那些需要排它鎖的操作,比如 VACUUM FULL。)

注:: 如果您的數據庫結構依賴於 OID (比如說用做外鍵),那麼您必須告訴 pg_dump OID 也倒出來。 要倒 OID,可以使用 -o 命令行選項。 缺省時也不會轉儲"大對象"。如果您使用大對象,請參考 pg_dump 的命令手冊頁。


2.2 pg_dumpall;

如果您希望對整個系統中所有的數據庫進行備份的話(而不是隻對某一個數據庫進行備份),您可以使用命令pg_dumpall 而不是pg_dump。執行這個命令可以對PostgreSQL 所能識別的所有的數據庫(包括其自身的系統數據庫)備份到一個文件中。下面給出了一個使用實例:

xiaop@xiaop-laptop:~$ /usr/lib/postgresql/8.2/bin/pg_dumpall -D -h localhost -U xiaop(
用戶名) > all.bak

這樣就會將localhost的所有數據庫備份到all.bak文件中了;


2.3
計劃任務;

爲了保證您的備份時刻保持更新,您可以通過往cron table中加入pg_dump或者是pg_dumpall命令來定期執行備份工作。這裏給出了兩個cron entries的例子。第一個是在每天凌晨3點對test數據庫進行備份,而第二個是在每個星期五的晚上9點對所有的數據庫進行備份:

xiaop@xiaop-laptop:~$ 0 3 * * * /usr/lib/postgresql/8.2/bin/pg_dump -D -h localhost -U xiaop(
用戶名) mydb(數據庫名稱) > /home/xiaop/mydb.bak0 21 * *
xiaop@xiaop-laptop:~$ 5 /usr/lib/postgresql/8.2/bin/pg_dumpall -D -h localhost -U xiaop(
用戶名) > /home/xiaop/all.bak


3.
從轉儲中恢復


3.1
pg_dump恢復;

從備份中恢復數據的工作比執行備份甚至更簡單——您所要做的就是通過執行備份文件中的SQL命令來對數據庫進行恢復。如果您是使用pg_dump對某一個數據庫進行了備份,那麼備份中就會有CREATE TABLE 的語句來對源表進行復制。當然,您首先要新創建一個空數據庫來存放這些數據表。您可以使用createdb 這個工具來完成這一步工作,這個工具也是PostgreSQL 套件中的一部分:
xiaop@xiaop-laptop:~$ /usr/lib/postgresql/8.2/bin/createdb mydb(
數據庫名稱)

現在您就可以執行備份文件中的SQL命令來對數據庫進行恢復了, pg_dump 生成的文本文件可以由 psql 程序讀取。 從轉儲中恢復的常用命令格式是:

psql dbname < infile

如下例所示:

xiaop@xiaop-laptop:~$ /usr/lib/postgresql/8.2/bin/psql -h localhost -U xiaop(
用戶名) -d mydb(數據庫名稱) < mydb.bak


3.2
pg_dumpall恢復;

如果您是使用pg_dumpall對所有的數據庫進行備份的,就沒有必要先新建一個數據庫,因爲備份文件中已經包含了完成CREATE DATABASE工作的相關的調用。在這裏,只需要在psql命令行客戶端中輸入對應的備份文件就可以了,而不需要指定目標數據庫:

xiaop@xiaop-laptop:~$ /usr/lib/postgresql/8.2/bin/psql -h localhost -U xiaop(
用戶名 ) < all.bak

一旦數據恢復完成後,您就可以登錄到服務器並查看到已恢復的數據。


3.3 ANALYZE;

一旦完成恢復,在每個數據庫上運行 ANALYZE 是明智的舉動, 這樣優化器就有有用的統計數據了。您總是可以運行 vacuumdb -a -z VACUUM ANALYZE 所有數據庫;這個等效於手工運行 VACUUM ANALYZE;


4.
處理大數據庫;


4.1
輸出大數據庫;

因爲 PostgreSQL 允許表的大小大於您的系統允許的最大文件大小, 可能把錶轉儲到一個文件會有問題,因爲生成的文件很可能比您的系統允許的最大文件大。 因爲 pg_dump 輸出到標準輸出,您可以用標準的 Unix 工具繞開這個問題:
使用壓縮的轉儲. 使用您熟悉的壓縮程序,比如說 gzip

xiaop@xiaop-laptop:~$ pg_dump mydb(
數據庫名) | gzip > mydbBACK.gz


4.2
恢復大數據庫;

用下面命令恢復:
xiaop@xiaop-laptop:~$ createdb mydbNEW(
新數據庫名)
xiaop@xiaop-laptop:~$ gunzip -c mydbBACK.gz | psql mydbNEW

或者
xiaop@xiaop-laptop:~$ cat mydbBACK.gz | gunzip | psql mydbNEW


4.3
使用 split;


4.3.1
分割;

split
命令允許您用下面的方法把輸出分解成操作系統可以接受的大小。 有關split的用法可以在《文件的切分split和結合工具cat 介紹》中查詢。比如,讓每個塊大小爲 1 兆字節:
xiaop@xiaop-laptop:~$ pg_dump dbname | split -b 1m - filename


4.3.2
合併;

分割後可以用下面的命令恢復:
xiaop@xiaop-laptop:~$createdb dbname
xiaop@xiaop-laptop:~$cat filename* | psql dbname


5.
關於本文;

有關PostgreSQl數據庫備份和恢復的另外兩個方法文件系統級別的備份在線備份,我們以後再討論,本文大部分資料都是參照中文文檔,目的是讓兄弟們查找方便一些,詳細的東西在中文文檔都有,多謝各位弟兄們指點 :)
,影響postgresql性能的主要參數

本人現在開發的所有項目都使用postgresql,應用下來對它很是滿意,現就影響postgresql性能的幾個重要參數介紹如下,希望對PG的初學者有所幫助,如果你在實際應用中遇到什麼問題,可給我留言,我們一起解決:

    PG的配置文件是數據庫目錄下的postgresql.conf文件,8.0以後的版本可支持KMG這樣的參數,只要修改相應參數後重新啓動PG服務就OK了。

 

    shared_buffers:這是最重要的參數,postgresql通過shared_buffers和內核和磁盤打交道,因此應該儘量大,讓更多的數據緩存在shared_buffers中。通常設置爲實際RAM10%是合理的,比如50000(400M)

 

    work_mem pgsql 8.0之前叫做sort_mempostgresql在執行排序操作時,會根據work_mem的大小決定是否將一個大的結果集拆分爲幾個小的和 work_mem查不多大小的臨時文件。顯然拆分的結果是降低了排序的速度。因此增加work_mem有助於提高排序的速度。通常設置爲實際RAM2% -4%,根據需要排序結果集的大小而定,比如81920(80M)

 

    effective_cache_size:是postgresql能夠使用的最大緩存,這個數字對於獨立的pgsql服務器而言應該足夠大,比如4G的內存,可以設置爲3.5G(437500)

 

    maintence_work_mem:這裏定義的內存只是在CREATE INDEX, VACUUM等時用到,因此用到的頻率不高,但是往往這些指令消耗比較多的資源,因此應該儘快讓這些指令快速執行完畢:給maintence_work_mem大的內存,比如512M(524288)

 

    max_connections 通常,max_connections的目的是防止max_connections * work_mem超出了實際內存大小。比如,如果將work_mem設置爲實際內存的2%大小,則在極端情況下,如果有50個查詢都有排序要求,而且都使用2%的內存,則會導致swap的產生,系統性能就會大大降低。當然,如果有4G的內存,同時出現50個如此大的查詢的機率應該是很小的。不過,要清楚 max_connectionswork_mem的關係。

 

 

Python PostgreSQL

 

使用 PyGreSQL 來連 PostgreSQL

PyGreSQL 是一個開放原始碼的 Python 模組,讓 Python 可以與 PostgreSQL 資料庫連接。

PyGreSQL 分成兩個模組,pg(classic" PyGreSQL interface) 和 pgdbDB-API 2.0 compliant interface),以下說明爲 pg 模組。


PyGreSQL 官方首

載頁

另外 import pg 需要 libpq.dll 這個檔案,這個檔案是在 PostgreSQL Client 中,所以要先安裝 PostgreSQL Client 如果不想安裝則到 PostgreSQL 官方下載 postgresql-8.2.3-1-binaries-no-installer.zip,然後解開來,把 libpq.dll, comerr32.dll, libintl-2.dll, libiconv-2.dll, krb5_32.dll 複製到 C:/WINDOWS/system32/ 資料夾中。

 

測試程式碼:

import pg

conn = pg.connect(dbname='DbForTest',host='digit.idv.tw', user='tester',passwd='123')

 

for obj in conn.query("select * from public.user").dictresult():

print obj

 

conn.close()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章