{"id":46797,"date":"2026-09-10T08:28:00","date_gmt":"2026-09-10T06:28:00","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=46797"},"modified":"2026-09-07T17:32:26","modified_gmt":"2026-09-07T15:32:26","slug":"rename-a-goldengate-extract-with-the-rest-api","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/","title":{"rendered":"Rename a GoldenGate Extract with the REST API"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In a <a href=\"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-without-missing-transactions\/\" target=\"_blank\" rel=\"noopener noreferrer\">previous blog<\/a>, I went through the full procedure of renaming a GoldenGate extract from the <code>adminclient<\/code>. I included all necessary steps to avoid missing transactions. Doing this by hand is completely fine, but if you do it often, or want to remove the risk of a typo on an SCN, I have another solution for you. In this blog, I automate the same procedure with a Python script, <code>rename_extract.py<\/code>, using GoldenGate REST API (the <a href=\"https:\/\/juliendelattre.com\/docs\/rename-goldengate-extract-rest-api-script\/\" target=\"_blank\" rel=\"noopener noreferrer\">full source is in this reference doc<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Please read through the previous blog if you have not already done it. I explain there the two SCNs involved (the <strong>start SCN<\/strong>, the oldest unprocessed transaction, and the <strong>dictionary build SCN<\/strong>, which must predate it) and why their ordering matters. Here, I only cover how to obtain and pass them through the REST API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As a reminder, these were the steps:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Build the <strong>LogMiner data dictionary<\/strong> (if you don\u2019t already build it regularly).<\/li>\n\n\n\n<li>Check for <strong>long running transactions<\/strong> in the source database.<\/li>\n\n\n\n<li><strong>Stop the extract<\/strong> that you want to rename.<\/li>\n\n\n\n<li>Get the SCN of the <strong>oldest unprocessed transaction<\/strong>.<\/li>\n\n\n\n<li>Find the <strong>dictionary build<\/strong> to register the new extract.<\/li>\n\n\n\n<li><strong>Create the new extract<\/strong>, registered and started at the correct SCNs, reusing the old extract\u2019s parameter file with only the name and trail changed.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"building-the-logminer-dictionary\" class=\"wp-block-heading\">Building the LogMiner dictionary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DBMS_CAPTURE_ADM.BUILD<\/code> is a database-side operation, not a GoldenGate one, so the REST API cannot run it directly. The script runs it through the Python <code>oracledb<\/code> module when available :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import oracledb\n\ndef build_dictionary_oracledb(dsn, user, password):\n    with oracledb.connect(dsn=dsn, user=user, password=password) as conn:\n        with conn.cursor() as cur:\n            first_scn = cur.var(int)\n            cur.execute(\"BEGIN DBMS_CAPTURE_ADM.BUILD(first_scn =&gt; :first_scn); END;\", first_scn=first_scn)\n            return int(first_scn.getvalue())<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; build_dictionary_oracledb(\"localhost:1521\/CDB01\", \"c##oggadmin\", \"ogg\")\n25261458<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or through <code>sqlplus<\/code> when <code>oracledb<\/code> is not installed :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import re\nimport shutil\nimport subprocess\n\ndef build_dictionary_sqlplus(dsn, user, password):\n    if not shutil.which(\"sqlplus\"):\n        raise RuntimeError(\"sqlplus is not on PATH\")\n    script = f\"\"\"\n        SET SERVEROUTPUT ON\n        CONNECT {user}\/{password}@{dsn}\n        DECLARE\n            scn NUMBER;\n        BEGIN\n            DBMS_CAPTURE_ADM.BUILD(first_scn =&gt; scn);\n            DBMS_OUTPUT.PUT_LINE('DICTIONARY_BUILD_SCN:' || scn);\n        END;\n        \/\n        EXIT\n    \"\"\"\n    proc = subprocess.run(&#091;\"sqlplus\", \"-s\", \"\/nolog\"], input=script, capture_output=True, text=True)\n    return int(re.search(r\"DICTIONARY_BUILD_SCN:(\\d+)\", proc.stdout).group(1))<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; build_dictionary_sqlplus(\"localhost:1521\/CDB01\", \"c##oggadmin\", \"ogg\")\n25262183<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you already build the dictionary on a regular schedule, <code>rename_extract.py<\/code> never calls either of these : the lookup further down finds an existing build old enough to reuse and moves straight on. It only builds a fresh one as a fallback, when that lookup comes back empty.<\/p>\n\n\n\n<h2 id=\"computing-the-start-scn-through-the-api\" class=\"wp-block-heading\">Computing the start SCN through the API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Reading the old extract\u2019s recovery checkpoint and the database\u2019s active transactions (exactly what the <a href=\"https:\/\/www.dbi-services.com\/blog\/checking-long-running-transactions-in-goldengate\/\" target=\"_blank\" rel=\"noopener noreferrer\">long running transactions blog<\/a> describes) gives you the oldest unprocessed transaction. <code>get_extract_checkpoint<\/code> calls <code>GET \/services\/{version}\/extracts\/{extract}\/info\/checkpoints<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; extract_checkpoints = ogg_client.get_extract_checkpoint(\"EXT1\")\n&gt;&gt;&gt; extract_checkpoints&#091;\"current\"]&#091;\"input\"]&#091;0]&#091;\"recovery\"]\n{'timestamp': '2026-09-06T14:03:16.000Z', 'thread': 1, 'sequence': 888, 'offset': 172466704, 'csn': 25167710, 'name': None}\n&gt;&gt;&gt; start_scn = extract_checkpoints&#091;\"current\"]&#091;\"input\"]&#091;0]&#091;\"recovery\"]&#091;\"csn\"]\n&gt;&gt;&gt; start_scn\n25167710<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>get_active_transactions<\/code> runs the same check the <a href=\"https:\/\/www.dbi-services.com\/blog\/checking-long-running-transactions-in-goldengate\/\" target=\"_blank\" rel=\"noopener noreferrer\">long running transactions blog<\/a> covers by hand, as a REST call to <code>GET \/services\/{version}\/connections\/{connection}\/activeTransactions<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; ogg_client.get_active_transactions(\"OracleGoldenGate.source_cdb\")\n{'activeTransactions': &#091;], 'currentScn': {'csn': 25167998, 'currentDate': '2026-09-06T14:03:30.000Z', 'userName': 'SYS'}, '$schema': 'ogg:activeTransactions'}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No open transactions here, so <code>25167710<\/code> stands as the start SCN. Had there been one, its <code>txnStartScn<\/code> would have been folded in and the smallest of the two kept, exactly as <code>get_oldest_unprocessed_scn<\/code> does in the full script <code>rename_extract.py<\/code> (see below).<\/p>\n\n\n\n<h2 id=\"computing-the-dictionary-scn\" class=\"wp-block-heading\">Computing the dictionary SCN<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Building a LogMiner dictionary is a database-side operation (<code>DBMS_CAPTURE_ADM.BUILD<\/code>). So is finding the right existing build, directly against the source database :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import oracledb\n\ndef get_dictionary_scn_oracledb(dsn, user, password, start_scn):\n    with oracledb.connect(dsn=dsn, user=user, password=password) as conn:\n        with conn.cursor() as cur:\n            cur.execute(\"\"\"\n                SELECT first_change#\n                FROM v$archived_log\n                WHERE dictionary_begin = 'YES'\n                AND standby_dest = 'NO'\n                AND name IS NOT NULL\n                AND status = 'A'\n                AND first_change# &lt; :start_scn\n                ORDER BY first_change# DESC\n                FETCH FIRST 1 ROWS ONLY\n            \"\"\", start_scn=start_scn)\n            row = cur.fetchone()\n            return row&#091;0] if row else None<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; get_dictionary_scn_oracledb(\"localhost:1521\/CDB01\", \"c##oggadmin\", \"ogg\", 25167710)\n25134064<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If <code>dictionary_scn<\/code> is <code>None<\/code>, no existing build predates the start SCN. It happens on a source database where the dictionary is not built on a regular schedule (the same case the <a href=\"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-without-missing-transactions\/#find-the-logminer-dictionary-build-to-register-at\" target=\"_blank\" rel=\"noopener noreferrer\">adminclient blog<\/a> covers by hand). <code>rename_extract.py<\/code> handles it by calling <code>build_dictionary<\/code> (above) for a fresh build. It then waits for the old extract\u2019s checkpoint to move past that build\u2019s SCN before continuing.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if dictionary_scn is None:\n    dictionary_scn = build_dictionary(dsn, user, password, driver)\n    start_scn = wait_for_dictionary_scn(ogg_client, \"EXT1\", \"OracleGoldenGate.source_cdb\", dictionary_scn)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>wait_for_dictionary_scn<\/code> polls <code>get_extract_checkpoint<\/code> every 30 seconds until the old extract\u2019s start SCN passes the new build\u2019s SCN. It gives up after 10 minutes with an error, rather than hanging forever. Both these delays are configurable. The old extract keeps running throughout, since stopping it would freeze its checkpoint.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When <code>oracledb<\/code> is not installed, the same query runs through <code>sqlplus<\/code> instead :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import shutil\nimport subprocess\n\ndef get_dictionary_scn_sqlplus(dsn, user, password, start_scn):\n    if not shutil.which(\"sqlplus\"):\n        raise RuntimeError(\"sqlplus is not on PATH\")\n    script = f\"\"\"\n        SET FEEDBACK OFF HEADING OFF PAGESIZE 0\n        CONNECT {user}\/{password}@{dsn}\n        SELECT first_change# FROM v$archived_log\n        WHERE dictionary_begin = 'YES' AND standby_dest = 'NO'\n        AND name IS NOT NULL AND status = 'A'\n        AND first_change# &lt; {start_scn}\n        ORDER BY first_change# DESC FETCH FIRST 1 ROWS ONLY;\n        EXIT\n    \"\"\"\n    proc = subprocess.run(&#091;\"sqlplus\", \"-s\", \"\/nolog\"], input=script, capture_output=True, text=True)\n    return int(proc.stdout.strip()) if proc.stdout.strip() else None<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; get_dictionary_scn_sqlplus(\"localhost:1521\/CDB01\", \"c##oggadmin\", \"ogg\", 25167710)\n25134064<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><span class=\"proof-marker\">Please note that unlike <code>oracledb<\/code>, <code>sqlplus<\/code> needs the statement\u2019s trailing <code>;<\/code> to execute the query.<\/span><\/p>\n\n\n\n<h2 id=\"creating-the-new-extract-at-the-correct-scns\" class=\"wp-block-heading\">Creating the new extract at the correct SCNs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rather than retyping the old extract\u2019s parameter file by hand, <code>get_extract<\/code> returns its exact <code>config<\/code> and <code>credentials<\/code>, which the new extract can reuse as is, only changing the <code>EXTRACT<\/code> name and the <code>EXTTRAIL<\/code> line :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; old = ogg_client.get_extract(\"EXT1\")\n&gt;&gt;&gt; old&#091;\"config\"]\n&#091;'EXTRACT EXT1', 'USERIDALIAS source_cdb DOMAIN OracleGoldenGate', 'EXTTRAIL aa', 'SOURCECATALOG PDB1', 'TABLE SALES.ORDERS;']\n&gt;&gt;&gt; old&#091;\"credentials\"]\n{'alias': 'source_cdb', 'domain': 'OracleGoldenGate'}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>old_config = old&#091;\"config\"]\ncredentials = old&#091;\"credentials\"]\n\nnew_config = &#091;]\nfor line in old_config:\n    if line.startswith(\"EXTRACT \"):\n        new_config.append(\"EXTRACT EXT2\")\n    elif line.startswith(\"EXTTRAIL \"):\n        new_config.append(\"EXTTRAIL pdb1\/bb\")\n    else:\n        new_config.append(line)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>create_extract<\/code> call then accepts both the <strong>begin<\/strong> position (start SCN) and the <strong>registration<\/strong> (dictionary build SCN) in a single call, on top of the reused config :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; ogg_client.stop_extract(\"EXT1\")\n&gt;&gt;&gt; r = ogg_client.create_extract(\n...     extract=\"EXT2\",\n...     begin={\"at\": {\"csn\": start_scn}},\n...     registration={\"containers\": &#091;\"PDB1\"], \"csn\": dictionary_scn, \"replace\": True},\n...     source=\"tranlogs\",\n...     config=new_config,\n...     credentials=credentials,\n...     targets=&#091;{\"name\": \"bb\", \"path\": \"pdb1\"}],\n... )\n&gt;&gt;&gt; &#091;m&#091;\"title\"] for m in r&#091;\"messages\"]]\n&#091;'Integrated Extract added.', 'Extract group EXT2 successfully registered with database at SCN 25134064.', 'Parameter file EXT2.prm passed validity check.']\n&gt;&gt;&gt; r = ogg_client.start_extract(\"EXT2\")\n&gt;&gt;&gt; &#091;m&#091;\"title\"] for m in r&#091;\"messages\"]]\n&#091;'Extract group EXT2 starting.', 'Extract group EXT2 started.']<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Running <code>OGGRestAPI<\/code>\u2019s <code>get_extract_status<\/code> method right after confirms it, with a real process ID and no lag :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; ogg_client.get_extract_status(\"EXT2\")\n{'$schema': 'ogg:extractStatus', 'status': 'running', 'processId': 127046, 'lastStarted': None, 'lag': 0, 'sinceLagReported': 5, 'position': '0.25477722'}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notice how <code>begin<\/code> uses the <code>{\"at\": {\"csn\": ...}}<\/code> form to start the integrated extract at a specific SCN, and how <code>registration<\/code> carries the dictionary build SCN with its <code>csn<\/code> field. These are the REST equivalents of the <code>add extract ... scn<\/code> and <code>register extract ... database scn<\/code> commands.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>targets<\/code> field is easy to miss and not optional : without it, <code>create_extract<\/code> writes the <code>EXTTRAIL<\/code> line into the parameter file but never actually creates the trail on disk, and the new extract abends on start with <code>OGG-02454 Trail ... not found in checkpoint file<\/code>. <code>targets<\/code> takes the trail\u2019s two-character <code>name<\/code> and an optional <code>path<\/code> value. This also means the new trail must have a different name than the old extract.<\/p>\n\n\n\n<h2 id=\"complete-script\" class=\"wp-block-heading\">Complete script<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Assembling everything together into a single script, the only thing left to provide is the connection information and the new trail name. If you already have a dictionary SCN, you can pass it with <code>--dictionary-scn<\/code>, or let the script look it up by itself with <code>--db-dsn<\/code>\/<code>--db-user<\/code> (<code>--db-password<\/code> is prompted if you leave it out) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python rename_extract.py \\\n  --url https:\/\/vmogg \\\n  --user ogg \\\n  --deployment ogg_test_01 \\\n  --old-extract EXT1 \\\n  --new-extract EXT2 \\\n  --connection OracleGoldenGate.source_cdb \\\n  --db-dsn localhost:1521\/CDB01 \\\n  --db-user c##oggadmin \\\n  --trail pdb1\/bb<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the same <code>EXT1<\/code> renaming, but forcing <code>--driver sqlplus<\/code> explicitly :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ python rename_extract.py \\\n    --url http:\/\/localhost:7810 \\\n    --user ogg \\\n    --old-extract EXT1 \\\n    --new-extract EXT2 \\\n    --connection OracleGoldenGate.source_cdb \\\n    --db-dsn localhost:1521\/CDB01 \\\n    --db-user c##oggadmin \\\n    --driver sqlplus \\\n    --trail bb\nPassword for ogg:\nOldest unprocessed SCN of EXT1...\n  start SCN (oldest unprocessed): 25378395\nLooking up the dictionary build SCN through sqlplus...\n  dictionary SCN: 25342438\nStopping extract EXT1...\n  start SCN after stop: 25378395\nCreating extract EXT2 (register at 25342438, begin at 25378395)...\nStarting extract EXT2...\nDone.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The script fetches the old extract\u2019s config and credentials, computes the start SCN from its recovery checkpoint, looks up the dictionary SCN (building a fresh one and waiting for the checkpoint to pass it if none was found), stops the old extract, then creates and starts the new one with that config, registered and started at the two SCNs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can find the full <code>rename_extract.py<\/code> in this <a href=\"https:\/\/juliendelattre.com\/docs\/rename-goldengate-extract-rest-api-script\/\" target=\"_blank\" rel=\"noopener noreferrer\">reference doc<\/a>. It uses <code>oggrestapi<\/code>, the GoldenGate REST API Python package you can find <a href=\"https:\/\/www.dbi-services.com\/blog\/the-goldengate-rest-api-python-client-is-now-on-pip\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a> or on <a href=\"https:\/\/github.com\/juliendlttr\/ogg\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In a previous blog, I went through the full procedure of renaming a GoldenGate extract from the adminclient. I included all necessary steps to avoid missing transactions. Doing this by hand is completely fine, but if you do it often, or want to remove the risk of a typo on an SCN, I have another [&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":[515,979,3781,328,2562,3730,1089,1232,1521,3767],"type_dbi":[4196,3801,3785,3740,3786,3881,3768,4197,3800],"class_list":["post-46797","post","type-post","status-publish","format-standard","hentry","category-goldengate","category-oracle","tag-administration","tag-api","tag-extract","tag-goldengate","tag-migration-2","tag-ogg","tag-python","tag-rename","tag-rest","tag-restapi","type-administration","type-api","type-extract","type-goldengate","type-migration","type-ogg","type-python","type-rename","type-rest"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.4 (Yoast SEO v28.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Rename a GoldenGate Extract with the REST API - dbi Blog<\/title>\n<meta name=\"description\" content=\"Automating a GoldenGate extract rename with the REST API in Python, computing the start and dictionary SCNs to avoid missing transactions.\" \/>\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\/rename-a-goldengate-extract-with-the-rest-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rename a GoldenGate Extract with the REST API\" \/>\n<meta property=\"og:description\" content=\"Automating a GoldenGate extract rename with the REST API in Python, computing the start and dictionary SCNs to avoid missing transactions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-10T06:28: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=\"4 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\\\/rename-a-goldengate-extract-with-the-rest-api\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/rename-a-goldengate-extract-with-the-rest-api\\\/\"},\"author\":{\"name\":\"Julien Delattre\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/764ab019cc9dec42655b4c6b9b8e474e\"},\"headline\":\"Rename a GoldenGate Extract with the REST API\",\"datePublished\":\"2026-09-10T06:28:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/rename-a-goldengate-extract-with-the-rest-api\\\/\"},\"wordCount\":862,\"commentCount\":0,\"keywords\":[\"administration\",\"api\",\"extract\",\"GoldenGate\",\"migration\",\"ogg\",\"Python\",\"Rename\",\"rest\",\"restapi\"],\"articleSection\":[\"GoldenGate\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/rename-a-goldengate-extract-with-the-rest-api\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/rename-a-goldengate-extract-with-the-rest-api\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/rename-a-goldengate-extract-with-the-rest-api\\\/\",\"name\":\"Rename a GoldenGate Extract with the REST API - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-10T06:28:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/764ab019cc9dec42655b4c6b9b8e474e\"},\"description\":\"Automating a GoldenGate extract rename with the REST API in Python, computing the start and dictionary SCNs to avoid missing transactions.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/rename-a-goldengate-extract-with-the-rest-api\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/rename-a-goldengate-extract-with-the-rest-api\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/rename-a-goldengate-extract-with-the-rest-api\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rename a GoldenGate Extract with the REST API\"}]},{\"@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\\\/764ab019cc9dec42655b4c6b9b8e474e\",\"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":"Rename a GoldenGate Extract with the REST API - dbi Blog","description":"Automating a GoldenGate extract rename with the REST API in Python, computing the start and dictionary SCNs to avoid missing transactions.","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\/rename-a-goldengate-extract-with-the-rest-api\/","og_locale":"en_US","og_type":"article","og_title":"Rename a GoldenGate Extract with the REST API","og_description":"Automating a GoldenGate extract rename with the REST API in Python, computing the start and dictionary SCNs to avoid missing transactions.","og_url":"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/","og_site_name":"dbi Blog","article_published_time":"2026-09-10T06:28:00+00:00","author":"Julien Delattre","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Julien Delattre","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/"},"author":{"name":"Julien Delattre","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/764ab019cc9dec42655b4c6b9b8e474e"},"headline":"Rename a GoldenGate Extract with the REST API","datePublished":"2026-09-10T06:28:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/"},"wordCount":862,"commentCount":0,"keywords":["administration","api","extract","GoldenGate","migration","ogg","Python","Rename","rest","restapi"],"articleSection":["GoldenGate","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/","url":"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/","name":"Rename a GoldenGate Extract with the REST API - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2026-09-10T06:28:00+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/764ab019cc9dec42655b4c6b9b8e474e"},"description":"Automating a GoldenGate extract rename with the REST API in Python, computing the start and dictionary SCNs to avoid missing transactions.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/rename-a-goldengate-extract-with-the-rest-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Rename a GoldenGate Extract with the REST API"}]},{"@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\/764ab019cc9dec42655b4c6b9b8e474e","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\/46797","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=46797"}],"version-history":[{"count":2,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/46797\/revisions"}],"predecessor-version":[{"id":46812,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/46797\/revisions\/46812"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=46797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=46797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=46797"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=46797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}