클라우드 객체 저장소에 저장된 메시지와 함께 영구 메시징 사용

DBMS_PIPE 패키지는 메시지가 클라우드 객체 저장소에 저장되는 영구 메시징을 지원하기 위해 Autonomous Database에서 기능을 확장했습니다.

DBMS_PIPE를 사용한 영구 메시징 정보

DBMS_PIPE를 사용하는 영구 메시징을 사용하면 하나 이상의 데이터베이스 세션이 클라우드 객체 저장소에 저장된 메시지를 사용하여 동일한 지역 또는 여러 지역에서 통신할 수 있습니다.

DBMS_PIPE의 영구 메시지:

  • 매우 큰 메시지를 주고 받을 수 있게 합니다.

  • 많은 수의 파이프 메시지 전송을 지원합니다.

  • 여러 데이터베이스 및 여러 리전의 데이터베이스 간에 단일 데이터베이스 내에서 메시지를 송수신할 수 있도록 지원합니다.

  • 동일한 클라우드 객체 저장소 위치 URI를 사용하여 여러 파이프를 지원합니다.

지속 메시징 파이프는 지원되는 DBMS_PIPE 유형 중 하나로 생성할 수 있습니다.

  • 암시적 파이프: DBMS_PIPE.SEND_MESSAGE 함수를 사용하여 알 수 없는 파이프 이름으로 메시지를 보낼 때 자동으로 생성됩니다.
  • 명시적 파이프: 사용자가 지정한 파이프 이름과 함께 DBMS_PIPE.CREATE_PIPE 함수를 사용하여 생성됩니다.
  • 공용 파이프: DBMS_PIPE 패키지에 대해 EXECUTE 권한이 있는 모든 사용자가 액세스할 수 있습니다.
  • 전용 파이프: 파이프 작성자와 동일한 사용자가 있는 세션에서 액세스할 수 있습니다.

주:

Oracle은 영구 메시징으로 메시지를 보내거나 받기 전에 명시적 파이프를 만들 것을 권장합니다. DBMS_PIPE.CREATE_PIPE를 사용하여 명시적 파이프를 만들면 private 매개변수를 설정하여 원하는 액세스 권한(public 또는 private)으로 파이프를 만들 수 있습니다.

다음은 영구 메시징이 포함된 DBMS_PIPE에 대한 일반 워크플로우를 보여줍니다.

database-pipe-persistent-messaging.eps에 대한 설명은 다음과 같습니다.
그림 database-pipe-persistent-messaging.eps에 대한 설명입니다.

DBMS_PIPE를 사용하는 기존 응용 프로그램은 최소한의 변경으로 계속 작동할 수 있습니다. 로그온 트리거를 사용하거나 다른 초기화 루틴을 사용하여 자격 증명 객체 및 위치 URI와 함께 DBMS_PIPE를 사용하는 기존 응용 프로그램을 구성할 수 있습니다. DBMS_PIPE 인증서 및 위치 URI를 설정한 후에는 영구 메시징을 사용하기 위해 다른 변경사항이 필요하지 않습니다. 이후 모든 파이프 사용은 데이터베이스 메모리가 아닌 클라우드 객체 저장소에 메시지를 저장합니다. 이를 통해 최소한의 변경으로 인메모리에서 영구 클라우드 오브젝트 스토리지로 메시지의 저장 방법을 변경할 수 있습니다.

영구 메시징 개요 및 기능

영구 메시징을 사용하는 DBMS_PIPE의 기능:

  • 동일한 지역 또는 여러 지역에 있는 여러 Autonomous Database 인스턴스에서 메시지를 보내고 검색할 수 있습니다.

  • 지속 메시지는 정확히 하나의 프로세스에서 쓰거나 읽도록 보장됩니다. 이렇게 하면 동시 읽기 및 쓰기로 인해 메시지 내용이 일치하지 않습니다. DBMS_PIPE는 지정된 시간에 메시지 또는 수신 메시지를 활성 상태로 보내는 하나의 작업만 허용하며 이러한 작업은 잠금 메커니즘으로 보호됩니다. 그러나 진행 중인 작업으로 인해 작업이 불가능한 경우 timeout 값에 도달할 때까지 프로세스가 주기적으로 재시도됩니다.

  • DBMS_PIPEDBMS_CLOUD를 사용하여 클라우드 객체 저장소에 액세스합니다. 메시지는 지원되는 클라우드 객체 저장소에 저장할 수 있습니다. 자세한 내용은 클라우드 오브젝트 스토리지 URI 형식을 참조하십시오.

  • DBMS_PIPEDBMS_CLOUD를 사용하여 클라우드 객체 저장소에 액세스하고 지원되는 모든 인증서 유형을 사용할 수 있습니다.

