{"id":35577,"date":"2024-11-01T09:44:25","date_gmt":"2024-11-01T08:44:25","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=35577"},"modified":"2024-11-01T09:44:28","modified_gmt":"2024-11-01T08:44:28","slug":"postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/","title":{"rendered":"PostgreSQL: Partitioning an existing table (almost) online using table inheritance"},"content":{"rendered":"\n<p>The <a href=\"https:\/\/www.postgresql.org\/list\/\" target=\"_blank\" rel=\"noreferrer noopener\">PostgreSQL mailing list archives<\/a> are a wonderful place to get new ideas just by reading through random posts. This time I found an <a href=\"https:\/\/www.postgresql.org\/message-id\/CAApHDvre3nuCLA4DVfYSW_EAiuV9FKaZV6k7_dPMSa9d6_Mg2Q%40mail.gmail.com\" target=\"_blank\" rel=\"noreferrer noopener\">interesting idea <\/a>on how to partition an existing table almost online without dumping and reloading the data in some way. For those who remember: Before PostgreSQL 10 the only way to partition a table in PostgreSQL was to use <a href=\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-7-partitioning\/\" target=\"_blank\" rel=\"noreferrer noopener\">table inheritance<\/a>. I haven&#8217;t used <a href=\"https:\/\/www.postgresql.org\/docs\/17\/ddl-inherit.html\" target=\"_blank\" rel=\"noreferrer noopener\">table inheritance (docs)<\/a> since quite some while, but it turned out that this is still something which can be very useful.<\/p>\n\n\n\n<p>As usual lets start with a simple table and some data:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\npostgres=# create table t ( a int primary key, b text );\nCREATE TABLE\npostgres=# insert into t select i, &#039;aaa&#039; from generate_series(1,1000000) i;\nINSERT 0 1000000\npostgres=# insert into t select i+1000000, &#039;bbb&#039; from generate_series(1,1000000) i;\nINSERT 0 1000000\n<\/pre><\/div>\n\n\n<p>What options do we have if we want to partition this table by list for column b? We could create the new partition structure beside the current table, and then in one point in time load the existing data into the partitioned table (either by using insert into .. select * from, or by dumping and reloading). Another option would be to setup logical replication from the old table into the new partitioned table. The third option , what we&#8217;ll have a look now, is to use table inheritance as an intermediate step to partition the table almost online. <\/p>\n\n\n\n<p>The first bits we need are the child tables which are supposed to hold that data for the values of &#8216;aaa&#8217; and &#8216;bbb&#8217;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ncreate table t_aaa ( a int, b text check (b in (&#039;aaa&#039;)) ) inherits ( t );\ncreate table t_bbb ( a int, b text check (b in (&#039;bbb&#039;)) ) inherits ( t );\n<\/pre><\/div>\n\n\n<p>The important point here is the check constraint (more on that later), and of course the inheritance. For now we&#8217;ve build the inheritance tree but the child tables do not contain any data. Before we load the child table we need to make sure, that new data arriving in the parent table gets routed to the correct child table by creating a trigger:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\npostgres=# CREATE OR REPLACE FUNCTION tmp_trigger()\nRETURNS TRIGGER AS $$\nBEGIN\n    IF ( NEW.b = &#039;aaa&#039; )\n    THEN\n      INSERT INTO t_aaa VALUES (NEW.*);\n    ELSIF ( NEW.b = &#039;bbb&#039; )\n    THEN\n      INSERT INTO t_bbb VALUES (NEW.*);\n    ELSE\n      RAISE EXCEPTION &#039;Value out of range!&#039;;\n    END IF;\n    RETURN NULL;\nEND;\n$$\nLANGUAGE plpgsql;\nCREATE FUNCTION\npostgres=# CREATE TRIGGER tmp_insert_trigger\n    BEFORE INSERT ON t\n    FOR EACH ROW EXECUTE PROCEDURE tmp_trigger();\nCREATE TRIGGER\n<\/pre><\/div>\n\n\n<p>A quick test to check that the trigger works:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\npostgres=# insert into t values (-1,&#039;aaa&#039;);\nINSERT 0 0\npostgres=# insert into t values (-2,&#039;bbb&#039;);\nINSERT 0 0\npostgres=# select * from only t_aaa;\n a  |  b  \n----+-----\n -1 | aaa\n(1 row)\n\npostgres=# select * from only t_bbb;\n a  |  b  \n----+-----\n -2 | bbb\npostgres=# select * from t where a in (-1,-2);\n a  |  b  \n----+-----\n -1 | aaa\n -2 | bbb\n(2 rows)\n<\/pre><\/div>\n\n\n<p>This confirms that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Data is routed into the correct child table<\/li>\n\n\n\n<li>Data is accessible over the parent <\/li>\n<\/ul>\n\n\n\n<p>Having that confirmed we can delete the data from the parent table and insert into the child tables (maybe in multiple batches):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\npostgres=# with aa as ( delete from t where b = &#039;aaa&#039; returning * ) insert into t_aaa select * from aa;\nINSERT 0 1000000\npostgres=# with bb as ( delete from t where b = &#039;bbb&#039; returning * ) insert into t_bbb select * from bb;\nINSERT 0 1000000\n<\/pre><\/div>\n\n\n<p>We do that until the parent table is empty and all data is in the child tables:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\npostgres=# select count(*) from only t;\n count \n-------\n     0\n(1 row)\n\npostgres=# select count(*) from only t_aaa;\n  count  \n---------\n 1000000\n(1 row)\n\npostgres=# select count(*) from only t_bbb;\n  count  \n---------\n 1000000\n(1 row)\n<\/pre><\/div>\n\n\n<p>The final step is to destroy the inheritance and attach the child tables as new partitions to a newly created partitioned table, and finally rename the old one and the new one:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\npostgres=# begin;\nBEGIN\npostgres=*# create table tt ( a int, b text ) partition by list(b);\nCREATE TABLE\npostgres=*# alter table t_aaa no inherit t;\nALTER TABLE\npostgres=*# alter table tt attach partition t_aaa for values in (&#039;aaa&#039;);\nALTER TABLE\npostgres=*# alter table t_bbb no inherit t;\nALTER TABLE\npostgres=*# alter table tt attach partition t_bbb for values in (&#039;bbb&#039;);\nALTER TABLE\npostgres=*# alter table t rename to t_old;\nALTER TABLE\npostgres=*# alter table tt rename to t;\nALTER TABLE\npostgres=*# commit;\nCOMMIT\n<\/pre><\/div>\n\n\n<p>Because the check constraint matches the partition key, PostgreSQL can just attach the tables as new partitions without scanning the tables, so this is a very fast operation with a very short lock. Done:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\npostgres=# select * from only t_aaa;\n                                      Partitioned table &quot;public.t&quot;\n Column |  Type   | Collation | Nullable | Default | Storage  | Compression | Stats target | Description \n--------+---------+-----------+----------+---------+----------+-------------+--------------+-------------\n a      | integer |           |          |         | plain    |             |              | \n b      | text    |           |          |         | extended |             |              | \nPartition key: LIST (b)\nPartitions: t_aaa FOR VALUES IN (&#039;aaa&#039;),\n            t_bbb FOR VALUES IN (&#039;bbb&#039;)\n<\/pre><\/div>\n\n\n<p>But, pleas keep in mind:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>This is a really simple test case, of course this works well. In busy systems this might get more tricky<\/li>\n\n\n\n<li>Routing data with a trigger might introduce some performance degradation<\/li>\n\n\n\n<li>You somehow have to deal with data coming in while you go from the old to the new structure, or stop data from coming in during the last step<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>The PostgreSQL mailing list archives are a wonderful place to get new ideas just by reading through random posts. This time I found an interesting idea on how to partition an existing table almost online without dumping and reloading the data in some way. For those who remember: Before PostgreSQL 10 the only way to [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,198],"tags":[77],"type_dbi":[2749],"class_list":["post-35577","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-database-management","tag-postgresql","type-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>PostgreSQL: Partitioning an existing table (almost) online using table inheritance - 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\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL: Partitioning an existing table (almost) online using table inheritance\" \/>\n<meta property=\"og:description\" content=\"The PostgreSQL mailing list archives are a wonderful place to get new ideas just by reading through random posts. This time I found an interesting idea on how to partition an existing table almost online without dumping and reloading the data in some way. For those who remember: Before PostgreSQL 10 the only way to [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T08:44:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T08:44:28+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=\"3 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\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"PostgreSQL: Partitioning an existing table (almost) online using table inheritance\",\"datePublished\":\"2024-11-01T08:44:25+00:00\",\"dateModified\":\"2024-11-01T08:44:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/\"},\"wordCount\":489,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Database management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/\",\"name\":\"PostgreSQL: Partitioning an existing table (almost) online using table inheritance - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2024-11-01T08:44:25+00:00\",\"dateModified\":\"2024-11-01T08:44:28+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL: Partitioning an existing table (almost) online using table inheritance\"}]},{\"@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":"PostgreSQL: Partitioning an existing table (almost) online using table inheritance - 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\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL: Partitioning an existing table (almost) online using table inheritance","og_description":"The PostgreSQL mailing list archives are a wonderful place to get new ideas just by reading through random posts. This time I found an interesting idea on how to partition an existing table almost online without dumping and reloading the data in some way. For those who remember: Before PostgreSQL 10 the only way to [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/","og_site_name":"dbi Blog","article_published_time":"2024-11-01T08:44:25+00:00","article_modified_time":"2024-11-01T08:44:28+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"PostgreSQL: Partitioning an existing table (almost) online using table inheritance","datePublished":"2024-11-01T08:44:25+00:00","dateModified":"2024-11-01T08:44:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/"},"wordCount":489,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring","Database management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/","url":"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/","name":"PostgreSQL: Partitioning an existing table (almost) online using table inheritance - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2024-11-01T08:44:25+00:00","dateModified":"2024-11-01T08:44:28+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-partitioning-an-existing-table-almost-online-using-table-inheritance\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL: Partitioning an existing table (almost) online using table inheritance"}]},{"@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\/35577","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=35577"}],"version-history":[{"count":21,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/35577\/revisions"}],"predecessor-version":[{"id":35604,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/35577\/revisions\/35604"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=35577"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=35577"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=35577"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=35577"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}