강좌
클라우드/리눅스에 관한 강좌입니다.
데이터베이스 분류

Database Link사용법

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

Database Link사용법




piruks.kang.com(원격지DB)의 init.ora내용
db_name = "piruks"
db_domain = kang.com
instance_name = piruks
service_names = piruks.kang.com

maddog.kang.com(로컬DB)의 tnsnames.ora내용
PIRUKS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.102)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PIRUKS.KANG.COM)
    )
  )







global_names = true [ or false ]


SQL> select name, value from v$parameter where name='global_names';

NAME                 VALUE
-------------------- ------
global_names         FALSE



SQL> connect kang/xxxxxx@piruks;
연결되었습니다.
SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------
PIRUKS.KANG.COM




SQL> connect kang/xxxxxx
연결되었습니다.


SQL> create database link piruks.kang.com
  2  connect to kang identified by xxxxxx
  3  using 'piruks';

데이타베이스 링크가 생성되었습니다.




SQL> select * from tab@piruks.kang.com;

TNAME                                                        TABTYPE         CLUSTERID
------------------------------------------------------------ -------------- ----------
TEST                                                         TABLE

SQL> select * from 

NAME                        AGE
-------------------- ----------
강명규                       27

SQL> insert into test@piruks.kang.com values('홍길동', 30);

1 개의 행이 만들어졌습니다.

SQL> update test@piruks.kang.com set age=31 where age=30;

1 행이 갱신되었습니다.

SQL> select * from test@piruks.kang.com;

NAME                        AGE
-------------------- ----------
강명규                       27
홍길동                       31

SQL> delete from test@piruks.kang.com where age=31;

1 행이 삭제되었습니다.


SQL> drop table test@piruks.kang.com;
drop table test@piruks.kang.com
                *
1행에 오류:
ORA-02021: 원격 데이터베이스에 DDL 조작들이 허용되지 않습니다


SQL> drop database link piruks.kang.com;

데이타베이스 링크가 삭제되었습니다.

SQL>


[2003-07-30 추가]
public DB링크와 동의어의 사용
이제껏 설명한 private DB링크와는 달리, public DB링크는 DB내의 모든 사용자가 사용할 수 있다.
이는 일반계정에서는 사용하지 못하므로 system사용자에서 생성해야 한다.
일반계정에서 public DB링크를 생성하려면, 다음의 권한이 필요하다.

DROP PUBLIC DATABASE LINK
CREATE PUBLIC DATABASE LINK

system계정에서 다음의 명령으로 kang계정에 이 권한을 줄 수 있다.

SQL> 

권한이 부여되었습니다.


SQL> 
연결되었습니다.
SQL> 
  2  
  3  

데이타베이스 링크가 생성되었습니다.
SQL> 
연결되었습니다.
SQL> 

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
이하생략

12 개의 행이 선택되었습니다.

SQL> 
연결되었습니다.
SQL> 

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
이하생략

12 개의 행이 선택되었습니다.

이와 같이 매번 골뱅이와 DB링크명(@db.world)를 붙이면 불편하므로, 동의어를 사용하여 투명하게 사용할 수도 
있을 것이다. 모든 사용자에게 적용하려면 마찬가지로 system계정에서 public동의어를 생성하면 된다.

SQL> 
연결되었습니다.
SQL> 

동의어가 생성되었습니다.

SQL> 

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
이하생략

12 개의 행이 선택되었습니다.

SQL>


[2003-07-30 추가]
하나의 SQL명령에서 사용할 수 있는 DB링크수는 초기화 패러미터 open_links에 따라 정해진다.
디폴트는 4개다.
SQL> 

NAME                                 TYPE    VALUE
------------------------------------ ------- ------------------------------
open_links                           integer 4
open_links_per_instance              integer 4


[2003-07-30 추가]
본문에서 잠깐 언급했지만, DB링크가 제대로 생성되었으나 실제 질의시 실패하는 경우가 있다.
이 경우에는, 연결DB의 global_name에 지정된 문자열을 사용하면 해결된다.
원래 초기화패러미터 gloabl_names가 true일 경우에만, 이것을 강제하게 되어 있으나, 
이상한 것은 false일 경우에도 발생했다. 예제를 보면 쉽게 알 수 있을 것이다.

[문제**********]
DB링크는 에러없이 생성되나, 실제 질의가 실패함.
SQL> 
연결되었습니다.
SQL> 
  2  
  3  

데이타베이스 링크가 생성되었습니다.

SQL> 
select * from tab@linuxdb_link;
                  *
1행에 오류:



SQL> 

데이타베이스 링크가 삭제되었습니다.


[해결책********]
원격DB서버의 global_name값을 확인
SQL> 
SQL> 

NAME                                 TYPE    VALUE
------------------------------------ ------- ------------------------------
global_names                         boolean FALSE
연결되었습니다.
SQL> 

GLOBAL_NAME
--------------------------------------------------------------------------------
DB.WORLD

다시 돌아와, DB링크생성시 이름을 위에서 확인한 global_names로 한다.
SQL> 
연결되었습니다.
SQL> 
  2  
  3  

데이타베이스 링크가 생성되었습니다.

SQL> 

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
A                              TABLE
AA                             TABLE
BONUS                          TABLE
CUSTOMER                       TABLE
DEPT                           TABLE
EMP                            TABLE
FAMILY                         TABLE
HITEL                          TABLE
ILSAN014                       TABLE
INTERIOR                       TABLE
MEMBER                         TABLE
MEMBER_DETAIL                  TABLE
PLAN_TABLE                     TABLE
SALGRADE                       TABLE
SAMWOO                         TABLE
SERVER                         TABLE
TEST                           TABLE
TM_YH                          TABLE
V_EMP                          VIEW

19 개의 행이 선택되었습니다.

SQL>

This article comes from dbakorea.pe.kr (Leave this line as is) 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,037 명
  • 현재 강좌수 :  35,810 개
  • 현재 접속자 :  117 명