Oracle/etc

db_link

pbj1102 2022. 1. 26. 09:37
반응형

DB Link 란?

데이터베이스 링크는 클라이언트 또는 현재의 데이터베이스에서 네트워크상의 다른 데이터베이스에 접속하기 위한 접속 설정을 정의하는 오라클 객체 이다.

=> 다른 DB로 접속 설정 정의. 

 - 우선 고려되어야 사항은 ORACLE INSTANCE가 두 개 이상이고, 각각의 HOST NAME과 ORACLE_SID는 다르고 NLS_CHARACTER_SET은 동일하게 되어 있어야 한다.
 - 만약 같은 MECHINE에서 INSTANCE의 ORACLE_SID가 같다면 TNS ERROR가 발생한다.
 - 미래를 위해 다른 MECHINE이라 할지라도 ORACLE_SID는 규칙에 의해 다르게 가져가는 것이 좋다.
 - NLS_CHARACTER_SET이 동일하게 되어있지 않으면 DATA 입출력시 ?????로 나타난다.
 - 데이터베이스 링크로 연결되는 서버에 Listener가 꼭 구동 되어있어야 한다. 
 

 - 실질적으로 db_link 는 매우 편리한 기능이긴 하지만 제약조건이 많아 사실상 많이 사용하지 않는 편이다.

   주로 pump 시(migration) 사용되는 편이며 EAI 솔루션을 통해 다른 dbms와 데이터를 주고 받는 편이다. 

 

 - 마지막으로 db_link 로 연결 시 양족의 DBMS 중 scn 높은 값을 따라가게된다. 

    오라클 수명 SCN - 281,474,976,710,656


 1) 두 DBMS 간 character set이 같아야 된다.


 * character set 확인 방법

SQL> select * from v$nls_parameters
where PARAMETER = 'NLS_CHARACTERSET';
 
2) 오라클 Listener 기동 확인.
  원격 DB의 오라클 Listener 가 기동되어 있어야 한다.

3) tnsnames.ora 파일 수정

[oracle@DBTEST admin]$ pwd
#ORACLE_HOME/network/admin



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


p_test =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.40.95)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = PTEST)
    )
  )



h_test =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.113.222)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = HTEST)
    )
  )






4) sqlplus 접속 테스트

[oracle@DBTEST admin]$ sqlplus system/fkqpsej@h_test 

SQL*Plus: Release 11.2.0.1.0 Production on Wed Feb 10 14:11:48 2016

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning option

SYSTEM@hpc_test > exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning option



sqlplus system/fkqpsej@p_test

SQL*Plus: Release 11.2.0.1.0 Production on Wed Feb 10 14:11:25 2016

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, Oracle Label Security, Oracle Database Vault and Real Application Testing options

SYSTEM@pos_test > 
SYSTEM@pos_test > 
SYSTEM@pos_test > exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, Oracle Label Security, Oracle Database Vault and Real Application Testing options




5) db_link 설정


CREATE [PUBLIC] DATABASE LINK [DB LINK 이름]
CONNECT TO [유저명]
IDENTIFIED BY [비밀번호]
USING ['서비스 이름'];




 PUBLIC - 오라클 시노님과 마찬가지로 PUBLIC 옵션을 사용하면 공용 데이터베이스 링크를 생성 할 수 있다. 
          PUBLIC 옵션을 사용하지 않으면 링크를 생성한 자신만 사용 할 수 있다.
          => ISMS 보안법에 위배됨

 * DB Link 설정하기 위해서는 권한이 필요. 만약 권한이 없다면 SYS 계정으로 접속해서 DB Link를 사용할 계정에 권한 설정을 해준다.
=>  GRANT CREATE DATABASE LINK, DROP DATABASE LINK TO [user_id];



create database link pos_test
connect to SYSTEM
identified by oracle
using 'p_test'


select * from user_db_links;


select sysdate from dual@p_test;




5. DB Link 삭제

DROP DATABASE LINK [DB LINK 이름]

drop database link p_test




6. 간편하게 사용하기

tablename@SID 를 식별자로 사용하면 보기도 지저분.
아래와 같이 view나 synonym을 생성해서 사용하면 좀더 편하게 사용할수 있음.

 1) View 생성    
 
SQL> create view test_view
as select * from test@ORA_REMOTE;
 




 2) Synonym 생성

SQL> create synonym test for test@ORA_REMOTE;
 

SQL> select * from test;
 



7) tns 파일 수정 없이 사용하기

 

create database link p_test
connect to system
identified by oracle
using '(DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.40.95)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = PTEST)
   )
 )';



ora-02018 동일한 데이터베이스 링크가 열려있습니다. 
 => exec DBMS_SESSION.CLOSE_DATABASE_LINK('SL_OLD')
 
 
 
 
db 링크 유저 계정 패스워드 복호화
 
 
1. Select * from sys.link$ 

SQL> select PASSWORDX 
from sys.link$ 
where USERID ='H_CP';

PASSWORDX                                                                                                                        
-------------------------------------------------------------------------------------------------------------------------------- 
056EBC0620D02E2B160E85F0072C610726


2. 아래의 pl/sql 실행  -- 11gt1 까지는 잘 되는듯. 이후 부터 crypto 변경되면서 복호화가 안됨

set serveroutput on
declare
 db_link_password varchar2(100);
begin
 db_link_password := '056EBC0620D02E2B160E85F0072C610726';
 
 dbms_output.put_line ('Plain password: ' || utl_raw.cast_to_varchar2 ( dbms_crypto.decrypt ( substr (db_link_password, 19) , dbms_crypto.DES_CBC_PKCS5 , substr (db_link_password, 3, 16) ) ) );
end;
/
-------------------------[Start Time: 2019/04/24 16:05:57]-------------------------
SQL> Plain password: h1*p3o

반응형

'Oracle > etc' 카테고리의 다른 글

ogg(Oracle Golden Gate)  (0) 2022.01.26
flashback  (0) 2022.01.26
compress  (0) 2022.01.26
Reorg  (0) 2022.01.26
audit  (0) 2022.01.25