底下,是EnterpriseDB初學者的我,對於所測到的一些Oracle與EDB(EnterpriseDB)之間,架構上的差異的記錄,若有錯誤,請高手不吝指正,謝謝!
1、Tablespace
(1)
Oracle中,是一個Tablespace由多個檔案組成;
EDB中,是將同一個Tablespace的資訊,儲存在同一個目錄中。似乎是一個物件一個檔案去儲存,以1G為大小限制,超過者會再產生一個xxx.1繼續儲存,依此類推。
(2)
EDB中'pg_'開頭者,為系統用之Tablespace,一般的Tablespace,不能命名為以'pg_'開頭。
(3)
$PGDATA/pg_tblspc目錄中,記錄每個非內建tablespace的目錄位置
2、Schema & Account:
Oracle中,Schema與帳號,是搭配運作的,也就是帳號與Schema的名稱相同;
EDB中,要分別建立schema與Login Role,權限管理,是以Role去進行(Role與Schema是多對多關係)。
3、DB & Role & Tablespace:
Oracle中,Role(account)與Tablespace都是DB中的物件,
EnterpriseDB中,Role、Tablespace是不屬於任何DB,可供各DB中schema內的物件共用。
由底下Postgres Studio的TreeView中,就可表示出來:
4、database cluster:
Oracle中,cluster指的是Oracle Real Application Cluster (RAC)架構,也就是多個DB instance同時共用Storage的HA、Failoever、Load Balance並存的架構;
EDB中,是指同一個連線中可以建立多個database,這些DB稱為database cluster,就如同Oracle中的instance。
5、synonym:
Oracle中,提供private、public同義字,
EDB中,只提供public同義字。(superuser權限者才可建立)
6、schema間的權限:
EDB中,預設情況,使用者(role)不能存取非本身擁有之schema物件,即使物件已經授權給role,必須要另外再授權schema的USAGE權限,如
grant usage on schema eip to purchase;
(其中,eip是schema_name,purchase是role_name)
7、OS上ACCOUNT及GROUP:
Oracle在Linux上的帳號預設的group為dba等等,使用者大多使用oracle;
EDB在Linux上安裝,基本版會建立自動postgres帳號與群組,為PostgreSQL的superuseruser。
企業版會建立自動enterprisedb 帳號與edb群組,為PostgreSQL的superuseruser
8、EnterpriseDB之使用限制:
Limit Value
Maximum Database Size Unlimited
Maximum Table Size 32 TB
Maximum Row Size 1.6 TB
Maximum Field Size 1 GB
Maximum Rows per Table Unlimited
Maximum Columns per Table 250 – 1600 depending on column types
Maximum Indexes per Table Unlimited
postgrlsql 還是有繼承特性的?物件關聯式資料庫?喔,可安裝於Win與Linux/ Unix 等等。
其特色有MVCC(Multi-Version Concurrency Control)維護資料的一致性。
具有類似於Oracle REDO log的 Write ahead Logs(WAL)預寫日誌。
Object-relational In PostgreSQL, every table defines a class.
PostgreSQL is an open-source, client/server, relational database.
PostgreSQL includes support for geometric data types such as point, line segment, box, polygon, and circle.
參考EnterpriseDB FAQ(http://www.enterprisedb.com/products/allfaq.do)
9、字元集支援
Postgres Plus 擁有很多字元集可以選擇但隨著時代的演進, Postgres Plus 對中文的系統編碼也跟著改變.
在建立資料庫時
CREATE DATABASE .... ENCODING = '[encoding]'...)
createdb -e [encoding]
已不再支援 BIG5, GBK, GB18030 此三個字元集,均為無效值.
舉例:
=# CREATE DATABASE testg51 ENCODING = 'BIG5';
ERROR: BIG5 is not a valid encoding name
目前均建議採用 UTF-8 或者考慮使用 EUC_TW, EUC_CN
10、更改資料庫名稱
一般使用過Oracle資料庫的人都知道,一個oracle instance只能掛載一個資料庫,而且如果當您
建立完資料庫名稱後,事後欲修改其資料庫名稱非常麻煩,須關閉資料庫且重建Controlfile。
但在Postgres Plus呢?就非常簡單啦,只要下以下的語法就可以達到此目的囉:
edb=# alter database rep2 rename to rep3;
11、資料庫密碼檔
Oracle中:通常密碼檔會儲存在$ORACLE_HOME/database底下的PWD<SID>.ORA檔中
EDB中:
一般而言在使用psql進入database時,往往要經過帳號密碼驗証是否很麻煩呢?其實有兩種方式可以讓使用者不用輸入密碼即可進入psql互動模式:
1.透過密碼檔(.pgpass)
2.透過pg_hba.conf
當postgres Plus安裝在Linux時,密碼檔為「.pgpass」一般位於enterprisedb帳號家目錄,屬於隱藏檔。
如在Windows環境下為pgpass.conf
語法:
主機名稱:埠號:資料庫:使用者帳號:密碼
localhost:5444:edb:enterprisedb:edb
localhost:5444:*:enterprisedb:edb
第一行範例表示為:
使用enterprisedb帳號登入本機edb資料庫,其資料庫服務埠號為5444,故如欲使用psql進行互動模式時,則不需再輸入帳號密碼即可進入。
第二行範例表示為:
使用enterprisedb帳號登入本機任何資料庫,其資料庫服務埠號為5444,故如欲使用psql進行互動模式時,則不需再輸入帳號密碼即可進入。
12、SQL*Plus & EDB*Plus
Oracle:SQL*Plus
EDB:EDB*Plus,另外還有EDB-PSQL(目前還無法區分兩者有什麼不同)
13、bin目錄位置:
Oracle:$ORACLE_HOME/bin
EDB:<PG_HOME>/dbserver/bin
14、data目錄位置:
Oracle:$ORACLE_BASE/oradata(可另外指定)
EDB:<PG_HOME>/data
15、反安裝:
Oracle:執行Universal Installer進行反安裝
EDB:8.3R2版 - 執行<EDB_dir>/_uninst/uninstaller.bin進行反安裝
16、匯出匯入:
(1)Oracle:exp,imp或expdp,impdp
EDB:pg_dump,pg_restore
(2)Oracle:指定多個schema或table時,以逗點隔開條列
EDB:同選項指定多次,如-t=table_A -t=table_B
17、模板資料庫:
Oracle:在安裝時可以選擇是否以某種模板建立資料庫(速度會比較快)
EDB:
在EnterpriseDB中有template0、template1兩個資料庫,是資料庫的模板(template),
建立資料庫時就是依照它們為模板建立的。
例如建立資料庫的指令:CREATE DATABASE dbname TEMPLATE template0;
template0是一個read-only資料庫,不能連線,若要連線它會出現如底下的錯誤:
edb=# \c template0 enterprisedb localhost 5888
Password for user "enterprisedb":
FATAL: database "template0" is not currently accepting connections
template1可以連線,但是不建議異動裡面的內容。
18、JOB:
Oracle:內建於資料庫背景程序
EnterpriseDB:另外要建立pgAgent服務,並於OS啟動為服務,可執行SQL或shell
19、大小寫:
1.帳號:Oracle在不加雙引號情況下,預設為大寫,
EnterpriseDB在不加雙引號情況下,大小寫不同。
2.指令:Oracle在不加雙引號情況下,預設為大寫,
EnterpriseDB在不加雙引號情況下,預設為小寫。
例如,有個TABLE名叫DEPT,
則指定要下select * from "DEPT";
若下select * from DEPT;會出現物件不存在的錯誤。
(還需要進一步驗證)
20、連線設定:
Oracle中,在<安裝目錄>/network/admin底下設定tnsnames.ora檔;
EDB中,在<安裝目錄>/dbserver/share底下設定pg_service.conf檔。
21、SEQUENCE:
授權 -
Oracle中:grant select on <seq_name> to <user_name>;
EDB中:grant select,update on table <seq_name> to <role_name>;
注意:EDB要selec與udpate都授權,因為在select <seq_name>.NEXTVAL時,會需要更新sequence的值。
22、Trigger:
name space -
Oracle:同一個schema中的trigger,名稱不能相同,
EDB:同一個table的trigger,名稱不能相同。
23、異動Table
●刪除Table-包含各種constraint
Oracle:drop table <table_name> cascade constraints;
EDB:drop table <table_name> cascade;
●異動constraint
-- Primary Key
Oracle:ALTER TABLE <table_name> DROP PRIMARY KEY CASCADE;
EDB:ALTER TABLE <table_name> DROP CONSTRAINT <pk_name> CASCADE;
●異動欄位
--------------------------- 2012.11.05 更新 ---------------------------
PS. 在 EnterpriseDB 中,若是 Table 的欄位已經被 View 所引用,則無法異動,
會出現 ERROR: cannot alter type of a column used by a view or rule 的錯誤訊息。
必須要先將相關的 View 先刪除,異動欄位,然後再重建 View
------------------------------------------------------------------------------
-- 資料型態
Oracle:ALTER TABLE eip_user MODIFY(id NUMBER);
EDB:ALTER TABLE eip_user ALTER COLUMN id TYPE numeric;
-- 預設值
Oracle:ALTER TABLE public.eip_group MODIFY is_disabled DEFAULT false;
EDB:ALTER TABLE public.eip_group ALTER COLUMN is_disabled SET DEFAULT false;
-- 設定 NOT NULL
Oracle:ALTER TABLE eip_user MODIFY avail_date NOT NULL;
EDB:ALTER TABLE eip_user ALTER COLUMN avail_date SET NOT NULL;
-- 取消 NOT NULL
Oracle:ALTER TABLE eip_user MODIFY avail_date NULL;
EDB:ALTER TABLE eip_user ALTER COLUMN avail_date DROP NOT NULL;
●刪除Trigger
Oracle:DROP TRIGGER <trigger_name>;
EDB:DROP TRIGGER <trigger_name> on <table_name>;
24、DDL之COMMIT
在Oracle中,DDL語句執行之後,異動即完成,不可回復(不考慮FLASH BACK情況等等);
在EDB中,DDL語句執行之後,可以選擇COMMIT或ROLLBACK。
底下,是將目前使用後,對於Oracle與EnterpriseDB之間功能間的比較所畫的一張對應圖:
2011.07.01
自己的經驗記錄
若是要將 1, 0 、或 'T', 'F' 值,異動為 boolean 值之 true, false
之前將Oracle之table資料轉到EDB中,然後將原本 number(1) 型態之 "是、否" 類型欄位改成以 boolean 為型態,
所以,就必須先將資料寫到暫存table, 異動完欄位型態後,再寫回來(中間要將 1, 0 值異動為 true, false)。
不過,如果直接以DECODE(改不了用DECODE),則會出現如底下錯誤訊息,
insert into userm (user_id, user_no, user_name, is_disabled)
select user_id, user_no, user_name, DECODE(is_disabled, 1,true,0,false)
from tmp_userm;
ERROR: column "is_disabled" is of type boolean but expression is of type character varying
LINE 2: ... (user_id, user_no, user_name, is_disabled...
^
HINT: You will need to rewrite or cast the expression.
********** 錯誤 **********
ERROR: column "is_disabled" is of type boolean but expression is of type character varying
SQL 狀態: 42804
指導建議:You will need to rewrite or cast the expression.
字元:79
因為,DECODE是轉成字串 'true' 或 'false‘,而不是布林值。
要改用CASE的方式,才能正確無誤寫入。
insert into userm (user_id, user_no, user_name, is_disabled)
select user_id, user_no, user_name, (case is_disabled when 1 then true when 0 then false end)
from tmp_userm;