{"id":8986,"date":"2016-09-30T07:24:00","date_gmt":"2016-09-30T05:24:00","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/"},"modified":"2016-09-30T07:24:00","modified_gmt":"2016-09-30T05:24:00","slug":"running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/","title":{"rendered":"Running PostgreSQL on ZFS on Linux &#8211; Fun with snapshots and clones"},"content":{"rendered":"<p>In the <a href=\"http:\/\/dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux\/\" target=\"_blank\" rel=\"noopener\">last post<\/a> we looked at how to get a ZFS file system up and running on a CentOS 7 host and how to enable the auto mount of the ZFS file systems. In this post we&#8217;ll look at two of the features ZFS provides: Snapshots and clones. <\/p>\n<p><!--more--><\/p>\n<p>A ZFS snapshot is a read only copy of a file system. How can we benefit from that when it comes to PostgreSQL. There are several scenarios where this can be useful. Imagine you are developing an application and you want to test the deployment of a new release on top of a previous release. What you probably want to have is a production like PostgreSQL instance with lots of data for being able to test the upgrade path. In addition it would be great if you can revert in seconds and start from scratch just in case you run into troubles or you missed one important point in the upgrade scripts. Using ZFS snapshots you can have all of this. Lets see.<\/p>\n<p>Currently my PostgreSQL instance from the <a href=\"http:\/\/dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux\/\" target=\"_blank\" rel=\"noopener\">last post<\/a> does not contain any user data, so lets generate some:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres= create table my_app_table ( a int, b varchar(50) );\nCREATE TABLE\npostgres=# with aa as \npostgres-# ( select * \npostgres(#     from generate_series (1,1000000) a\npostgres(# )\npostgres-# insert into my_app_table\npostgres-# select aa.a, md5(aa.a::varchar)\npostgres-#   from aa;\nINSERT 0 1000000\n<\/pre>\n<p>This is the release we want to test our upgrade scripts from so lets create a snapshot of the current state of our instance:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n[root@centos7 ~] zfs snapshot pgpool\/pgdata@baserelease\n[root@centos7 ~] zfs list -t snapshot\nNAME                        USED  AVAIL  REFER  MOUNTPOINT\npgpool\/pgdata@baserelease  16.6M      -   202M  -\n<\/pre>\n<p>The &#8220;@baserelease&#8221; is the name of the snapshot or to be correct everything after the &#8220;@&#8221; is the name of the snapshot.<\/p>\n<p>Are you worried about consistency? This should not be an issue as PostgreSQL fsyncs the WAL so the instance should just start, apply all the wal records which are missing from the data files and you&#8217;re fine. Anyway, this is a scenario for testing: So as long as you have a consistent starting point you are fine. <\/p>\n<p>A simple upgrade script could be:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# alter table my_app_table add column c date;\nALTER TABLE\npostgres=# update my_app_table set c = now();\nUPDATE 1000000\n<\/pre>\n<p>What happened to the snapshot?<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n[root@centos7 ~] zfs list -t snapshot\nNAME                        USED  AVAIL  REFER  MOUNTPOINT\npgpool\/pgdata@baserelease  78.3M      -   202M  -\n<\/pre>\n<p>As soon as you modify data the snapshot will grow, no surprise.<\/p>\n<p>So you did run your tests and discovered some things you could improve and once you improved what you wanted you want to start from the same point again. When having a snapshot this is quite easy, just revert to the snapshot. Of course you&#8217;ll need to stop your PostgreSQL instance first:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@centos7:\/home\/postgres\/ [PG1] pg_ctl stop -D \/pgpool\/pgdata\/ -m fast\nwaiting for server to shut down....LOG:  received fast shutdown request\nLOG:  aborting any active transactions\nLOG:  autovacuum launcher shutting down\nLOG:  shutting down\n done\nserver stopped\n<\/pre>\n<p>As soon as the instance is down the snapshot can be reverted:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n[root@centos7 ~] zfs rollback pgpool\/pgdata@baserelease\n[root@centos7 ~] zfs list -t snapshot\nNAME                        USED  AVAIL  REFER  MOUNTPOINT\npgpool\/pgdata@baserelease     1K      -   202M  -\n<\/pre>\n<p>When you check the data after you started the instance again it is exactly as it was before:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@centos7:\/home\/postgres\/ [PG1] pg_ctl start -D \/pgpool\/pgdata\/\npostgres@centos7:\/home\/postgres\/ [PG1] LOG:  database system was not properly shut down; automatic recovery in progress\npostgres@centos7:\/home\/postgres\/ [PG1] psql postgres\npsql (9.5.4 dbi services build)\nType \"help\" for help.\n\npostgres= d my_app_table\n        Table \"public.my_app_table\"\n Column |         Type          | Modifiers \n--------+-----------------------+-----------\n a      | integer               | \n b      | character varying(50) | \n<\/pre>\n<p>Notice the message about the automatic recovery, that is when the wal is replayed. Now you can just start your upgrade script again, revert in case of issues, start again, revert again, and so on.<\/p>\n<p>Another use case: Rapid cloning of PostgreSQL instances (clones are writable, snapshots not). How does that work? This is where clones come into the game. For being able to clone you need a snapshot as clones depend on snapshots. Another thing to keep in mind is that you can not delete a snapshot when you have a clone still sitting on top of it. Lets see how it works:<\/p>\n<p>As said we need a snapshot:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n[root@centos7 ~] zfs snapshot pgpool\/pgdata@clonebase\n<\/pre>\n<p>On top of this snapshot we can now create a clone:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n[root@centos7 ~] zfs create pgpool\/clones\n[root@centos7 ~] zfs clone pgpool\/pgdata@clonebase pgpool\/clones\/1\n[root@centos7 ~] zfs list\nNAME              USED  AVAIL  REFER  MOUNTPOINT\npgpool            170M  9.46G    21K  \/pgpool\npgpool\/clones    20.5K  9.46G  19.5K  \/pgpool\/clones\npgpool\/clones\/1     1K  9.46G   169M  \/pgpool\/clones\/1\npgpool\/pgdata     170M  9.46G   169M  \/pgpool\/pgdata\n<\/pre>\n<p>Using the new clone we bring up another PostgreSQL instance in seconds, containing the exact data from the source of the clone:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@centos7:\/home\/postgres\/ [PG1] rm \/pgpool\/clones\/1\/*.pid\npostgres@centos7:\/home\/postgres\/ [PG1] sed -i 's\/#port = 5432\/port=5433\/g' \/pgpool\/clones\/1\/postgresql.conf\npostgres@centos7:\/home\/postgres\/ [PG1] pg_ctl start -D \/pgpool\/clones\/1\/\npostgres@centos7:\/home\/postgres\/ [PG1] psql -p 5433 postgres\npsql (9.5.4 dbi services build)\nType \"help\" for help.\n\npostgres=\n<\/pre>\n<p>Quite cool and easy. <\/p>\n<p>Conclusion: I am not sure if I&#8217;d use ZFS for production databases on Linux because I have not tested enough. But for development and testing purposes there are quite a few benefits such as snapshots and cloning. This can simply your processes a lot. You could even use snapshots and clones as a basis for your backups although I&#8217;d prefer <a href=\"http:\/\/www.pgbarman.org\/\">barman<\/a> or <a href=\"http:\/\/www.enterprisedb.com\/edb-backup-and-recovery-tool\" target=\"_blank\" rel=\"noopener\">bart<\/a>.<\/p>\n<p>PS: To clean up:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n[root@centos7 ~] zfs destroy pgpool\/clones\/1\n[root@centos7 ~] zfs destroy pgpool\/clones\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>In the last post we looked at how to get a ZFS file system up and running on a CentOS 7 host and how to enable the auto mount of the ZFS file systems. In this post we&#8217;ll look at two of the features ZFS provides: Snapshots and clones.<\/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":[611,73,77,935],"type_dbi":[],"class_list":["post-8986","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-filesytem","tag-linux","tag-postgresql","tag-zfs"],"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>Running PostgreSQL on ZFS on Linux - Fun with snapshots and clones - 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\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Running PostgreSQL on ZFS on Linux - Fun with snapshots and clones\" \/>\n<meta property=\"og:description\" content=\"In the last post we looked at how to get a ZFS file system up and running on a CentOS 7 host and how to enable the auto mount of the ZFS file systems. In this post we&#8217;ll look at two of the features ZFS provides: Snapshots and clones.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-09-30T05:24:00+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\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Running PostgreSQL on ZFS on Linux &#8211; Fun with snapshots and clones\",\"datePublished\":\"2016-09-30T05:24:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/\"},\"wordCount\":627,\"commentCount\":0,\"keywords\":[\"filesytem\",\"Linux\",\"PostgreSQL\",\"ZFS\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/\",\"name\":\"Running PostgreSQL on ZFS on Linux - Fun with snapshots and clones - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2016-09-30T05:24:00+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Running PostgreSQL on ZFS on Linux &#8211; Fun with snapshots and clones\"}]},{\"@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":"Running PostgreSQL on ZFS on Linux - Fun with snapshots and clones - 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\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/","og_locale":"en_US","og_type":"article","og_title":"Running PostgreSQL on ZFS on Linux - Fun with snapshots and clones","og_description":"In the last post we looked at how to get a ZFS file system up and running on a CentOS 7 host and how to enable the auto mount of the ZFS file systems. In this post we&#8217;ll look at two of the features ZFS provides: Snapshots and clones.","og_url":"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/","og_site_name":"dbi Blog","article_published_time":"2016-09-30T05:24:00+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\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Running PostgreSQL on ZFS on Linux &#8211; Fun with snapshots and clones","datePublished":"2016-09-30T05:24:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/"},"wordCount":627,"commentCount":0,"keywords":["filesytem","Linux","PostgreSQL","ZFS"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/","url":"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/","name":"Running PostgreSQL on ZFS on Linux - Fun with snapshots and clones - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2016-09-30T05:24:00+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/running-postgresql-on-zfs-on-linux-fun-with-snapshots-and-clones\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Running PostgreSQL on ZFS on Linux &#8211; Fun with snapshots and clones"}]},{"@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\/8986","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=8986"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/8986\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=8986"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=8986"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=8986"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=8986"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}