2013年8月8日 星期四

Oracle 11g- 使用dblink

在我現在的電腦中我有兩個Instance ORCL 與 ORCL2 ,如何做我能夠在ORCL的DB 中去存取ORCL2呢?


其實DB LINK是個很好用的東西,如果你不想要讓其他人直接去操作 ORCL2 ,或是你不想要
浪費時間在把ORCL2的資料移動到ORCL DB中,我認為DB LINK都可以幫助你

Step 1. 建立本機中的Tnsnames.ora,建立一個net service name讓你可以正常連到ORCL2 
DB中

Step2.在ORCL中輸入以下指令


SQL> create public database link Porcl2  <<Porcl2 只是一個字串
  2  connect to hr identified by hr  <<連線使用的帳號密碼 (ORCL2)
  3  using 'orcl2';    <<使用連線的 net service name  

Database link created.



Step 3.驗證

SQL> select count(*) from hr.uuu@Porcl2;            

  COUNT(*)
----------
     72410

這是在還沒連結前在ORCL2中建立的一個Table 看起來是對的


這是在ORCL2刪掉802筆資料後從ORCL這邊查詢,確定筆數也正確,這就是說一旦commit後
也可以馬上得到回應
SQL> select count(*) from hr.uuu@Porcl2;

  COUNT(*)
----------
     71568

注意事項:

a.透過dblink僅可以進行DML,但不能進行DDL

b.若包含Remote database異動的交易發生問題,RECO將負責進行rollback.


Step 4.Synonym隱藏database link字串

雖然使用db link很好用但是在操作的過程中總是覺得怪怪的,又或者是你不想讓使用者發現現在所連的這個表格是從外部的DB來的接下來就要利用Synonym來隱藏dblink字串

SQL> create synonym new_uuu for hr.uuu@Porcl2;

Synonym created.

SQL> select count(*) from new_uuu;

  COUNT(*)
----------
     71568


如果要刪除同義字的話可以用drop synonym new_uuu










Oracle 11g-關於Listener.ora / Sqlnet.ora / Tnsnames.ora


事實上,當我們在做Oracle的配至時往往監聽器設定的資訊跟Instance都是一樣的,這也讓我有時候會突然腦筋打結


平常我們在遠端主機不是都這樣打嗎? sqlplus hr/oracle@orcl ,然後趴啦一聲你就連接上了
你不覺得這樣很奇怪嗎?到底我是怎樣連接上的?



Oracle主要有三個配置文件
1.listener.ora
2.sqlnet.ora
3.tnsnames.ora

預設這些檔案都是放在$ORACLE_HOME\network\admin目錄下,如果有使用Grid的話目標位置會在Grid\network\admin目錄下
  


重點:三個文件的作用和使用方式

1.[sqlnet.ora] <-- 簡單的講就是決定連線的方法選擇  
 
   (可使用的連線方式有 EZCONNECT 、TNSNAMES、HOSTNAME、LDAP、NIS)

最常用的大概就是 EZCONNECT 、TNSNAMES這兩種堪稱是最經典的方式

關於


=================================================================
/u01/app/oracle/product/11.2.0/grid/network/admin
[oracle@oracledb admin]$ cat sqlnet.ora
# sqlnet.ora Network Configuration File: /u01/app/oracle/product/11.2.0/grid/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
 <<可以設定多種連線方式它將會依序幫你做解析

ADR_BASE = /u01/app/oracle
=================================================================

在用戶端的話你必須要定義使用的方法這樣才會依據你輸入的command不同而決定你將使用哪種方式連線

舉例:

A.使用EZCONNECT條件
   
 1.sqlnet.ora必須要有設定NAMES.DIRECTORY_PATH= (EZCONNECT)
 2.輸入時必須要有IP 、PORT以及service name

   EX:sqlplus system/oracle@192.168.56.2:1521/orcl
                                         


B.使用TNSNAMES條件

 1.sqlnet.ora必須要有設定NAMES.DIRECTORY_PATH= (TNSNAMES)
 2.本機要搭配 TNSNAMES.ora設定檔

 EX: sqlplus system/oracle@myoracle




假設我的sqlnet.ora中使用  NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT,HOSTNAME)三種方式

當我執行 sqlplus system/oracle@myoracle
當你執行後客戶端就會首先在tnsnames.ora文件中找myorcle的記錄.如果沒有相應的記錄則嘗試下一個是否為EZCONNECT旦發現一整個格式太扯落差又太大就會在往下一下HOSTNAME走把myoracle當作一個主機名稱,通過網路途徑進行解析它 的IP地址然後在去連接這個IP,在這裡還要考慮到SERVER端是否有設定GLOBAL_DBNAME=myoracle



