{"id":15816,"date":"2021-02-25T06:47:52","date_gmt":"2021-02-25T05:47:52","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/"},"modified":"2021-02-25T06:47:52","modified_gmt":"2021-02-25T05:47:52","slug":"datanymizer-data-anonymizer-for-postgresql","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/","title":{"rendered":"[Data]nymizer &#8211; Data anonymizer for PostgreSQL"},"content":{"rendered":"<p>Often there is the requirement to populate a test or development database with data from production, but this comes with a risk: Do you really want, that developers or testers have access to sensitive data? In a lot of companies this might not be an issue, but for others, sensitive data must not be available to any other database than production. In Oracle there is <a href=\"https:\/\/www.oracle.com\/database\/technologies\/security\/data-masking-subsetting.html\" target=\"_blank\" rel=\"noopener\">Data Masking<\/a> but there is nothing in Community PostgreSQL which helps you with that. Of course you could develop something on your own, but there is another solution: <a href=\"https:\/\/github.com\/datanymizer\/datanymizer\" target=\"_blank\" rel=\"noopener\">[Data]nymizer<\/a>. This tool will produce a native dump file, and sensitive data is masked based on flexible rules. Because the result is a dump file, the size of the dump file might become an issue, if your source database is large, and you want to dump the whole database. But usually you do not have sensitive data in all the tables and you have the option to dump only specific tables. Lets have a look at how this can be installed, and how it works.<\/p>\n<p><!--more--><\/p>\n<p>The installation itself is straight forward:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] curl -sSfL https:\/\/git.io\/pg_datanymizer | sh -s -- -b bin v0.1.0\npg_datanymizer installer: Version v0.1.0 will be installed\npg_datanymizer installer: Successfully installed pg_datanymizer 0.1.0 to bin\/pg_datanymizer\npostgres@debian10pg:\/home\/postgres\/ [pgdev] ls -l bin\/\ntotal 14452\n-rwxr-xr-x 1 postgres postgres 14796464 Feb 24 10:51 pg_datanymizer\n<\/pre>\n<p>To check if it works in general, we can print the help:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] bin\/pg_datanymizer --help\npg_datanymizer 0.1.0\n\nUSAGE:\n    pg_datanymizer [OPTIONS] \n\nFLAGS:\n        --help       Prints help information\n    -V, --version    Prints version information\n\nOPTIONS:\n    -f, --file                    Path to dump file, example: \/tmp\/dump.sql\n    -c, --config                  Path to config file. Default: .\/config.yml\n    -d, --dbname                  database to dump [default: postgres]\n    -h, --host                    database server host or socket directory [default: localhost]\n    -W, --password                force password prompt (should happen automatically)\n        --pg_dump                 pg_dump file location [default: pg_dump]\n    -p, --port                    database server port number\n    -U, --username                connect as specified database user\n\nARGS:\n     \n<\/pre>\n<p>There are not too many options and you&#8217;ll notice that the tool can be used over the network as well. This is quite important, as access to the production host usually is limited. <\/p>\n<p>Before we proceed with the tool we need some data, so lets use a standard <a href=\"https:\/\/www.postgresql.org\/docs\/current\/pgbench.html\" target=\"_blank\" rel=\"noopener\">pgbench<\/a> database for this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] psql\npsql (14devel)\nType \"help\" for help.\n\npostgres=# create database test;\nCREATE DATABASE\npostgres=# ! pgbench -i -s 10 test\ndropping old tables...\nNOTICE:  table \"pgbench_accounts\" does not exist, skipping\nNOTICE:  table \"pgbench_branches\" does not exist, skipping\nNOTICE:  table \"pgbench_history\" does not exist, skipping\nNOTICE:  table \"pgbench_tellers\" does not exist, skipping\ncreating tables...\ngenerating data (client-side)...\n1000000 of 1000000 tuples (100%) done (elapsed 1.73 s, remaining 0.00 s)\nvacuuming...\ncreating primary keys...\ndone in 2.83 s (drop tables 0.00 s, create tables 0.03 s, client-side generate 1.77 s, vacuum 0.33 s, primary keys 0.70 s).\npostgres=# c test\nYou are now connected to database \"test\" as user \"postgres\".\ntest=# d\n              List of relations\n Schema |       Name       | Type  |  Owner   \n--------+------------------+-------+----------\n public | pgbench_accounts | table | postgres\n public | pgbench_branches | table | postgres\n public | pgbench_history  | table | postgres\n public | pgbench_tellers  | table | postgres\n(4 rows)\ntest=# \n<\/pre>\n<p>The &#8220;filler&#8221; column of pgbench_accounts is not populated by default. Lets assume we have some sensitive data there, e.g. email addresses:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\ntest=# test=# update pgbench_accounts set filler = 'email@_'||md5(bid::text)||'.com';\nUPDATE 1000000\ntest=# select * from pgbench_accounts limit 5;\n  aid   | bid | abalance |                                        filler                                        \n--------+-----+----------+--------------------------------------------------------------------------------------\n 999947 |  10 |        0 | email@_d3d9446802a44259755d38e6d163e820.com                                         \n 999948 |  10 |        0 | email@_d3d9446802a44259755d38e6d163e820.com                                         \n 999949 |  10 |        0 | email@_d3d9446802a44259755d38e6d163e820.com                                         \n 999950 |  10 |        0 | email@_d3d9446802a44259755d38e6d163e820.com                                         \n 999951 |  10 |        0 | email@_d3d9446802a44259755d38e6d163e820.com                                         \n(5 rows)\n<\/pre>\n<p>Using a simple configuration file like this:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] cat config.yaml \ntables:\n  - name: pgbench_accounts\n    rules:\n      filler:\n        template:\n          format: user-{{_1}}-{{_2}}\n          rules:\n            - random_num: {}\n            - email:\n                kind: Safe\n<\/pre>\n<p>&#8230; we can easily obfuscate this:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] bin\/pg_datanymizer -c config.yaml -U postgres -f output.sql test \nPrepare data scheme...\nFetch tables metadata...\n[1 \/ 4] Prepare to dump table: public.pgbench_tellers\n[Dumping: public.pgbench_tellers] [|##################################################|] 100 of 100 rows [100%] (0s)\n[Dumping: public.pgbench_tellers] Finished in 0 seconds\n[Dumping: public.pgbench_accounts] [|##################################################|] 1016397 of 1016397 rows [100%] (0s)\n[Dumping: public.pgbench_accounts] Finished in 54 seconds\n[Dumping: public.pgbench_history] [|##################################################|] 0 of 0 rows [100%] (0s)\n[Dumping: public.pgbench_history] Finished in 0 seconds\n[Dumping: public.pgbench_branches] [|##################################################|] 10 of 10 rows [100%] (0s)\n[Dumping: public.pgbench_branches] Finished in 0 seconds\nFinishing with indexes...\n<\/pre>\n<p>Looking at the result, the filler column contains email addresses, but not with the original values anymore:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] grep \"@\" output.sql | head -10\n999947  10      0       user-17320282186627338435-muriel@example.com\n999948  10      0       user-14511192900116306114-rollin@example.org\n999949  10      0       user-11496284339692580677-adelle@example.net\n999950  10      0       user-1388753146590388317-kyra@example.net\n999951  10      0       user-16622047998196191495-hardy@example.org\n999952  10      0       user-1728042100917541840-leanna@example.org\n999953  10      0       user-16390037134577324059-daniela@example.com\n110689  2       0       user-797822007425813191-brendan@example.org\n110690  2       0       user-9262399608909070020-hunter@example.org\n110691  2       0       user-17500639029911909208-susan@example.net\n<\/pre>\n<p>&#8220;Email&#8221; is only one of the available the rules. Have a look at the <a href=\"https:\/\/github.com\/datanymizer\/datanymizer\/blob\/main\/README.md\" target=\"_blank\" rel=\"noopener\">Readme<\/a> for the other options.<\/p>\n<p>Filtering tables, either to be included or excluded is possible as well:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pg14] cat config.yaml \nfilter:\n  only:\n    - public.pgbench_accounts\n\ntables:\n  - name: pgbench_accounts\n    rules:\n      filler:\n        template:\n          format: user-{{_1}}-{{_2}}\n          rules:\n            - random_num: {}\n            - email:\n                kind: Safe\n<\/pre>\n<p>Using this configuration, only the pgbench_accounts table will be in the dump file:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] bin\/pg_datanymizer -c config.yaml -U postgres -f output.sql test \nPrepare data scheme...\nFetch tables metadata...\n[1 \/ 4] Prepare to dump table: public.pgbench_tellers\n[Dumping: public.pgbench_tellers] --- SKIP ---\n[2 \/ 4] Prepare to dump table: public.pgbench_history\n[Dumping: public.pgbench_history] --- SKIP ---\n[3 \/ 4] Prepare to dump table: public.pgbench_branches\n[Dumping: public.pgbench_branches] --- SKIP ---\n[4 \/ 4] Prepare to dump table: public.pgbench_accounts\n[Dumping: public.pgbench_accounts] [|##################################################|] 1016397 of 1016397 rows [100%] (0s)\n[Dumping: public.pgbench_accounts] Finished in 35 seconds\nFinishing with indexes...\nFull Dump finished in 35 seconds\n<\/pre>\n<p>Really a nice tool, and very flexible, if you have the requirement for data anonymization.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Often there is the requirement to populate a test or development database with data from production, but this comes with a risk: Do you really want, that developers or testers have access to sensitive data? In a lot of companies this might not be an issue, but for others, sensitive data must not be available [&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-15816","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>[Data]nymizer - Data anonymizer for PostgreSQL - 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\/datanymizer-data-anonymizer-for-postgresql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[Data]nymizer - Data anonymizer for PostgreSQL\" \/>\n<meta property=\"og:description\" content=\"Often there is the requirement to populate a test or development database with data from production, but this comes with a risk: Do you really want, that developers or testers have access to sensitive data? In a lot of companies this might not be an issue, but for others, sensitive data must not be available [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-25T05:47:52+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\/datanymizer-data-anonymizer-for-postgresql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"[Data]nymizer &#8211; Data anonymizer for PostgreSQL\",\"datePublished\":\"2021-02-25T05:47:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/\"},\"wordCount\":369,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/\",\"name\":\"[Data]nymizer - Data anonymizer for PostgreSQL - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2021-02-25T05:47:52+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[Data]nymizer &#8211; Data anonymizer for PostgreSQL\"}]},{\"@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":"[Data]nymizer - Data anonymizer for PostgreSQL - 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\/datanymizer-data-anonymizer-for-postgresql\/","og_locale":"en_US","og_type":"article","og_title":"[Data]nymizer - Data anonymizer for PostgreSQL","og_description":"Often there is the requirement to populate a test or development database with data from production, but this comes with a risk: Do you really want, that developers or testers have access to sensitive data? In a lot of companies this might not be an issue, but for others, sensitive data must not be available [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/","og_site_name":"dbi Blog","article_published_time":"2021-02-25T05:47:52+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\/datanymizer-data-anonymizer-for-postgresql\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"[Data]nymizer &#8211; Data anonymizer for PostgreSQL","datePublished":"2021-02-25T05:47:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/"},"wordCount":369,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/","url":"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/","name":"[Data]nymizer - Data anonymizer for PostgreSQL - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2021-02-25T05:47:52+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/datanymizer-data-anonymizer-for-postgresql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"[Data]nymizer &#8211; Data anonymizer for PostgreSQL"}]},{"@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\/15816","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=15816"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/15816\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=15816"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=15816"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=15816"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=15816"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}