DBMS_PIPE 권한 부여 및 보안

DBMS_PIPE 프로시저는 호출자 권한으로 실행됩니다. 개인 파이프는 현재 사용자가 소유하며 사용자가 만든 개인 파이프는 동일한 사용자만 사용할 수 있습니다. 이는 메시지가 클라우드 객체 저장소에 저장되는 인메모리 파이프 및 영구 메시징 파이프 모두에 적용됩니다. 메시지 전송 및 수신은 호출자의 스키마에서 실행됩니다.

메시지가 클라우드 객체 저장소에 저장되는 프라이빗 파이프를 사용하면 location_uri 매개변수로 식별된 클라우드 객체 저장소와의 인증에 인증서 객체가 필요합니다. 호출하는 사용자는 객체 저장소에 액세스하는 데 사용되는 credential_name 매개변수로 지정된 인증서 객체에 대해 EXECUTE 권한이 있어야 합니다.

공용 파이프를 사용하려면 사용자 데이터베이스 세션에 DBMS_PIPE에 대한 실행 권한이 있어야 합니다. 영구 메시징을 사용하고 메시지를 클라우드 객체 저장소에 저장하는 퍼블릭 파이프의 경우 사용자 데이터베이스 세션은 DBMS_CLOUD에 대한 실행 권한이 있어야 하고 인증서 객체에 대한 실행 권한이 있어야 합니다. 또는 메시지가 포함된 위치 URI에 액세스할 수 있는 인증서 객체를 생성할 수 있습니다.

DBMS_PIPE 제한

DBMS_PIPE 패키지는 서로 다른 문자 집합을 사용하는 데이터베이스 간의 메시지 전송을 지원하지 않습니다. 예를 들어, AL32UTF8를 사용하는 Autonomous Database 인스턴스 하나와 WE8MSWIN1252를 사용하는 다른 인스턴스가 있는 경우 이 두 데이터베이스 간에 DBMS_PIPE를 사용하는 메시지를 전송할 수 없습니다. 이 경우 두 데이터베이스 간에 DBMS_PIPE를 사용하여 메시지를 보내려고 하면 시스템에서 ORA-12704 오류가 발생합니다.

자세한 내용은 Autonomous Database에 대한 문자 집합 선택을 참조하십시오.

명시적 지속 파이프 작성 및 메시지 보내기

