{"id":47510,"date":"2026-10-19T08:59:00","date_gmt":"2026-10-19T06:59:00","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=47510"},"modified":"2026-10-04T17:00:17","modified_gmt":"2026-10-04T15:00:17","slug":"how-to-detect-a-suspended-goldengate-extract","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/","title":{"rendered":"How to detect a suspended GoldenGate extract"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">While testing <code>EVENTACTIONS (SUSPEND)<\/code> on an extract, I noticed that nothing in <code>INFO<\/code> tells you the process is suspended. The extract shows as <code>RUNNING<\/code>, the lag might look fine for a while, and yet it has stopped capturing. You may use <code>SUSPEND<\/code> on purpose (to pause an extract when a specific DDL goes by, for instance). Or someone else put it in a parameter file and you have to monitor the result. Either way, you need another way to know.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the end, <strong><code>SEND EXTRACT ... STATUS<\/code> is the only command that reports the suspended state<\/strong>, and it works the same way through the REST API, where the text is already parsed for you. A simpler check exists in the report file, generating an <code>OGG-01281<\/code>, but it has a limit I will show at the end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this blog, I will run an <code>EXT1<\/code> extract capturing from <code>PDB1<\/code>. It has a DDL <code>EVENTACTIONS<\/code> trigger on a <code>CREATE USER<\/code> statement run in <code>PDB1<\/code>. The trigger suspends the extract whenever a user is created:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXTRACT EXT1\nUSERIDALIAS pdb1 DOMAIN OracleGoldenGate\nEXTTRAIL pdb1\/e1\nDDL INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (SUSPEND)\nDDLOPTIONS REPORT\nTABLE APP_PDB1.*;<\/code><\/pre>\n\n\n\n<h2 id=\"extract-status-before-suspend\" class=\"wp-block-heading\">Extract status before <code>SUSPEND<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once started, the extract shows as <code>RUNNING<\/code> in <code>INFO ALL<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OGG (http:\/\/vmogg:7810 ogg_test_01) 2&gt; INFO ALL\nProgram     Status      Group       Type                   Lag at Chkpt       Time Since Chkpt\n\nEXTRACT     RUNNING     EXT1        INTEGRATED                  00:00:00           00:00:06<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>SEND EXTRACT EXT1 STATUS<\/code> reports where the extract is in its life cycle. Here, the extract has nothing to capture, so the status is <code>At EOF<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OGG (http:\/\/vmogg:7810 ogg_test_01) 2&gt; SEND EXTRACT EXT1 STATUS\n\nSending STATUS request to Extract group EXT1 ...\n\nEXTRACT EXT1 (PID 21617)\n  Current status: Recovery complete: At EOF\n\n  Current read position:\n  Redo thread #: 0\n  Sequence #: 0\n  RBA: 0\n  Timestamp: 2026-09-26 06:26:24.000000\n  SCN: 0.115334476 (115334476)\n  Current write position:\n  Sequence #: 11\n  RBA: 6942\n  Timestamp: 2026-09-26 06:26:20.463368\n  Extract Trail: pdb1\/e1<\/code><\/pre>\n\n\n\n<h2 id=\"suspending-the-extract\" class=\"wp-block-heading\">Suspending the extract<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s create a user in <code>PDB1<\/code>, which matches the <code>DDL<\/code> rule:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SQL&gt; CREATE USER SUSPTEST IDENTIFIED BY \"Suspend_Test_1\";\n\nUser created.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Half a minute later, <code>INFO EXT1<\/code> still says <code>RUNNING<\/code> with a lag of 0 seconds, but the checkpoint was last updated 30 seconds ago:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OGG (http:\/\/vmogg:7810 ogg_test_01) 2&gt; INFO EXT1\n\nExtract    EXT1      Last Started 2026-09-26 06:26   Status RUNNING\nCheckpoint Lag       00:00:00 (updated 00:00:30 ago)\nProcess ID           21617\nLog Read Checkpoint  Oracle Integrated Redo Logs, per-PDB\n                     2026-09-26 06:26:18\n                     SCN 0.115334462 (115334462)\nEncryption Profile   LocalWallet\nNo Replicat groups found, but some coordinated threads may have been excluded.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Two minutes after the <code>CREATE USER<\/code>, the same command gives:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OGG (http:\/\/vmogg:7810 ogg_test_01) 2&gt; INFO EXT1\n\nExtract    EXT1      Last Started 2026-09-26 06:26   Status RUNNING\nCheckpoint Lag       00:00:00 (updated 00:02:00 ago)\nProcess ID           21617\nLog Read Checkpoint  Oracle Integrated Redo Logs, per-PDB\n                     2026-09-26 06:26:18\n                     SCN 0.115334462 (115334462)\nEncryption Profile   LocalWallet\nNo Replicat groups found, but some coordinated threads may have been excluded.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The status is still <code>RUNNING<\/code>, and <strong>the lag value does not grow<\/strong>: <code>Checkpoint Lag<\/code> stays at <code>00:00:00<\/code>. What grows is the time since the checkpoint was updated (<code>updated 00:00:30 ago<\/code>, then <code>updated 00:02:00 ago<\/code>), and the checkpoint position (<code>SCN 0.115334462<\/code>) never moves. That is a hint that something is wrong (or right), but nothing in this output says it is a suspend.<\/p>\n\n\n\n<h2 id=\"send-extract-status-shows-the-suspended-state\" class=\"wp-block-heading\"><code>SEND EXTRACT STATUS<\/code> shows the suspended state<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Now the same <code>SEND EXTRACT EXT1 STATUS<\/code> as before:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OGG (http:\/\/vmogg:7810 ogg_test_01) 2&gt; SEND EXTRACT EXT1 STATUS\n\nSending STATUS request to Extract group EXT1 ...\n\nEXTRACT EXT1 (PID 21617)\n  Current status: Recovery complete: Suspended, waiting to be resumed\n\n  Current read position:\n  Redo thread #: 1\n  Sequence #: 3045\n  RBA: 58777616\n  Timestamp: 2026-09-26 06:26:27.000000\n  SCN: 0.115334507 (115334507)\n  Current write position:\n  Sequence #: 11\n  RBA: 6942\n  Timestamp: 2026-09-26 06:26:20.463368\n  Extract Trail: pdb1\/e1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Comparing the two outputs, <strong>the only line that tells you the extract is suspended is <code>Current status<\/code><\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Before: <code>Current status: Recovery complete: At EOF<\/code>. It could have been some other message if it was still extracting.<\/li>\n\n\n\n<li>After: <code>Current status: Recovery complete: Suspended, waiting to be resumed<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Everything else in <code>INFO<\/code> is compatible with a healthy extract. To resume it, run <code>SEND EXTRACT EXT1 RESUME<\/code>.<\/p>\n\n\n\n<h2 id=\"which-command-shows-the-suspend\" class=\"wp-block-heading\">Which command shows the suspend?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>STATUS EXTRACT<\/code> looks like the natural command, but it is not the same as <code>SEND EXTRACT ... STATUS<\/code>. On the suspended extract, <code>STATUS EXTRACT<\/code> gives:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OGG (http:\/\/vmogg:7810 ogg_test_01) 4&gt; STATUS EXTRACT EXT1\nEXTRACT EXT1: RUNNING<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>INFO EXT1 DETAIL<\/code> adds the trail, the outbound server SCNs and the file locations, but its header is the same as <code>INFO EXT1<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OGG (http:\/\/vmogg:7810 ogg_test_01) 5&gt; INFO EXT1 DETAIL\n\nExtract    EXT1      Last Started 2026-09-26 06:26   Status RUNNING\nCheckpoint Lag       00:00:00 (updated 00:02:00 ago)\nProcess ID           21617\nLog Read Checkpoint  Oracle Integrated Redo Logs, per-PDB\n                     2026-09-26 06:26:18\n                     SCN 0.115334462 (115334462)\nEncryption Profile   LocalWallet\n\n  Target Extract Trails:\n\n  Trail Name                                       Seqno        RBA     Max MB Trail Type\n\n  pdb1\/e1                                             11       6942       2000 EXTTRAIL\n\nIntegrated Extract outbound server first scn: 0.115313606 (115313606)\n\nIntegrated Extract outbound server filtering start scn: 0.115313606 (115313606)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Command<\/th><th>Before the suspend<\/th><th>After the suspend<\/th><\/tr><\/thead><tbody><tr><td><code>INFO ALL<\/code><\/td><td><code>RUNNING<\/code><\/td><td><code>RUNNING<\/code><\/td><\/tr><tr><td><code>INFO EXT1<\/code><\/td><td><code>RUNNING<\/code><\/td><td><code>RUNNING<\/code><\/td><\/tr><tr><td><code>INFO EXT1 DETAIL<\/code><\/td><td><code>RUNNING<\/code><\/td><td><code>RUNNING<\/code><\/td><\/tr><tr><td><code>STATUS EXTRACT EXT1<\/code><\/td><td><code>RUNNING<\/code><\/td><td><code>RUNNING<\/code><\/td><\/tr><tr><td><code>SEND EXTRACT EXT1 STATUS<\/code><\/td><td><code>Recovery complete: At EOF<\/code><\/td><td><code>Recovery complete: Suspended, waiting to be resumed<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Only <code>SEND EXTRACT ... STATUS<\/code> shows the suspend.<\/strong> <code>STATUS EXTRACT<\/code>, like <code>INFO<\/code>, just reports the state of the process.<\/p>\n\n\n\n<h2 id=\"getting-the-status-with-the-rest-api\" class=\"wp-block-heading\">Getting the status with the REST API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>SEND<\/code> commands are available through the <code>\/services\/{version}\/extracts\/{extract}\/command<\/code> endpoint, and the response already contains the parsed status.<\/p>\n\n\n\n<h3 id=\"with-the-oggrestapi-python-client\" class=\"wp-block-heading\">With the <code>oggrestapi<\/code> Python client<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With the <a href=\"https:\/\/juliendelattre.com\/tools\/ogg-python-client\/\" target=\"_blank\" rel=\"noopener noreferrer\">GoldenGate Python client<\/a>, <code>execute_command_extract<\/code> sends the request. First, initialize the client:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; from oggrestapi import OGGRestAPI\n&gt;&gt;&gt; ogg_client = OGGRestAPI(\n    url='http:\/\/vmogg:7810',\n    username='ogg',\n    password='ogg'\n)\nConnected to OGG REST API at http:\/\/vmogg:7810<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the raw output given by the <code>execute_command_extract<\/code> method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; resp = ogg_client.execute_command_extract('EXT1', data={'command': 'STATUS'})\n&gt;&gt;&gt; resp\n{'$schema': 'er:commandResult', 'reply': 'OKNODOT\\tEXTRACT EXT1 (PID 41522)\\n  Current status: Recovery complete: Suspended, waiting to be resumed\\n\\n  Current read position:\\n  Redo thread #: 1\\n  Sequence #: 3047\\n  RBA: 92686352\\n  Timestamp: 2026-09-26 08:48:41.000000\\n  SCN: 0.115434621 (115434621)\\n  Current write position:\\n  Sequence #: 1\\n  RBA: 5679\\n  Timestamp: 2026-09-26 08:48:37.669072\\n  Extract Trail: pdb1\/r1\\n\\n', 'replyData': {'$schema': 'er:statusResult', 'status': {'groupName': 'EXT1', 'processId': '41522', 'processType': 'extract', 'status': 'Recovery complete: Suspended, waiting to be resumed', 'extractReadingPosition': &#091;{'$schema': 'dbms:positionInfo', 'position': {'redoThread': 1, 'csn': 115434621, 'seqno': 3047, 'rba': 92686352, 'timestamp': '2026-09-26T08:48:41.000Z'}}], 'extractWritingPosition': &#091;{'$schema': 'ogg:trailPosition', 'sequence': 1, 'offset': 5679, 'name': 'r1', 'path': 'pdb1\/'}]}}}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In GoldenGate REST API, the status is available in <code>replyData.status.status<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; resp&#091;'replyData']&#091;'status']&#091;'status']\n'Recovery complete: Suspended, waiting to be resumed'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To avoid repeating the <code>replyData<\/code> navigation everywhere, custom methods are available in <code>oggrestapi<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def get_extract_status_detail(self, extract):\n    result = self.execute_command_extract(extract, data={'command': 'STATUS'})\n    return str(result.get('replyData', {}).get('status', {}).get('status', ''))\n\ndef is_extract_suspended(self, extract):\n    return 'suspended' in self.get_extract_status_detail(extract).lower()<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; ogg_client.get_extract_status_detail('EXT1')\n'Recovery complete: Suspended, waiting to be resumed'\n\n&gt;&gt;&gt; ogg_client.is_extract_suspended('EXT1')\nTrue<\/code><\/pre>\n\n\n\n<h3 id=\"with-the-requests-module\" class=\"wp-block-heading\">With the <code>requests<\/code> module<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Without the client, send <code>STATUS<\/code> as the command with the <code>requests<\/code> library:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import requests\n\nurl = 'http:\/\/vmogg:7810\/services\/v2\/extracts\/EXT1'\nauth = ('ogg', 'ogg')\n\nresponse = requests.post(f'{url}\/command', auth=auth, json={'command': 'STATUS'}).json()&#091;'response']<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The response contains the same <code>replyData<\/code> field, with the status already extracted:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; response&#091;'replyData']&#091;'status']&#091;'status']\n'Recovery complete: Suspended, waiting to be resumed'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Note that this is not the same as the <code>info\/status<\/code> endpoint, which returns the process state as <code>INFO<\/code> does. It says <code>running<\/code> for a suspended extract, but it holds the two values behind the lag line of <code>INFO<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; requests.get(f'{url}\/info\/status', auth=auth).json()&#091;'response']\n{'$schema': 'ogg:extractStatus', 'status': 'running', 'processId': 21617, 'lastStarted': '2026-09-26T06:26:09.798Z', 'lag': 0, 'sinceLagReported': 125, 'position': '0.115334462'}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>lag<\/code> is the checkpoint lag of <code>INFO<\/code>, and <strong><code>sinceLagReported<\/code> is the <code>updated ... ago<\/code> value in seconds<\/strong>.<\/p>\n\n\n\n<h3 id=\"adding-a-lag-check\" class=\"wp-block-heading\">Adding a lag check<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For a monitoring script, the status can be paired with a lag check. <code>get_extract_status<\/code> costs a single <code>GET<\/code> call, and a healthy extract keeps updating its checkpoint. A large <code>sinceLagReported<\/code> is a cheap first filter before sending the <code>STATUS<\/code> command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; status = ogg_client.get_extract_status('EXT1')\n&gt;&gt;&gt; status&#091;'status'] == 'running' and status&#091;'sinceLagReported'] &gt; 60 and ogg_client.is_extract_suspended('EXT1')\nTrue<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">When this returns <code>True<\/code>, you have a running extract that has not moved for more than a minute and that reports itself as suspended. Whether you should then resume it depends on why the <code>SUSPEND<\/code> was there in the first place. An alert is usually the right answer. If you do want to resume it from the script, it is another <code>execute_command_extract<\/code> call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; ogg_client.execute_command_extract('EXT1', data={'command': 'RESUME'})<\/code><\/pre>\n\n\n\n<h2 id=\"a-simpler-check-ogg-01281-in-the-report\" class=\"wp-block-heading\">A simpler check: <code>OGG-01281<\/code> in the report<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The suspend also leaves a trace in the extract report file, with the <code>OGG-01281<\/code> message:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2026-09-26 06:26:29  INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (SUSPEND)], optype &#091;CREATE], objtype &#091;USER], objowner \"\", objname \"SUSPTEST\".\n\n2026-09-26 06:26:30  INFO    OGG-01281  Processed SUSPEND event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Is this message specific to <code>SUSPEND<\/code>? To check it, I ran the same <code>DDL<\/code> rule with other <code>EVENTACTIONS<\/code>, recreating the user each time:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># DDL INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (ROLLOVER)\n2026-09-26 06:29:32  INFO    OGG-01285  Processed ROLLOVER event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.\n\n# DDL INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (LOG INFO)\n2026-09-26 06:30:37  INFO    OGG-06117  Processed LOG event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.\n\n# DDL INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (LOG WARNING)\n2026-09-26 06:31:40  WARNING OGG-06118  Processed LOG event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ROLLOVER<\/code> raises <code>OGG-01285<\/code>, and <code>LOG<\/code> raises <code>OGG-06117<\/code> (or <code>OGG-06118<\/code> with <code>WARNING<\/code>). <code>IGNORE<\/code> raises nothing at all beyond the <code>OGG-00487<\/code> line. So <strong><code>OGG-01281<\/code> is only raised by <code>SUSPEND<\/code><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The limit of this check is that the report is a history, not a state. When resuming the extract, the <code>OGG-01281<\/code> line stays in the report, and a new message is written after it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2026-09-26 06:26:30  INFO    OGG-01281  Processed SUSPEND event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.\n2026-09-26 06:28:29  INFO    OGG-01824  Resume processing from SUSPEND state for process EXT1.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Finding <code>OGG-01281<\/code> in the report does not mean the extract is suspended now.<\/strong> You have to check that no <code>OGG-01824<\/code> comes after it. On top of that, the report is rolled over at each restart of the extract, so it only covers the current run. With the REST API, the report is available through <code>get_extract_report<\/code>, whose <code>lines<\/code> key contains the list of lines:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; report = ogg_client.get_extract_report('EXT1', 'EXT1.rpt')\n&gt;&gt;&gt; &#091;line for line in report&#091;'lines'] if 'OGG-01281' in line or 'OGG-01824' in line]\n&#091;'2026-09-26 06:26:30  INFO    OGG-01281  Processed SUSPEND event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.']<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is useful to find out when and why the extract was suspended, since the message contains the object that triggered it. But to know whether it is suspended right now, <code>STATUS<\/code> is the reliable way.<\/p>\n\n\n\n<h2 id=\"the-full-check-in-one-script\" class=\"wp-block-heading\">The full check in one script<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a small script with everything seen in this blog. It runs the lag check, the suspend check, and the log analysis to find the culprit, then prints an info message.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from oggrestapi import OGGRestAPI\n\nogg_client = OGGRestAPI(url='http:\/\/vmogg:7810', username='ogg', password='ogg')\n\nextract = 'EXT1'\nstatus = ogg_client.get_extract_status(extract)\n\n# Lag check: a running extract whose checkpoint has not moved for a minute\nif status&#091;'status'] == 'running' and status&#091;'sinceLagReported'] &gt; 60:\n    # Suspend check\n    if ogg_client.is_extract_suspended(extract):\n        # Log analysis: the last OGG-01281 or OGG-01824 tells who suspended it\n        report = ogg_client.get_extract_report(extract, f'{extract}.rpt')\n        events = &#091;line for line in report&#091;'lines'] if 'OGG-01281' in line or 'OGG-01824' in line]\n        if events and 'OGG-01281' in events&#091;-1]:\n            print(f'INFO: {extract} is suspended. Culprit: {events&#091;-1]}')\n        else:\n            print(f'INFO: {extract} is suspended, but no OGG-01281 in the current report')\n    else:\n        print(f'INFO: {extract} is not suspended, but its checkpoint has not moved for {status&#091;\"sinceLagReported\"]} seconds')\nelse:\n    print(f'INFO: {extract} is not suspended')<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>INFO: EXT1 is suspended. Culprit: 2026-09-26 06:26:30  INFO    OGG-01281  Processed SUSPEND event from DDL on object name SUSPTEST, DDL seqno 0, marker seqno 0.<\/code><\/pre>\n\n\n\n<h2 id=\"what-about-replicats\" class=\"wp-block-heading\">What about replicats?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It works the same way for a replicat. I tested it with an integrated replicat applying the trail of <code>EXT1<\/code>, with <code>DDL INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (SUSPEND)<\/code> in its parameter file. <code>INFO<\/code> reports <code>RUNNING<\/code>, and <code>SEND REPLICAT REP1 STATUS<\/code> reports the suspended state. <code>is_replicat_suspended<\/code> returns <code>True<\/code>, and <code>SEND REPLICAT REP1 RESUME<\/code> resumes it with an <code>OGG-01824<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The suspend is still logged with <code>OGG-01281<\/code>, but <strong>the culprit is not named<\/strong>. The replicat suspends before applying the DDL, so the report says <code>object name N\/A<\/code>. The user name only appears in the <code>OGG-00487<\/code> line after the resume operation:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2026-09-26 08:56:19  INFO    OGG-01281  Processed SUSPEND event from DDL on object name N\/A in file \/u01\/app\/ogg\/deployments\/ogg_test_01\/var\/lib\/data\/pdb1\/q1000000000, RBA 5284.\n2026-09-26 08:58:02  INFO    OGG-01824  Resume processing from SUSPEND state for process REP1.\n2026-09-26 08:58:02  INFO    OGG-00487  DDL operation included &#091;INCLUDE ALL OBJTYPE 'USER' OPTYPE CREATE EVENTACTIONS (SUSPEND)], optype &#091;CREATE], objtype &#091;USER], objowner \"\", objname \"SUSPTEST\".<\/code><\/pre>\n\n\n\n<h2 id=\"summary\" class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To know whether a GoldenGate extract is suspended by an <code>EVENTACTIONS (SUSPEND)<\/code> rule:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Do not rely on <code>INFO ALL<\/code>, <code>INFO<\/code>, <code>INFO DETAIL<\/code> or <code>STATUS EXTRACT<\/code>. They all report <code>RUNNING<\/code>, and the checkpoint lag stays the same. Only the <code>updated ... ago<\/code> value grows.<\/li>\n\n\n\n<li>Run <code>SEND EXTRACT EXT1 STATUS<\/code> in the <code>adminclient<\/code>: <code>Current status: Recovery complete: Suspended, waiting to be resumed<\/code> appears when the extract is suspended.<\/li>\n\n\n\n<li>In a script, use <code>is_extract_suspended<\/code> from the Python client, or send the same <code>STATUS<\/code> command to <code>\/services\/v2\/extracts\/EXT1\/command<\/code> and read <code>replyData.status.status<\/code>.<\/li>\n\n\n\n<li>Filter with <code>sinceLagReported<\/code> from <code>info\/status<\/code> (for instance more than 60 seconds) before sending the <code>STATUS<\/code> command.<\/li>\n\n\n\n<li>Use <code>OGG-01281<\/code> in the report to find out when and why the extract was suspended, and check that no <code>OGG-01824<\/code> came after it.<\/li>\n\n\n\n<li>Resume with <code>SEND EXTRACT EXT1 RESUME<\/code>, or with the <code>RESUME<\/code> command through <code>execute_command_extract<\/code>.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>While testing EVENTACTIONS (SUSPEND) on an extract, I noticed that nothing in INFO tells you the process is suspended. The extract shows as RUNNING, the lag might look fine for a while, and yet it has stopped capturing. You may use SUSPEND on purpose (to pause an extract when a specific DDL goes by, for [&hellip;]<\/p>\n","protected":false},"author":152,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":"","_members_access_role":[],"_members_access_error":""},"categories":[3787,59],"tags":[3804,4273,4274,3781,328,143,3730,1089,4255],"type_dbi":[3823,4276,4275,3785,3740,3347,3881,3768,4261],"class_list":["post-47510","post","type-post","status-publish","format-standard","hentry","category-goldengate","category-oracle","tag-26ai","tag-adminclient","tag-eventactions","tag-extract","tag-goldengate","tag-monitoring","tag-ogg","tag-python","tag-rest-api-2","type-26ai","type-adminclient","type-eventactions","type-extract","type-goldengate","type-monitoring","type-ogg","type-python","type-rest-api-3"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.7 (Yoast SEO v28.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to detect a suspended GoldenGate extract - dbi Blog<\/title>\n<meta name=\"description\" content=\"INFO EXTRACT keeps saying RUNNING after an EVENTACTIONS SUSPEND. Detect suspended GoldenGate extract state with STATUS, REST and OGG-01281.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to detect a suspended GoldenGate extract\" \/>\n<meta property=\"og:description\" content=\"INFO EXTRACT keeps saying RUNNING after an EVENTACTIONS SUSPEND. Detect suspended GoldenGate extract state with STATUS, REST and OGG-01281.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-19T06:59:00+00:00\" \/>\n<meta name=\"author\" content=\"Julien Delattre\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Julien Delattre\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/how-to-detect-a-suspended-goldengate-extract\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/how-to-detect-a-suspended-goldengate-extract\\\/\"},\"author\":{\"name\":\"Julien Delattre\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/812297b963933317cfcbbf006a273eec\"},\"headline\":\"How to detect a suspended GoldenGate extract\",\"datePublished\":\"2026-10-19T06:59:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/how-to-detect-a-suspended-goldengate-extract\\\/\"},\"wordCount\":1021,\"commentCount\":0,\"keywords\":[\"26ai\",\"adminclient\",\"eventactions\",\"extract\",\"GoldenGate\",\"Monitoring\",\"ogg\",\"Python\",\"rest api\"],\"articleSection\":[\"GoldenGate\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/how-to-detect-a-suspended-goldengate-extract\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/how-to-detect-a-suspended-goldengate-extract\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/how-to-detect-a-suspended-goldengate-extract\\\/\",\"name\":\"How to detect a suspended GoldenGate extract - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-19T06:59:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/812297b963933317cfcbbf006a273eec\"},\"description\":\"INFO EXTRACT keeps saying RUNNING after an EVENTACTIONS SUSPEND. Detect suspended GoldenGate extract state with STATUS, REST and OGG-01281.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/how-to-detect-a-suspended-goldengate-extract\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/how-to-detect-a-suspended-goldengate-extract\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/how-to-detect-a-suspended-goldengate-extract\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to detect a suspended GoldenGate extract\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/812297b963933317cfcbbf006a273eec\",\"name\":\"Julien Delattre\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"caption\":\"Julien Delattre\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/juliendelattre\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to detect a suspended GoldenGate extract - dbi Blog","description":"INFO EXTRACT keeps saying RUNNING after an EVENTACTIONS SUSPEND. Detect suspended GoldenGate extract state with STATUS, REST and OGG-01281.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/","og_locale":"en_US","og_type":"article","og_title":"How to detect a suspended GoldenGate extract","og_description":"INFO EXTRACT keeps saying RUNNING after an EVENTACTIONS SUSPEND. Detect suspended GoldenGate extract state with STATUS, REST and OGG-01281.","og_url":"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/","og_site_name":"dbi Blog","article_published_time":"2026-10-19T06:59:00+00:00","author":"Julien Delattre","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Julien Delattre","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/"},"author":{"name":"Julien Delattre","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/812297b963933317cfcbbf006a273eec"},"headline":"How to detect a suspended GoldenGate extract","datePublished":"2026-10-19T06:59:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/"},"wordCount":1021,"commentCount":0,"keywords":["26ai","adminclient","eventactions","extract","GoldenGate","Monitoring","ogg","Python","rest api"],"articleSection":["GoldenGate","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/","url":"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/","name":"How to detect a suspended GoldenGate extract - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2026-10-19T06:59:00+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/812297b963933317cfcbbf006a273eec"},"description":"INFO EXTRACT keeps saying RUNNING after an EVENTACTIONS SUSPEND. Detect suspended GoldenGate extract state with STATUS, REST and OGG-01281.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/how-to-detect-a-suspended-goldengate-extract\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to detect a suspended GoldenGate extract"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/812297b963933317cfcbbf006a273eec","name":"Julien Delattre","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","caption":"Julien Delattre"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/juliendelattre\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/47510","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/152"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=47510"}],"version-history":[{"count":3,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/47510\/revisions"}],"predecessor-version":[{"id":47634,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/47510\/revisions\/47634"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=47510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=47510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=47510"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=47510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}