{"id":44875,"date":"2026-08-20T08:54:00","date_gmt":"2026-08-20T06:54:00","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=44875"},"modified":"2026-08-20T08:47:32","modified_gmt":"2026-08-20T06:47:32","slug":"goldengate-26ai-out-of-place-patching-with-python","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/","title":{"rendered":"GoldenGate 26ai out-of-place patching with Python"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I already covered <a href=\"https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-the-web-ui\/\" target=\"_blank\" rel=\"noopener noreferrer\">out-of-place patching from the web UI<\/a>, but patching tasks should be automated, and clicking through the same screens for every deployment can get repetitive. Let\u2019s do the exact same <strong>out-of-place patch of a GoldenGate Microservices Architecture deployment<\/strong>, this time entirely with the <strong>REST API<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every step below shows two ways to make the same call:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A <strong>standard <code>requests<\/code> call<\/strong>, the default Python module to handle REST APIs.<\/li>\n\n\n\n<li>The equivalent call using <strong><code>oggrestapi.py<\/code><\/strong>, the <code>OGGRestAPI<\/code> <a href=\"https:\/\/github.com\/juliendlttr\/ogg\/blob\/main\/26\/oggrestapi.py\" target=\"_blank\" rel=\"noopener noreferrer\">Python client<\/a> I presented in <a href=\"https:\/\/www.dbi-services.com\/blog\/production-ready-goldengate-rest-client-in-python\/\" target=\"_blank\" rel=\"noopener noreferrer\">another blog<\/a>, which handles everything for you.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"installing-the-latest-version-of-goldengate\" class=\"wp-block-heading\">Installing the latest version of GoldenGate<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This part does not change: the REST API cannot install software on the server, so you still need to <strong>unzip the patched installation<\/strong> to a new <code>OGG_HOME<\/code> and run <code>runInstaller<\/code> in silent mode, as described in the web UI blog.<\/p>\n\n\n\n<h2 id=\"patching-the-service-manager-with-the-rest-api\" class=\"wp-block-heading\">Patching the Service Manager with the REST API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As with the web UI, the Service Manager has to be patched first. Assume the following setup:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>sm_url<\/code>: <code>https:\/\/vmogg:7809<\/code><\/li>\n\n\n\n<li><code>new_ogg_home<\/code>: <code>\/u01\/app\/ogg\/product\/23.26.2.0.1<\/code><\/li>\n\n\n\n<li><code>username<\/code> \/ <code>password<\/code>: an administrator on the Service Manager<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Updating <code>OGG_HOME<\/code><\/strong> is a <code>PATCH<\/code> call on the <code>ServiceManager<\/code> deployment:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import requests\n\nsm_url = \"https:\/\/vmogg:7809\"\nauth = (\"oggadmin\", \"password\")\n\nrequests.patch(\n    f\"{sm_url}\/services\/v2\/deployments\/ServiceManager\",\n    json={\"oggHome\": \"\/u01\/app\/ogg\/product\/23.26.2.0.1\"},\n    auth=auth,\n)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With <code>oggrestapi.py<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from oggrestapi import OGGRestAPI\n\nclient = OGGRestAPI(url=\"https:\/\/vmogg:7809\", username=\"oggadmin\", password=\"password\")\nclient.update_deployment(deployment=\"ServiceManager\", ogg_home=\"\/u01\/app\/ogg\/product\/23.26.2.0.1\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Already, you can see that the REST API client simplifies the patching a lot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Restarting the Service Manager<\/strong> is the same endpoint, this time setting <code>status<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>requests.patch(\n    f\"{sm_url}\/services\/v2\/deployments\/ServiceManager\",\n    json={\"status\": \"restart\"},\n    auth=auth,\n)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>client.restart_deployment(deployment=\"ServiceManager\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>restart_deployment<\/code> is a dedicated method in <code>oggrestapi.py<\/code>, following the same pattern already used for <code>restart_service<\/code>, <code>restart_extract<\/code> and <code>restart_replicat<\/code>. It makes it easier to use the API, instead of building the <code>{\"status\": \"restart\"}<\/code> payload yourself. It also takes an optional <code>only_if_running<\/code> argument, so a deployment that was already stopped before the patch is left alone rather than being started by the restart call.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As with the web UI, all your deployment processes are still running on the old <code>OGG_HOME<\/code> at this point. The <code>AIService<\/code>, introduced in 26ai, does not pick up the new home automatically either. You should then <strong>list the services<\/strong> attached to the Service Manager and <strong>restart the ones that are not <code>ServiceManager<\/code> itself<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services = requests.get(\n    f\"{sm_url}\/services\/v2\/deployments\/ServiceManager\/services\",\n    auth=auth,\n).json()&#091;\"response\"]&#091;\"items\"]\n\nfor service in services:\n    if service&#091;\"name\"] != \"ServiceManager\":\n        requests.patch(\n            f\"{sm_url}\/services\/v2\/deployments\/ServiceManager\/services\/{service&#091;'name']}\",\n            json={\"status\": \"restart\"},\n            auth=auth,\n        )<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>for service in client.list_services(\"ServiceManager\"):\n    if service.get(\"name\") != \"ServiceManager\":\n        client.restart_service(deployment=\"ServiceManager\", service=service.get(\"name\"))<\/code><\/pre>\n\n\n\n<h2 id=\"patching-each-deployment-with-the-rest-api\" class=\"wp-block-heading\">Patching each deployment with the REST API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once the Service Manager runs on the new home, repeat the same <strong>update, then restart<\/strong> sequence for each deployment (<code>oggHome<\/code>, then <code>status: restart<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>deployment = \"ogg_test_01\"\n\nrequests.patch(\n    f\"{sm_url}\/services\/v2\/deployments\/{deployment}\",\n    json={\"oggHome\": \"\/u01\/app\/ogg\/product\/23.26.2.0.1\"},\n    auth=auth,\n)\n\nrequests.patch(\n    f\"{sm_url}\/services\/v2\/deployments\/{deployment}\",\n    json={\"status\": \"restart\"},\n    auth=auth,\n)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>client.update_deployment(deployment=\"ogg_test_01\", ogg_home=\"\/u01\/app\/ogg\/product\/23.26.2.0.1\")\nclient.restart_deployment(deployment=\"ogg_test_01\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once the deployment is back up, restart its extracts and replicats. Since these processes are not accessible through the Service Manager port, you need to change the URL. If you use a reverse proxy setup, or <code>auto_discovery=True<\/code> (see below), this is also easier with the Python client.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>admin_url = \"https:\/\/vmogg:7810\"\n\nextracts = requests.get(f\"{admin_url}\/services\/v2\/extracts\", auth=auth).json()&#091;\"response\"]&#091;\"items\"]\nfor extract in extracts:\n    requests.patch(f\"{admin_url}\/services\/v2\/extracts\/{extract&#091;'name']}\", json={\"status\": \"stopped\"}, auth=auth)\n    requests.patch(f\"{admin_url}\/services\/v2\/extracts\/{extract&#091;'name']}\", json={\"status\": \"running\"}, auth=auth)\n\nreplicats = requests.get(f\"{admin_url}\/services\/v2\/replicats\", auth=auth).json()&#091;\"response\"]&#091;\"items\"]\nfor replicat in replicats:\n    requests.patch(f\"{admin_url}\/services\/v2\/replicats\/{replicat&#091;'name']}\", json={\"status\": \"stopped\"}, auth=auth)\n    requests.patch(f\"{admin_url}\/services\/v2\/replicats\/{replicat&#091;'name']}\", json={\"status\": \"running\"}, auth=auth)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With <code>oggrestapi.py<\/code>, <code>restart_all_extracts<\/code> and <code>restart_all_replicats<\/code> do the same thing on an <code>OGGRestAPI<\/code> client already pointed at the deployment (either connected directly to its Administration Service, or through an NGINX reverse proxy with <code>deployment=<\/code> set):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>admin_client = OGGRestAPI(url=\"https:\/\/vmogg:7810\", username=\"oggadmin\", password=\"password\")\nadmin_client.restart_all_extracts(only_if_running=True)\nadmin_client.restart_all_replicats(only_if_running=True)<\/code><\/pre>\n\n\n\n<h2 id=\"automating-the-whole-patching-in-one-call\" class=\"wp-block-heading\">Automating the whole patching in one call<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The steps listed above (update home, restart deployment, restart processes for every deployment) is exactly what <code>patch_deployment<\/code> (a single deployment) and <code>patch_deployments<\/code> (all of them) already do in <code>oggrestapi.py<\/code>, internally calling <code>restart_deployment<\/code> for the restart step. They also handle the <code>ServiceManager<\/code> special case (patch and restart the deployment and its services, but never restart extracts and replicats on it) and the <code>wait_until_deployment_status<\/code> polling in between:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>client = OGGRestAPI(url=\"https:\/\/vmogg:7809\", username=\"oggadmin\", password=\"password\", reverse_proxy=True)\nclient.patch_deployments(new_home=\"\/u01\/app\/ogg\/product\/23.26.2.0.1\", ask_credentials=False)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Both methods take <code>restart_after_patch<\/code> and <code>restart_processes_after_patch<\/code> (both default to <code>True<\/code>) if you need to skip either step, for example to patch every home first and restart everything in a separate maintenance window:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>client.patch_deployments(\n    new_home=\"\/u01\/app\/ogg\/product\/23.26.2.0.1\",\n    restart_after_patch=False,\n    restart_processes_after_patch=False,\n    ask_credentials=False,\n)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>restart_processes_after_patch=True<\/code> needs per-deployment routing: restarting extracts and replicats on <code>ogg_test_01<\/code> is a different call than on <code>ogg_test_02<\/code>, and a plain connection to the Service Manager\u2019s own port has no way to reach either one. <code>oggrestapi.py<\/code> gives you two ways to get that routing from a single client:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>reverse_proxy=True<\/code>, shown above, if you already run NGINX in front of your deployments.<\/li>\n\n\n\n<li><code>auto_discovery=True<\/code>, with no reverse proxy at all. The client looks up each deployment\u2019s real Administration\/Distribution\/Performance Metrics Service port through the Service Manager itself (the same <code>GET ...\/deployments\/{deployment}\/services\/{service}<\/code> call), the first time each one is actually needed, and reuses that lookup for the rest of the run:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>client = OGGRestAPI(url=\"https:\/\/vmogg:7809\", username=\"oggadmin\", password=\"password\", auto_discovery=True)\nclient.patch_deployments(new_home=\"\/u01\/app\/ogg\/product\/23.26.2.0.1\", ask_credentials=False)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Without either flag, patch with <code>restart_processes_after_patch=False<\/code> and restart each deployment\u2019s processes yourself through a separate client pointed at that deployment\u2019s own admin URL.<\/p>\n\n\n\n<h2 id=\"some-services-are-still-running-on-the-old-ogg_home\" class=\"wp-block-heading\">Some services are still running on the old <code>OGG_HOME<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Same as with the web UI: a <code>restart<\/code> call on a deployment returns as soon as the Administration Service (<code>adminsrvr<\/code>) is back up. The Receiver Service (<code>recvsrvr<\/code>) or the Distribution Service (<code>distsrvr<\/code>) can take a bit longer to restart. If, after polling for a few minutes, a service is still reporting the old home, restart it individually with the same <code>PATCH ...\/services\/{service}<\/code> call shown above for the <code>AIService<\/code>, or with the <code>restart_service<\/code> method.<\/p>\n\n\n\n<h2 id=\"other-things-to-consider\" class=\"wp-block-heading\">Other things to consider<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you change the name of your home at every release, remember to update <code>OGG_HOME<\/code> in every script and environment that references it, for example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DMK environment files.<\/li>\n\n\n\n<li><code>systemd<\/code> service files, which might hardcode the <code>OGG_HOME<\/code> variable.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>I already covered out-of-place patching from the web UI, but patching tasks should be automated, and clicking through the same screens for every deployment can get repetitive. Let\u2019s do the exact same out-of-place patch of a GoldenGate Microservices Architecture deployment, this time entirely with the REST API. Every step below shows two ways to make [&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":[3560,3804,979,708,328,3730,4193,572,2576,1089,1521],"type_dbi":[3406,3823,3801,3817,3740,3881,4192,2949,3893,3768,3800],"class_list":["post-44875","post","type-post","status-publish","format-standard","hentry","category-goldengate","category-oracle","tag-23ai","tag-26ai","tag-api","tag-automation","tag-goldengate","tag-ogg","tag-out-of-place-3","tag-patch","tag-patching-2","tag-python","tag-rest","type-23ai","type-26ai","type-api","type-automation","type-goldengate","type-ogg","type-out-of-place-2","type-patch","type-patching","type-python","type-rest"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.2 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>GoldenGate 26ai out-of-place patching with Python - dbi Blog<\/title>\n<meta name=\"description\" content=\"Automate GoldenGate 26ai out-of-place patching over the REST API, with raw Python requests calls and the oggrestapi.py client side by side.\" \/>\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\/goldengate-26ai-out-of-place-patching-with-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GoldenGate 26ai out-of-place patching with Python\" \/>\n<meta property=\"og:description\" content=\"Automate GoldenGate 26ai out-of-place patching over the REST API, with raw Python requests calls and the oggrestapi.py client side by side.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-20T06:54: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\\\/goldengate-26ai-out-of-place-patching-with-python\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/goldengate-26ai-out-of-place-patching-with-python\\\/\"},\"author\":{\"name\":\"Julien Delattre\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/764ab019cc9dec42655b4c6b9b8e474e\"},\"headline\":\"GoldenGate 26ai out-of-place patching with Python\",\"datePublished\":\"2026-08-20T06:54:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/goldengate-26ai-out-of-place-patching-with-python\\\/\"},\"wordCount\":739,\"commentCount\":0,\"keywords\":[\"23ai\",\"26ai\",\"api\",\"Automation\",\"GoldenGate\",\"ogg\",\"out of place\",\"patch\",\"patching\",\"Python\",\"rest\"],\"articleSection\":[\"GoldenGate\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/goldengate-26ai-out-of-place-patching-with-python\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/goldengate-26ai-out-of-place-patching-with-python\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/goldengate-26ai-out-of-place-patching-with-python\\\/\",\"name\":\"GoldenGate 26ai out-of-place patching with Python - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-20T06:54:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/764ab019cc9dec42655b4c6b9b8e474e\"},\"description\":\"Automate GoldenGate 26ai out-of-place patching over the REST API, with raw Python requests calls and the oggrestapi.py client side by side.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/goldengate-26ai-out-of-place-patching-with-python\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/goldengate-26ai-out-of-place-patching-with-python\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/goldengate-26ai-out-of-place-patching-with-python\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GoldenGate 26ai out-of-place patching with Python\"}]},{\"@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":"GoldenGate 26ai out-of-place patching with Python - dbi Blog","description":"Automate GoldenGate 26ai out-of-place patching over the REST API, with raw Python requests calls and the oggrestapi.py client side by side.","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\/goldengate-26ai-out-of-place-patching-with-python\/","og_locale":"en_US","og_type":"article","og_title":"GoldenGate 26ai out-of-place patching with Python","og_description":"Automate GoldenGate 26ai out-of-place patching over the REST API, with raw Python requests calls and the oggrestapi.py client side by side.","og_url":"https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/","og_site_name":"dbi Blog","article_published_time":"2026-08-20T06:54: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\/goldengate-26ai-out-of-place-patching-with-python\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/"},"author":{"name":"Julien Delattre","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/764ab019cc9dec42655b4c6b9b8e474e"},"headline":"GoldenGate 26ai out-of-place patching with Python","datePublished":"2026-08-20T06:54:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/"},"wordCount":739,"commentCount":0,"keywords":["23ai","26ai","api","Automation","GoldenGate","ogg","out of place","patch","patching","Python","rest"],"articleSection":["GoldenGate","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/","url":"https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/","name":"GoldenGate 26ai out-of-place patching with Python - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2026-08-20T06:54:00+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/764ab019cc9dec42655b4c6b9b8e474e"},"description":"Automate GoldenGate 26ai out-of-place patching over the REST API, with raw Python requests calls and the oggrestapi.py client side by side.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/goldengate-26ai-out-of-place-patching-with-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"GoldenGate 26ai out-of-place patching with Python"}]},{"@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\/44875","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=44875"}],"version-history":[{"count":3,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44875\/revisions"}],"predecessor-version":[{"id":46569,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/44875\/revisions\/46569"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=44875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=44875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=44875"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=44875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}