지정된 파이프 이름(명시적 파이프)을 사용하여 영구 파이프를 작성하는 단계를 설명합니다.

  1. DBMS_CLOUD.CREATE_CREDENTIAL 절차에 따라 객체 저장소 자격 증명을 저장합니다. 예를 들면, 다음과 같습니다.
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'my_persistent_pipe_cred',
        username => 'adb_user@example.com',
        password => 'password'
      );
    END;
    /

    이 작업은 인증서를 암호화된 형식으로 데이터베이스에 저장합니다. 인증서 이름에 대해 원하는 이름을 사용할 수 있습니다. 이 단계는 객체 저장소 인증서가 변경되지 않는 한 한 한 번만 필요합니다. 인증서를 저장한 후 동일한 인증서 이름을 사용하여 DBMS_PIPE로 메시지를 보내고 받을 클라우드 객체 저장소에 액세스할 수 있습니다.

    매개변수에 대한 자세한 내용은 CREATE_CREDENTIAL Procedure를 참조하십시오. Oracle Cloud Infrastructure Object Storage의 경우 인증서가 기본 Oracle Cloud Infrastructure 인증을 사용해야 합니다.

    주:

    SQL*Plus 및 SQL Developer와 같은 일부 툴에서는 앰퍼샌드 문자(&)를 특수 문자로 사용합니다. 암호에 앰퍼샌드 문자가 있는 경우 예제에 표시된 대로 해당 도구에서 SET DEFINE OFF 명령을 사용하여 특수 문자를 사용 안함으로 설정하고 자격 증명이 제대로 만들어지도록 합니다.
  2. 메시지를 보내고 검색할 명시적 파이프를 만듭니다. 예를 들어, ORDER_PIPE이라는 파이프를 만듭니다.
    DECLARE
      r_status INTEGER;
    BEGIN
        r_status := DBMS_PIPE.CREATE_PIPE(pipename => 'ORDER_PIPE');
    END;
    /

    자세한 내용은 CREATE_PIPE 함수를 참조하십시오.

  3. 파이프가 작성되었는지 확인합니다.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 
  4. DBMS_PIPE 프로시저를 사용하여 클라우드 객체 저장소에 영구 메시지를 저장할 기본 액세스 인증서 및 위치 URI를 설정합니다.
    BEGIN
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
    END;
    /

    이러한 절차에서는 DBMS_PIPE 절차에 사용할 기본 자격 증명 이름과 기본 위치 URI를 설정합니다.

    Oracle Cloud Infrastructure Object Storage를 사용하여 메시지를 저장하는 경우 Oracle Cloud Infrastructure 고유 URI 또는 Swift URI를 사용할 수 있습니다. 그러나 위치 URI와 자격 증명은 다음과 같은 유형과 일치해야 합니다.

    • 고유 URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 고유 Oracle Cloud Infrastructure 서명 키 인증을 사용해야 합니다.

    • Swift URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 인증 토큰 인증을 사용해야 합니다.

    자세한 내용은 SET_CREDENTIAL_NAME 프로시저GET_LOCATION_URI 함수를 참조하십시오.

  5. 포장하고 파이프에 메시지를 보냅니다.
    DECLARE
      l_result INTEGER;
      l_date   DATE;
    BEGIN
        l_date := sysdate;
        DBMS_PIPE.PACK_MESSAGE(l_date);         -- date of order
        DBMS_PIPE.PACK_MESSAGE('C123');         -- order number
        DBMS_PIPE.PACK_MESSAGE(5);              -- number of items in order
        DBMS_PIPE.PACK_MESSAGE('Printers');     -- type of item in order
    
     
        l_result := DBMS_PIPE.SEND_MESSAGE(
                        pipename => 'ORDER_PIPE',
                        credential_name => DBMS_PIPE.GET_CREDENTIAL_NAME,
                        location_uri => DBMS_PIPE.GET_LOCATION_URI);
         
        IF l_result = 0 THEN
            DBMS_OUTPUT.put_line('DBMS_PIPE sent order successfully');
        END IF;
     
    END;
    /

동일한 데이터베이스에서 영구 메시지 검색

동일한 Autonomous Database 인스턴스(메시지가 전송된 인스턴스)의 명시적 파이프에서 영구 메시지를 검색하는 단계를 설명합니다.

Autonomous Database 인스턴스에서는 다른 세션에서 파이프로 전송된 메시지를 수신할 수 있습니다. DBMS_PIPE 프로시저는 호출자의 권한 프로시저이며 현재 호출된 유저로 실행됩니다.

개인 파이프는 파이프를 만드는 현재 사용자가 소유합니다. 개인 파이프는 파이프를 작성한 사용자만 액세스할 수 있습니다. 이는 인메모리 메시지를 사용하는 파이프 및 클라우드 객체 저장소에 저장된 메시지와 함께 영구 메시징을 사용하는 파이프에 적용됩니다.

