顯示具有 PG維護:備份/還原:資料遷移 標籤的文章。 顯示所有文章
顯示具有 PG維護:備份/還原:資料遷移 標籤的文章。 顯示所有文章

2009-04-25

PostgreSQL vs Oracle - IBM利用EntepriseDB技術 蠶食Oracle客戶

EnterpriseDB 是將 BSD 授權的 PostgreSQL 包裝成商業產品的公司, 也是 PostgreSQL 開發者團隊中主力的貢獻來源之一, 詳情可參考本社群較早前的文章:

宣布 EnterpriseDB 與IBM的合作,其中包括最近發布的的 EnterpriseDB Advanced Server 8.2 Linux 在 IBM Z系統大型主機,以及提供的 EnterpriseDB Advanced Server for AIX 系統的 IBM System P Server。

從 Oracle 牽移到相容度與可靠性如同 Oracle 的 PostgreSQL, 能對企業節省多少錢呢 ? 來看看 EnterpriseDB 做的整理:

相了解更多可以參考下頁:
http://www.enterprisedb.com/solutions/ibm_db2_license.do

賽迪網訊 4月24日, News:
甲骨文(Oracle)宣佈收購 Sun 後,IBM 將利用資料庫庫軟體廠商 EntepriseDB 的技術蠶食甲骨文的客戶。據國外媒體報導稱,EnterpriseDB發言人稱,甲骨文應用軟體可以不加修改地在該公司的 PostgresPlus 上運行


IBM 資料庫業務副總裁阿溫德·克里須那表示,現在,甲骨文的應用軟體也可以在 DB2Release9.7上運行了,「利用 EnterpriseDB 的移植工具,精通甲骨文技術的資料庫管理員將能夠使用 DB2.資料庫。EnterpriseDB 的技術使甲骨文的 PL/SQL 查詢和預儲程序可以在 DB2 系統上運 行。」



EnterpriseDB 首席執行官愛德華·博亞簡表示,IBM 使用該公司的甲骨文相容性技術是「對其技術的認可。」
- 来源: 赛迪网 作者:刘彦青



相關新聞:
http://www.enterprisedb.com/company/news_events/press_releases/03_25_08a.do
http://www.theregister.co.uk/2008/04/07/ibm_enterprisedb_stake/

2007-05-05

從 Oracle 到 PostgreSQL 的 JDBC 概要手冊

更新:2007-05-05
對映章節:
http://www.postgresql.org/docs/techdocs.41

內容:
PGSQL 8.1 for J2EE/JDBC Applications

Robert Treat 是 PostgreSQL 開發團隊的長期的成員之一,
並著作有 Begining PHP and PostgreSQL 8 ,
這份文件是放在 PostgreSQL 國際官網上,
提供給從 Oracle 10g 10.2 版到 PostgreSQL 8.1 遷移過程中,
JDBC 應用的一些改變需求的基礎性概觀.

下載文件(PDF): pg_8.1_J2EE_v1.0.pdf (161.4 kb)





延伸閱讀(Link):

2007-04-18

[台灣應用實列]從 Oracle 遷移到 PostgreSQL

更新:2007-04-18
對映章節:
作者簡介: ingram, chen
Java狂,熱衷 server-side open source 技術。現於中研院某角落謀有一職,兼任 DinBenDon
長。(本文已連絡原著作者, 經同意後轉載.)

阿益:這是一篇很棒的遷移經驗談, 更具說服力的是作者來自台灣最高的學術研究單位:國立中央研究院, 從原本使用者 Oracle 到為何選擇 PostgreSQL 做了這篇文, 感謝作者同意轉載.

內容:
我們單位已經開始規畫將原本 oracle 的資料庫轉移到 PostgreSQL,原因無它,Oracle 對學術單位來說太 over kill,我們也鮮少使用 oracle 進階的功能。基於經費、維護上的考量,最後選擇改採 Open source 的 PostgreSQL。至於為啥不用 MySQL ? 表面的理由是 postgreSQL 和 oracle 在很多方面都很類似,轉移比較簡單,而 PostgreSQL 功能也比 MySQL 完整太多了。背後的理由嘛... 算是個人偏好與信仰吧?MySQL vs. PostgreSQL 對我來說就像是 VB vs. Java一樣。選擇 Java 的我自然也就選擇 PostgreSQL 囉。

