閱讀55 返回首頁    go 阿裏雲 go 技術社區[雲棲]


PostgreSQL服務器管理:從源代碼安裝

本文檔為PostgreSQL 9.6.0文檔,本轉載已得到原譯者彭煜瑋授權。

./configure
make
su
make install
adduser postgres
mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &
/usr/local/pgsql/bin/createdb test
/usr/local/pgsql/bin/psql test

本章剩餘部分都是完全版。

一般說來,一個現代的與 Unix 兼容的平台應該就能運行PostgreSQL。 到發布為止已經明確測試過的平台的列表在 Section 16.6中列出。在發布的doc子目錄裏麵有許多平台相關的 FAQ文檔,如果你碰到問題你可能會需要參考它們。

編譯PostgreSQL需要下列軟件包:

  • 要求GNU make版本3.80或以上;其他的make程序或更老的GNU make版本將不會工作(GNU make有時以名字gmake安裝)。要測試GNU make可以輸入: java make --version
  • 你需要一個ISO/ANSI C 編譯器(至少是 C89兼容的)。我們推薦使用最近版本的GCC,不過,眾所周知的是PostgreSQL可以利用許多不同廠商的不同編譯器進行編譯。
  • 除了gzip和bzip2之外,我們還需要tar來解包源代碼發布。
  • 默認時將自動使用GNU Readline庫。它允許psql(PostgreSQL的命令行 SQL 解釋器)記住你輸入的每一個命令並且允許你使用箭頭鍵來找回和編輯之前的命令。如果你不想用它,那麼你必需給configure聲明--without-readline選項。作為一種可選方案,你常常可以使用 BSD許可證的libedit庫,它最初是在NetBSD上開發的。libedit庫是GNU Readline兼容的, 如果沒有發現libreadline或者configure使用了--with-libedit-preferred選項,都會使用這個庫。如果你使用的是一個基於包的 Linux 發布,那麼要注意你需要readline和readline-devel兩個包,特別是如果這兩個包在你的版本裏是分開的時候。
  • 默認的時候將使用zlib壓縮庫。 如果你不想使用它,那麼你必須給configure聲明--without-zlib選項。使用這個選項關閉了在pg_dump和pg_restore中對壓縮歸檔的支持。

下列包是可選的。在默認配置的時候並不要求它們,但是如果打開了一些編譯選項之後就需要它們了,如下文所解釋的:

  • 要編譯服務器端編程語言PL/Perl,你需要一個完整的 Perl安裝, 包括libperl 庫和頭文件。因為PL/Perl是一個共享庫, libperl庫在大多數平台上也必須是一個共享庫。最近的版本的 Perl好像已經默認這樣做了,但是早先的版本可不是 這樣的, 而且這總是一種在站點上安裝 Perl 的選擇。如果選擇了編譯 PL/Perl但是它卻找不到一個共享的 libperl,那麼configure將會失敗。 在這種情況下,你將不得不重新手工編譯並且安裝Perl 以便能編譯PL/Perl。在 Perl的配置處理過程中,需要一個共享庫。
  • 如果你想更多地使用PL/Perl, 你應當保證Perl安裝在編譯時啟用了 usemultiplicity選項(perl -V將會顯示是否是這樣)。
  • 要編譯PL/Python服務器端編程語言, 你需要一個Python的安裝,包括頭文件和distutils模塊。最低的版本要求是Python 2.3(要和類型numeric的函數參數一起工作,2.3.x 安裝必須包括獨立可用的cdecimal模塊,注意如果缺少它PL/Python回歸測試就無法通過)。
  • 因為PL/Python將以共享庫的方式編譯, libpython庫在大多數平台上也必須是一個共享庫。 在默認的從源碼安裝Python時不是這樣的, 而是在很多操作係統發布中有一個共享庫可用。如果選擇了編譯 PL/Python但找不到一個共享的 libpython,configure將 會失敗。這可能意味著你不得不安裝額外的包或者(部分)重編譯 Python安裝以提供這個共享庫。 在從源碼編譯時,請用--enable-shared標誌運行 Python的配置腳本。
  • 如果你想編譯PL/Tcl過程語言, 你當然需要安裝Tcl,要求的最低版本是 Tcl 8.4。
  • 要打開本地語言支持(NLS),也就是說, 用英語之外的語言顯示程序的消息,你需要一個Gettext API的實現。有些操作係統內置了這些(例如Linux、NetBSD、Solaris), 對於其它係統,你可以從https://www.gnu.org/software/gettext/ 下載一個額外的包。如果你在使用GNU C 庫裏麵的Gettext實現, 那麼你就額外需要GNU Gettext包,因為我們需要裏麵的幾個工具程序。對於任何其它的實現,你應該不需要它。
  • 如果你想支持使用Kerberos、OpenSSL、OpenLDAP和/或PAM的認證或者加密,那你需要相應的包。
  • 要編譯PostgreSQL文檔,有一些獨立的要求集 。

如果你正從Git樹而不是使用發布的源代碼包進行編譯,或者你想做服務器端開發, 那麼你還需要下麵的包:

  • 如果你需要從 Git 檢出中編譯,或者你修改了實際的掃描器和分析器的定義文件, 那麼你需要 GNU Flex和Bison。 如果你需要它們,那麼確保自己拿到的是Flex 2.5.31 或更新的版本, 以及Bison 1.875 或者更新的版本。不能使用其他lex和yacc程序。
  • 如果需要從 Git 檢出中編譯,或者你修改了任何使用 Perl 腳本的編譯步驟的輸入文件,那麼你需要Perl 5.8或以後的版本。如果你在 Windows 上編譯,你在任何情況下都需要Perl。運行一些測試套件時也需要Perl。