공용 파이프는 DBMS_PIPE에 대한 실행 권한이 있는 데이터베이스 세션에서 액세스할 수 있습니다. 이는 인메모리 메시지를 사용하는 파이프 및 클라우드 객체 저장소에 저장된 메시지와 함께 영구 메시징을 사용하는 파이프에 적용됩니다.

  1. 파이프가 작성되었는지 확인합니다.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 

    동일한 Autonomous Database 인스턴스에 있고 파이프가 있는 경우 메시지를 수신하기 전에 DBMS_PIPE.CREATE_PIPE를 실행할 필요가 없습니다. Create an Explicit Persistent Pipe and Send a Message에 표시된 것과 같이, 파이프가 동일한 인스턴스에 만들어졌을 때 적용됩니다.

  2. 파이프에서 메시지를 받습니다.
    DECLARE
        message1  DATE;
        message2  VARCHAR2(100);
        message3  INTEGER;
        message4  VARCHAR2(100);
        l_result  INTEGER;
    
    BEGIN
    
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
        l_result := DBMS_PIPE.RECEIVE_MESSAGE (
                      pipename => 'ORDER_PIPE',
                      timeout  => DBMS_PIPE.MAXWAIT,
                      credential_name => DBMS_PIPE.GET_CREDENTIAL_NAME,
                      location_uri => DBMS_PIPE.GET_LOCATION_URI);
     
        IF l_result = 0 THEN
            DBMS_PIPE.unpack_message(message1);
            DBMS_PIPE.unpack_message(message2);
            DBMS_PIPE.unpack_message(message3);
            DBMS_PIPE.unpack_message(message4);
     
            DBMS_OUTPUT.put_line('Order Received Successfully On: ' || TO_CHAR(sysdate, 'dd-mm-yyyy hh24:mi:ss'));
            DBMS_OUTPUT.put_line('Date of Order: ' || message1);
            DBMS_OUTPUT.put_line('Order Number: ' || message2);
            DBMS_OUTPUT.put_line('Number of Items In Order: ' || message3);
            DBMS_OUTPUT.put_line('Item Type in Order: ' || message4);
        END IF;
     
    END;
    /

    동일한 Autonomous Database 인스턴스에 있는 경우 인증서가 존재하므로 메시지를 수신하기 위해 DBMS_CLOUD.CREATE_CREDENTIAL를 실행할 필요가 없습니다. Create an Explicit Persistent Pipe and Send a Message에 표시된 것과 같이, 파이프가 동일한 인스턴스에 만들어졌을 때 적용됩니다.

자세한 내용은 SET_CREDENTIAL_NAME 프로시저GET_LOCATION_URI 함수를 참조하십시오.

자세한 내용은 RECEIVE_MESSAGE 함수를 참조하십시오.

다른 데이터베이스에서 파이프를 작성하여 영구 메시지 검색