2.[TNSNAMES.ora] <-- 簡單的講就是選擇對應的解析資訊

如果你懂DNS的話其原理就有點類似,我說白話一點好了,你知道 QR-Code這種東西吧?(啥...不知道...那你先查一下好了) 不是用手掃描器這樣一掃就連到要去的網站
所以QR-CODE 記載了目的地的(主機名稱或IP) 、協定(Protocol)連接的PORT跟哪一個網頁(SID)

**但要聽清楚了TNSNAMES.ora 是用戶端在用的,SERVER端用的是監聽器,你會說不是在 SERVER端的 /network/admin/下也有TNSNAMES.ora嗎? 
沒錯~因為你也會在SEREVR端下去連接DB吧...所以這時你也是用戶端啦****

=================================================================
[oracle@oracledb admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.


myoracle =  <<這是net service name
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracledb)(PORT = 1521))
<<定義連線的協定、主機名稱與連接的Port

    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl2) <<定義你的SID 
    )
  )


因為礙於習慣以往我們在做練習時很喜歡都設成一樣的,但我這也會讓我們有一些腦筋打結orcl是跟誰有關而導致有時後搞不清楚狀況

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracledb)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

=================================================================


3.[Listener.ora] <<簡單的說是SERVER端l監聽器

如果沒有設定listener.ora,就像郵差拿著掛號信要送到你家去簽收但是死也找不到電鈴可以叫你下來領掛號一樣


[oracle@oracledb admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/grid/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)  

<<sid.domain在沒domain name的情況下就跟SID NAME是相同的
其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做數據庫連接,舉個範例假設我有5台DB每台DB我都叫orcl的話那這樣要怎樣連??
但如果是  orcl.aaa.com.tw  orcl.bbb.com.tw、orcl.ccc.com.tw、orcl.ddd.com.tw、orcl.eee.com.tw
這樣你有清楚差別了嗎??


      (SID_NAME = orcl) <<SID NAME

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1) <<主目錄路徑
    )
  )


TRACE_LEVEL_LISTENER2 = OFF

LOGGING_LISTENER = OFF

LISTENER =

<<監聽器名稱(一台數據庫可以有不止一個監聽器,每個監聽器可以聽很多個Port)

  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracledb)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      )
    )
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = oracledb)(PORT = 12345))
      )
    )
  )

在Listener的監聽器中負責監聽想要連線到目的地HOST與PORT,所以你可以看到
Port 1521與Port 12345都是可以被使用的


ADR_BASE_LISTENER = /u01/app/oracle
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON
TRACE_LEVEL_LISTENER = OFF
=================================================================



2013年7月29日 星期一

Oracle 11g-Transport Tablespace


事實上Transport Tablespace根本就是expdp 與 impdp 的方法之一,差別在實際的data仍放在datafile中,試想如果我要匯出的tablespace中的其中一個table有1百萬筆資料時,你覺得是expdpd含資料快還是直接複製datafile快??


Transport Tablespace的注意事項
Oracle8/8i=>兩個database必須有相同oracle版本,OS平台,block size,characterset
Oracle9i=>兩個database必須有相同oracle版本,OS平台,characterset.block size可以不相同
                  (可以有1個standard block,4個non-standard block同時存在)
Oracle10g/11g=>兩個database必須有相同oracle版本,characterset.block size與os平台可以不相同

如果你了解了,請參閱下方步驟...




2013年7月26日 星期五

Oracle 11g-手動 Duplicate database (異機使用RMAN備份檔)

說起來本章算是半人工狀態進行 Duplicate 資料庫到其他台,為什說是半人工狀態呢?
因為整個過程人工的部分都在做環境設定,直到最後仍需要RAMN所產生的備份檔進行還原
接下來我會先模擬一個情境狀態接下來在一步一步說明該如何操作!!

情境:


A同事說: 我需要一個平台測試我的SQL或是內容...但我不想搞壞現有的DB
B同事說: 我需要安裝一個Patch但我也不想搞壞現有的DB
C同事說: 我想要練習一下DB管理,但我也能搞壞現有的DB
老闆說: 我希望公司就算沒有錢做Cluster的機器.....但還是希望這台壞掉以後能有一台加減頂一
               下.....不管怎樣你自己想個辦法解決一下


所以說....用手上現有空閒的硬體複製一個一模一樣的DB就可以暫時解決這個問題
Duplicate database時最好兩邊的版本都是一樣的比較不會有問題

來吧~ 看看怎樣進行下一步