資料庫相關

如何在 Ubuntu 下安裝 PostgreSQL 9.0 和 pgAdmin III 1.12.0

按照「官方說法」,PostgreSQL 9 的 Ubuntu 套件會在 11.04 版釋出時隨著釋出。所以這篇文章的時效性可能只有一個月不到,但是我仍然決定丟上來。因為世事難料,誰都不會想到日本會發生 9.0 強震,並且引發史上第二大的海嘯,還一併發生史上第二嚴重的核子安全事件;那誰又能預知 PostgreSQL 或 pgAdmin III 在下一版的 Ubuntu (11.04) 發行後,是不是還能保持最新版本的更新。別忘了,RHEL/CentOS/Fedora Core 版本的 PostgreSQL rpm 套件,仍然是社群版本的更新速度是最快的。如果你一直只是跟隨 Redhat 官方版本,那恐怕早就被怪客搞得七葷八素了。

PostgreSQL 的版本

這個標題,可能很多人看都不看,就略過這篇文章,就像我在上 PostgreSQL 課程的時候,我的投影片裏有一頁提到查看 PostgreSQL 版本的方法。而這一頁被一些意見比較多的學生私下抱怨,認為我在灌水,增加篇幅。而我想略過不看這篇文章的朋友,大概也是認為這篇文章不重要吧。其實不然,尤其是當你碰到的伺服器,不是由你全新安裝的,而是要幫忙維護的舊系統時,目前所安裝的版本,就要相當當心並注意了!

先提一下,PostgreSQL 安裝時,server 和 client 可以是不同版本。而這種版本的不一致,的確有潛在的危險可能會發生。如果 client 端比較舊,那還無所謂;但是若是 server 端的版本較舊時,你就要當心了。

你想要知道伺服器的版本,那可以從 psql 或 pgAdmin III 直接下 SQL 指令:

postgres=# SELECT version();

即可。

在 Ubuntu 上的 PostgreSQL 預設存取認證方式

在 FreeBSD 和 CentOS 上,第一次著手使用 PostgreSQL 非常容易,因為 root 的密碼你會知道,所以只需要以下列這兩個指令,就可以不用知道安裝程式到底替你的 pgsql 或者 postgres 指定了什麼複雜的密碼,你都可以切成 PostgreSQL 的系統帳號,來執行該有的管理命令:

$ su

# su - pgsql (這是在 FreeBSD ,或者)

# su - postgres (這是在 CentOS 上)

在 FreeBSD 上第一步更輕鬆,因為 FreeBSD 上的 PostgreSQL port 版的預設 pg_hba.conf 設定,把 localhost 和本機使用 Unix domain socket 的權限,設成最寬鬆的

Npgsql

如果你常常在微軟的世界裏寫程式,你一定知道什麼是 .Net Data Provider,它就是 .NET 資料庫程式設計用的資料庫驅動程式,而 PostgreSQL 專屬的官方 .Net Data Provider 就是 Npgsql。Npgsql 目前是 PostgreSQL 的應用程式界面中,維護的速度前三名的;另兩個是 ODBC driver 和 JDBC driver。半個月前 Npgsql 釋出 2.0.7 版。這只是 2.0 版的第七個安全性更新。已經釋出一年的 2.0.x 版,實作了給 .Net 2.0 和 3.5 甚至 3.5sp1 的 .Net Data Provider 絕大部份的功能。也就是說,如果你是在用微軟的 Visual Studio 2008 寫程式,不管你是用 C#、VB 還是 C++,就是用這個 Data Provider 就對了,就算你用的是不用錢的 Visual Studio Express 也能。

實作建立新的 Tablespace

上個星期發表的 PostgreSQL 的 Tablespace 只有文字說明。事實上,我曾想用圖來解說 Oracle 的 tablespace 的架構,順便也畫一張 PostgreSQL 的架構圖,但是人懶沒畫Tongue out;不是啦,其實是我不太會用繪圖軟體,等我有空再慢慢把圖補起來。但是,如果實作一下在 PostgreSQL 建立一個新的 tablespace,然後 demo 一下是做得到的。

PostgreSQL 的 Tablespace

這一篇文章原本是三個月前就開始寫,原先預定是剛好九月底時出刊,但是在發展的過程,突然覺得似乎應該先介紹一下 PostgreSQL 如何來放置、維護資料,再來聊聊 Tablespace 可能比較適當,接著生了一場重病再加上發神經買了一台新電腦,所以就放到現在才發表。

PostgreSQL 在進入 8.0 版時,整套系統的架構大變,新增了不少功能和架構, Tablespace 就是其中一項。當我第一次在 pgAdmin III 上看到 Tablespace 這個字眼出現時,我是非常興奮的,因為要在較大型的資料庫中,才會有這種概念。尤其是之前有 Oracle 的實作經驗,所以看到熟悉的字眼出現時,備感親切,而內心對它充滿期待。但是在進一步深入研究後,就有如被潑了一桶冷水一樣,PostgreSQL 的 Tablespace 和 Oracle 的 Tablespace 功能上差距還不小,實作上更是不一樣。

