{"id":6618,"date":"2016-01-01T20:17:45","date_gmt":"2016-01-01T19:17:45","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/"},"modified":"2016-01-01T20:17:45","modified_gmt":"2016-01-01T19:17:45","slug":"pdb-snapshot-copy-for-continuous-integration-testing","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/","title":{"rendered":"PDB snapshot copy for continuous integration testing"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nHow do you manage your continuous integration tests on the database? You need to restart at the same state for probably a hundred of tests. Recreating the schema and test data takes too long. Oracle is not optimized for DDL. Restoring the database takes too long. Even if you data is small, there is those SYSTEM, SYSAUX tablespaces. Flashback database can help, but it still takes time because it requires to restart the instance.<br \/>\nLet&#8217;s see how multitenant can help here.<br \/>\n<!--more--><\/p>\n<h3>Flashback database<\/h3>\n<p>The flashback database solution is a good solution, and I&#8217;ve implemented that for continuous integration tests. It seems that having thousands of incarnations is not a problem (at least for a test database) and in current versions I&#8217;ve not seen many bugs where flashback logs or archived logs remain without becoming obsolete. But there is a problem: you need to close the database, which means that you need to restart the instance to open it again. This takes time. There are a lot of processes in current versions and linux is not optimized for process creation.<\/p>\n<h3>Alter database close<\/h3>\n<p>But now multitenant is there. 12c Multitenant is a major change of oracle architecture. If you don&#8217;t share my opinion about it, just look at the first paragraph of Tom Kyte&#8217;s &#8216;Expert Oracle&#8217; about architecture overview: <i>An instance can mount and open at most one database in its life<\/i>. This statement is not true anymore with multitenant: you can re-open a closed pluggable database very quickly, without having to restart the instance.<br \/>\nThis makes flashback database a very nice solution for our problem, as it can be done in few seconds, but for the moment, in 12.1, the problem is that you cannot flashback database at PDB level. So we need a workaround.<\/p>\n<h3>Thin provisioning<\/h3>\n<p>Here is the most simple workaround: once you have your reference PDB with your test data in the state you want at the beginning of each tests, you can make it read only, and then create new PDB from it for the tests. However, I don&#8217;t want to copy the SYSTEM and SYSAUX tablespaces each time, so I&#8217;ll use thin provisioning.<\/p>\n<h3>Snapshot copy<\/h3>\n<p>Here is the simple command to do that:<\/p>\n<pre><code>\nSQL&gt; create pluggable database PDBSNAP from PDB snapshot copy file_name_convert=('\/PDB\/','\/PDBSNAP\/');\n<\/code><\/pre>\n<p>but you need a storage that allow thin provisioning to use that or you get the following error:<\/p>\n<pre><code>\ncreate pluggable database PDBSNAP from PDB snapshot copy file_name_convert=('\/PDB\/','\/PDBSNAP\/')\n*\nERROR at line 1:\nORA-65169: error encountered while attempting to copy file\n\/u02\/app\/oracle\/oradata\/CDB\/PDB\/system01.dbf\nORA-17525: Database clone using storage snapshot not supported on file\n\/u02\/app\/oracle\/oradata\/CDB\/PDB\/system01.dbf\n<\/code><\/pre>\n<p>The solution is:<\/p>\n<pre><code>\n$ oerr ora 17525\n17525, 00000, \"Database clone using storage snapshot not supported on file %s\"\n\/\/ *Cause:  Cloning a database using storage level snapshot is not supported on the underlying storage.\n\/\/ *Action: Use storage product that has snapshot based cloning support for Oracle.\n<\/code><\/pre>\n<h3>CLONEDB=true<\/h3>\n<p>But you can do it also without any special storage as long as your filesystem supports sparse files. Then, the original files will not be touched and only the modified blocks will be written in the new files (it&#8217;s copy-on-write). Which means two things:<\/p>\n<ul>\n<li>that the PDB creation is very fast as there is nothing to copy<\/li>\n<li>that once dropped, the base files are available to create a new one<\/li>\n<\/ul>\n<p>In order to use that, you need to set the instance parameter clonedb=true (needs restart):<\/p>\n<pre><code>\nSQL&gt; alter system set clonedb=true scope=spfile;\nSystem altered.\nSQL&gt; shutdown immediate\nDatabase closed.\nDatabase dismounted.\nSQL&gt; startup\nORACLE instance started\n...\nDatabase mounted.\nDatabase opened.\n&nbsp;\nSQL&gt; show parameter clonedb\n&nbsp;\nNAME                                 TYPE        VALUE\n------------------------------------ ----------- ------------------------------\nclonedb                              boolean     TRUE\n<\/code><\/pre>\n<p>and then I can thin clone my reference PDB in few seconds:<\/p>\n<pre><code>\n17:16:21 SQL&gt; create pluggable database PDBSNAP from PDB snapshot copy file_name_convert=('\/PDB\/','\/PDBSNAP\/');\nPluggable database created.\n17:16:31 SQL&gt;\n<\/code><\/pre>\n<p>and if you look at the files you see that the new ones are very small:<\/p>\n<pre><code>\n17:16:31 SQL&gt; host  du -ka \/u02\/app\/oracle\/oradata\/CDB\/PDB*\/*\n276488  \/u02\/app\/oracle\/oradata\/CDB\/PDB\/system01.dbf\n614412  \/u02\/app\/oracle\/oradata\/CDB\/PDB\/sysaux01.dbf\n1273612 \/u02\/app\/oracle\/oradata\/CDB\/PDB\/example01.dbf\n15368   \/u02\/app\/oracle\/oradata\/CDB\/PDB\/SAMPLE_SCHEMA_users01.dbf\n172     \/u02\/app\/oracle\/oradata\/CDB\/PDBSNAP\/system01.dbf\n16      \/u02\/app\/oracle\/oradata\/CDB\/PDBSNAP\/sysaux01.dbf\n16      \/u02\/app\/oracle\/oradata\/CDB\/PDBSNAP\/example01.dbf\n16      \/u02\/app\/oracle\/oradata\/CDB\/PDBSNAP\/SAMPLE_SCHEMA_users01.dbf\n<\/code><\/pre>\n<p>16k (two blocks) only are different for the application datafiles. SYSTEM had a few more change, but it&#8217;s only few blocks here.<br \/>\nIt took 10 seconds here on 1GB datafiles and it will still take 10 seconds if you have 100GB. That makes the thin provisioning very fast.<\/p>\n<p>Then you open it and can use it in few seconds:<\/p>\n<pre><code>\n17:16:31 SQL&gt; alter pluggable database PDBSNAP open;\nPluggable database altered.\n&nbsp;\n17:16:34 SQL&gt; connect hr\/hr@\/\/localhost\/PDBSNAP\nConnected.\n<\/code><\/pre>\n<p>Do everything you want here and then drop it, which takes only few seconds again.<\/p>\n<pre><code>\n17:16:35 SQL&gt; connect \/ as sysdba\nConnected.\n17:16:35 SQL&gt; alter pluggable database PDBSNAP close;\nPluggable database altered.\n17:16:36 SQL&gt; drop pluggable database PDBSNAP including datafiles;\nPluggable database dropped.\n17:16:37 SQL&gt;\n<\/code><\/pre>\n<p>You can see that I&#8217;ve dropped it &#8216;including datafiles&#8217; and it drops only the sparse files:<\/p>\n<pre><code>\n17:16:37 SQL&gt; host  du -ka \/u02\/app\/oracle\/oradata\/CDB\/PDB*\/*\n276488  \/u02\/app\/oracle\/oradata\/CDB\/PDB\/system01.dbf\n614412  \/u02\/app\/oracle\/oradata\/CDB\/PDB\/sysaux01.dbf\n1273612 \/u02\/app\/oracle\/oradata\/CDB\/PDB\/example01.dbf\n15368   \/u02\/app\/oracle\/oradata\/CDB\/PDB\/SAMPLE_SCHEMA_users01.dbf\n<\/code><\/pre>\n<p>The files from my reference PDB are still there, ready for another provisioning.<\/p>\n<h3>Expensive option?<\/h3>\n<p>CREATE PLUGGABLE DATABASE &#8230; SNAPSHOT COPY is a good alternative to flashback database here. However, keep in mind that you need to have more than one PDB in your CDB which means that you need to have multitenant option for that. You may find that expensive, but  think about what it can bring you: you can provision multiple test environments and run your test in parallel, you same lot of storage, you can provision one database for each developer without a big overhead,&#8230;<\/p>\n<h3>Cloud<\/h3>\n<p>The Oracle cloud service is a good solution for those environments. You probably don&#8217;t need the same number of databases for the whole application lifecycle. In the cloud you can provision those environments when a project needs it. And the cost of additional options is not very high there: the &#8216;high performance&#8217; service price is 30% higher than the &#8216;enterprise edition&#8217; one and brings nearly all options (except In-Memory and Active Data Guard). But take care: if you give that environment to your developers, they may use a lot of options that you don&#8217;t want to buy for production. Keep an eye on DBA_FEATURE_USAGE_STATISTICS.<\/p>\n<h3>single-tenant<\/h3>\n<p>If you don&#8217;t want to pay for the multitenant option yet you can have only one pluggable database (in addition to seed). And you can do snapshot copy from remote CDB through db link, so you keep one PDB per CDB. It seems to take a few more seconds (in &#8216;remote operation&#8217; and &#8216;external table read&#8217; to read opatch inventory from the remote database).<\/p>\n<p>Even without multitenant option, not having to re-start the instance, and to possibility to easily use thin provisioning is a very good reason to start to look at pluggable databases.<\/p>\n<h3>Update<\/h3>\n<p>In a new blog post I&#8217;ve detailed another solution in single-tenant with only one instance, using dbms_dnfs.clonedb_renamefile: <a href=\"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-using-dbms_dnfs-clonedb_renamefile\/\">https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-using-dbms_dnfs-clonedb_renamefile\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . How do you manage your continuous integration tests on the database? You need to restart at the same state for probably a hundred of tests. Recreating the schema and test data takes too long. Oracle is not optimized for DDL. Restoring the database takes too long. Even if you data is [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[220,221,64,96,209,66,223],"type_dbi":[],"class_list":["post-6618","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-cdb","tag-data-guard","tag-multitenant","tag-oracle","tag-oracle-12c","tag-pdb","tag-pluggable-databases"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PDB snapshot copy for continuous integration testing - dbi Blog<\/title>\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\/pdb-snapshot-copy-for-continuous-integration-testing\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PDB snapshot copy for continuous integration testing\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . How do you manage your continuous integration tests on the database? You need to restart at the same state for probably a hundred of tests. Recreating the schema and test data takes too long. Oracle is not optimized for DDL. Restoring the database takes too long. Even if you data is [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-01T19:17:45+00:00\" \/>\n<meta name=\"author\" content=\"Oracle Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Oracle Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 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\/pdb-snapshot-copy-for-continuous-integration-testing\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"PDB snapshot copy for continuous integration testing\",\"datePublished\":\"2016-01-01T19:17:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/\"},\"wordCount\":944,\"commentCount\":0,\"keywords\":[\"CDB\",\"Data Guard\",\"multitenant\",\"Oracle\",\"Oracle 12c\",\"PDB\",\"Pluggable Databases\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/\",\"name\":\"PDB snapshot copy for continuous integration testing - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2016-01-01T19:17:45+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PDB snapshot copy for continuous integration testing\"}]},{\"@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\/66ab87129f2d357f09971bc7936a77ee\",\"name\":\"Oracle Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"caption\":\"Oracle Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PDB snapshot copy for continuous integration testing - dbi Blog","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\/pdb-snapshot-copy-for-continuous-integration-testing\/","og_locale":"en_US","og_type":"article","og_title":"PDB snapshot copy for continuous integration testing","og_description":"By Franck Pachot . How do you manage your continuous integration tests on the database? You need to restart at the same state for probably a hundred of tests. Recreating the schema and test data takes too long. Oracle is not optimized for DDL. Restoring the database takes too long. Even if you data is [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/","og_site_name":"dbi Blog","article_published_time":"2016-01-01T19:17:45+00:00","author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"PDB snapshot copy for continuous integration testing","datePublished":"2016-01-01T19:17:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/"},"wordCount":944,"commentCount":0,"keywords":["CDB","Data Guard","multitenant","Oracle","Oracle 12c","PDB","Pluggable Databases"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/","url":"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/","name":"PDB snapshot copy for continuous integration testing - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2016-01-01T19:17:45+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/pdb-snapshot-copy-for-continuous-integration-testing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PDB snapshot copy for continuous integration testing"}]},{"@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\/66ab87129f2d357f09971bc7936a77ee","name":"Oracle Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","caption":"Oracle Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/6618","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\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=6618"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/6618\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=6618"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=6618"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=6618"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=6618"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}