기본적으로 흔히 개발을 하면서 데이터베이스를 사용할 때 로컬 환경에 있는 데이터베이스를 사용하게 된다. 하지만 생각해보면 실제 서비스가 그런 식으로 작동할리는 없다. 서버실이 따로 존재할 것은 확실하고 클라우드와 같은 기술도 많이 사용되니 말이다.
그렇다면 이러한 점을 고려했을 때 원격지에 있는 데이터베이스는 어떻게 연동해야 할까??
Oracle 19c docs
31.2 Database Links
The central concept in distributed database systems is a database link. A database link is a connection between two physical database servers that allows a client to access them as one logical database.공식문서에서 말하길 분산 시스템 상에서 가장 핵심적인 부분은 Database Link라고 소개하고 있다. 해당 글에서도 이와 관련하여 설명을 할려고 한다.
What Are Database Links?
A database link is a pointer that defines a one-way communication path from an Oracle Database server to another database server.역시나 이번에도 공식문서를 확인해보자! 간단하게 생각하면 one-way communication path, 즉 단방향으로 형성되는 다른 서버로의 포인터라고 볼 수 있다.
예를 들어 DB A -> DB B 로 생성한 Link가 있다면 DB B -> DB A 방향으로는 통신할 수 없다는 뜻이다. (B에서 추가적으로 Link를 생성해야 함)
이러한 Link의 작동 방식을 이해할려면 먼저 이해해야 하는 것은 Global database name 이 무엇인지 아는 것이다.
기본적으로 Oracle 에서 Global database name은 DB_DOMAIN
과 DB_DOMAIN
초기화 매개변수로 형성된다고 생각할 수 있다.
위 사진에서 sales DB 를 생각해보자. 우측 트리를 확인해보면 UK, US 두 곳에 존재하는 것을 확인할 수 있는데 앞서 설명한 방식의 결합으로 이를 구분할 수 있는 것이다.
sales.us.americas.example_auto.com
sales.uk.americas.example_auto.com
자 그렇다면 우리는 이렇게 생각할 수 있다.
아니 그러면 원격지 고유한 주소도 저렇게 알 수 있는데 그냥 단순히 저 주소로 접속하면 되는 것 아닌가??
맞다. 가능하다. 네트워크 도메인 상에서 고유한 주소로 존재하기 때문에 이를 활용하여 접속할 수 있다!
SELECT * FROM hr.employees@db1.example.com;
그러나 저런 주소를 매번 작성할 수도 없는 노릇이고 저러한 데이터를 어디에 저장하는 것도 참 애매하다.
앞서 말한 주소 데이터를 어딘가에 저장하면 되는 것 아닐까?? 아니나 다를까 Oracle은 해당 기능을 제공한다. 바로 Database Link로!
CREATE PUBLIC DATABASE LINK db1.example.com USING 'sales1';
보편적으로 Link 이름은 원격지의 DB의 이름과 동일하게 설정한다. 위의 대표적인 예시도 실제 DB의 이름과 동일하게 설정하는 것을 볼 수 있다.
-> 물론 네트워크 도메인명 보다는 보다 간편하게 작성할 수 있을 것이다. DB_NAME
으로만 구성한다던지!
이 때 USING 키워드는 SERVICE_NAME
에 해당된다. 물론 이러한 이름은 tnsnames.ora 파일에 명시된 Alias 를 사용할 수 도 있을 것이다.
DB_NAME, SID, SERVICE_NAME... 참 헷갈리는 매개변수가 많다. 만약 해당 개념이 혼동된다면 따로 찾아보자!
어쨌든 우리는 위와 같은 방식으로 Link를 생성할 수 있다. public, privae, global 과 같은 키워드가 존재하는데 간략하게 설명하면 아래와 같다.
더 깊게 설명하게 되면 끝도 없다. 혹시 궁금하신 분이 있다면 아래 공식문서를 참고하면 좋을 것 같다.
Oracle에서 스키마가 User로 관리되는 만큼 결국 원격지와 연결되는 것도 해당 DB의 User를 통하게 될 것이다. 이를 알아보자!
Connected User : 원격지 User 정보 미포함, 로컬에서 접속하는 User가 곧 원격지의 동일한 User로 간주됨
CREATE PUBLIC DATABASE LINK hq USING 'hq';
-> 해당 사용자에 대한
Current User : Global User를 사용, 현재 로컬의 User와 무관
CREATE PUBLIC DATABASE LINK hq CONNECT TO CURRENT_USER using 'hq';
Fixed User : 원격 스키마의 User 정보를 포함하여 생성, 링크로 접속시 해당 User를 사용하게 됨
CREATE PUBLIC DATABASE LINK hq CONNECT TO jane IDENTIFIED BY password USING 'hq';
개인적으로 가장 많이 사용하게 되는 형식은 Fixed User인 것 같다.
앞서 말한 내용들이 헷갈린다면 대표적인 예시가 잘 설명되어 있으니 위 공식 문서를 참고하자!
사실 간략하게 DB Link에 대해서 소개했지만 파면 팔수록 알아야 하는 사항이 너무 많아 게시글에 모두 담진 못했다. 또한 내용 자체도 간략하게 말했으니 말이다.
가장 중요한 점은 위 방식은 같은 Oracle 일 때 해당되는 방식이다. MySQL, MariaDB 등 이기종간 접속은 추가적인 방법을 요구한다. 이는 다음 게시글로 작성할려고 한다. 뿐만 아니라 실제로 어떻게 쿼리를 작성하면 연동이 성공하는지 실습을 게시할려고 한다.