首先來說明一下,什麼是 Tablespace?Tablespace 一般都翻譯成表格空間。而表格空間,按照手冊上的定義,是整個系統的資料主體。

PostgreSQL 如何組織資料

原本上個月,打算寫另一篇文章,但是寫到一半,臨時改變計劃,決定先把這篇文章推出來。

在教授 PostgreSQL 時,我發覺,要讓稍微有點基礎的其它資料庫使用者,最容易上手 PostgreSQL 的方法,就是從說明 PostgreSQL 如何在檔案系統中放置你的資料著手。PostgreSQL 存放資料的邏輯相當簡單,所以進階使用者在了解這個邏輯後,很容易就能了解如何備份、擴充功能等等進階功能,不像 Oracle 等商用資料庫,把資料包在一層厚厚的黑盒子裏,不讓你接觸和了解它的行為;但是很不幸的,它也相當程度的依賴檔案系統。這會出現什麼問題呢?等我介紹完 tablespace 後,我想不用我多做解釋你也自然立刻能夠了解。

在開始介紹前,我要介紹一個環境變數。這個環境變數是 $PGDATA,將來我會找個時間把 PostgreSQL 會用到的環境變數做個整理,再另外發表一篇文章來介紹。垷在先稍微介紹一下 $PGDATA

PostgreSQL JDBC 客戶端以 SSL 傳輸資料,以 NetBeans 為例

上次 利用 SSL 讓 PostgreSQL 有一個安全的網路傳輸 談到如何在 PostgreSQL 伺服器端上設定,讓資料通訊能夠以 SSL 加密所要傳送的資料。那篇文章的最後,我留了一個伏筆,不在該篇討論客戶端的連接。那是因為依客戶端的特質的不同,SSL 加密連接的設定方式也就不同,如果要在當時就討論,那麼那篇文章就太過冗長了。PostgreSQL 的客戶端的連接方式很多,如果你用的語言是 C,那麼你可以直接用 libpg 這類的 API 直接連接;用 Java 的,當然得透 JDBC driver (除非你太閒,想證明自己的實力,用 JNI 來寫);如果你用 MS Access,那麼就要用 ODBC 來連接;如果你要用 Visual BASIC.NET、C# 則用 .NET provider......。換句話說,客戶端不同時,SSL 的設定方式就不同。

利用 SSL 讓 PostgreSQL 有一個安全的網路傳輸

如果你的資料庫應用,全都只能讓伺服器本機上的應用程式連線使用,那麼就太過暴殄天物了。RDBMS 原本就是設計來讓多人同時使用的,我們評比一個資料庫系統的良莠,有一個評定的標準就是同時連線的數目,看看這套資料庫管理系統,同時可以服務多少使用者。所以從網路上連上資料庫就變成相當稀鬆平常的應用。但是,一旦資料在網路上傳遞,就有資料外洩的考量。如果你存放的資料不怕被外人窺視也就算了,但是這是不可能的事,一般公司存放在資料庫中的資料,絕對都是機密性高的資料,所以當你的應用程式和資料庫間,一旦有人得以偷窺資料封包時,恐怕資料外洩是勢必難避免的。

那麼,我們所安裝的 PostgreSQL 在網路上傳遞資料的安全性是如何呢?如果是預設安裝,那麼很抱歉,在 FreeBSD 上的 PostgreSQL port 是極不安全的,連密碼都是以明碼的方式在網路上傳遞的。很不幸的,Windows 版本也是。Ubuntu 比較好,預設已把 SSL 支援加上,但是它也有缺點,缺點和 Debian 一樣,改版的速度太過緩慢,慢到會讓人抓狂,尤其是安全性更新。

PostgreSQL 在 FreeBSD 上的大版本升級

唉!升級...升級...升級...這一陣子一直升級,這次輪到 PostgreSQL 大升級。PostgreSQL 不像其它軟體,即使是 8.2 升級到 8.3,也必須大改,所以無法直接用 upgrade 工具直接升。即使是 Windows 版本,也必須勞心費力一番。這次我用 FreeBSD 版本的升級做為例子,來說明最簡單也是最正確的大改版升級步驟。

首先,請先把原本資料庫的資料完全備份下來。如果你是 Windows 的使用者或是 Linux 的使用者,你可以考慮使用 pgAdmin III 的「工具」選單中的「備份」或「備份全域」來做,這樣簡單很多,但是由於 pgAdmin III 的說明太少,我實在看不懂「備份」對話方塊中選項的含意,所以乾脆不用。最正式的方法是使用在 console 下的工具:pg_dump 和 pg_dumpall。兩者的差別在於,前者可以針對某個特定的 database 做備份,而後者一般用來把整個伺服器資料做完整的備份。我建議直接使用 pg_dumpall 比較方便和快速。

訂閱文章