Lob, Lob, Lob

轉移 db 最痛苦的欄位非 Blob, Clob 莫屬了,因為各家 db 對 lob 的做法都不一樣。PostgreSQL 本身並不支援Blob, Clob 欄位。你得使用 bytea, oid, text 等欄位來模擬。text 可以對應的 jdbc clob。而 bytea 與 oid 則對應到 Blob。bytea(byte array) 可直接在該欄位上儲存所有 binary 的資料,算是最簡單的做法。但缺點是 query 該 row 時也會一口氣把全部的資料都讀到記憶體裡... 除非是儲存一些 .gif, .jpg 之類的小檔,不然還是選擇採間接儲存的 oid 比較好。現行 hibernate 的工具會替 java Blob 產生 oid 的欄位型別。

oid 是 PostgreSQL 一個內藏指標,任何資料庫物件 (sequence/table/row... etc) 都有一個 oid。而 oid 欄位就是可儲存 oid 值的欄位。PosgreSQL 裡還有一個系統 table 叫 pg_largeobject,所有的 lob 物件都會存到這個公用的 table 上。我們來看看 blob 的資料會怎樣儲存:

table: MY_BLOBS
id(int8) filename(varchar) blob_data(oid)
==================================================
12 mydata.xls 20300
13 yourdata.png 20301

table: pg_largeobject
loid pageno data
==================================================
20300 0 134134134AED14134DD.....
20300 1 19AE3ADE91091999000.....
20301 0 1093101910519949592.....

MY_BLOBS.blob_data 裡記錄的 oid 直接對應到 pg_largeobject.loid 欄位。而 pg_largeobject.data 裡才是真正的 binary 資料。在預設的情況下,一筆資料最大是 8 kB,所以如果太長的資料會分段儲存,例如上面的 20300 就被分成兩頁存了 (pageno, 0 和 1)。ok, 這就是 blob 在 postgreSQL 間接儲存的做法。

blob 採用 oid 的缺點

  • 無法控管權限,任何可以存取該 database 的 user 都可以存取 pg_largeobject 的內容
  • 讀取 oid 的欄位要在 transaction 下操作。沒有 transaction 會丟 exception。
  • 修改/刪除 blob 會留下舊的資料,系統不會自動清除。(pg_largeobject 會留下一堆用不著的 binary data)

第一個問題對我們來說還好,只要管理得宜就不是問題。第三個就很麻煩了,隨著時間一長,垃圾資料會越來越多 (這種垃圾叫 orphan large object,請用 google 查一查....)。所幸已經有人寫工具專門來清理 -- 安裝 postgres-contrib 套件後,裡面有個 vaccumlo 的程式,只要用 cron 排程定期清理即可。至於讀取 oid 要在 transaction 下... 這個最慘了!我們過去的程式讀取 blob 都沒有在 transaction 內,而且有些部份是仰賴 OpenSessionInView 這個 pattern 來減輕 DAO 的實做 (note 1),因為這些在 oracle 上都沒有問題。現在 port 到 postgreSQL,程式得被迫重新再檢驗一次,甚至改寫.... orz。再次證明即使使用了 hibernate,migrate db 還是相當頭痛的一件事。

note 1: Spring 的 OpenSessionInViewFilter 在 page render 這個階段並沒有包 transaction,所以遇到 oid 也會出 exception。

奇特的 hibernate blob truncate bug

除了上面三個 oid 的缺點外,搭配 hibernate 使用時還有個 bug (?)。看看下面這段程式:

  1. //Read and update in transaction
  2. Transaction transaction = session.beginTransaction();
  3. MyEntity myEntity = (MyEntity) session.get(MyEntity.class, new Long(12));
  4. byte[] readBytes = IOUtils.toByteArray(myEntity.getData().getBinaryStream());
  5. assertEquals(1000, readBytes.length); // data is 1000 bytes.
  6. myEntity.setFilename("makeSomeChange.txt");

  7. // fileName got updated but blob is truncated to 0 byte at database!
  8. session.saveOrUpdate(myEntity);
  9. transaction.commit();
  10. session.close();

