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

DBMS_PIPE 패키지는 클라우드 객체 저장소에 메시지가 저장되는 영구 메시징을 지원하기 위해 자율운영 AI 데이터베이스에서 확장된 기능을 제공합니다.

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

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

DBMS_PIPE의 영구 메시지:

지속 메시징 파이프는 지원되는 DBMS_PIPE 유형에서 생성할 수 있습니다.

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

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

database-pipe-persistent-messaging.svg 그림에 대한 설명

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

영구 메시징 개요 및 기능

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

DBMS_PIPE 권한 부여 및 보안

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

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

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

DBMS_PIPE 제한

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

자세한 내용은 자율운영 AI 데이터베이스에 대한 문자 집합 선택을 참조하십시오.

명시적 영구 파이프 만들기 및 메시지 보내기

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

  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;
     /
    

    자세한 내용은 Oracle Database 19c PL/SQL Packages and Types ReferencePACK_MESSAGE Procedures 또는 Oracle Database 26ai PL/SQL Packages and Types ReferenceSEND_MESSAGE Function을 참조하십시오.

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

동일한 자율운영 AI 데이터베이스 인스턴스(메시지가 전송된 인스턴스)의 명시적 파이프에서 영구 메시지를 검색하는 단계에 대해 설명합니다.

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

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

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

  1. 파이프가 만들어졌는지 확인합니다.

     SELECT ownerid, name, type FROM v$db_pipes
            WHERE name = 'ORDER_PIPE';
    
     OWNERID NAME       TYPE
    
     ------- ---------- -------
         80 ORDER_PIPE PRIVATE
    

    동일한 자율운영 AI 데이터베이스 인스턴스에 있고 파이프가 존재하는 경우 메시지를 수신하기 전에 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;
     /
    

    동일한 자율운영 AI 데이터베이스 인스턴스에 있는 경우 인증서가 이미 존재하며 메시지를 수신하기 위해 DBMS_CLOUD.CREATE_CREDENTIAL를 실행할 필요가 없습니다. 이는 Create an Explicit Persistent Pipe and Send a Message에 표시된 것과 같이 파이프가 동일한 인스턴스에 생성되었을 때 적용됩니다.

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

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

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

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

  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가 지속 메시지에 액세스할 수 있도록 객체 저장소에 대한 기본 액세스 인증서 및 위치 URI를 설정하려면 DBMS_PIPE 프로시저를 사용합니다.

     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를 사용하여 자율운영 AI 데이터베이스 인스턴스에서 영구 파이프를 제거합니다.

  1. DBMS_PIPE.REMOVE_PIPE 함수를 호출하여 파이프를 제거합니다.

     DECLARE
        l_result  INTEGER;
     BEGIN
          l_result := DBMS_PIPE.REMOVE_PIPE('ORDER_PIPE');
     END;
     /
    

    REMOVE_PIPE 함수는 파이프가 실행되는 자율운영 AI 데이터베이스 인스턴스에서 파이프를 제거하지만, REMOVE_PIPE는 동일한 위치 URI를 사용하는 동일한 이름의 파이프가 있는 다른 자율운영 AI 데이터베이스 인스턴스에 영향을 주지 않습니다.

  2. 자율운영 AI 데이터베이스 인스턴스에서 DBMS_PIPE.REMOVE_PIPE를 실행하고 파이프가 제거되었는지 확인합니다.

     SELECT ownerid, name, type FROM v$db_pipes
            WHERE name = 'ORDER_PIPE';
    
     No rows selected
    

관련 콘텐츠