메시지를 전송한 인스턴스와 다른 Autonomous Database 인스턴스의 명시적 파이프를 사용하여 클라우드 객체 저장소에 저장된 영구 메시지를 검색하는 단계를 설명합니다.

  1. DBMS_CLOUD.CREATE_CREDENTIAL 절차에 따라 객체 저장소 자격 증명을 저장합니다. 예를 들면, 다음과 같습니다.
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'my_persistent_pipe_cred',
        username => 'adb_user@example.com',
        password => 'password'
      );
    END;
    /

    이 작업은 인증서를 암호화된 형식으로 데이터베이스에 저장합니다. 인증서 이름에 대해 원하는 이름을 사용할 수 있습니다. 이 단계는 객체 저장소 인증서가 변경되지 않는 한 한 한 번만 필요합니다. 인증서를 저장한 후에는 동일한 인증서 이름을 사용하여 클라우드 객체 저장소에 액세스하여 DBMS_PIPE로 메시지를 보내고 받을 수 있습니다.

    매개변수에 대한 자세한 내용은 CREATE_CREDENTIAL Procedure를 참조하십시오.

    주:

    SQL*Plus 및 SQL Developer와 같은 일부 툴에서는 앰퍼샌드 문자(&)를 특수 문자로 사용합니다. 암호에 앰퍼샌드 문자가 있는 경우 예제에 표시된 대로 해당 도구에서 SET DEFINE OFF 명령을 사용하여 특수 문자를 사용 안함으로 설정하고 자격 증명이 제대로 만들어지도록 합니다.
  2. 메시지를 보낸 파이프와 동일한 이름의 명시적 파이프를 만듭니다. 예를 들어, ORDER_PIPE이라는 파이프를 만듭니다.
    DECLARE
      r_status INTEGER;
    BEGIN
        r_status := DBMS_PIPE.CREATE_PIPE(pipename => 'ORDER_PIPE');
    END;
    /

    CREATE_PIPE 함수를 참조하십시오.

  3. 파이프가 작성되었는지 확인합니다.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 
  4. DBMS_PIPE 프로시저를 사용하여 DBMS_PIPE가 지속 메시지에 액세스할 수 있도록 객체 저장소에 대한 기본 액세스 인증서 및 위치 URI를 설정합니다.
    BEGIN
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
    END;
    /

    이러한 절차에서는 DBMS_PIPE 절차에 사용할 기본 자격 증명 이름과 기본 위치 URI를 설정합니다.

    Oracle Cloud Infrastructure Object Storage를 사용하여 메시지를 저장하는 경우 Oracle Cloud Infrastructure 고유 URI 또는 Swift URI를 사용할 수 있습니다. 그러나 위치 URI와 자격 증명은 다음과 같은 유형과 일치해야 합니다.

    • 고유 URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 고유 Oracle Cloud Infrastructure 서명 키 인증을 사용해야 합니다.

    • Swift URI 형식을 사용하여 Oracle Cloud Infrastructure Object Storage에 액세스하는 경우 인증서 객체에서 인증 토큰 인증을 사용해야 합니다.

    자세한 내용은 SET_CREDENTIAL_NAME 프로시저GET_LOCATION_URI 함수를 참조하십시오.

  5. 지속 파이프에서 메시지를 수신합니다.
    DECLARE
        message1  DATE;
        message2  VARCHAR2(100);
        message3  INTEGER;
        message4  VARCHAR2(100);
        l_result  INTEGER;
    
    BEGIN
    
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
        l_result := DBMS_PIPE.RECEIVE_MESSAGE (
                      pipename => 'ORDER_PIPE',
                      timeout  => DBMS_PIPE.MAXWAIT,
                      credential_name => DBMS_PIPE.GET_CREDENTIAL_NAME,
                      location_uri => DBMS_PIPE.GET_LOCATION_URI);
     
        IF l_result = 0 THEN
            DBMS_PIPE.unpack_message(message1);
            DBMS_PIPE.unpack_message(message2);
            DBMS_PIPE.unpack_message(message3);
            DBMS_PIPE.unpack_message(message4);
     
            DBMS_OUTPUT.put_line('Order Received Successfully On: ' || TO_CHAR(sysdate, 'dd-mm-yyyy hh24:mi:ss'));
            DBMS_OUTPUT.put_line('Date of Order: ' || message1);
            DBMS_OUTPUT.put_line('Order Number: ' || message2);
            DBMS_OUTPUT.put_line('Number of Items In Order: ' || message3);
            DBMS_OUTPUT.put_line('Item Type in Order: ' || message4);
        END IF;
     
    END;
    /

    자세한 내용은 RECEIVE_MESSAGE 함수를 참조하십시오.

지속 파이프 제거

지속 파이프를 제거하는 단계에 대해 설명합니다.

영구 파이프는 메시지를 클라우드 객체 저장소에 저장하여 메시지를 보내고 받습니다. DBMS_PIPE.REMOVE_PIPE를 사용하여 Autonomous Database 인스턴스에서 영구 파이프를 제거합니다.

  1. DBMS_PIPE.REMOVE_PIPE 함수를 호출하여 파이프를 제거합니다.
    DECLARE
       l_result  INTEGER;
    BEGIN
         l_result := DBMS_PIPE.REMOVE_PIPE('ORDER_PIPE');
    END;
    /

    REMOVE_PIPE 함수는 파이프가 실행되는 Autonomous Database 인스턴스에서 파이프를 제거합니다. 그러나 REMOVE_PIPE는 동일한 위치 URI를 사용하는 동일한 이름의 파이프가 있는 다른 Autonomous Database 인스턴스에 영향을 주지 않습니다.

  2. Autonomous Database 인스턴스에서 DBMS_PIPE.REMOVE_PIPE를 실행하여 파이프가 제거되었는지 확인합니다.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    No rows selected