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