底下,是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中,就可表示出來:
db_architecture.PNG 

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之間功能間的比較所畫的一張對應圖:
enterprisedb vs. oracle 


 

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;

arrow
arrow
    全站熱搜

    來自大海的心 發表在 痞客邦 留言(8) 人氣()