{"id":472,"date":"2019-04-14T20:15:49","date_gmt":"2019-04-14T23:15:49","guid":{"rendered":"http:\/\/www.fernandosimon.com\/blog\/?p=472"},"modified":"2019-08-31T18:40:17","modified_gmt":"2019-08-31T21:40:17","slug":"dml-over-standby-for-active-data-guard-in-19c","status":"publish","type":"post","link":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/","title":{"rendered":"DML over Standby for Active Data Guard in 19c"},"content":{"rendered":"<p style=\"text-align: justify;\">With the new 19c version the Data Guard received some attention and now we can do DML over the standby and it will be redirect to primary database. It is not hard to implement, but unfortunately there is no much information about that in the docs about that.<\/p>\n<p style=\"text-align: justify;\">As training exercise I tested this new feature and want to share some information about that. First, the environment that I used (and the requirements too):<\/p>\n<ul style=\"text-align: justify;\">\n<li>Primary and Standby databases running 19c.<\/li>\n<li>Data Guard in Maximum Availability .<\/li>\n<li>Active Data Guard enabled.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Remember that the idea of DML over the standby it is to use in some cases where your reporting application need to update some tables and few records (like audit logins) while processing the data in the standby. The volume of DML is (and will be) low. At this point there is no effort to allow, or create, a multiple active-active datacenters\/sites for your database. If you start to execute a lot of DML in the standby side you can impact the primary database and you adding the fact that you can maximize the problems for locks and concurrency.<\/p>\n<p style=\"text-align: justify;\"><!--more More...--><\/p>\n<p style=\"text-align: justify;\">Theorical info about DDL in the standby you can find <a href=\"https:\/\/www.oracle.com\/technetwork\/database\/availability\/dg-adg-technical-overview-wp-5347548.pdf\">here<\/a> and <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/sbydb\/data-guard-concepts-and-administration.pdf\">here<\/a>. &nbsp;The basic workflow you can see below:<\/p>\n<p><a href=\"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-471 aligncenter\" src=\"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png\" alt=\"\" width=\"570\" height=\"260\" srcset=\"https:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png 570w, https:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow-300x137.png 300w\" sizes=\"auto, (max-width: 570px) 100vw, 570px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">To create the DG configuration you can follow the steps that are available in the internet in many sources, one good example it is <a href=\"https:\/\/oracle-base.com\/articles\/19c\/data-guard-setup-using-broker-19c\">here<\/a>. If you want to see what I made, you can check this file that contains the output from the steps for my config \u201c<a href=\"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/Log-Create-PHY-STB-19c.txt\">Log-Create-PHY-STB-19c<\/a>\u201d.<\/p>\n<p style=\"text-align: justify;\">Before continue, since here we have a lot of interaction between primary and standby, I put all the code that I executed over primary identified with PRIMARY, and executed as standby with the STANDBY in the codes below.<\/p>\n<p>The first step to configure is guarantee that everything is ok with the config for DG. The main thing is check the \u201cReal Time Query\u201d and ON:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-title=\"Config-DG\" data-enlighter-group=\"Config-DG\" data-enlighter-theme=\"droide\">DGMGRL&gt; show configuration\r\n\r\nConfiguration - dg19b2\r\n\r\n  Protection Mode: MaxAvailability\r\n  Members:\r\n  dg19  - Primary database\r\n    dg19s - Physical standby database\r\n\r\nFast-Start Failover:  Disabled\r\n\r\nConfiguration Status:\r\nSUCCESS   (status updated 31 seconds ago)\r\n\r\nDGMGRL&gt; show database dg19s\r\n\r\nDatabase - dg19s\r\n\r\n  Role:               PHYSICAL STANDBY\r\n  Intended State:     APPLY-ON\r\n  Transport Lag:      0 seconds (computed 0 seconds ago)\r\n  Apply Lag:          0 seconds (computed 0 seconds ago)\r\n  Average Apply Rate: 2.00 KByte\/s\r\n  Real Time Query:    ON\r\n  Instance(s):\r\n    dg19s\r\n\r\nDatabase Status:\r\nSUCCESS\r\n\r\nDGMGRL&gt;<\/pre>\n<p style=\"text-align: justify;\">After that you enable the parameter ADG_REDIRECT_DML &nbsp;in both sides. Primary:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-group=\"Enable-adg_redirect_dml-PRIMARY\" data-enlighter-title=\"Enable-adg_redirect_dml-PRIMARY\" data-enlighter-language=\"no-highlight\">[oracle@orcl19p ~]$ sqlplus sys\/oracle@dg19 as sysdba\r\n\r\nSQL*Plus: Release 19.0.0.0.0 - Production on Sun Apr 14 17:50:38 2019\r\nVersion 19.2.0.0.0\r\n\r\nCopyright (c) 1982, 2018, Oracle.  All rights reserved.\r\n\r\n\r\nConnected to:\r\nOracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Beta\r\nVersion 19.2.0.0.0\r\n\r\nSQL&gt; show parameter adg_redirect_dml\r\n\r\nNAME                                 TYPE        VALUE\r\n------------------------------------ ----------- ------------------------------\r\nadg_redirect_dml                     boolean     FALSE\r\nSQL&gt; \r\nSQL&gt; alter system set adg_redirect_dml = true scope = both sid = '*';\r\n\r\nSystem altered.\r\n\r\nSQL&gt;<\/pre>\n<p style=\"text-align: justify;\">And in standby:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-group=\"Enable-adg_redirect_dml-STANDBY\" data-enlighter-title=\"Enable-adg_redirect_dml-STANDBY\" data-enlighter-language=\"no-highlight\">[oracle@orcl19s ~]$ sqlplus sys\/oracle@dg19s as sysdba\r\n\r\nSQL*Plus: Release 19.0.0.0.0 - Production on Sun Apr 14 17:51:19 2019\r\nVersion 19.2.0.0.0\r\n\r\nCopyright (c) 1982, 2018, Oracle.  All rights reserved.\r\n\r\n\r\nConnected to:\r\nOracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Beta\r\nVersion 19.2.0.0.0\r\n\r\nSQL&gt; select open_mode from v$database;\r\n\r\nOPEN_MODE\r\n--------------------\r\nREAD ONLY WITH APPLY\r\n\r\nSQL&gt; show parameter adg_redirect_dml\r\n\r\nNAME                                 TYPE        VALUE\r\n------------------------------------ ----------- ------------------------------\r\nadg_redirect_dml                     boolean     FALSE\r\nSQL&gt;\r\nSQL&gt; alter system set adg_redirect_dml = true scope = both sid = '*';\r\n\r\nSystem altered.\r\n\r\nSQL&gt;<\/pre>\n<p style=\"text-align: justify;\">To test the DML redirection I created one table with some data in the primary database. Here I amd connected as SYS and without PDB, after I will do the same for PDB and with a normal user:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-group=\"Create-Table-PRIMARY\" data-enlighter-title=\"Create-Table-PRIMARY\" data-enlighter-language=\"no-highlight\">SQL&gt; CREATE TABLE testDML(c1 NUMBER, c2 VARCHAR2(50), c3 DATE) TABLESPACE users;\r\n\r\nTable created.\r\n\r\nSQL&gt; INSERT INTO testDML(c1, c3) VALUES (1, sysdate);\r\n\r\n1 row created.\r\n\r\nSQL&gt; commit;\r\n\r\nCommit complete.\r\n\r\nSQL&gt; select c1, TO_CHAR(c3, 'DD\/MM\/RRRR HH24:MI') FROM testDML;\r\n\r\n        C1 TO_CHAR(C3,'DD\/M\r\n---------- ----------------\r\n         1 14\/04\/2019 17:58\r\n\r\nSQL&gt;<\/pre>\n<p style=\"text-align: justify;\">In the standby you can see the table and do some DML over it:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"DML-STANDBY\" data-enlighter-title=\"DML-STANDBY\">SQL&gt; select c1, TO_CHAR(c3, 'DD\/MM\/RRRR HH24:MI') FROM testDML;\r\n\r\n        C1 TO_CHAR(C3,'DD\/M\r\n---------- ----------------\r\n         1 14\/04\/2019 17:58\r\n\r\nSQL&gt; select database_role from v$database;\r\n\r\nDATABASE_ROLE\r\n----------------\r\nPHYSICAL STANDBY\r\n\r\nSQL&gt; delete from testDML;\r\n\r\n1 row deleted.\r\n\r\nSQL&gt; commit;\r\n\r\nCommit complete.\r\n\r\nSQL&gt;<\/pre>\n<p style=\"text-align: justify;\">And in the primary, you can see that the data was deleted:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"CheckData-PRIMARY\" data-enlighter-title=\"CheckData-PRIMARY\">SQL&gt; select c1, TO_CHAR(c3, 'DD\/MM\/RRRR HH24:MI') FROM testDML;\r\n\r\nno rows selected\r\n\r\nSQL&gt; SELECT TO_CHAR(sysdate, 'DD\/MM\/RRRR HH24:MI') FROM dual;\r\n\r\nTO_CHAR(SYSDATE,\r\n----------------\r\n14\/04\/2019 18:01\r\n\r\nSQL&gt;<\/pre>\n<h2 style=\"text-align: justify;\">Locks<\/h2>\n<p style=\"text-align: justify;\">But in the case of locks, how it works? Some new event? Some different? To simulate this I inserted the data in the primary again:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"Check-Lock-Data-PRIMARY\" data-enlighter-title=\"Check-Lock-Data-PRIMARY\">SQL&gt; select c1, TO_CHAR(c3, 'DD\/MM\/RRRR HH24:MI') as c3 FROM testDML;\r\n\r\n        C1 C3\r\n---------- ----------------\r\n         1 14\/04\/2019 18:04\r\n\r\nSQL&gt;<\/pre>\n<p style=\"text-align: justify;\">In the primary I deleted all the data but without commit to lock all the table:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"Delete-Data-PRIMARY\" data-enlighter-title=\"Delete-Data-PRIMARY\">SQL&gt; delete from testDML;\r\n\r\n1 row deleted.\r\n\r\nSQL&gt;<\/pre>\n<p style=\"text-align: justify;\">After that I tried to update all the rows in the table. But, as expected, my session got stuck:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"Update-Data-STANDBY\" data-enlighter-title=\"Update-Data-STANDBY\">SQL&gt; update testDML set c1 = 2;<\/pre>\n<p style=\"text-align: justify;\">At same time I went to production and check for locks and events:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"Check-Lock-PRIMARY\" data-enlighter-title=\"Check-Lock-PRIMARY\">SQL&gt; SELECT username, final_blocking_session, final_blocking_instance, event lockwait, status, machine, service_name , sql_id FROM gv$session WHERE username IS NOT NULL;\r\n\r\nUSERNAME             FINAL_BLOCKING_SESSION FINAL_BLOCKING_INSTANCE LOCKWAIT                                                         STATUS   MACHINE              SERVICE_NAME                             SQL_ID\r\n-------------------- ---------------------- ----------------------- ---------------------------------------------------------------- -------- -------------------- ---------------------------------------- -------------\r\nSYS                                                                 OFS idle                                                         ACTIVE   orcl19p.oralocal     SYS$BACKGROUND\r\nSYSRAC                                                              SQL*Net message from client                                      INACTIVE orcl19p.oralocal     SYS$USERS\r\nPUBLIC                                                              SQL*Net message from client                                      INACTIVE orcl19s.oralocal     SYS$USERS\r\nSYS                                                                 SQL*Net message to client                                        ACTIVE   orcl19p.oralocal     SYS$USERS                                4dzzccufjscvp\r\nSYS                                      86                       1 enq: TX - row lock contention                                    ACTIVE   orcl19s.oralocal     SYS$USERS                                49b39kubnb2d1\r\n\r\nSQL&gt;\r\nSQL&gt; col sql_text format a50\r\nSQL&gt; select sql_text from v$sql where sql_id = '49b39kubnb2d1';\r\n\r\nSQL_TEXT\r\n--------------------------------------------------\r\nUPDATE \"TESTDML\" \"A1\" SET \"C1\" = 2\r\n\r\nSQL&gt;<\/pre>\n<p style=\"text-align: justify;\">As you can see, there is no different event. The primary database reports TX coming from one connection of standby database. And you can even see the SQL. Normal behaviour.<\/p>\n<p style=\"text-align: justify;\">But, after some time in lock state, the session in the standby reported a new error. <strong><em>ORA-02049<\/em><\/strong><em>: timeout: distributed transaction waiting for lock<\/em> and <strong><em>ORA-02063<\/em><\/strong><em>: preceding line from ADGREDIRECT<\/em>. These exists just to avoid eternal wait in the standby.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"ORA-02049-Timeout-STANDBY\" data-enlighter-title=\"ORA-02049-Timeout-STANDBY\">SQL&gt; update testDML set c1 = 2;\r\nupdate testDML set c1 = 2\r\n*\r\nERROR at line 1:\r\nORA-02049: timeout: distributed transaction waiting for lock\r\nORA-02063: preceding line from ADGREDIRECT\r\n\r\nSQL&gt;<\/pre>\n<p>If you do in the opposite site, deleting the registry standby and not doing the commit. The session in the primary that it is waiting never receive the ORA-02049. And the same for the session in standby, it holds the lock until you commit\/rollback.<\/p>\n<h2>Over PDB<\/h2>\n<p style=\"text-align: justify;\">If you want to do the same using PDB, you need to work a little with services to allow direct connections in the physical standby using the services. Basically you need to create the service and set the role (to start it) as physical_standby. The trick part here is that you need to, at least, call the start command in the primary because doing this you registry it in the <strong>service$<\/strong> table. Since you are in the DG config and running the Active Data Guard (this is requirement because the redo is open with Real Time Query) you can open it in the standby too. I added this info here because with DML over standby this config start to be recurrent.<\/p>\n<p style=\"text-align: justify;\">First, create and add the service in primary database:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"Add-Service-PRIMARY\" data-enlighter-title=\"Add-Service-PRIMARY\">[oracle@orcl19p ~]$ srvctl add service -db dg19 -service dgpdb_dml -pdb dgpdb -role physical_standby\r\n[oracle@orcl19p ~]$ srvctl start service -db dg19 -service dgpdb_dml -pdb dgpdb\r\n[oracle@orcl19p ~]$\r\n[oracle@orcl19p ~]$ sqlplus \/ as sysdba\r\n\r\nSQL*Plus: Release 19.0.0.0.0 - Production on Sun Apr 14 18:48:28 2019\r\nVersion 19.2.0.0.0\r\n\r\nCopyright (c) 1982, 2018, Oracle.  All rights reserved.\r\n\r\n\r\nConnected to:\r\nOracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Beta\r\nVersion 19.2.0.0.0\r\n\r\nSQL&gt; alter session set container = DGPDB;\r\n\r\nSession altered.\r\n\r\nSQL&gt; set linesize 250\r\nSQL&gt; col NAME format a30\r\nSQL&gt; col NETWORK_NAME format a30\r\nSQL&gt; col pdb format a30\r\nSQL&gt; SELECT name, network_name, pdb FROM service$;\r\n\r\nNAME                           NETWORK_NAME                   PDB\r\n------------------------------ ------------------------------ ------------------------------\r\nDGPDB                          DGPDB                          DGPDB\r\ndgpdb_dml                      dgpdb_dml                      DGPDB\r\n\r\nSQL&gt; exit\r\nDisconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Beta\r\nVersion 19.2.0.0.0\r\n[oracle@orcl19p ~]$<\/pre>\n<p>After that you do the same in the standby:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-group=\"Add-Service-STANDBY\" data-enlighter-title=\"Add-Service-STANDBY\" data-enlighter-language=\"no-highlight\">[oracle@orcl19s ~]$ srvctl add service -db dg19s -service dgpdb_dml -pdb dgpdb -role physical_standby\r\n[oracle@orcl19s ~]$ srvctl start service -db dg19s -service dgpdb_dml -pdb dgpdb\r\n[oracle@orcl19s ~]$\r\n[oracle@orcl19s ~]$ srvctl stop database -d dg19s\r\n[oracle@orcl19s ~]$ srvctl start database -d dg19s\r\n[oracle@orcl19s ~]$\r\n[oracle@orcl19s ~]$ srvctl status service -d dg19s\r\nService dgpdb_dml is running\r\n[oracle@orcl19s ~]$<\/pre>\n<p style=\"text-align: justify;\">Here something to add. I don\u2019t know why but for me just worked (the service appears as enable to connect) after I restart the standby. Since it is not focus for this post this point, you can find good info <a href=\"https:\/\/blog.iarsov.com\/oracle\/data-guard\/active-services-on-physical-standby-database\/\">here<\/a> (original post from Ivica Arsov) and <a href=\"https:\/\/blog.dbi-services.com\/active-data-guard-services-in-multitenant\/\">here<\/a>.<\/p>\n<p style=\"text-align: justify;\">After that you can test the same as before (create table in PDB and populate):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-group=\"Connect-PDB-PRIMARY\" data-enlighter-title=\"Connect-PDB-PRIMARY\" data-enlighter-language=\"no-highlight\">[oracle@orcl19p ~]$ sqlplus simon\/simon@orcl19p\/DGPDB\r\n\r\nSQL*Plus: Release 19.0.0.0.0 - Production on Sun Apr 14 21:37:36 2019\r\nVersion 19.2.0.0.0\r\n\r\nCopyright (c) 1982, 2018, Oracle.  All rights reserved.\r\n\r\nLast Successful login time: Sun Apr 14 2019 21:36:05 +02:00\r\n\r\nConnected to:\r\nOracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Beta\r\nVersion 19.2.0.0.0\r\n\r\nSQL&gt; CREATE TABLE testDML(c1 NUMBER, c2 VARCHAR2(50), c3 DATE) TABLESPACE users;\r\n\r\nTable created.\r\n\r\nSQL&gt; INSERT INTO testDML(c1, c3) VALUES (1, sysdate);\r\n\r\n1 row created.\r\n\r\nSQL&gt; commit;\r\n\r\nCommit complete.\r\n\r\nSQL&gt;<\/pre>\n<p style=\"text-align: justify;\">After that do some DML over standby:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-group=\"Connect-PDB-DML-STANDBY\" data-enlighter-title=\"Connect-PDB-DML-STANDBY\" data-enlighter-language=\"no-highlight\">[oracle@orcl19s ~]$ sqlplus simon\/simon@orcl19s\/DGPDB\r\n\r\nSQL*Plus: Release 19.0.0.0.0 - Production on Sun Apr 14 21:38:17 2019\r\nVersion 19.2.0.0.0\r\n\r\nCopyright (c) 1982, 2018, Oracle.  All rights reserved.\r\n\r\nLast Successful login time: Sun Apr 14 2019 21:37:36 +02:00\r\n\r\nConnected to:\r\nOracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Beta\r\nVersion 19.2.0.0.0\r\n\r\nSQL&gt;\r\nSQL&gt; delete from testDML;\r\n\r\n1 row deleted.\r\n\r\nSQL&gt;<\/pre>\n<p style=\"text-align: justify;\">And if you have some locks the behaviour it is the same than before. But now, with the information from user and con_id from connection:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"Check-Lock-PDB-Connection-PRIMARY\" data-enlighter-title=\"Check-Lock-PDB-Connection-PRIMARY\">SQL&gt; select USERNAME, FINAL_BLOCKING_SESSION, FINAL_BLOCKING_INSTANCE, EVENT LOCKWAIT, STATUS, machine, service_name , sql_id, con_id from gv$session where username is not null;\r\n\r\nUSERNAME             FINAL_BLOCKING_SESSION FINAL_BLOCKING_INSTANCE LOCKWAIT                                                         STATUS   MACHINE              SERVICE_NAME         SQL_ID            CON_ID\r\n-------------------- ---------------------- ----------------------- ---------------------------------------------------------------- -------- -------------------- -------------------- ------------- ----------\r\nSYS                                                                 OFS idle                                                         ACTIVE   orcl19p.oralocal     SYS$BACKGROUND                              0\r\nSYSRAC                                                              SQL*Net message from client                                      INACTIVE orcl19p.oralocal     SYS$USERS                                   1\r\nSYSRAC                                                              SQL*Net message from client                                      INACTIVE orcl19p.oralocal     SYS$USERS                                   1\r\nPUBLIC                                                              SQL*Net message from client                                      INACTIVE orcl19s.oralocal     SYS$USERS                                   1\r\nSIMON                                   102                       1 enq: TX - row lock contention                                    ACTIVE   orcl19p.oralocal     dgpdb                4sqjaugwcxar0          3\r\nSYS                                                                 SQL*Net message to client                                        ACTIVE   orcl19p.oralocal     SYS$USERS            cssctts2u81n4          1\r\nSIMON                                                               SQL*Net message from client                                      INACTIVE orcl19s.oralocal     SYS$USERS                                   3\r\n\r\n7 rows selected.\r\n\r\nSQL&gt;\r\nSQL&gt; select username, machine, service_name, program from gv$session where inst_id = 1 and sid = 102;\r\n\r\nUSERNAME             MACHINE              SERVICE_NAME         PROGRAM\r\n-------------------- -------------------- -------------------- ------------------------------------------------\r\nSIMON                orcl19s.oralocal     SYS$USERS            oracle@orcl19s.oralocal (TNS V1-V3)\r\n\r\nSQL&gt;<\/pre>\n<p style=\"text-align: justify;\">As you can see above the connection appear in the primary as a normal connection, nothing complicate or special to handle. And in the listener log the connection (coming from standby when receiving the DML) is normal:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-group=\"Listener-Connection-PRIMARY\" data-enlighter-title=\"Listener-Connection-PRIMARY\" data-enlighter-language=\"no-highlight\">2019-04-14T22:12:57.977135+02:00\r\n14-APR-2019 22:12:57 * (CONNECT_DATA=(SERVICE_NAME=8106653b19ca6636e053016410ac3c21)(CID=(PROGRAM=oracle)(HOST=orcl19s.oralocal)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.200.1)(PORT=36782)) * establish * 8106653b19ca6636e053016410ac3c21 * 0\r\n2019-04-14T22:14:02.121149+02:00\r\n14-APR-2019 22:14:02 * (CONNECT_DATA=(SERVER=DEDICATED)(SID=dg19)(CID=(PROGRAM=oracle)(HOST=orcl19s.oralocal)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.200.1)(PORT=36786)) * establish * dg19 * 0<\/pre>\n<p style=\"text-align: justify;\">The behaviour it is so normal that you will see the cursors open in the primary (the lock system is by row):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-group=\"Row-Lock-Check-PRIMARY\" data-enlighter-title=\"Row-Lock-Check-PRIMARY\" data-enlighter-language=\"no-highlight\">SQL&gt; create index ixtestDML on testDML(c1) tablespace users;\r\n\r\nIndex created.\r\n\r\nSQL&gt; INSERT INTO testDML(c1, c3) VALUES (1, sysdate);\r\n\r\n1 row created.\r\n\r\nSQL&gt; INSERT INTO testDML(c1, c3) VALUES (2, sysdate);\r\n\r\n1 row created.\r\n\r\nSQL&gt; commit;\r\n\r\nCommit complete.\r\n\r\nSQL&gt;\r\n\r\n    ###########\r\n    In the sdtandby database\r\n    ###########\r\n    SQL&gt; delete from testDML where c1 = 1;\r\n\r\n    1 row deleted.\r\n\r\n    SQL&gt;\r\n\r\nSQL&gt; update testDML set c1 = 3 where c1 = 2;\r\n\r\n1 row updated.\r\n\r\nSQL&gt;\r\nSQL&gt; select  sql_text, user_name from v$open_cursor where user_name = 'SIMON' and upper(sql_text) like '%TESTDML%';\r\n\r\nSQL_TEXT                                                                                             USER_NAME\r\n---------------------------------------------------------------------------------------------------- --------------------\r\nDELETE FROM \"TESTDML\" \"A1\" WHERE \"A1\".\"C1\"=1                                                         SIMON\r\nupdate testDML set c1 = 3 where c1 = 2                                                               SIMON\r\n\r\nSQL&gt;<\/pre>\n<h2>ORA-16397<\/h2>\n<p>If you receive the error <strong><em>ORA-16397<\/em><\/strong><em>: statement redirection from Oracle Active Data Guard standby database to primary database failed<\/em> this is linked with the way that you connected in the database. If you use \u201c\/ as sysdba\u201d without username and password, when you try to do the DML you hit the error. To solve this, connect using username, password and database:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"ORA-16397-Connection-STANDBY\" data-enlighter-title=\"ORA-16397-Connection-STANDBY\">[oracle@orcl19s ~]$ sqlplus \/ as sysdba\r\n\r\nSQL*Plus: Release 19.0.0.0.0 - Production on Sun Apr 14 19:34:45 2019\r\nVersion 19.2.0.0.0\r\n\r\nCopyright (c) 1982, 2018, Oracle.  All rights reserved.\r\n\r\n\r\nConnected to:\r\nOracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Beta\r\nVersion 19.2.0.0.0\r\n\r\nSQL&gt; INSERT INTO testDML(c1, c3) VALUES (1, sysdate);\r\nINSERT INTO testDML(c1, c3) VALUES (1, sysdate)\r\n            *\r\nERROR at line 1:\r\nORA-16397: statement redirection from Oracle Active Data Guard standby database\r\nto primary database failed\r\n\r\n\r\nSQL&gt; exit\r\nDisconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Beta\r\nVersion 19.2.0.0.0\r\n[oracle@orcl19s ~]$ sqlplus sys\/oracle@dg19s as sysdba\r\n\r\nSQL*Plus: Release 19.0.0.0.0 - Production on Sun Apr 14 19:34:55 2019\r\nVersion 19.2.0.0.0\r\n\r\nCopyright (c) 1982, 2018, Oracle.  All rights reserved.\r\n\r\n\r\nConnected to:\r\nOracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Beta\r\nVersion 19.2.0.0.0\r\n\r\nSQL&gt; INSERT INTO testDML(c1, c3) VALUES (1, sysdate);\r\n\r\n1 row created.\r\n\r\nSQL&gt; commit;\r\n\r\nCommit complete.\r\n\r\nSQL&gt; exit\r\nDisconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Beta\r\nVersion 19.2.0.0.0\r\n[oracle@orcl19s ~]$<\/pre>\n<h2>ORA-16000<\/h2>\n<p style=\"text-align: justify;\">If you disable the ADG_REDIRECT_DML you will receive the error <strong><em>ORA-16000<\/em><\/strong><em>: database or pluggable database open for read-only access<\/em> when you try to execute the DML:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"no-highlight\" data-enlighter-group=\"ORA-16000-Redirect-Not-Enabled-STANDBY\" data-enlighter-title=\"ORA-16000-Redirect-Not-Enabled-STANDBY\">SQL&gt; alter system set ADG_REDIRECT_DML=false scope = both sid = '*';\r\n\r\nSystem altered.\r\n\r\nSQL&gt; INSERT INTO testDML(c1, c3) VALUES (1, sysdate);\r\nINSERT INTO testDML(c1, c3) VALUES (1, sysdate)\r\n            *\r\nERROR at line 1:\r\nORA-16000: database or pluggable database open for read-only access\r\n\r\n\r\nSQL&gt;<\/pre>\n<p>If you have something to add, please coment!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>With the new 19c version the Data Guard received some attention and now we can do DML over the standby and it will be redirect to primary database. It is not hard to implement, but unfortunately there is no much information about that in the docs about that. As training exercise I tested this new [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[71,50,41,29,5],"tags":[72,73,67,65],"class_list":["post-472","post","type-post","status-publish","format-standard","hentry","category-19c","category-broker","category-data-guard","category-database","category-oracle","tag-19c","tag-active-data-gaurd","tag-data-guard","tag-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>DML over Standby for Active Data Guard in 19c - Fernando Simon<\/title>\n<meta name=\"description\" content=\"Check how to use the new feature in Oracle 19c that allow a Physical Standby to receive and process DML. Check issues and how to solve.\" \/>\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.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DML over Standby for Active Data Guard in 19c - Fernando Simon\" \/>\n<meta property=\"og:description\" content=\"Check how to use the new feature in Oracle 19c that allow a Physical Standby to receive and process DML. Check issues and how to solve.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/\" \/>\n<meta property=\"og:site_name\" content=\"Fernando Simon\" \/>\n<meta property=\"article:published_time\" content=\"2019-04-14T23:15:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-31T21:40:17+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png\" \/>\n<meta name=\"author\" content=\"Simon\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simon\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/\"},\"author\":{\"name\":\"Simon\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9\"},\"headline\":\"DML over Standby for Active Data Guard in 19c\",\"datePublished\":\"2019-04-14T23:15:49+00:00\",\"dateModified\":\"2019-08-31T21:40:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/\"},\"wordCount\":999,\"commentCount\":2,\"image\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png\",\"keywords\":[\"19c\",\"Active Data Gaurd\",\"Data Guard\",\"Oracle\"],\"articleSection\":[\"19c\",\"Broker\",\"Data Guard\",\"Database\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/\",\"url\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/\",\"name\":\"DML over Standby for Active Data Guard in 19c - Fernando Simon\",\"isPartOf\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png\",\"datePublished\":\"2019-04-14T23:15:49+00:00\",\"dateModified\":\"2019-08-31T21:40:17+00:00\",\"author\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9\"},\"description\":\"Check how to use the new feature in Oracle 19c that allow a Physical Standby to receive and process DML. Check issues and how to solve.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#primaryimage\",\"url\":\"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png\",\"contentUrl\":\"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.fernandosimon.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DML over Standby for Active Data Guard in 19c\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#website\",\"url\":\"https:\/\/www.fernandosimon.com\/blog\/\",\"name\":\"Fernando Simon\",\"description\":\"Have you hugged your backup today?\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.fernandosimon.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9\",\"name\":\"Simon\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a3dbc48de62fffb1829befb4a588d789ec6dc5e05977afabb3407a5f37a16482?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a3dbc48de62fffb1829befb4a588d789ec6dc5e05977afabb3407a5f37a16482?s=96&d=mm&r=g\",\"caption\":\"Simon\"},\"sameAs\":[\"http:\/\/www.fernandosimon.com\"],\"url\":\"https:\/\/www.fernandosimon.com\/blog\/author\/simon\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"DML over Standby for Active Data Guard in 19c - Fernando Simon","description":"Check how to use the new feature in Oracle 19c that allow a Physical Standby to receive and process DML. Check issues and how to solve.","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.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/","og_locale":"en_US","og_type":"article","og_title":"DML over Standby for Active Data Guard in 19c - Fernando Simon","og_description":"Check how to use the new feature in Oracle 19c that allow a Physical Standby to receive and process DML. Check issues and how to solve.","og_url":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/","og_site_name":"Fernando Simon","article_published_time":"2019-04-14T23:15:49+00:00","article_modified_time":"2019-08-31T21:40:17+00:00","og_image":[{"url":"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png","type":"","width":"","height":""}],"author":"Simon","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Simon","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#article","isPartOf":{"@id":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/"},"author":{"name":"Simon","@id":"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9"},"headline":"DML over Standby for Active Data Guard in 19c","datePublished":"2019-04-14T23:15:49+00:00","dateModified":"2019-08-31T21:40:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/"},"wordCount":999,"commentCount":2,"image":{"@id":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#primaryimage"},"thumbnailUrl":"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png","keywords":["19c","Active Data Gaurd","Data Guard","Oracle"],"articleSection":["19c","Broker","Data Guard","Database","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/","url":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/","name":"DML over Standby for Active Data Guard in 19c - Fernando Simon","isPartOf":{"@id":"https:\/\/www.fernandosimon.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#primaryimage"},"image":{"@id":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#primaryimage"},"thumbnailUrl":"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png","datePublished":"2019-04-14T23:15:49+00:00","dateModified":"2019-08-31T21:40:17+00:00","author":{"@id":"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9"},"description":"Check how to use the new feature in Oracle 19c that allow a Physical Standby to receive and process DML. Check issues and how to solve.","breadcrumb":{"@id":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#primaryimage","url":"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png","contentUrl":"http:\/\/www.fernandosimon.com\/blog\/wp-content\/uploads\/2019\/04\/DML-STB-Basic-flow.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.fernandosimon.com\/blog\/dml-over-standby-for-active-data-guard-in-19c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.fernandosimon.com\/blog\/"},{"@type":"ListItem","position":2,"name":"DML over Standby for Active Data Guard in 19c"}]},{"@type":"WebSite","@id":"https:\/\/www.fernandosimon.com\/blog\/#website","url":"https:\/\/www.fernandosimon.com\/blog\/","name":"Fernando Simon","description":"Have you hugged your backup today?","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.fernandosimon.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/386da956604bca0d5be5dd52210c1dd9","name":"Simon","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.fernandosimon.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a3dbc48de62fffb1829befb4a588d789ec6dc5e05977afabb3407a5f37a16482?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a3dbc48de62fffb1829befb4a588d789ec6dc5e05977afabb3407a5f37a16482?s=96&d=mm&r=g","caption":"Simon"},"sameAs":["http:\/\/www.fernandosimon.com"],"url":"https:\/\/www.fernandosimon.com\/blog\/author\/simon\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5ofTp-7C","_links":{"self":[{"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/posts\/472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/comments?post=472"}],"version-history":[{"count":0,"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/posts\/472\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/media?parent=472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/categories?post=472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandosimon.com\/blog\/wp-json\/wp\/v2\/tags?post=472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}