In a recent project, a customer used Advanced Queueing (AQ), and I had to move a single queue from one database to another.
In Oracle AI Database, you can use Data Pump to move queues. According to the documentation, exporting and importing a queue is straightforward, but there are some caveats to be aware of.
How to Export a Queue
I want to export the ORDER_Q queue in the APPUSER schema.
-
Under the hood, a queue consists of a queue table. Often, the queue uses an object type for its payload. I start by finding the queue table name and payload type:
select q.queue_table, qt.object_type from dba_queues q, dba_queue_tables qt where q.owner='APPUSER' and q.name='ORDER_Q' and q.owner=qt.owner and q.queue_table =qt.queue_table; QUEUE_TABLE OBJECT_TYPE ______________ __________________ ORDER_QT APPUSER.ORDER_T -
I prepare a Data Pump parfile named
queue_table_export.par. It exports the queue table:directory=dpdir dumpfile=order_qt.dmp logfile=order_q_export.log tables=APPUSER.ORDER_QT exclude=statistics- The
tablesparameter is the queue table for the queue I want to export. I find it using the query above.
- The
-
Then, I export the queue table:
expdp ... parfile=queue_table_export.par -
Next, I create a new parfile named
payload_type_export.par. It exports the object_type or payload_type:directory=dpdir dumpfile=queue_types.dmp logfile=queue_types_export.log schemas=appuser include=type:"IN ('ORDER_T')"- To export types, I must perform a schema export.
- I use the
includeparameter to include only types and further limit the export to theORDER_Ttype.
-
Then, I export the type:
expdp ... parfile=payload_type_export.par
How to Import
-
I start by importing the type:
impdp ... dumpfile=queue_types.dmp -
Then, I import the queue table:
impdp ... dumpfile=order_qt.dmp- Data Pump imports the queue table and all messages.
- It also calls the AQ API to create the queue infrastructure.
-
I connect to the database and start the queue:
BEGIN DBMS_AQADM.START_QUEUE( queue_name => 'APPUSER.ORDER_Q' ); END; /- Note that I start the queue by its name
ORDER_Q. It was created automatically during the import of the queue table.
- Note that I start the queue by its name
-
That’s it. I’ve moved the queue and can start using it.
What Happens During Import
Let’s see how Data Pump uses the AQ API when it imports the queue table.
- I start Data Pump to extract the DDL from the dump file:
impdp ... dumpfile=order_qt.dmp sqlfile=order_qt.sql- Data Pump reads the dump file and extracts the statements needed to perform this import.
- It doesn’t perform the import.
- The statements are written to the text file specified by
sqlfile.
- I examine the text file. This is what Data Pump would do during an import.
- Data Pump starts by creating the queue table:
CREATE TABLE "APPUSER"."ORDER_QT" ( "Q_NAME" VARCHAR2(128 BYTE), "MSGID" RAW(16), "CORRID" VARCHAR2(128 BYTE), "PRIORITY" NUMBER, ... - Next come a few indexes:
CREATE INDEX "APPUSER"."AQ$_ORDER_QT_I" ON "APPUSER"."ORDER_QT" ("Q_NAME", "STATE", "ENQ_TIME", "STEP_NO", "CHAIN_NO", "LOCAL_ORDER_NO") ... - Finally, the call to the AQ API to create the queue:
BEGIN SYS.DBMS_AQ_IMP_INTERNAL.IMPORT_QUEUE_TABLE('ORDER_QT',1,16801800,2,0,0,'', SYS.DBMS_AQ_IMP_INTERNAL.DBVER_10i, '00:00'); COMMIT; END; / BEGIN SYS.DBMS_AQ_IMP_INTERNAL.IMPORT_QUEUE(HEXTORAW('598D4E9609226B60E0635301000A0A08'),'ORDER_QT','AQ$_ORDER_QT_E',1,0,0,0,0,'exception queue'); COMMIT; END; / BEGIN SYS.DBMS_AQ_IMP_INTERNAL.IMPORT_QUEUE(HEXTORAW('598D4E9609236B60E0635301000A0A08'),'ORDER_QT','ORDER_Q',0,5,0,0,0,''); COMMIT; END; / - You can’t see the rows being loaded into the queue, but that happens too. All messages in the queue are also exported.
- Data Pump starts by creating the queue table:
- The
DBMS_AQ_IMP_INTERNALis an internal API. Don’t call it yourself.
What About a Full or Schema Export
If you perform a full or schema mode export, it’s simple. Data Pump exports all the required objects, including the types.
The only thing you must do is to start the queues after the import.
What If
The payload type must exist when you import the queue table. If you try to import the queue table without the type, Data Pump throws an error:
Processing object type TABLE_EXPORT/TABLE/TABLE
ORA-39117: Type needed to create table is not included in this operation. Failing sql is:
CREATE TABLE "APPUSER"."ORDER_QT" ("Q_NAME" VARCHAR2(128 BYTE), "MSGID" RAW(16), "CORRID" VARCHAR2(128 BYTE), "PRIORITY" NUMBER, "STATE" NUMBER, "DELAY" TIMESTAMP (6), "EXPIRATION" NUMBER, "TIME_MANAGER_INFO" TIMESTAMP (6), "LOCAL_ORDER_NO" NUMBER, "CHAIN_NO" NUMBER, "CSCN" NUMBER, "DSCN" NUMBER, "ENQ_TIME" TIMESTAMP (6), "ENQ_UID" VARCHAR2(128 BYTE), "ENQ_TID" VARCHAR2(30 BYTE), "DEQ_TIME" TIMESTAMP (6), "DEQ_UID" VARCHAR2(128 BYTE), "DEQ_TID" VARCHAR2(30 BYTE), "RETRY_COUNT" NUMBER, "EXCEPTION_QSCHEMA" VARCHAR2(128 BYTE), "EXCEPTION_QUEUE" VARCHAR2(128 BYTE), "STEP_NO" NUMBER, "RECIPIENT_KEY" NUMBER, "DEQUEUE_MSGID" RAW(16), "SENDER_NAME" VARCHAR2(128 BYTE), "SENDER_ADDRESS" VARCHAR2(1024 BYTE), "SENDER_PROTOCOL" NUMBER, "USER_DATA" "APPUSER"."ORDER_T" , "USER_PROP" "SYS"."ANYDATA" ) USAGE QUEUE SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "USERS" OPAQUE TYPE ("USER_PROP") STORE AS SECUREFILE LOB (ENABLE STORAGE IN ROW CHUNK 8192 CACHE NOCOMPRESS KEEP_DUPLICATES STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
That’s It
You can use Data Pump to move queues around. For table-mode exports, remember to export the payload type separately.
A few interesting links:
- Steps To Perform EXPDP/IMPDP For AQ Queue Tables (KB118627)
- Understanding How Advanced Queueing (AQ) Objects Are Exported And Imported (KB115340)
- Implications of Export/Import on Advanced Queuing (KB127724)
- What Objects Are Created When Creating a Queue Table? (KB84833)
- Things to Consider When Importing Advanced Queues using Oracle Data Pump
Happy queueing!