MyEntity 有兩個 property,一是 fileName(varchar),二是 data(blob by oid)。上面的程式很簡單,(1) 開始 transaction ,(2) 讀出一筆 myEntity,(3) 裡面的 blob 讀出來變成 byte array (4) 修改檔名 (5) update myEntity 回資料庫 (6) transaction commit。可以預期的是,這一筆 myEntity 應該只會修改 fileName 欄位,其他欄位都不變... 呃,回頭查一下 db,發現 pg_largeobject 裡的資料長度竟然變成 0,資料無故被砍了!究其原因,應該是 hibernate 將 "讀到空的 binary inputStream" 也寫回 db 裡去了!真是個大 bug 地雷。貼到 hibernate 論譠但是沒人理... orz。所幸還是有暫時的解決方案,昨個參加 Javaworld TWJUG,Cyberjos兄建議替 mapping 加上 dynamic-update="true"

  1. <class name="MyEntity" table="my_entity"
  2. dynamic-update="true">

我試了結果果然可行。hibernate 產生的 update sql 就不再包含 oid 那個欄位了,因此也不會有讀過的資料被砍的問題。dynamic-update="true" 的功能是 update 時,只替 dirty 的欄位產生 set foo = ? ,所以能夠避免不必要的 update。

結語

我們的程式不採用 file system,而使用 lob 來儲存檔案有幾個原因:

  • Lob 支援 transaction,file based 的沒有。
  • 資料都統一放在 db 裡,簡化備份。
  • 檔案都不是很大

但是 jdbc/hibernate/blob/clob 卻讓我們開發過程中吃足了苦頭:oracle9i 時期的 jdbc driver 處理 lob 時會有 leak、而目前最新的 oracle jdbc driver 處理 clob 時,遇到長度為 1000~2000 byte 的檔案會出錯 ( <1000> 2000 時就沒問題.... 別問我為什麼)... blah blah。現在我們打算擺脫 oracle 了,想說 postgreSQL 應該就沒這些怪問題了,結果還是有一堆東西要調整... lob 真是讓人又愛又恨啊。


延伸閱讀(Link):
PostgreSQL 大型物件 BYTEA vs OID

2007-03-14

PostgreSQL 高可靠性與預寫式日誌(WAL)

更新:2007-03-15
對映章節:III.C27
版本限制: > 7.1

內容:
商用 DBMS 為了確保在系統非預期下潰散後, 仍可複原至近 100% 潰散前的 DB 狀態, 大多採用 類似 PostgreSQL 預寫式日誌(Write-Ahead Logging :WAL)的關念, 預先將一連串的操作先行寫入到日誌檔, 來預防系統潰散時的損失, 對 DBMS 而言這是提高 HR 的重要功能.
(PostgreSQL 在 7.1+版後加入本功能, 至今仍不斷改良使用中)

高可靠性(High-Reliability)
PostgreSQL 的實現方式:
WAL 提供了資料庫即時備份和恢復(backup and restore (BAR))的實作

  • 熱備份(Hot backup):利用 pg_dump 取得一定時間點的復原資料.
  • 利用 WAL 來復原損失最少的狀態.
2.預寫式日誌(WAL:Write-Ahead Logging)
說明:
預寫式日誌WAL) 是一種實現交易日誌的標準方法。WAL 的中心思想是對資料文件的修改(它們是資料表和索引的載體)必須是只能發生在這些修改已經記錄了日誌之後, 也就是說,在描述這些變化的日誌記錄沖刷到永久儲存器之後。
如果我們遵循這個過程,那麼我們就不需要在每次交易提交的時候都把資料頁立即儲到磁碟,因為我們知道在出現崩潰的情況下, 我們可以用日誌來恢復資料庫:任何尚未附加到資料頁的記錄都將先從日誌記錄中重做(這叫向前滾動恢復,也叫做 REDO)。
(This is roll-forward recovery, also known as REDO.)
好處:

