{"id":16755,"date":"2021-10-30T10:39:24","date_gmt":"2021-10-30T08:39:24","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/"},"modified":"2021-10-30T10:39:24","modified_gmt":"2021-10-30T08:39:24","slug":"why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/","title":{"rendered":"Why does my first tablespace in PostgreSQL always get the OID 16384?"},"content":{"rendered":"<p>For those already familiar with this topic and wonder about the heading, hold on and continue reading. One of the exercises we do in our <a href=\"https:\/\/www.dbi-services.com\/trainings\/postgresql-dba-essentials-workshop\/\" target=\"_blank\" rel=\"noopener\">PostgreSQL DBA Essentials workshop<\/a> is to create a tablespace. This is to demonstrate how tablespaces work in PostgreSQL and, especially to show the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Symbolic_link\" target=\"_blank\" rel=\"noopener\">symbolic link<\/a> that gets created in $PGDATA\/pg_tblspc. In one of the last workshops, two attendees noticed that they got the same <a href=\"https:\/\/www.postgresql.org\/docs\/current\/datatype-oid.html\" target=\"_blank\" rel=\"noopener\">OID<\/a> and asked if that is normal or just a coincidence. As I could not immediately answer to that question, I had to do some research and this is the topic of this post. <\/p>\n<p><!--more--><\/p>\n<p>To start with, lets create a fresh cluster and start it up:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@debian11pg:\/home\/postgres\/ [pgdev] mkdir \/var\/tmp\/dummy\npostgres@debian11pg:\/home\/postgres\/ [pgdev] cd \/var\/tmp\/dummy\/\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] initdb .\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] export PGPORT=7777\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] pg_ctl -D . start\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] psql\npsql (15devel)\nType \"help\" for help.\n\npostgres=# \n<\/pre>\n<p>If we create a tablespace now, what OID will it get?<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# ! mkdir \/var\/tmp\/tbs\npostgres=# create tablespace tbs1 location '\/var\/tmp\/tbs';\nCREATE TABLESPACE\npostgres=# ! ls \/var\/tmp\/dummy\/pg_tblspc\n16384\npostgres=# select oid from pg_tablespace where spcname = 'tbs1';\n  oid  \n-------\n 16384\n(1 row)\n<\/pre>\n<p>Indeed, it gets the same OID as we have it in the workshop slides and this was true for all attendees of the workshop. Of course they followed all the same exercises but it anyway was somehow surprising, we never paid any attention to that. Dropping and re-creating the tablespace increases the OID by one:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# drop tablespace tbs1;\nDROP TABLESPACE\npostgres=# create tablespace tbs1 location '\/var\/tmp\/tbs';\nCREATE TABLESPACE\npostgres=# select oid from pg_tablespace where spcname = 'tbs1';\n  oid  \n-------\n 16385\n(1 row)\n<\/pre>\n<p>This makes sense, new object new OID. To make it short, lets do another test: Re-create the cluster and create a table instead of a tablespace:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# q\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] pg_ctl -D . stop\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] rm -rf *\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] initdb .\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] pg_ctl -D . start\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] psql\npsql (15devel)\nType \"help\" for help.\n\npostgres=# create table t1 ( a int );\nCREATE TABLE\npostgres=# select oid from pg_class where relname = 't1';\n  oid  \n-------\n 16384\n(1 row)\n<\/pre>\n<p>Now the table gets this magic number assigned and if we create a tablespace afterwards it will be a higher OID:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# ! rm -rf \/var\/tmp\/tbs\/*\npostgres=# create tablespace tbs1 location '\/var\/tmp\/tbs';\nCREATE TABLESPACE\npostgres=# select oid from pg_tablespace where spcname = 'tbs1';\n  oid  \n-------\n 16388\n(1 row)\n<\/pre>\n<p>Grepping over the source code confirms this: The first object that gets created in normal operation gets 16384. You can find this comment in &#8220;src\/include\/access\/transam.h&#8221;:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n *              OIDs beginning at 16384 are assigned from the OID generator\n *              during normal multiuser operation.  (We force the generator up to\n *              16384 as soon as we are in normal operation.)\n<\/pre>\n<p>So, by now we know that the first object that is created in normal operation gets OID 16384. The next one will get 16385 then, right? Again, lets start from scratch and create two tables: The first one will get 16384 and the second one probably 16385, correct?<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# q\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] pg_ctl -D . stop\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] rm -rf *\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] initdb .\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] pg_ctl -D . start\npostgres@debian11pg:\/var\/tmp\/dummy\/ [pgdev] psql\npsql (15devel)\nType \"help\" for help.\n\npostgres=# create table t1 ( a int );\nCREATE TABLE\npostgres=# create table t2 ( a int );\nCREATE TABLE\npostgres=# select oid,relname from pg_class where relname in ('t1','t2');\n  oid  | relname \n-------+---------\n 16384 | t1\n 16387 | t2\n(2 rows)\n<\/pre>\n<p>It is not as simple as I thought, we have a gap of two OIDs. Why is that, two OIDs seem to be reserved for something else. Creating a new tablespace afterwards also shows a gap of two:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# ! rm -rf \/var\/tmp\/tbs\/*\npostgres=# create tablespace tbs location '\/var\/tmp\/tbs\/';\nCREATE TABLESPACE\npostgres=# select oid from pg_tablespace where spcname = 'tbs';\n  oid  \n-------\n 16390\n(1 row)\n<\/pre>\n<p>We did not see this gap when we created one tablespace and another one right after above. We can confirm this once more by creating another tablespace:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# ! mkdir \/var\/tmp\/tbs2\npostgres=# create tablespace tbs2 location '\/var\/tmp\/tbs2\/';\nCREATE TABLESPACE\npostgres=# select oid from pg_tablespace where spcname = 'tbs2';\n  oid  \n-------\n 16391\n(1 row)\n<\/pre>\n<p>No gap here, so the gap seems to be related to the object that gets created. A table seems to reserve two additional OIDs by default, a tablespace does not. What could be the reason for that? The two tables we&#8217;ve created currently have these assignments:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select oid,relname from pg_class where relname in ('t1','t2');\n  oid  | relname \n-------+---------\n 16384 | t1\n 16387 | t2\n(2 rows)\n<\/pre>\n<p>As did not find anything related to this in the source code (I know it must be there) I had to ask the <a href=\"https:\/\/www.postgresql.org\/message-id\/flat\/ZR0P278MB092061F8F01770B16DFAB4A4D2889%40ZR0P278MB0920.CHEP278.PROD.OUTLOOK.COM\" target=\"_blank\" rel=\"noopener\">community<\/a>. What really happens here is, that two types get created when you create a table, the table&#8217;s base type and one type that represents one row of the table:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1; highlight: [6,7,8,9]\">\npostgres=# select oid, typname, typtype from pg_type where typname like '%t1' or typname like '%t2' order by oid;\n  oid  | typname | typtype \n-------+---------+---------\n    21 | int2    | b\n  1005 | _int2   | b\n 16385 | _t1     | b\n 16386 | t1      | c\n 16388 | _t2     | b\n 16389 | t2      | c\n(6 rows)\n<\/pre>\n<p>This is mentioned in the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createtable.html\" target=\"_blank\" rel=\"noopener\">documentation<\/a> and I should have read that before posting to the list \ud83d\ude41<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For those already familiar with this topic and wonder about the heading, hold on and continue reading. One of the exercises we do in our PostgreSQL DBA Essentials workshop is to create a tablespace. This is to demonstrate how tablespaces work in PostgreSQL and, especially to show the symbolic link that gets created in $PGDATA\/pg_tblspc. [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[77],"type_dbi":[],"class_list":["post-16755","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-postgresql"],"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>Why does my first tablespace in PostgreSQL always get the OID 16384? - 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\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Why does my first tablespace in PostgreSQL always get the OID 16384?\" \/>\n<meta property=\"og:description\" content=\"For those already familiar with this topic and wonder about the heading, hold on and continue reading. One of the exercises we do in our PostgreSQL DBA Essentials workshop is to create a tablespace. This is to demonstrate how tablespaces work in PostgreSQL and, especially to show the symbolic link that gets created in $PGDATA\/pg_tblspc. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-30T08:39:24+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Why does my first tablespace in PostgreSQL always get the OID 16384?\",\"datePublished\":\"2021-10-30T08:39:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/\"},\"wordCount\":496,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/\",\"name\":\"Why does my first tablespace in PostgreSQL always get the OID 16384? - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2021-10-30T08:39:24+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Why does my first tablespace in PostgreSQL always get the OID 16384?\"}]},{\"@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\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\/\/x.com\/westermanndanie\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Why does my first tablespace in PostgreSQL always get the OID 16384? - 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\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/","og_locale":"en_US","og_type":"article","og_title":"Why does my first tablespace in PostgreSQL always get the OID 16384?","og_description":"For those already familiar with this topic and wonder about the heading, hold on and continue reading. One of the exercises we do in our PostgreSQL DBA Essentials workshop is to create a tablespace. This is to demonstrate how tablespaces work in PostgreSQL and, especially to show the symbolic link that gets created in $PGDATA\/pg_tblspc. [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/","og_site_name":"dbi Blog","article_published_time":"2021-10-30T08:39:24+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Why does my first tablespace in PostgreSQL always get the OID 16384?","datePublished":"2021-10-30T08:39:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/"},"wordCount":496,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/","url":"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/","name":"Why does my first tablespace in PostgreSQL always get the OID 16384? - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2021-10-30T08:39:24+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/why-does-my-first-tablespace-in-postgresql-always-get-the-oid-16384\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Why does my first tablespace in PostgreSQL always get the OID 16384?"}]},{"@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\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/16755","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\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=16755"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/16755\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=16755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=16755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=16755"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=16755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}