如果你需要獲取GNU包,你可以在你的本地GNU鏡像站點 (看看 https://www.gnu.org/order/ftp.htmlhttps://yq.aliyun.com/articles/ftp://ftp.gnu.org/gnu/ 找到它們。

還要檢查一下你是否有足夠的磁盤空間。你將大概需要近 100MB 用於存放編譯過程中的源碼樹和大約 20 MB 用於安裝目錄。 一個空數據庫集簇大概需要 35 MB。一個數據庫所占的空間大約是存儲同樣數據的平麵文件所占空間的五倍。如果你要運行回歸測試,還臨時需要額外的 150MB。請用df命令檢查剩餘磁盤空間。

PostgreSQL 9.6.0 源代碼可以從我們的官方網站 https://www.postgresql.org/download/ 的下載區中獲得。你將得到一個名為postgresql-9.6.0.tar.gz或postgresql-9.6.0.tar.bz2的文件。在你獲取文件之後,解壓縮它:


gunzip postgresql-9.6.0.tar.gz
tar xf postgresql-9.6.0.tar

(如果你得到的是.bz2文件,請用bunzip2代替gunzip)。這樣將在當前目錄創建一個目錄postgresql-9.6.0, 裏麵是PostgreSQL源代碼。 進入這個目錄完成安裝過程的其他步驟。

你也可以直接從版本控製庫中獲得源代碼.

1.配置

安裝過程的第一步就是為你的係統配置源代碼樹並選擇你喜歡的選項。這個工作是通過運行configure腳本實現的,對於默認安裝,你隻需要簡單地輸入:


./configure

該腳本將運行一些測試來決定一些係統相關的變量, 並檢測你的操作係統的特殊設置,並且最後將在編譯樹中創建一些文件以記錄它找到了什麼。如果你想保持編譯目錄的獨立,你也可以在一個源碼樹之外的目錄中運行configure 。這個過程也被稱為一個VPATH編譯。做法如下:


mkdir build_dir
cd build_dir
/path/to/source/tree/configure [options go here]
make

默認設置將編譯服務器和輔助程序,還有隻需要 C 編譯器的所有客戶端程序和接口。默認時所有文件都將安裝到/usr/local/pgsql。

你可以通過給出下麵的configure命令行選項中的一個或更多的選項來自定義編譯和安裝過程:

--prefix=PREFIX

把所有文件裝在目錄PREFIX中而不是/usr/local/pgsql中。 實際的文件會安裝到數個子目錄中;沒有一個文件會直接安裝到PREFIX目錄裏。

如果你有特殊需要,你還可以用下麵的選項自定義不同的子目錄的位置。 不過,如果你把這些設置保留默認,那麼安裝將是可重定位的,意思是你可以在安裝過後移動目錄(man和doc位置不受此影響)。

對於可重定位的安裝,你可能需要使用configure的--disable-rpath選項。 還有,你需要告訴操作係統如何找到共享庫。

--exec-prefix=EXEC-PREFIX

你可以把體係相關的文件安裝到一個不同的前綴下(EXEC-PREFIX),而不是PREFIX中設置的地方。 這樣做可以比較方便地在不同主機之間共享體係相關的文件。 如果你省略這些,那麼EXEC-PREFIX就會被設置為等於 PREFIX並且體係相關和體係無關的文件都會安裝到同一棵目錄樹下,這也可能是你想要的。

--bindir=DIRECTORY

為可執行程序指定目錄。默認是EXEC-PREFIX/bin, 通常也就是/usr/local/pgsql/bin。

--sysconfdir=DIRECTORY

用於各種各樣配置文件的目錄,默認為PREFIX/etc。

--libdir=DIRECTORY

設置安裝庫和動態裝載模塊的目錄。默認是EXEC-PREFIX/lib。

--includedir=DIRECTORY

C 和 C++ 頭文件的目錄。默認是PREFIX/include。

--datarootdir=DIRECTORY

設置多種隻讀數據文件的根目錄。這隻為後麵的某些選項設置默認值。默認值為PREFIX/share。

--datadir=DIRECTORY

設置被安裝的程序使用的隻讀數據文件的目錄。默認值為DATAROOTDIR。注意這不會對你的數據庫文件被放置的位置產生任何影響。

--localedir=DIRECTORY

設置安裝區域數據的目錄,特別是消息翻譯目錄文件。默認值為DATAROOTDIR/locale。

--mandir=DIRECTORY

PostgreSQL自帶的手冊頁將安裝到這個目錄,它們被安裝在相應的manx子目錄裏。 默認是DATAROOTDIR/man。

--docdir=DIRECTORY

設置安裝文檔文件的根目錄,"man"頁不包含在內。這隻為後續選項設置默認值。這個選項的默認值為DATAROOTDIR/doc/postgresql。

--htmldir=DIRECTORY

PostgreSQL的HTML格式的文檔將被安裝在這個目錄中。默認值為DATAROOTDIR。

Note:
為了讓PostgreSQL能夠安裝在一些共享的安裝位置(例如/usr/local/include), 同時又不至於和係統其它部分產生名字空間幹擾,我們特別做了一些處理。 首先,安裝腳本會自動給datadir、sysconfdir和docdir後麵附加上"/postgresql"字符串, 除非展開的完整路徑名已經包含字符串"postgres"或者"pgsql"。 例如,如果你選擇/usr/local作為前綴, 那麼文檔將安裝在/usr/local/doc/postgresql,但如果前綴是/opt/postgres, 那麼它將被放到/opt/postgres/doc。客戶接口的公共 C 頭文件安裝到了includedir,並且是名字空間無關的。內部的頭文件和服務器頭文件都安裝在includedir下的私有目錄中。參考每種接口的文檔獲取關於如何訪問頭文件的信息。最後,如果合適,那麼也會在libdir下創建一個私有的子目錄用於動態可裝載的模塊。

--with-extra-version=STRING

把STRING追加到 PostgreSQL 版本號。例如,你可以使用它來標記從未發布的 Git 快照或者包含定製補丁(帶有一個如git describe標識符之類的額外版本號或者一個分發包發行號)創建的二進製文件。

--with-includes=DIRECTORIES

DIRECTORIES是一個冒號分隔的目錄列表,這些目錄將被加入編譯器的頭文件搜索列表中。 如果你有一些可選的包(例如 GNU Readline)安裝在非標準位置, 你就必須使用這個選項,以及可能還有相應的 --with-libraries選項。

例子:--with-includes=/opt/gnu/include:/usr/sup/include.

--with-libraries=DIRECTORIES

DIRECTORIES是一個冒號分隔的目錄列表,這些目錄是用於查找庫文件的。 如果你有一些包安裝在非標準位置,你可能就需要使用這個選項(以及對應的--with-includes選項)。

例子:--with-libraries=/opt/gnu/lib:/usr/sup/lib.

--enable-nls[=LANGUAGES]

打開本地語言支持(NLS),也就是以非英文顯示程序消息的能力。LANGUAGES是一個空格分隔的語言代碼列表, 表示你想支持的語言。例如--enable-nls='de fr' (你提供的列表和實際支持的列表之間的交集將會自動計算出來)。如果你沒有聲明一個列表,那麼就會安裝所有可用的翻譯。

要使用這個選項,你需要一個Gettext API 的實現。見上文。

--with-pgport=NUMBER

把NUMBER設置為服務器和客戶端的默認端口。默認是 5432。 這個端口可以在以後修改,不過如果你在這裏聲明,那麼服務器和客戶端將有相同的編譯好了的默認值。這樣會非常方便些。 通常選取一個非默認值的理由是你企圖在同一台機器上運行多個PostgreSQL服務器。

--with-perl

製作PL/Perl服務器端編程語言。

--with-python

製作PL/Python服務器端編程語言。

--with-tcl

製作PL/Tcl服務器編程語言。

--with-tclconfig=DIRECTORY

Tcl 安裝文件tclConfig.sh,其中裏麵包含編譯與 Tcl 接口的模塊的配置信息。該文件通常可以自動地在一個眾所周知的位置找到,但是如果你需要一個不同版本的 Tcl,你也可以指定可以找到它的目錄。

--with-gssapi

編譯 GSSAPI 認證支持。在很多係統上,GSSAPI(通常是 Kerberos 安裝的一部分)係統不會被安裝在默認搜索位置(例如/usr/include、/usr/lib),因此你必須使用選項--with-includes和--with-libraries來配合該選項。configure將會檢查所需的頭文件和庫以確保你的 GSSAPI 安裝足以讓配置繼續下去。

--with-krb-srvnam=NAME

默認的 Kerberos 服務主的名稱(也被 GSSAPI 使用)。默認是postgres。通常沒有理由改變這個值,除非你是一個 Windows 環境,這種情況下該名稱必須被設置為大寫形式POSTGRES。

--with-openssl

編譯SSL(加密)連接支持。這個選項需要安裝OpenSSL包。configure將會檢查所需的頭文件和庫以確保你的 OpenSSL安裝足以讓配置繼續下去。

--with-pam

編譯PAM(可插拔認證模塊)支持。

--with-bsd-auth

編譯 BSD 認證支持(BSD 認證框架目前隻在 OpenBSD 上可用)。

--with-ldap

為認證和連接參數查找編譯LDAP支持(詳見Section 32.17和Section 20.3.7)。在 Unix 上,這需要安裝OpenLDAP包。在 Windows 上將使用默認的WinLDAP庫。configure將會檢查所需的頭文件和庫以確保你的 OpenLDAP安裝足以讓配置繼續下去。

--with-systemd

編譯對systemd 服務通知的支持。如果服務器是在systemd 機製下被啟動,這可以提高集成度,否則不會有影響 ; see Section 18.3 for more information。要使用這個選項,必須安裝libsystemd 以及相關的頭文件。

--without-readline

避免使用Readline庫(以及libedit)。這個選項禁用了psql中的命令行編輯和曆史, 因此我們不建議這麼做。

--with-libedit-preferred

更傾向於使用BSD許可證的libedit庫而不是GPL許可證的Readline。這個選項隻有在你同時安裝了兩個庫時才有意義,在那種情況下默認會使用Readline。

--with-bonjour

編譯 Bonjour 支持。這要求你的操作係統支持 Bonjour。在 OS X 上建議使用。

--with-uuid=LIBRARY

使用指定的 UUID 庫編譯 uuid-ossp模塊(提供生成 UUID 的函數)。 LIBRARY必須是下列之一:

  • bsd,用來使用 FreeBSD、NetBSD 和一些其他 BSD 衍生係統 中的 UUID 函數
  • e2fs,用來使用e2fsprogs項目創建的 UUID 庫, 這個庫出現在大部分的 Linux 係統和 OS X 中,並且也能找到用於其他平台的 版本
  • ossp,用來使用OSSP UUID library

--with-ossp-uuid

  • with-uuid=ossp的已廢棄的等效選項。

--with-libxml

編譯 libxml (啟用 SQL/XML 支持)。這個特性需要 Libxml 版本 2.6.23 及以上。

Libxml 會安裝一個程序xml2-config,它可以被用來檢測所需的編譯器和鏈接器選項。如果能找到,PostgreSQL 將自動使用它。要製定一個非常用的 libxml 安裝位置,你可以設置環境變量XML2_CONFIG指向xml2-config程序所屬的安裝,或者使用選項--with-includes和--with-libraries。

--with-libxslt

編譯 xml2模塊時使用 libxslt。xml2依賴這個庫來執行XML的XSL轉換。

--disable-integer-datetimes

禁用對時間戳和間隔的64位存儲支持,並且將 datetime 值存儲為浮點數。浮點 datetime 存儲在PostgreSQL 8.4之前是默認方式,但是現在已經被廢棄,因為它對於timestamp值的全範圍不支持毫秒精度。但是,基於整數的 datetime 存儲要求64位整數類型。因此,當沒有64位整數類型時,可以使用這個選項,或者在兼容為PostgreSQL之前版本開發的應用時使用。

--disable-float4-byval

禁用 float4 值的"傳值",導致它們隻能被"傳引用"。這個選項會損失性能,但是在需要兼容使用 C 編寫並使用"version 0"調用規範的老用戶定義函數時可能需要這個選項。更好的長久解決方案是將任何這樣的函數更新成使用"version 1"調用規範。

--disable-float8-byval

禁用 float8 值的"傳值",導致它們隻能被"傳引用"。這個選項會損失性能,但是在需要兼容使用 C 編寫並使用"version 0"調用規範的老用戶定義函數時可能需要這個選項。更好的長久解決方案是將任何這樣的函數更新成使用"version 1"調用規範。注意這個選項並非隻影響 float8,它還影響 int8 和某些相關類型如時間戳。在32位平台上,--disable-float8-byval是默認選項並且不允許選擇--enable-float8-byval。

--with-segsize=SEGSIZE

設置段尺寸,以 G 字節計。大型的表會被分解成多個操作係統文件,每一個的尺寸等於段尺寸。這避免了與操作係統對文件大小限製相關的問題。默認的段尺寸(1G字節)在所有支持的平台上都是安全的。如果你的操作係統有"largefile"支持(如今大部分都支持),你可以使用一個更大的段尺寸。這可以有助於在使用非常大的表時消耗的文件描述符數目。但是要當心不能選擇一個超過你將使用的平台和文件係統所支持尺寸的值。你可能希望使用的其他工具(如tar)也可以對可用文件尺寸設限。如非絕對必要,我們推薦這個值應為2的冪。注意改變這個值需要一次 initdb。

--with-blocksize=BLOCKSIZE

設置塊尺寸,以 K 字節計。這是表內存儲和I/O的單位。默認值(8K字節)適合於大多數情況,但是在特殊情況下可能其他值更有用。這個值必須是2的冪並且在 1 和 32 (K字節)之間。注意修改這個值需要一次 initdb。

--with-wal-segsize=SEGSIZE

設置WAL 段尺寸,以 M 字節計。這是 WAL 日誌中每一個獨立文件的尺寸。調整這個值來控製傳送 WAL 日誌的粒度非常有用。默認尺寸為 16 M字節。這個值必須是2的冪並且在 1 到 64 (M字節)之間。注意修改這個值需要一次 initdb。

--with-wal-blocksize=BLOCKSIZE

設置WAL 塊尺寸,以 K 字節計。這是 WAL 日誌存儲和I/O的單位。默認值(8K 字節)適合於大多數情況,但是在特殊情況下其他值更好有用。這個值必須是2的冪並且在 1 到 64(K字節)之間。注意修改這個值需要一次 initdb。

--disable-spinlocks

即便PostgreSQL對於該平台沒有 CPU 自旋鎖支持,也允許編譯成功。自旋鎖支持的缺乏會導致較差的性能,因此這個選項隻有當編譯終端或者通知你該平台缺乏自旋鎖支持時才應被使用。如果在你的平台上要求使用該選項來編譯PostgreSQL,請將此問題報告給PostgreSQL的開發者。

--disable-thread-safety

禁用客戶端庫的線程安全性。這會阻止libpq和ECPG程序中的並發線程安全地控製它們私有的連接句柄。

--with-system-tzdata=DIRECTORY

PostgreSQL包含它自己的時區數據庫,它被用於日期和時間操作。這個時區數據庫實際上是和 IANA 時區數據庫相兼容的,後者在很多操作係統如 FreeBSD、Linux和Solaris上都有提供,因此再次安裝它可能是冗餘的。當這個選項被使用時,將不會使用DIRECTORY中係統提供的時區數據庫,而是使用包括在 PostgreSQL 源碼發布中的時區數據庫。DIRECTORY必須被指定為一個絕對路徑。/usr/share/zoneinfo在某些操作係統上是一個很有可能的路徑。注意安裝例程將不會檢測不匹配或錯誤的時區數據。如果你使用這個選項,建議你運行回歸測試來驗證你指定的時區數據能正常地工作在PostgreSQL中。

這個選項主要針對那些很了解他們的目標操作係統的二進製包發布者。使用這個選項主要優點是不管何時當眾多本地夏令時規則之一改變時, PostgreSQL 包不需要被升級。另一個優點是如果時區數據庫文件在安裝時不需要被編譯, PostgreSQL 可以被更直接地交叉編譯。

--without-zlib

避免使用Zlib庫。這樣就禁用了pg_dump和 pg_restore中對壓縮歸檔的支持。這個選項隻適用於那些沒有這個庫的少見的係統。

--enable-debug

把所有程序和庫以帶有調試符號的方式編譯。這意味著你可以通過一個調試器運行程序來分析問題。 這樣做顯著增大了最後安裝的可執行文件的大小,並且在非 GCC 的編譯器上,這麼做通常還要關閉編譯器優化, 這些都導致速度的下降。但是,如果有這些符號的話,就可以非常有效地幫助定位可能發生問題的位置。目前,我們隻是在你使用 GCC 的情況下才建議在生產安裝中使用這個選項。但是如果你正在進行開發工作,或者正在使用 beta 版本,那麼你就應該總是打開它。

--enable-coverage

如果在使用 GCC,所有程序和庫都會用代碼覆蓋率測試工具編譯。在運行時,它們會在編譯目錄中生成代碼覆蓋率度量的文件。這個選項隻用於 GCC 以及做開發工作時。

--enable-profiling

如果在使用 GCC,所有程序和庫都被編譯成可以進行性能分析。在後端退出時,將會創建一個子目錄,其中包含用於性能分析的gmon.out文件。這個選項隻用於 GCC 和做開發工作時。

--enable-cassert

打開在服務器中的assertion檢查, 它會檢查許多"不可能發生"的條件。它對於代碼開發的用途而言是無價之寶, 不過這些測試可能會顯著地降低服務器的速度。並且,打開這個測試不會提高你的係統的穩定性! 這些斷言檢查並不是按照嚴重性分類的,因此一些相對無害的小故障也可能導致服務器重啟 — 隻要它觸發了一次斷言失敗。 目前,我們不推薦在生產環境中使用這個選項,但是如果你在做開發或者在使用 beta 版本的時候應該打開它。

--enable-depend

打開自動倚賴性跟蹤。如果打開這個選項,那麼製作文件(makefile)將設置為在任何頭文件被修改的時候都將重新編譯所有受影響的目標文件。 如果你在做開發的工作,那麼這個選項很有用,但是如果你隻是想編譯一次並且安裝,那麼這就是浪費時間。 目前,這個選項隻對 GCC 有用。

--enable-dtrace

為PostgreSQL編譯對動態跟蹤工具 DTrace 的支持。

要指向dtrace程序,必須設置環境變量DTRACE。這通常是必需的,因為dtrace通常被安裝在/usr/sbin中,該路徑可能不在搜索路徑中。

dtrace程序的附加命令行選項可以在環境變量DTRACEFLAGS中指定。在 Solaris 上,要在一個64位二進製中包括 DTrace,你必須為 configure 指定DTRACEFLAGS="-64"。例如,使用 GCC 編譯器:


./configure CC='gcc -m64' --enable-dtrace DTRACEFLAGS='-64' ...

使用 Sun 的編譯器:


./configure CC='/opt/SUNWspro/bin/cc -xtarget=native64' --enable-dtrace DTRACEFLAGS='-64' ...

--enable-tap-tests

啟用 Perl TAP 工具進行測試。這要求安裝了 Perl 以及 Perl 模塊IPC::Run。

如果你喜歡用那些和configure選取的不同的 C 編譯器,那麼你可以你的環境變量CC設置為你選擇的程序。默認時,隻要gcc可以使用,configure將選擇它, 或者是該平台的默認(通常是cc)。類似地,你可以用CFLAGS變量覆蓋默認編譯器標誌。

你可以在configure命令行上指定環境變量, 例如:


./configure CC=/opt/bin/gcc CFLAGS='-O2 -pipe'

下麵是可以以這種方式設置的有效變量的列表:

BISON

Bison程序

CC

C編譯器

CFLAGS

傳遞給 C 編譯器的選項

CPP

C 預處理器

CPPFLAGS

傳遞給 C 預處理器的選項

DTRACE

dtrace程序的位置

DTRACEFLAGS

傳遞給dtrace程序的選項

FLEX

Flex程序

LDFLAGS

鏈接可執行程序或共享庫時使用的選項

LDFLAGS_EX

隻用於鏈接可執行程序的附加選項

LDFLAGS_SL

隻用於鏈接共享庫的附加選項

MSGFMT

用於本地語言支持的msgfmt程序

PERL

Perl 解釋器的全路徑。這將被用來決定編譯 PL/Perl 時的依賴性。

PYTHON

Python 解釋器的全路徑。這將被用來決定編譯 PL/Python 時的依賴性。另外這裏指定的是 Python 2 還是 Python 3 (或者是隱式選擇)決定了 PL/Python 語言的哪一種變種將成為可用的。

TCLSH

Tcl 解釋器的全路徑。這將被用來決定編譯 PL/Tcl 時的依賴性,並且它將被替換到 Tcl 腳本中。

XML2_CONFIG

用於定位 libxml 安裝的xml2-config程序。

Note:
在開發服務器內部代碼時,我們推薦使用配置選項--enable-cassert(它會打開很多運行時錯誤檢查)和--enable-debug(它會提高調試工具的有用性)。

如果在使用 GCC,最好使用至少-O1的優化級別來編譯,因為不使用優化(-O0)會禁用某些重要的編譯器警告(例如使用未經初始化的變量)。但是,非零的優化級別會使調試更複雜,因為在編譯好的代碼中步進通常將不能和源代碼行一一對應。如果你在嚐試調試優化過的代碼時覺得困惑,將感興趣的特定文件使用-O0編譯。一種簡單的方式是傳遞一個選項給make:make PROFILE=-O0 file.o。

2.編譯

要開始編譯,鍵入:


make

(一定要記得用GNU make)。依你的硬件而異,編譯過程可能需要 5 分鍾到半小時。顯示的最後一行應該是:


All of PostgreSQL successfully made. Ready to install.

如果你希望編譯所有能編譯的東西,包括文檔(HTML和手冊頁)以及附加模塊(contrib),這樣鍵入:


make world

顯示的最後一行應該是:


PostgreSQL, contrib, and documentation successfully made. Ready to install.

3.回歸測試

如果你想在安裝文件前測試新編譯的服務器, 那麼你可以在這個時候運行回歸測試。 回歸測試是一個用於驗證PostgreSQL在你的係統上是否按照開發人員設想的那樣運行的測試套件。鍵入:


make check

(這條命令不能以 root 運行;請在非特權用戶下運行該命令)。 (This won't work as root; do it as an unprivileged user.) Chapter 31包含關於如何解釋測試結果的詳細信息。你可以在以後的任何時間通過執行這條命令來運行這個測試。

4.安裝文件

Note:
如果你正在升級一套現有的係統,請閱讀 Section 18.6 其中有關於升級一個集簇的指導。

要安裝PostgreSQL,輸入:


make install

這條命令將把文件安裝到在step 1中指定的目錄。確保你有足夠的權限向該區域寫入。通常你需要用 root 權限做這一步。或者你也可以事先創建目標目錄並且分派合適的權限。

要安裝文檔(HTML和手冊頁),輸入:


make install-docs

如果你按照上麵的方法編譯了所有東西,輸入:


make install-world

這也會安裝文檔。

你可以使用make install-strip代替make install, 在安裝可執行文件和庫文件時把它們剝離。 這樣將節約一些空間。如果你編譯時帶著調試支持,那麼抽取將有效地刪除調試支持, 因此我們應該隻是在不再需要調試的時候做這些事情。 install-strip力圖做一些合理的工作來節約空間, 但是它並不了解如何從可執行文件中抽取每個不需要的字節, 因此,如果你希望節約所有可能節約的磁盤空間,那麼你可能需要手工做些處理。

標準的安裝隻提供客戶端應用開發和服務器端程序開發所需的所有頭文件,例如用 C 寫的定製函數或者數據類型(在PostgreSQL 8.0 之前,後者需要獨立地執行一次make install-all-headers命令,不過現在這個步驟已經融合到標準的安裝步驟中)。

隻安裝客戶端:. 如果你隻想裝客戶應用和接口,那麼你可以用下麵的命令:


make -C src/bin install
make -C src/include install
make -C src/interfaces install
make -C doc install

src/bin中有一些服務器專用的二進製文件,但是它們很小。

卸載:. 要撤銷安裝可以使用命令make uninstall。不過這樣不會刪除任何創建出來的目錄。

清理:. 在安裝完成以後,你可以通過在源碼樹裏麵用命令make clean刪除編譯文件。 這樣會保留configure程序生成的文件,這樣以後你就可以用make命令重新編譯所有東西。 要把源碼樹恢複為發布時的狀態,可用make distclean命令。 如果你想從同一棵源碼樹上為多個不同平台製作,你就一定要運行這條命令並且為每個編譯重新配置(另外一種方法是在每種平台上使用一套獨立的編譯樹,這樣源代碼樹就可以保留不被更改)。

如果你執行了一次製作,然後發現你的configure選項是錯誤的, 或者你修改了任何configure所探測的東西(例如,升級了軟件), 那麼在重新配置和編譯之前運行一下make distclean是個好習慣。如果不這樣做, 你修改的配置選項可能無法傳播到所有需要變化的地方。

5.1. 共享庫

在一些有共享庫的係統裏,你需要告訴你的係統如何找到新安裝的共享庫。那些並不是必須做這個工作的係統包括 FreeBSD、HP-UX、Linux、NetBSD、OpenBSD和Solaris。

設置共享庫的搜索路徑的方法因平台而異, 但是最廣泛使用的方法是設置環境變量LD_LIBRARY_PATH,例如在 Bourne shells (sh、ksh、bash、zsh)中:


LD_LIBRARY_PATH=/usr/local/pgsql/lib
export LD_LIBRARY_PATH

或者在csh或tcsh中:


setenv LD_LIBRARY_PATH /usr/local/pgsql/lib

把/usr/local/pgsql/lib換成你在step 1時設置的--libdir。 你應該把這些命令放到 shell 啟動文件,如/etc/profile或~/.bash_profile中。 和這個方法相關的一些注意事項和很好的信息可以在https://xahlee.org/UnixResource_dir/_/ldpath.html 找到。

在有些係統上,更好的方法可能是在編譯之前設置環境變量LD_RUN_PATH。

在Cygwin上,把庫目錄放在PATH中或者把.dll文件移動到bin目錄。

如果有疑問,請參考你的係統的手冊頁(可能是ld.so或rld)。 如果稍後你收到下麵這樣的消息:


psql: error in loading shared libraries
libpq.so.2.1: cannot open shared object file: No such file or directory

那麼這一步就是必須的了。這個隻需關注一下就是了。

如果你用的係統是Linux,並且你還有 root 權限,那麼你可以在安裝之後運行:


/sbin/ldconfig /usr/local/pgsql/lib

(或者等效的目錄)以便讓運行時鏈接器更快地找到共享庫。請參考ldconfig的手冊頁獲取更多信息。在FreeBSD、NetBSD和OpenBSD上,命令是:


/sbin/ldconfig -m /usr/local/pgsql/lib

我們不知道其它的係統有等效的命令。

5.2. 環境變量

如果你安裝到/usr/local/pgsql或者其他默認不在搜索路徑中的地方, 那你應該在你的PATH環境變量裏麵增加一個 /usr/local/pgsql/bin(或者是你在step 1時給選項--bindir設置的任何值) 。嚴格來說,這些都不是必須的,但這麼做可以讓你使用PostgreSQL更方便。

要做這些事情,把下麵幾行加到你的 shell 啟動文件,如~/.bash_profile(如果想影響所有用戶就放在/etc/profile):


PATH=/usr/local/pgsql/bin:$PATH
export PATH

如果你用的是csh或者tcsh,那麼用這條命令:


set path = ( /usr/local/pgsql/bin $path )

為了讓你的係統找得到man文檔,你需要加類似下麵的一行到一個shell啟動文件裏 (除非你安裝到了默認搜索的位置):


MANPATH=/usr/local/pgsql/share/man:$MANPATH
export MANPATH

環境變量PGHOST和PGPORT為客戶端應用指定了數據庫服務器的主機和端口, 它們會覆蓋編譯時的默認項。如果你想從遠程運行客戶端應用, 那麼為每個準備使用該數據庫的用戶都設置PGHOST將會非常方便。但這不是必須的,而且大部分客戶端程序也可以通過命令行選項替換這些設置。

如果代碼包含規定要工作在一個平台(即一種 CPU 架構和操作係統的結合)上並且它最近已經被驗證能在該平台上編譯並通過其回歸測試,PostgreSQL開發社區才會認為該平台是被支持的。目前,大部分平台兼容性的測試都是由PostgreSQL 編譯農場的測試機器自動完成的。如果你對在一個並沒有出現在編譯農場中的平台上運行PostgreSQL感興趣,但是代碼確實能夠工作或者能被修改得工作,我們強烈鼓勵你建立一個編譯農場成員機器,這樣進一步的兼容性可以被確認。

通常,PostgreSQL被期望能在這些 CPU 架構上工作:x86、 x86_64、IA64、PowerPC、PowerPC 64、S/390、S/390x、Sparc、Sparc 64、ARM、MIPS、MIPSEL、M68K和PA-RISC。存在對 M32R 和 VAX 的代碼支持,但是這些架構上並沒有近期測試的報告。通常也可以在一個為支持的 CPU 類型上通過使用--disable-spinlocks配置來進行編譯,但是性能將會比較差。

PostgreSQL被期望能在這些操作係統上工作: Linux(所有最近的發布)、Windows(Win2000 SP4及以上)、 FreeBSD、OpenBSD、NetBSD、OS X、AIX、HP/UX、Solaris 和 UnixWare。其他類 Unix 係統可能也可以工作,但是目前沒有被測試。在大部分情況下,一個給定操作係統所支持的所有 CPU 架構都能工作。查找下文的Section 16.7來看是否有與你的操作係統相關的信息,特別是使用一個老的係統時更應該這樣做。

如果你在一個平台上有安裝問題,並且該平台根據最近的編譯農場結果已經可以被支持,請將問題報告給pgsql-bugs@postgresql.org。如果你有興趣將PostgreSQL移植到一個新的平台,pgsql-hackers@postgresql.org是一個合適的討論它的地方。

這一節提供了考慮 PostgreSQL 安裝和設置的附加平台相關的話題。確保閱讀安裝知道,特別是Section 2。

這裏沒有覆蓋的平台不存在平台相關的安裝問題。

7.1. AIX

PostgreSQL 能在 AIX 上工作,但是正確地安裝它卻富有挑戰性。從4.3.3到6.1的 AIX 被認為是可支持的。你可以使用 GCC 或本地 IBM 編譯器xlc。通常,使用最新版本的 AIX 和 PostgreSQL 能有所幫助。在編譯農場中檢查有關已知能工作的 AIX 版本的最新信息。

被支持的 AIX 版本的最小推薦修理級別是:

AIX 4.3.3

Maintenance Level 11 + post ML11 bundle

AIX 5.1

Maintenance Level 9 + post ML9 bundle

AIX 5.2

Technology Level 10 Service Pack 3

AIX 5.3

Technology Level 7

AIX 6.1

Base Level

要檢查你當前的修理級別,在AIX 4.3.3 至 AIX 5.2 ML 7中使用 oslevel -r,或者在後麵的版本中使用 oslevel -s。

如果你已經在/usr/local中安裝了 Readline 或 libz,在你自己的選項之外使用下列configure標誌: --with-includes=/usr/local/include --with-libraries=/usr/local/lib.

7.1.1. GCC問題

在 AIX 5.3 上,使用 GCC 編譯和運行 PostgreSQL 有一些問題。

你將要使用 GCC 繼 3.3.2 之後的一個版本,特別是如果你在使用一個打包好的版本。我們在 4.0.1 上獲得了成功。早期版本的問題看起來更多地與 IBM 打包的 GCC 有關,而非 GCC 真正的問題,因此如果你自己編譯 GCC, 你更有可能使用早期版本的 GCC 取得成功。

7.1.2. Unix域套接字崩潰

AIX 5.3 有一個問題是sockaddr_storage定義得不夠大。在版本 5.3 中,IBM 增加了sockaddr_un(Unix域套接字的地址結構)的尺寸,但是沒有相應地增加sockaddr_storage的尺寸。這樣做的結果是在 PostgreSQL 中嚐試使用 Unix域套接字會導致 libpq 讓該數據結構溢出。 TCP/IP 連接工作正常,但是 Unix域套接字不行,這將使回歸測試不能工作。

該問題已經被報告給了 IBM,並且已被記錄為缺陷報告 PMR29657。如果你升級到 maintenance level 5300-03 或更新,將會包括這個修複。一種快速的解決方法是把/usr/include/sys/socket.h中的_SS_MAXSIZE改成 1025。在兩種情況中,一旦你得到了修正過的頭文件,你都需要重編譯 PostgreSQL。

7.1.3. Internet地址問題

PostgreSQL 依賴係統的getaddrinfo函數來解析listen_addresses、pg_hba.conf等中的 IP 地址。舊版本的 AIX 在這個函數中有各種各樣的缺陷。如果你存在與此有關的問題,更新到上文所示的合適的 AIX fix level 將會解決它。

一個用戶報告:

當在 AIX 5.3 上實現 PostgreSQL 版本 8.1 時,我們會周期性地碰到問題,在其中統計收集器會"神秘地"無法成功啟動。這似乎是在 IPv6 實現中意外行為的結果。看起來 PostgreSQL 和 IPv6 無法和 AIX 5.3 一起很好地工作。

下麵任意一種動作都可以"修複"該問題。

  • 刪除 localhost 的 IPv6 地址:

(as root)
# ifconfig lo0 inet6 ::1/0 delete
  • 從網絡服務刪除 IPv6。AIX 上的/etc/netsvc.conf大概等價於 Solaris/Linux 上的/etc/nsswitch.conf。在 AIX 上的默認值因此是:

hosts=local,bind

將其換成:


hosts=local4,bind4

來使 IPv6 地址的搜索無效。

Warning

這實際上是對有關 IPv6 支持不成熟性的問題的一種變通方案,這在 AIX 5.3 發布的過程中有了顯著地改進。它可以和 AIX 5.3 一起工作,但是不代表對此問題的一種華麗的解決方案。有報告稱該變通方案不僅僅是多餘的,還會在 AIX 6.1 上導致問題,在 AIX 6.1 中 IPv6 支持已變得更加成熟。

7.1.4. 內存管理

AIX 的特別之處在於它的內存管理。你可能有一個裝備有好多個吉字節空閑 RAM 的服務器,但是在運行應用時仍然會得到內存不足或者地址空間錯誤。一個例子是createlang會因為罕見的錯誤失敗。例如,作為 PostgreSQL 安裝的擁有者運行:


-bash-3.00$ createlang plperl template1
createlang: language installation failed: ERROR:  could not load library "/opt/dbs/pgsql748/lib/plperl.so": A memory address is not in the address space for the process.

作為擁有 PostgreSQL 安裝的組中的非擁有者運行:


-bash-3.00$ createlang plperl template1
createlang: language installation failed: ERROR:  could not load library "/opt/dbs/pgsql748/lib/plperl.so": Bad address

另一個例子是 PostgreSQL 服務器日誌中的內存不足錯誤,每次內存分配接近或者超過 256 MB 時都會失敗。

所有這些問題的總體成因是服務器進程所用的尋址空間和內存模型。默認情況下,所有在 AIX 上編譯的二進製都是32位。這並不依賴於硬件類型或使用的內核。這些32位進程被限製在 4GB 的內存中,並被使用幾種模型之一安排成 256 MB 的段。該默認值允許在堆中低於 256 MB,因為它和棧共享一個單獨的段。

在createlang的例子中,檢查你的 umask 和你的 PostgreSQL 安裝中的二進製的權限。這個例子中涉及的二進製是32位的並且被用模式 750 而不是 755 安裝。由於這種方式的權限設置,隻有所有者或擁有組的成員可以載入該庫。因為它不是所有人可讀的,載入器將該對象放在進程的堆中而不是它應該被放入的共享庫段中。

這個問題的"理想的"解決方案是使用 PostgreSQL 的64位編譯,但是這不是總是實用的,因為有32位處理器的係統可以編譯64位二進製但是卻不能運行它。

如果想要一個 32 位二進製,在開始 PostgreSQL 服務器之前將LDR_CNTRL設置為MAXDATA=0xn0000000,其中 1 <= n <= 8,並且嚐試不同的值以及postgresql.conf設置來找一個能讓你滿意的配置。這種LDR_CNTRL的使用告訴 AIX 你希望服務器留出MAXDATA字節給堆,以 256 MB 的段分配。當你找到了一個可工作的配置時,ldedit可以被用來修改二進製,這樣它們默認使用想要的堆尺寸。PostgreSQL 也可以被重新編譯,傳遞configure LDFLAGS="-Wl,-bmaxdata:0xn0000000"來達到相同的效果。

對於一個 64 位編譯,設置OBJECT_MODE為 64 並且傳遞CC="gcc -maix64"和LDFLAGS="-Wl,-bbigtoc"給configure(給xlc的選項可能不同)。如果你省略OBJECT_MODE的輸出,你的編譯可能會因為鏈接器錯誤而失敗。當OBJECT_MODE被設置時,它告訴 AIX 的編譯工具(如ar、as和ld)默認要處理哪些對象類型。

默認情況下,過量使用頁麵空間的情況可能會發生。不過我們還沒有看到過,當進程用盡內存並且出現了過量使用時 AIX 會殺死進程。我們見到過的最接近於此的是 fork 失敗,其原因是係統覺得已經沒有足夠的內存給另一個進程。和 AIX 的很多其他部分一樣,如果這成為了一個問題,頁麵空間分配方法和耗盡內存導致的殺死在係統範圍或進程範圍是可以配置的。

參考和資源

"Large Program Support", AIX Documentation: General Programming Concepts: Writing and Debugging Programs.

"Program Address Space Overview", AIX Documentation: General Programming Concepts: Writing and Debugging Programs.

"Performance Overview of the Virtual Memory Manager (VMM)", AIX Documentation: Performance Management Guide.

"Page Space Allocation", AIX Documentation: Performance Management Guide.

"Paging-space thresholds tuning", AIX Documentation: Performance Management Guide.

Developing and Porting C and C++ Applications on AIX, IBM Redbook.

7.2. Cygwin

PostgreSQL 可以使用 Cygwin 來編譯,它是用於 Windows 的一個類 Linux 環境,但是這種方法不如原生 Windows 編譯(見Chapter 17)並且我們已經不再推薦在 Cygwin 下運行一個服務器。

在從源代碼編譯時,按照正常安裝過程進行(即./configure; make; 等;隻要注意下列 Cygwin 相關的區別:

  • 將你的路徑設置為使用 Cygwin 的 bin 目錄並且把它放在 Windows 工具的前麵。這將幫助避免很多編譯的問題。
  • 不支持adduser命令;使用 Windows NT、2000 或 XP 上的用戶管理應用來替代。否則,跳過這一步。
  • 不支持su命令;在 Windows NT、2000 或 XP 上使用 ssh 來模擬 su。否則,跳過這一步。
  • 不支持 OpenSSL。
  • 為共享內存支持啟動cygserver。要這樣做,輸入命令/usr/sbin/cygserver &。這個程序在你啟動 PostgreSQL 服務器或初始化一個數據集簇(initdb)時的任何時刻都需要被運行。默認的cygserver配置可能需要被更改(例如增加SEMMNS)來防止 PostgreSQL 因為缺少係統資源而失敗。
  • 在某些不使用 C 區域的係統上編譯可能會失敗。要修複這個問題,通過在邊以前export LANG=C.utf8把區域設置為 C,並且在安裝完 PostgreSQL 之後把區域恢複成之前的設置。
  • 並行回歸測試(make check)可能產生虛假的回歸測試錯誤,這是由於溢出的listen()連接緩衝區,它會導致連接拒絕錯誤或掛起。你可以使用MAX_CONNECTIONS來限製連接數:

make MAX_CONNECTIONS=5 check

(在某些係統上你可以有大約 10 個同時連接)。

可以把cygserver PostgreSQL 服務器安裝為 Windows NT 服務。關於如何這樣做的信息,請參考包含在 Cygwin 上 PostgreSQL 二進製包中的README文檔。它被安裝在目錄/usr/share/doc/Cygwin中。

7.3. HP-UX

給定合適的係統補丁級別和編譯工具,PostgreSQL 7.3+ 應該可以工作在運行 HP-UX 10.X 或 11.X 的 Series 700/800 PA-RISC 機器上。至少一個開發者例行地在 HP-UX 10.20 上測試過,並且我們有在 HP-UX 11.00 和 11.11 上成功安裝的報告。

除了 PostgreSQL 源代碼發布,你將需要 GNU make(HP 的 make 不行),並且需要 GCC 或 HP 的 ANSI C 編譯器。如果你想從 Git 源編譯而不是一個發布包,你還將需要 Flex(GNU lex)和 Bison(GNU yacc)。我們還推薦確認你真的在使用最新的 HP 補丁。最低限度下,如果你在 HP-UX 11.11 上編譯 64 位二進製,你可能需要 PHSS_30966 (11.11) 或一個後繼補丁,否則initdb可能中止:

PHSS_30966 s700_800 ld(1) and linker tools cumulative patch

在一般原則上,你應該使用 libc 和 ld/dld 的當前補丁,如果你在使用 HP 的 C 編譯器也一樣要用當前的編譯器補丁。它們最新補丁的免費拷貝請見 HP 的支持站點如https://itrc.hp.comftp://us-ffs.external.hp.com/。
如果你正在一台 PA-RISC 2.0 機器上編譯並且項使用 GCC 得到 64 位二進製,你必須使用 GCC 的 64 位版本。HP-UX PA-RISC 和 Itanium 的 GCC 二進製可以從https://www.hp.com/go/gcc 得到。別忘了在同時獲取並安裝 binutils。

如果你正在一台 PA-RISC 2.0 機器上編譯並且想讓編譯好的二進製運行在 PA-RISC 1.1 機器上,你將需要在CFLAGS中指定+DAportable。

如果你正在一台 HP-UX Itanium 機器上編譯,你將需要最新的 HP ANSI C 編譯器,以及它的依賴補丁或後繼補丁:

PHSS_30848 s700_800 HP C Compiler (A.05.57)
PHSS_30849 s700_800 u2comp/be/plugin library Patch

如果你同時有 HP 的 C 編譯器和 GCC 的編譯器,那麼在運行configure時你可能希望顯式地選擇要使用的編譯器:


./configure CC=cc

用於 HP 的 C 編譯器,或者


./configure CC=gcc

用於 GCC。如果你忽略這個設置,configure 在可以選擇時會使用gcc。

默認的安裝目標位置是/usr/local/pgsql,你可能希望修改它為/opt之下的某個地方。如果是這樣,使用configure的--prefix開關。

在回歸測試中,在幾何測試中可能會有某些低序位差別,這會根據你使用的編譯器和數學庫版本而變化。任何其他錯誤都需要懷疑。

7.4. MinGW/原生 Windows

用於 Windows 的 PostgreSQL 可以使用 MinGW 編譯,它是一個用於微軟操作係統的類 Unix 的編譯環境。也可以使用微軟的Visual C++編譯器套件來編譯。MinGW 編譯使用本章中描述的正常編譯係統;而 Visual C++ 編譯的工作完全不同並且在Chapter 17中描述。後者是一種完全原生的編譯並且沒有像 MinGW 那樣使用額外軟件。在 PostgreSQL 的主網站上有一個現成的安裝器可用。

原生 Windows 移植要求一個 Windows 2000 或更高的 32 或 64 位版本。早期的操作係統沒有足夠的基礎設施(但 Cygwin可以用在它們之上)。類 Unix 的編譯工具 MinGW 和 MSYS(一個 Unix 工具集合,用於運行如configure之類的 shell 腳本)可以從https://www.mingw.org/ 下載。運行結果二進製兩者都需要,它們隻在創建二進製時需要。

要使用 MinGW 編譯 64 位二進製,從https://mingw-w64.sourceforge.net/ 安裝 64 位工具。把它放在PATH中的 bin 目錄,並且使用--host=x86_64-w64-mingw32選項運行configure.

在你安裝完所有的東西之後,我們建議你在CMD.EXE下運行psql,因為 MSYS 控製台有緩衝問題。

7.4.1. 在 Windows 上收集崩潰轉儲

如果 PostgreSQL 在 Windows 上崩潰,它有能力產生minidumps,這可以被用來追蹤崩潰發生的原因,這與 Unix 上的核心轉儲相似。這些轉儲可以被使用Windows Debugger Tools或Visual Studio讀取。要啟用在 Windows 上的轉儲生成,可在集簇數據目錄下創建一個名為crashdumps的子目錄。轉儲將被寫入到這個目錄,轉儲的名字基於崩潰進程的標識符和崩潰的當前時間來確定。

7.5. SCO OpenServer 和 SCO UnixWare

PostgreSQL 可以在 SCO UnixWare 7 和 SCO OpenServer 5 上編譯。在 OpenServer 上,你可以使用 OpenServer Development Kit 或 Universal Development Kit。但是可能需要一些調整,如下所述。

7.5.1. Skunkware

你應該找到你的 SCO Skunkware CD 的拷貝。Skunkware CD 被包括在 UnixWare 7 和當前版本的 OpenServer 5。Skunkware 包括很多在互聯網上可以得到的流行程序的待安裝版本。例如,gzip、gunzip、GNU Make、Flex 和 Bison 都被包括在內。對於 UnixWare 7.1,這個 CD 現在被標為 "Open License Software Supplement"。如果你沒有這個 CD,其中的軟件可以從https://www.sco.com/skunkware/ 得到。

對於 UnixWare 和 OpenServer,Skunkware有不同的版本。請確保你為你的操作係統安裝了正確的版本,除了以下需要注意的。

在 UnixWare 7.1.3 及其以後,GCC 被包括在 UDK CD 上作為 GNU Make。

7.5.2. GNU Make

你需要使用 GNU Make 程序,它位於 Skunkware CD 上。默認情況下,它作為/usr/local/bin/make安裝。

對於 UnixWare 7.1.3 及以上,GNU Make 程序是 UDK CD 的 OSTK 部分,並且在/usr/gnu/bin/gmake中。

7.5.3. Readline

Readline 庫在 Skunkware CD 上。但是它不被包括在 UnixWare 7.1 Skunkware CD 上。如果你有 UnixWare 7.0.0 或 7.0.1 Skunkware CD,你可以從那裏安裝 Readline 庫。否則,試試https://www.sco.com/skunkware/。

默認情況下,Readline 安裝到/usr/local/lib和/usr/local/include。但是,PostgreSQL configure 程序在沒有得到幫助的情況下將不能找到它。如果你安裝了 Readline,那麼對configure使用下列選項:


./configure --with-libraries=/usr/local/lib --with-includes=/usr/local/include

7.5.4. 在 OpenServer 上使用 UDK

如果你正在 OpenServer 上使用新的 Universal Development Kit (UDK) 編譯器,你需要指定 UDK 庫的位置:


./configure --with-libraries=/udk/usr/lib --with-includes=/udk/usr/include

把這些和 Readline 選項放在一起:


./configure --with-libraries="/udk/usr/lib /usr/local/lib" --with-includes="/udk/usr/include /usr/local/include"

7.5.5. 閱讀 PostgreSQL 手冊頁

默認情況下,PostgreSQL 手冊頁被安裝到/usr/local/pgsql/share/man。默認情況下,UnixWare 不會在那裏查看手冊頁。要能夠閱讀它們你需要修改/etc/default/man中的MANPATH變量,例如:


MANPATH=/usr/lib/scohelp/%L/man:/usr/dt/man:/usr/man:/usr/share/man:scohelp:/usr/local/man:/usr/local/pgsql/share/man

在 OpenServer 上,某些額外的研究需要被覆蓋來使得手冊頁可用,因為其手冊係統與其他平台有點不同。當前,PostgreSQL 將根本不會安裝它們。

7.5.6. 帶 7.1.1b 特性補充的 C99 問題

對於那些早於隨 OpenUNIX 8.0.0(UnixWare 7.1.2)一起發布的編譯器版本的編譯器,它們包括 7.1.1b 特性補充,你可能需要在CFLAGS或CC環境變量中指定-Xb。這種問題的跡象是在編譯引用內聯函數的tuplesort.c時的一個錯誤。顯然在 7.1.2(8.0.0)及以後的編譯器中已有修改。

7.5.7. UnixWare 上的線程

對於線程,你必須在所有使用libpq的程序上使用-Kpthread。libpq使用pthread_*調用,這些隻能在有-Kpthread/-Kthread標誌的情況下可用。

7.6. Solaris

PostgreSQL 在 Solaris 上得到了很好的支持。你的操作係統越新,你將會碰到更少的問題;細節如下。

7.6.1. 要求的工具

你可以使用 GCC 或 Sun 的編譯器套件進行編譯。為了更好的代碼優化,我們強烈推薦在 SPARC 架構下使用 Sun 的編譯器。我們已經得到一些使用 GCC 2.95.1 時的問題報告;我們推薦 GCC 2.95.3 或之後的版本。如果你正在使用 Sun 的編譯器,注意不要選擇/usr/ucb/cc;而是使用/opt/SUNWspro/bin/cc。

你可以從https://www.oracle.com/technetwork/server-storage/solarisstudio/downloads/ 下載 Sun Studio。很多 GNU 工具都被整合到了 Solaris 10,或者它們在 Solaris companion CD 中。如果你喜歡用於老版本 Solaris 的包,你可以在https://www.sunfreeware.com 找到這些工具。如果你想要源碼,在https://www.gnu.org/order/ftp.html 上找找。

7.6.2. OpenSSL 的問題

當你編譯 PostgreSQL 帶有 OpenSSL 支持時,你可能在下列文件中得到編譯錯誤:

  • src/backend/libpq/crypt.c
  • src/backend/libpq/password.c
  • src/interfaces/libpq/fe-auth.c
  • src/interfaces/libpq/fe-connect.c

這是由於標準/usr/include/crypt.h頭部和 OpenSSL 提供的頭文件之間的一個名字空間衝突導致的。

升級你的 OpenSSL 安裝到版本 0.9.6a 來修複這個問題。 Solaris 9 及以上有一個更新版本的 OpenSSL。

7.6.3. configure 抱怨一個失敗的測試程序

如果configure抱怨一個失敗的測試程序,可能的情況是運行時鏈接器無法找到某些庫,可能是libz、libreadline或某些其他非標準庫如 libssl。要向它指出正確的位置,在configure命令行上設置LDFLAGS環境變量,例如:


configure ... LDFLAGS="-R /usr/sfw/lib:/opt/sfw/lib:/usr/local/lib"

更多信息可見ld手冊頁。

7.6.4. 64-位編譯有時會崩潰

在 Solaris 7 和更老的版本上,64-位版本的 libc 有一個有缺陷的vsnprintf例程,這導致 PostgreSQL 中不穩定的核心轉儲。最簡單的已知解決方案是強製 PostgreSQL 使用它自己的vsnprintf版本而不是庫中的拷貝。要這樣做,運行configure之後編輯一個由configure產生的文件: 在文件src/Makefile.global中將行


LIBOBJS =

改成


LIBOBJS = snprintf.o

(可能有其他文件已經被列在這個變量中。順序無影響)。然後正常編譯。

7.6.5. 為最優性能編譯

在 SPARC 架構上,我們強烈推薦使用 Sun Studio來編譯。嚐試使用-xO5優化標誌來生成顯著加快的二進製。不要使用任何修改浮點操作和errno處理(例如-fast)行為的標誌。這些標誌可能會做出某些非標準 PostgreSQL 行為,例如在日期/時間計算中。

如果你沒有理由要使用 SPARC 上的 64 位二進製,最好用 32 位版本。64 位操作較慢並且 64 位二進製比其 32 位變體要慢。並且在另一方麵,AMD64 CPU 家族上的32 位代碼不是原生的,並且這也是問什麼在這個 CPU 族中 32 位代碼要明顯地更慢。

7.6.6. 用 DTrace 來跟蹤 PostgreSQL

是的,可以使用 DTrace。詳見 Section 28.5。你還可以在這篇文章https://blogs.oracle.com/robertlor/entry/user_level_dtrace_probes_in 中找到更多信息。

如果你看到postgres可執行程序的鏈接中斷並且報出下麵的錯誤消息:


Undefined                       first referenced
 symbol                             in file
AbortTransaction                    utils/probes.o
CommitTransaction                   utils/probes.o
ld: fatal: Symbol referencing errors. No output written to postgres
collect2: ld returned 1 exit status
make: *** [postgres] Error 1

說明你的 DTrace 安裝太舊,無法處理靜態函數中的探測。你需要 Solaris 10u4 或更新的版本。

最後更新:2017-08-19 01:32:40

  上一篇:go  《深度學習:Java語言實現》一一2.4機器學習應用流程
  下一篇:go  智慧醫療如何在醫療行業中出類拔萃?