使用 WAL 的第一個主要的好處就是顯著地減少了磁盤寫的次數。 因為在日誌提交的時候只有日誌文件需要沖刷到磁盤;而不是交易修改的所有資料文件。 在多用戶環境裡,許多交易的提交可以用日誌文件的一次 fsync() 來完成。而且,日誌文件是順序寫的, 因此同步日誌的開銷要遠比同步資料頁的開銷要小。 這一點對於許多小交易修改資料儲存的許多不同的位置更是如此。

另外一個好處就是資料頁的完整性。

2007-03-07

PostgreSQL GUI 管理工具彙報

更新:2007-03-07

內文:
PostgreSQL 的 GUI 管理工具可以有多重的選擇與各有特色,
個人認為除了以開放源碼的為主外, 亦可善用商業版本的特定功能,
而非固守一項, 必竟各有所長.

個人評註和心得如下:

1. pgAdmin III (Free) 多國語(含 正/簡體中文)
http://www.pgadmin.org
當前版本: 1.6.2
是 PostgreSQL 原生的 GUI 管理工具專案, 同時會發佈各種平台版本供免費下載使用.
功能上足以勝任必要的管理工作, 且會忠實的承現相關操作的 Script 順便學習它的語法架構.

  • 可直接管理 Service 的啟用與停用.
  • 擁有系統管理的狀態檢視介面.
  • SQL 查詢工具具 TAB 鍵自動完成功能.
  • 能輸出各種有關的管理報告.
  • *具有自己的備份與還原的管理與二進制壓縮封裝檔及明文等三種模式可選.(COPY)
  • *支持 Slon-I 的複寫叢集管理功能.
  • *支持 Maintain Database



2. phpPgAdmin (Free) 多國語(含 正/簡體中文)
http://phppgadmin.sourceforge.net
當前版本: 4.1
Web 介面的管理工具, 前提是要有 php 可執行的環境, 便於 Web 使用.
*運用 pg_dump 創建完整語法和運用 COPY 來導資料的純文字檔.(效率好)
*支持 Slon-I 的複寫叢集管理功能
.
*支持 Maintain Database




3. Navicat PostgreSQL (約 USD $200) (目前無中文)
http://pgsql.navicat.com
當前版本: 7.2.11
目前屬難易適中且易於操作的 的商業型 GUI 管理.
但目前僅有 Windows和 MAC OS平台, 無 Linux.
*具有自己的備份與還原的管理與二進制檔亦有純 pg_dump script.(運用 INSERT )
*不支持 Slon-I 的複寫叢集管理功能.
*支持 Maintain Database
*有較多的資料(轉入/出)格式易於遷移.




4. SQL Manager 2005 for PostgreSQL (約 USD $700) (目前無中文)
http://sqlmanager.net/products/postgresql/manager/
當前版本: 3.8.0.2
承襲其家族(EMS)對 SQL 管理的專業血統, 功能強大, 也比較複雜, 不適合入門者使用.
但對想深入了解 PostgreSQL 的運作和架構者, 是不錯的剖析研究輔助工具.
但只有 for Windows 版本可以使用.
(對於 data 的語系顯示在 3.8.0.2 版不支持 Client_encoding = UTF-8)
*圖形化的系統設計與剖析工具.
*
SQL 查詢工具具 TAB 鍵自動完成功能及更豐富的GUI設計工具.
*運用 pg_dump 創建完整語法和運用 INSERT 來導資料的純文字檔(效率差).
*不支持 Slon-I 的複寫叢集管理功能.
*有較多的資料(轉入/出)格式易於遷移.
*支持 Maintain Database


建議:
在"管理"系統方面, pgAdmin 最為強項, 在 SQL "設計"方面 EMS PostgreSQL 為強, 在行動性上以 phpPgAdmin 為最方便, 在易於了解與入門學習性則以 Navicat 為強.
以目前的情況來論, 進行 Backup/Restore 還是採用 pgAdmin > phppgadmin > Other, 因為採用的還原備份是用 COPY 而非 INSERT, 當資料量巨大時, 還原的時間差距達 70%以上.

