{"id":9399,"date":"2016-11-24T17:03:56","date_gmt":"2016-11-24T16:03:56","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/"},"modified":"2016-11-24T17:03:56","modified_gmt":"2016-11-24T16:03:56","slug":"can-i-do-it-with-postgresql-1-restore-points","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/","title":{"rendered":"Can I do it with PostgreSQL? &#8211; 1 &#8211; Restore points"},"content":{"rendered":"<p>When discussing with customers about PostgreSQL we often hear that they can do things in one database that they can not do in PostgreSQL. Most of the times this is not true and you actually can do it in PostgreSQL. Maybe not in exactly the same way but this is not surprising as PostgreSQL does implement features not in exactly the same way other vendors do. <\/p>\n<p>To start this series we&#8217;ll talk about restore points. Of course you can create restore points in PostgreSQL and then restore up to such a point in case you need to (e.g. after a failed schema or application upgrade or just for testing purposes ). Lets go&#8230;<\/p>\n<p><!--more--><\/p>\n<p>We&#8217;ll use the latest version of PostgreSQL which is 9.6.1 currently:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@pgbox:\/home\/postgres\/ [PG961] sqh\npsql (9.6.1 dbi services build)\nType \"help\" for help.\n\n(postgres@[local]:5439) [postgres] &gt; select version();\n                                                          version                                                           \n----------------------------------------------------------------------------------------------------------------------------\n PostgreSQL 9.6.1 dbi services build on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4), 64-bit\n(1 row)\n\nTime: 47.119 ms\n(postgres@[local]:5439) [postgres] &gt; \n<\/pre>\n<p>When we want to do point in time recovery we need to setup archiving. Without going into the details (as this is out of scope here) the parameters which need to be adjusted are these (if not already done):<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [postgres] &gt; alter system set wal_level = 'replica';\nALTER SYSTEM\nTime: 28.056 ms\n(postgres@[local]:5439) [postgres] &gt; alter system set archive_command='test ! -f \/u90\/pgdata\/PG961\/%f &amp;&amp; cp %p \/u90\/pgdata\/PG961\/%f'; \nALTER SYSTEM\nTime: 20.925 ms\n(postgres@[local]:5439) [postgres] &gt; alter system set archive_mode ='on';\nALTER SYSTEM\nTime: 5.307 ms\n(postgres@[local]:5439) [postgres] &gt; select name,context from pg_settings where name in ('archive_mode','archive_command','wal_level');\n      name       |  context   \n-----------------+------------\n archive_command | sighup\n archive_mode    | postmaster\n wal_level       | postmaster\n(3 rows)\n\nTime: 1.460 ms\n<\/pre>\n<p>Be sure to restart your instance before you continue. Changing archive_mode and wal_level can not be done online. Once you restarted make sure that your archive_command really succeeds:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [postgres] &gt; create database test1;\nCREATE DATABASE\nTime: 1705.539 ms\n(postgres@[local]:5439) [postgres] &gt; drop database test1;\nDROP DATABASE\nTime: 107.283 ms\n(postgres@[local]:5439) [restore] &gt; select pg_switch_xlog();\n pg_switch_xlog \n----------------\n 0\/22001798\n(1 row)\n\nTime: 214.216 ms\n(postgres@[local]:5439) [postgres] &gt; ! ls -l \/u90\/pgdata\/PG961\/\ntotal 16384\n-rw-------. 1 postgres postgres 16777216 Nov 24 17:34 000000020000000000000022\n<\/pre>\n<p>When you can not see an archived wal in the last step you did something wrong. The next bit you need when you want to do point in time recovery with PostgreSQL is a base backup:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@pgbox:\/u02\/pgdata\/PG961\/ [PG961] mkdir \/u90\/pgdata\/PG961\/basebackups\npostgres@pgbox:\/u02\/pgdata\/PG961\/ [PG961] pg_basebackup -x -D \/u90\/pgdata\/PG961\/basebackups\/\npostgres@pgbox:\/u02\/pgdata\/PG961\/ [PG961] ls \/u90\/pgdata\/PG961\/basebackups\/\nbackup_label  pg_commit_ts   pg_log        pg_replslot   pg_stat_tmp  PG_VERSION\nbase          pg_dynshmem    pg_logical    pg_serial     pg_subtrans  pg_xlog\nglobal        pg_hba.conf    pg_multixact  pg_snapshots  pg_tblspc    postgresql.auto.conf\npg_clog       pg_ident.conf  pg_notify     pg_stat       pg_twophase  postgresql.conf\n<\/pre>\n<p>Fine. Lets generate some test data with this simple script:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [postgres] &gt; ! cat a.sql\nc postgres\ndrop database if exists restore;\ncreate database restore;\nc restore\ncreate table t1 ( a int );\ninsert into t1 (a)\n       values (generate_series(1,1000000));\nselect count(*) from t1;\nd t1\n<\/pre>\n<p>When you run this you&#8217;ll get a table (t1) containing 1 million rows:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [postgres] &gt; i a.sql\nYou are now connected to database \"postgres\" as user \"postgres\".\nDROP DATABASE\nTime: 114.000 ms\nCREATE DATABASE\nTime: 1033.245 ms\nYou are now connected to database \"restore\" as user \"postgres\".\nCREATE TABLE\nTime: 5.917 ms\nINSERT 0 1000000\nTime: 2226.599 ms\n  count  \n---------\n 1000000\n(1 row)\n\nTime: 65.864 ms\n      Table \"public.t1\"\n Column |  Type   | Modifiers \n--------+---------+-----------\n a      | integer | \n<\/pre>\n<p>Ok, fine. Now we are ready for testing restore points. Lets say you want to do some modifications to your table and to be on the safe side you want to create a restore point before. No problem:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [postgres] &gt; select pg_create_restore_point('RP1');\n pg_create_restore_point \n-------------------------\n 0\/28D50EF8\n(1 row)\n\nTime: 0.825 ms\n<\/pre>\n<p>Quite easy and fast. Now lets play with our table:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [restore] &gt; select count(*) from t1;\n  count  \n---------\n 1000010\n(1 row)\n\nTime: 66.214 ms\n(postgres@[local]:5439) [restore] &gt; d t1\n      Table \"public.t1\"\n Column |  Type   | Modifiers \n--------+---------+-----------\n a      | integer | \n\n(postgres@[local]:5439) [restore] &gt; alter table t1 add column b varchar(10);\nALTER TABLE\nTime: 1.810 ms\n(postgres@[local]:5439) [restore] &gt; update t1 set b='b';\nUPDATE 1000010\nTime: 11004.972 ms\n(postgres@[local]:5439) [restore] &gt; drop table t1;\nDROP TABLE\nTime: 238.329 ms\n<\/pre>\n<p>Ups, table gone. How can we now go back to the restore point created above? Quite easy:<\/p>\n<p>Shutdown your instance and copy back the base backup:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@pgbox:\/u02\/pgdata\/PG961\/ [PG961] rm -rf pg_xlog\npostgres@pgbox:\/u02\/pgdata\/PG961\/ [PG961] cp -pr \/u90\/pgdata\/PG961\/basebackups\/* $PGDATA\ncp: cannot overwrite non-directory \u2018\/u02\/pgdata\/PG961\/pg_xlog\u2019 with directory \u2018\/u90\/pgdata\/PG961\/basebackups\/pg_xlog\u2019\npostgres@pgbox:\/u02\/pgdata\/PG961\/ [PG961] ln -s \/u03\/pgdata\/PG961\/ pg_xlog\n<\/pre>\n<p>Then create a recovery.conf file (for telling PostgreSQL to go into recovery mode when it comes up) and specify the restore point you created above:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@pgbox:\/home\/postgres\/ [PG961] echo \"restore_command = 'cp \/u90\/pgdata\/PG961\/%f %p'\n&gt; recovery_target_name = 'RP1'\" &gt; $PGDATA\/recovery.conf\npostgres@pgbox:\/home\/postgres\/ [PG961] cat $PGDATA\/recovery.conf\nrestore_command = 'cp \/u90\/pgdata\/PG961\/%f %p'\nrecovery_target_name = 'RP1'\n<\/pre>\n<p>Start the instance and check the log file:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nLOG:  database system was interrupted; last known up at 2016-11-24 17:36:28 CET\nLOG:  creating missing WAL directory \"pg_xlog\/archive_status\"\nLOG:  starting point-in-time recovery to \"RP1\"\n<\/pre>\n<p>If everything went fine your table should be back without the additional column:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5439) [restore] &gt; d t1\n      Table \"public.t1\"\n Column |  Type   | Modifiers \n--------+---------+-----------\n a      | integer | \n\n(postgres@[local]:5439) [restore] &gt; select count(*) from t1;\n  count  \n---------\n 1000000\n(1 row)\n\nTime: 82.797 ms\n<\/pre>\n<p>So, yes, you can definitely use restore points with PostgreSQL \ud83d\ude42<\/p>\n<p>If you want me to blog about any feature you are not sure is there in PostgreSQL let me know.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>When discussing with customers about PostgreSQL we often hear that they can do things in one database that they can not do in PostgreSQL. Most of the times this is not true and you actually can do it in PostgreSQL. Maybe not in exactly the same way but this is not surprising as PostgreSQL does [&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":[202,77,226],"type_dbi":[],"class_list":["post-9399","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-backup","tag-postgresql","tag-recovery"],"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>Can I do it with PostgreSQL? - 1 - Restore points - 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\/can-i-do-it-with-postgresql-1-restore-points\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Can I do it with PostgreSQL? - 1 - Restore points\" \/>\n<meta property=\"og:description\" content=\"When discussing with customers about PostgreSQL we often hear that they can do things in one database that they can not do in PostgreSQL. Most of the times this is not true and you actually can do it in PostgreSQL. Maybe not in exactly the same way but this is not surprising as PostgreSQL does [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-11-24T16:03:56+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\/can-i-do-it-with-postgresql-1-restore-points\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Can I do it with PostgreSQL? &#8211; 1 &#8211; Restore points\",\"datePublished\":\"2016-11-24T16:03:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/\"},\"wordCount\":415,\"commentCount\":0,\"keywords\":[\"Backup\",\"PostgreSQL\",\"Recovery\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/\",\"name\":\"Can I do it with PostgreSQL? - 1 - Restore points - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2016-11-24T16:03:56+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Can I do it with PostgreSQL? &#8211; 1 &#8211; Restore points\"}]},{\"@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":"Can I do it with PostgreSQL? - 1 - Restore points - 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\/can-i-do-it-with-postgresql-1-restore-points\/","og_locale":"en_US","og_type":"article","og_title":"Can I do it with PostgreSQL? - 1 - Restore points","og_description":"When discussing with customers about PostgreSQL we often hear that they can do things in one database that they can not do in PostgreSQL. Most of the times this is not true and you actually can do it in PostgreSQL. Maybe not in exactly the same way but this is not surprising as PostgreSQL does [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/","og_site_name":"dbi Blog","article_published_time":"2016-11-24T16:03:56+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\/can-i-do-it-with-postgresql-1-restore-points\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Can I do it with PostgreSQL? &#8211; 1 &#8211; Restore points","datePublished":"2016-11-24T16:03:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/"},"wordCount":415,"commentCount":0,"keywords":["Backup","PostgreSQL","Recovery"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/","url":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/","name":"Can I do it with PostgreSQL? - 1 - Restore points - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2016-11-24T16:03:56+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-1-restore-points\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Can I do it with PostgreSQL? &#8211; 1 &#8211; Restore points"}]},{"@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\/9399","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=9399"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9399\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=9399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=9399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=9399"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=9399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}