{"id":10378,"date":"2017-07-25T18:49:26","date_gmt":"2017-07-25T16:49:26","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/"},"modified":"2017-07-25T18:49:26","modified_gmt":"2017-07-25T16:49:26","slug":"can-i-do-it-with-postgresql-17-identifying-a-blocking-session","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/","title":{"rendered":"Can I do it with PostgreSQL? \u2013 17 \u2013 Identifying a blocking session"},"content":{"rendered":"<p>One single blocking session in a database can completely halt your application so identifying which session is blocking other sessions is a task you must be able to perform quickly. In Oracle you can query <a href=\"http:\/\/docs.oracle.com\/database\/122\/REFRN\/V-SESSION.htm#REFRN30223\" target=\"_blank\" rel=\"noopener\">v$session<\/a> for getting that information (blocking_session, final_blocking_session). Can you do the same in PostgreSQL? Yes, you definitely can, lets go.<\/p>\n<p><!--more--><\/p>\n<p>As usual we&#8217;ll start by creating a test table:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@pgbox:\/home\/postgres\/ [PG10B] psql -X postgres\npsql (10beta2 dbi services build)\nType \"help\" for help.\n\npostgres=# create table t1 ( a int );\nCREATE TABLE\npostgres=# \n<\/pre>\n<p>One way to force other sessions to wait is to start a new transaction, modify the table:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# begin;\nBEGIN\npostgres=# alter table t1 add column t2 text;\nALTER TABLE\npostgres=#  \n<\/pre>\n<p>&#8230; and then try to insert data into the same table from another session:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres@pgbox:\/home\/postgres\/ [PG10B] psql -X postgres\npsql (10beta2 dbi services build)\nType \"help\" for help.\n\npostgres=# insert into t1 (a) values (1);\n<\/pre>\n<p>The insert statement will hang\/wait because the modification of the table is still ongoing (the transaction did neither commit nor rollback, <a href=\"https:\/\/www.dbi-services.com\/blog\/transactional-ddl\/\" target=\"_blank\" rel=\"noopener\">remember that DDLs in PostgreSQL are transactional<\/a>). Now that we have a blocking session how can we identify the session?<\/p>\n<p>What &#8220;v$session&#8221; is in Oracle, <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW\" target=\"_blank\" rel=\"noopener\">pg_stat_activity<\/a> is in PostgreSQL (Note: I am using PostgreSQL 10Beta2 here):<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# d pg_stat_activity \n                      View \"pg_catalog.pg_stat_activity\"\n      Column      |           Type           | Collation | Nullable | Default \n------------------+--------------------------+-----------+----------+---------\n datid            | oid                      |           |          | \n datname          | name                     |           |          | \n pid              | integer                  |           |          | \n usesysid         | oid                      |           |          | \n usename          | name                     |           |          | \n application_name | text                     |           |          | \n client_addr      | inet                     |           |          | \n client_hostname  | text                     |           |          | \n client_port      | integer                  |           |          | \n backend_start    | timestamp with time zone |           |          | \n xact_start       | timestamp with time zone |           |          | \n query_start      | timestamp with time zone |           |          | \n state_change     | timestamp with time zone |           |          | \n wait_event_type  | text                     |           |          | \n wait_event       | text                     |           |          | \n state            | text                     |           |          | \n backend_xid      | xid                      |           |          | \n backend_xmin     | xid                      |           |          | \n query            | text                     |           |          | \n backend_type     | text         \n<\/pre>\n<p>There is no column which identifies a blocking session but there are other interesting columns:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select datname,pid,usename,wait_event_type,wait_event,state,query from pg_stat_activity where backend_type = 'client backend' and pid != pg_backend_pid();\n datname  | pid  | usename  | wait_event_type | wait_event |        state        |               query                \n----------+------+----------+-----------------+------------+---------------------+------------------------------------\n postgres | 2572 | postgres | Client          | ClientRead | idle in transaction | alter table t1 add column t2 text;\n postgres | 2992 | postgres | Lock            | relation   | active              | insert into t1 (a) values (1);\n(2 rows)\n<\/pre>\n<p>This shows only client connections (excluding all the backend connections) and does not show the current session. In this case it is easy to identify the session which is blocking because we only have two sessions. When you have hundreds of sessions it becomes more tricky to identify the session which is blocking by looking at pg_stat_activity. <\/p>\n<p>When you want to know which locks are currently being held\/granted in PostgreSQL you can query <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/view-pg-locks.html\" target=\"_blank\" rel=\"noopener\">pg_locks<\/a>:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# d pg_locks\n                   View \"pg_catalog.pg_locks\"\n       Column       |   Type   | Collation | Nullable | Default \n--------------------+----------+-----------+----------+---------\n locktype           | text     |           |          | \n database           | oid      |           |          | \n relation           | oid      |           |          | \n page               | integer  |           |          | \n tuple              | smallint |           |          | \n virtualxid         | text     |           |          | \n transactionid      | xid      |           |          | \n classid            | oid      |           |          | \n objid              | oid      |           |          | \n objsubid           | smallint |           |          | \n virtualtransaction | text     |           |          | \n pid                | integer  |           |          | \n mode               | text     |           |          | \n granted            | boolean  |           |          | \n fastpath           | boolean  |           |          | \n<\/pre>\n<p>What can we see here:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select locktype,database,relation,pid,mode,granted from pg_locks where pid != pg_backend_pid();\n   locktype    | database | relation | pid  |        mode         | granted \n---------------+----------+----------+------+---------------------+---------\n virtualxid    |          |          | 2992 | ExclusiveLock       | t\n virtualxid    |          |          | 2572 | ExclusiveLock       | t\n relation      |    13212 |    24576 | 2992 | RowExclusiveLock    | f\n relation      |    13212 |    24581 | 2572 | AccessExclusiveLock | t\n transactionid |          |          | 2572 | ExclusiveLock       | t\n relation      |    13212 |    24579 | 2572 | ShareLock           | t\n relation      |    13212 |    24576 | 2572 | AccessExclusiveLock | t\n(7 rows)\n<\/pre>\n<p>There is one lock for session 2992 which is not granted and that is the session which currently is trying to insert a row in the table (see above). We can get more information by joining pg_locks with <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/catalog-pg-database.html\" target=\"_blank\" rel=\"noopener\">pg_database<\/a> and <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/catalog-pg-class.html\" target=\"_blank\" rel=\"noopener\">pg_class<\/a> taking the pids from above:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\nselect b.locktype,d.datname,c.relname,b.pid,b.mode \n  from pg_locks b \n     , pg_database d\n     , pg_class c\n where b.pid in (2572,2992)\n   and b.database = d.oid\n   and b.relation = c.oid;\n\n locktype | datname  | relname | pid  |        mode         \n----------+----------+---------+------+---------------------\n relation | postgres | t1      | 2992 | RowExclusiveLock\n relation | postgres | t1      | 2572 | AccessExclusiveLock\n(2 rows)\n<\/pre>\n<p>Does that help us beside that we now know that both sessions want to do some stuff against the t1 table? Not really. So how can we then identify a blocking session? Easy, use the pg_blocking_pids <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/functions-info.html\" target=\"_blank\" rel=\"noopener\">system information function<\/a> passing in the session which is blocked:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select pg_blocking_pids(2992);\n pg_blocking_pids \n------------------\n {2572}\n(1 row)\n<\/pre>\n<p>This gives you a list of sessions which are blocking. Can we kill it? Yes, of course, PostgreSQL comes with a rich set of <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/functions-admin.html\" target=\"_blank\" rel=\"noopener\">system administration functions<\/a>:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select pg_terminate_backend(2572);\n pg_terminate_backend \n----------------------\n t\n<\/pre>\n<p>&#8230; and the insert succeeds. Hope this helps &#8230;<\/p>\n<p>PS: There is a great page on the <a href=\"https:\/\/wiki.postgresql.org\/wiki\/Lock_dependency_information\" target=\"_blank\" rel=\"noopener\">PostgreSQL Wiki<\/a> about locks.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>One single blocking session in a database can completely halt your application so identifying which session is blocking other sessions is a task you must be able to perform quickly. In Oracle you can query v$session for getting that information (blocking_session, final_blocking_session). Can you do the same in PostgreSQL? Yes, you definitely can, lets go.<\/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-10378","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.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Can I do it with PostgreSQL? \u2013 17 \u2013 Identifying a blocking session - 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-17-identifying-a-blocking-session\/\" \/>\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? \u2013 17 \u2013 Identifying a blocking session\" \/>\n<meta property=\"og:description\" content=\"One single blocking session in a database can completely halt your application so identifying which session is blocking other sessions is a task you must be able to perform quickly. In Oracle you can query v$session for getting that information (blocking_session, final_blocking_session). Can you do the same in PostgreSQL? Yes, you definitely can, lets go.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-07-25T16:49:26+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=\"4 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-17-identifying-a-blocking-session\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Can I do it with PostgreSQL? \u2013 17 \u2013 Identifying a blocking session\",\"datePublished\":\"2017-07-25T16:49:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\\\/\"},\"wordCount\":410,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"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-17-identifying-a-blocking-session\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\\\/\",\"name\":\"Can I do it with PostgreSQL? \u2013 17 \u2013 Identifying a blocking session - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2017-07-25T16:49:26+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-17-identifying-a-blocking-session\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\\\/#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? \u2013 17 \u2013 Identifying a blocking session\"}]},{\"@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? \u2013 17 \u2013 Identifying a blocking session - 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-17-identifying-a-blocking-session\/","og_locale":"en_US","og_type":"article","og_title":"Can I do it with PostgreSQL? \u2013 17 \u2013 Identifying a blocking session","og_description":"One single blocking session in a database can completely halt your application so identifying which session is blocking other sessions is a task you must be able to perform quickly. In Oracle you can query v$session for getting that information (blocking_session, final_blocking_session). Can you do the same in PostgreSQL? Yes, you definitely can, lets go.","og_url":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/","og_site_name":"dbi Blog","article_published_time":"2017-07-25T16:49:26+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Can I do it with PostgreSQL? \u2013 17 \u2013 Identifying a blocking session","datePublished":"2017-07-25T16:49:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/"},"wordCount":410,"commentCount":0,"keywords":["PostgreSQL"],"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-17-identifying-a-blocking-session\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/","url":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/","name":"Can I do it with PostgreSQL? \u2013 17 \u2013 Identifying a blocking session - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2017-07-25T16:49:26+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-17-identifying-a-blocking-session\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-17-identifying-a-blocking-session\/#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? \u2013 17 \u2013 Identifying a blocking session"}]},{"@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\/10378","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=10378"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/10378\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=10378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=10378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=10378"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=10378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}