2007-03-06

pgAdmin III 的備份功能與 GUI 操作

更新:2007-03-06
對映章節:

內容:
pgAdmin III 是 PostgreSQL 重點發展的 GUI 管理工具, 幾乎所有的 OS 平台都有可以使用它. 比起其它由商業型發展的 PostgreSQL 工具, 在目前上功能可能不及, 但 pgAdmin 的專案卻週週都在進行對下個版本的功能開發與修正, CVS 的活動率算是相當勤奮, 在不久的將來便可以達到商業水準, 目前正在進行 1.8版的開發預計隨著 PostgreSQL 8.3 版的來到同時發佈.

pgAdmin 內建有專屬的備份/還原(Backup/restore)功能和GUI, 可選用的參數也很齊全.
操作時有二個方法:

  1. 先點選要進行備份的 DB 在到功能列上: 工具------>備份 或者 備份回存
  2. 點選要備份的 DB 再按 mouse 右鍵出現小選單: 備份 或者 備份回存.


再給予檔名, 路徑和指定的參變數就可以了, 會存為 *.Backup 的 pgAdmin 專屬備份包.

2007-03-05

mysql2pgsql :給 MySQL 用戶遷移至 PostgreSQL 的轉換程序稿本

更新:2007-03-06

專案及下載網址:
http://pgfoundry.org/projects/mysql2pgsql/

目前版本:1.2 (2007.03.04 更新)

內容:
這是個很成熟的 PgFoundry 的子專案,
perl 稿本程序用來轉換 mysqlDump.sql 文件檔成 postgresDump.sql 文件檔。
然後您再裝入到 psql 。所有 datatypes 都能被處理並且有著 7 個指令旗標可被利用。

下載後只要有 perl 的執行環境就可利用
在 Linux 下的話先變更執行權限

#chmod a+x mysql2pgsql.perl

下面能輸出詳細使用說明

#perl mysql2pgsql.perl --help
==========================================
Usage:

perl ./mysql2pgsql.perl {--help --debug --preserve_case --char2varchar -- nodrop --schema --sepfile --enc_in --enc_out } mysql.sql pg.sql

* OPTIONS WITHOUT ARGS
--help: prints this message
--debug: output the mysql line above the postgres line
--preserve_case: prevents automatic case-lowering of column and table na mes
If you want to preserve case, you must set this flag. For exampl e,
If your client application quotes table and column-names and the y have cases in them, set this flag
--char2varchar: converts all char fields to varchar
--nodrop: strips out DROP TABLE statements
warnings are printed by psql for DROP TABLE statements if the ta ble does not exist

* OPTIONS WITH ARGS
--schema: outputs a line into the postgres sql file setting search_path
--sepfile: output foreign key constraints and indexes to a separate file so that it can be
imported after large data set is inserted from another dump file
--enc_in: encoding of mysql in file (default utf8)
--enc_out: encoding of postgres out file (default utf8)

* REQUIRED ARGUMENTS
mysql.sql (undefined)
pg.sql (undefined)
#

2007-03-02

Sun-PostgreSQL 勝利獲得 Oracle 的客戶

更新:2007-03-02
對映章節:[新聞]2007-02-22
LinuxWorld : Sun-PostgreSQL win takes swing at Linux, Oracle



內容:
(擷取相關重點如下)
SUN 在2005 年底時, 宣佈它的意圖貢獻並支持開放來源碼的 PostgreSQL 資料庫在它的旗艦產品 Solaris 10 作業系統上, Sun Microsystems 的發佈勝利獲得了 Linux 和 Oracle 的顧客。

SUN 發表了一份文件在網站上, 公司概述一客戶從 ORACLE 到 PostgreSQL 資料庫和起因於一個未通過的測試項目使它選擇了 Solaris 10 而結束 Linux。

