clonedb를 이용해서 dblink 하기
Oracle/Administoration

dblink란

같은 host상의 1)클라이언트db와 2)서버db를 별명(alias)을 통해 두 db간의 다리를 만들어주는 기술


oracle dblink로 할수 있는건

서로 다른 컴퓨터로 export , import 명령어를 사용해서 옮기지만 dblink를 걸어주면 명령어만으로 쉽게 서버간 데이터이동을 할수있다.

그리고 backup & recovery 할때도 엄청 요긴하게 쓰이는 기술이니 알아두면 나중에 발목잡힐 일이 없다.


처음 리눅스 os를 깔고 oracle을 설치하면 리스너라는(listener.ora)파일이 없을것이다.

oracle 11g 기준으로 경로는 /app/oracle/product/11g/bin/에 있다.


cd /app/oracle/product/11g/bin/ 들어가서

터미널에

[oracle@dbserver ~ bin]$ ./netca 라고 치면 설치가능하다.

만약에 한글이 깨져보인다면 설치취소를 누르고

export LACG=C 명령어를 터미널에 쳐주고 다시 netca를 실행시켜주자.

*netca를 이용하지 않아도 vi로 해당위치의 파일을 만들어주고 내용을 입력해줘도 가능하다.

vi /app/oracle/product/11g/network/admin/listener.ora

vi /app/oracle/product/11g/network/admin/tnsnames.ora 이런식으로 새파일을 만들어 입력가능함


/app/oracle/product/11/network/admin/listener.ora를 열어보면

------------------------------------------------------------------------------------------------

# listener.ora Network Configuration File: /app/oracle/product/11g/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = testdb)
      (ORACLE_HOME = /app/oracle/product/11g)
      (PROGRAM = extproc)
    )
  )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

-------------------------------------------------------------------------------------------------

위에껀 기존부분이고 아래 listener2 부분을 기존내용 밑에 추가해주면 된다.(* 괄호주의)

-------------------------------------------------------------------------------------------------

LISTENER2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
       (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1522))
    )
  )
SID_LIST_LISTENER2 =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = testdb2)
      (ORACLE_HOME = /app/oracle/product/11g)
    )

  )

-------------------------------------------------------------------------------------------------

*참고로 HOST부분에 네임으로 적으려면 /etc/hosts에 아이피와 네임이 같이 적혀있어야한다.

vi를 열어서 살펴보자.

vi /etc/hosts

-------------------------------------------------------------------------------------------------

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.24.136          dbserver        dbserver

-------------------------------------------------------------------------------------------------

빨간색부분의 아이피와 옆에 리눅스를 설치했던 네임을 적어주면 된다. 그리고 :wq! 종료


그리고 vi /app/oracle/product/11g/network/admin/tnsnames.ora를 열어보면

-------------------------------------------------------------------------------------------------

TESTDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.24.136)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = testdb)
    )    
  )

--------------------------------------------------------------------------------------------------

위의내용은 기존내용이고 이 부분아래서부터 밑의 clonedb를 추가해주자

--------------------------------------------------------------------------------------------------

clonedb =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.24.136)(PORT = 1522)) -<포트번호는 listener와 동일한 포트로
    )       
    (CONNECT_DATA =
      (SERVICE_NAME = testdb2) -<clonedb의 네임적어주셔야 합니다.
    )
   )

--------------------------------------------------------------------------------------------------

*중요한 몇가지

1.listener와 tnsnames의 본 클라이언트db(testdb), 서버db(testdb2)의 port 같은 서버끼리 똑같아야 한다.

2.분명히 clonedb(testdb2)안만들고 listener와 tnsnames만 건드시는 분들 분명히 계십니다~

  다른서버가 분명히 하나 더 있어야 가능한 기술이니까 숙지하세요~

3.이건 주관적인건데 listener의 host는 아이피로 통일하거나 네임으로 통일하거나 같아야합니다

tnsnames.ora도 마찬가지로 네임으로 통일할려면 통일하고 안할려면 둘다 아이피로 적어주세요.


모두 :wq! 저장하고 나와서 리스너 명령어로 stop,start,status등 실행되는지 전부 확인해볼수 있습니다.


[oracle@dbserver ~]$lsnrctl -<리스너 접속명령어 확인을 누르면

--------------------------------------------------------------------------------------------------

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 16-JUL-2014 14:38:53

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

Welcome to LSNRCTL, type "help" for information.

LSNRCTL>

--------------------------------------------------------------------------------------------------

접속되었고 몇가지 명령어를 나열해 보자면 보통은

status listener(testdb꺼) ,status listener2(clonedb testdb2꺼) 이 명령어는 현재 리스너의 현재상태를 출력해주는 명령어다

그외에 멈추는 명령어 stop listener , 다시 재동가하는 명령어 start lestener 요 3가지만 알아도 많이 배운상태다 이미.


내용이 길어지기 때문에 현제 clonedb의 testdb만 정상적으로 재가동되는 결과 출력물만 기재하겠다.

LISTENER> 에서 나갈려면 EXIT 명령어를 써주면 나갈수가 있다.


제대로 작동되는지 확인해볼려면

[oracle@dbserver ~]#tnsping clonedb(testdb2용임)

--------------------------------------------------------------------------------------------------

TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 16-JUL-2014 14:44:35

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

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)

(HOST = 192.168.24.136)(PORT = 1522))) (CONNECT_DATA = (SERVICE_NAME = testdb2)))
OK (10 msec)

-------------------------------------------------------------------------------------------------

위의 ok가 떨어졌으면 정상적으로 리스너가 작동한다는 뜻이다.

그리고 당연하겠지만 본 클라이언트(운영서버)에서 디비링크를 확인하려면 clonedb(복구서버testdb2)의 db가 켜져있어야한다.

exprot ORACLE_SID=testdb2 (클론서버로 접속)입력해주고 db를 키자. 그리고 다시 export ORACLE_SID=testdb로 실행경로를 바꿔준다.


이제 거의 tnsnames.ora와 listener.ora쪽은 건들일이 없고 본클라이언트 서버 들어가서 서로연결해줄 링크를 만들면 끝이다.

[oracle@dbserver ~]$sqlplus / as sysdba
[oracle@dbserver ~]startup


명령어가 여러가지가 있는데 한번 살펴보자


<링크생성하기>

SQL>creata database link testdb02 /링크이름은 하고싶은걸로 하면된다.
  2 connect to scott
  3 identified by tiger                  /클론db와 연결할 계정과 암호
  4 using 'testdb2';                    /tnsnames.ora에 적어뒀던 걸로 하면된다.
DATABASE LINK CREATE


이것으로 링크는 정상적으로 만들어졌고 실행해보자.


SQL> select * from scott.hwangyk@testdb02

해주면 결과가 출력이 된다. 성공적으로 링크가 됐다.


지금까지 만들었던 dblink를 조회해보는 명령어

SQL>SELECT * FROM ALL_DB_LINKS;


만들어놨던 DBLINK를 삭제하는 명령어

SQL>DROP DATABASE LINK 링크명



링크를 만들때 직접 만들수 있는 방법도 있다.

이래저래 안걸리면 직접넣기


SQL>CREATE DATABASE LINK 링크이름
  2  CONNECT TO 아이디 IDENTIFIED BY 비번
  3  USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=호스트명)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=SID)))';