這個顧客, 是"一家大資料庫行銷公司", 是基於開放源碼 Maryland-based顧問 OmniTI.

在它的報告中, SUN 宣稱 OmniTI 的遷移從自有的應用程序到 PostgreSQL 替它的顧客由"受到軟體成本扶搖直上威脅" 的資料庫給了警示。

該公司現有近一半TG(terabyte)的 OLTP 資料在尖峰時每秒有 10,000 筆事務交易並且它的資料倉儲消耗 1.2 TG(terabytes)的資料。

"要求稱對 OLTP 和資料倉庫操作的自有的資料庫申請依據應用的每 CPU 數執照會是極端昂貴的," SUN : "這個開放來源碼 PostgreSQL 資料庫應用, 另一方面, 沒有使用執照的成本。"

連結: PostgreSQL for Solars 10

2007-02-19

PostgreSQL 例行程序維護工作 - VACUUM 概要

對映章節:III.C22.1

版本差異:
8.0+ 增加可詷整的組態參數選項
8.1+ 增加 Auto-Vacuum Daemon

目的:
清理與最佳化資料庫的索引定義, 另可清理因頻繁更新資料殘存在內部的"垃圾記錄"

  1. 恢復由已更新的或已刪除的行佔據的磁盤空間。
  2. 更新 PostgreSQL 查詢規劃器使用的資料統計資訊。
  3. 避免因為事務 ID 重疊造成的老舊資料的遺失。
phpPgadmin 擷圖:

不是很想對這名詞做中文化, 原因是翻成"清理"...似乎不太能代表這重大功能原文的含義.

pgAdmin III 擷圖:


由來:
RDBMS 利用"定義索引"技術來加快搜尋.
透過 Vacuum 技術來"清理和整理"索引.

選項:
  1. 完整的:會對所有資料表進行 Vacuum, 缺點就是費時.
  2. analyze: 進行更詳細的索引分析, 更費時, 但能建更有效率的執行計劃.
限制條件:
Vacuum 這維修工作期間會locks住資料表, 導致無法存取.
建議在深夜或是使用少時排定行程.

2007-02-01

備用還原方法-pg_dump and pg_restore

Debian:
/usr/bin/pg_dump, pg_dumpall, pg_restore 都被 link 到
/usr/share/postgresql-common/pg_wrapper

pg_dump [db_name] -D > [bak_db_name.sql]

#留意對寫入位置的"postgres"用戶權限問題

EX.
pg_dump dbname -D > db.sql

pg_dump
優點:
1.用於製作異質平台的DBMS的轉儲功能.
缺點:
1.備份回存的速度非常緩慢
.

備份指令:

pg_dump -Fc -i -EUTF8 -O -x -hlocahost -Upostgres -W -fc:\test_databse.backup test_databse

恢復指令:

pg_restore -dtest_databse -Fc -i -l -O -x -hlocahost -Upostgres -W -f c:\test_databse.backup

在這個例子中,編碼為UTF8,主機為localhost,用戶名為postgres,數據庫為 test_databae, 備份恢覆文件為test_databse.backup

2007-01-15

pgAgent - pgAdmin III 內建專屬的工作排程員

官方說明和教學(英文)

換我來寫構建範例吧~
阿益~一直都是用 Debian Linux 來建置 Server 的應用...
所以只好專寫 Debian 囉...

  1. 請確定您的 PostgreSQL 一切正常.
  2. #apt-get install pgagent
    pgagent: /usr/bin/pgagent
  3. (有急事, 晚點寫@@")

PostgreSQL & Google-Analytics Running...

::Planet PostgreSQL::

PostgreSQL Information Page

PostgreSQL日記(日本 石井達夫先生Blog)

PostgreSQL News

黑喵的家 - 資料庫相關

Google 網上論壇
PostgreSQL 8 DBA 專業指南中文版
書籍內容討論與更多下載區(造訪此群組)
目錄下載: PostgreSQL_8 _DBA_Index_zh_TW.pdf (更新:2007-05-18)

全球訪客分佈圖(Google)

全球訪客分佈圖(Google)