{"id":7240,"date":"2016-03-11T06:11:34","date_gmt":"2016-03-11T05:11:34","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/"},"modified":"2016-03-11T06:11:34","modified_gmt":"2016-03-11T05:11:34","slug":"pre-warming-the-buffer-cache-in-postgresql","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/","title":{"rendered":"Pre-warming the buffer cache in PostgreSQL"},"content":{"rendered":"<p>When a database gets shutdown for patching, operating system maintenance or other reasons you completely lose the contents of the buffer cache. No surprise. Memory is not persistent. Wouldn&#8217;t it be nice to load the most important tables to the cache when the instance starts automatically? This would reduce the time for the most important queries to return the results as blocks would not be needed to read from disk. PostgreSQL has a solution for that which is called <a href=\"www.postgresql.org\/docs\/current\/static\/pgprewarm.html\" target=\"_blank\" rel=\"noopener\">pg_prewarm<\/a>. This is a contrib module which is available by default. <\/p>\n<p>The extension provided by default can be installed by just issuing the &#8220;create extension&#8221; statement:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5001) [postgres] &gt; ! ls \/u01\/app\/postgres\/product\/95\/db_0\/share\/extension\/*prewarm*\n\/u01\/app\/postgres\/product\/95\/db_0\/share\/extension\/pg_prewarm--1.0.sql  \/u01\/app\/postgres\/product\/95\/db_0\/share\/extension\/pg_prewarm.control\n(postgres@[local]:5001) [postgres] &gt; create extension pg_prewarm;\nCREATE EXTENSION\nTime: 174.232 ms\n(postgres@[local]:5001) [postgres] &gt; dx pg_pre*\n             List of installed extensions\n    Name    | Version | Schema |      Description      \n------------+---------+--------+-----------------------\n pg_prewarm | 1.0     | public | prewarm relation data\n(1 row)\n<\/pre>\n<p>So, how does it work? Lets create some sample data in a first step:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5001) [postgres] &gt; create table prewarm ( a int, b varchar(100) );\nCREATE TABLE\nTime: 51.165 ms\n(postgres@[local]:5001) [postgres] &gt; with generator as ( select generate_series(1,1000000) a )\ninsert into prewarm ( select a, md5(a::text) from generator );\n<\/pre>\n<p>To get some idea on how long it takes to read the whole table I&#8217;ll restart the instance and do a count(*):<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG9] pg_ctl -D \/u02\/pgdata\/PG9 stop -m fast\npostgres@oel7:\/home\/postgres\/ [PG9] sudo sh -c 'echo 3 &gt;\/proc\/sys\/vm\/drop_caches'\npostgres@oel7:\/home\/postgres\/ [PG9] pg_ctl -D \/u02\/pgdata\/PG9 start\n<\/pre>\n<p>Note: the sudo command drops the kernel cache (see <a href=\"https:\/\/www.kernel.org\/doc\/Documentation\/sysctl\/vm.txt\" target=\"_blank\" rel=\"noopener\">here<\/a> for details).<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG9] time psql -c \"select count(*) from prewarm\" postgres\n  count  \n---------\n 1000000\n(1 row)\n\nreal\t0m0.908s\nuser\t0m0.005s\nsys\t0m0.000s\n<\/pre>\n<p>Almost a second to scan through the 1&#8217;000&#8217;000 rows to get the count. Lets do the same test but pre-warming the table before:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG9] pg_ctl -D \/u02\/pgdata\/PG9 stop -m fast\npostgres@oel7:\/home\/postgres\/ [PG9] sudo sh -c 'echo 3 &gt;\/proc\/sys\/vm\/drop_caches'\npostgres@oel7:\/home\/postgres\/ [PG9] pg_ctl -D \/u02\/pgdata\/PG9 start\npostgres@oel7:\/home\/postgres\/ [PG9] psql -c \"select pg_prewarm('prewarm')\" postgres\n pg_prewarm \n------------\n       8334\n(1 row)\n<\/pre>\n<p>Note: The number returned by pg_prewarm is the number of pages affected\/pre-warmed.<br \/>\nHow long does it now take to get the result:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG9] time psql -c \"select count(*) from prewarm\" postgres\n  count  \n---------\n 1000000\n(1 row)\n\n\nreal\t0m0.189s\nuser\t0m0.002s\nsys\t0m0.004s\n<\/pre>\n<p>Not so bad, isn&#8217;t it? There is a second parameter for pg_prewarm which specifies the method to use (copied from the documentation):<\/p>\n<ul>\n<li>prefetch: issues asynchronous prefetch requests to the operating system, if this is supported, or throws an error otherwise<\/li>\n<li>read: reads the requested range of blocks; unlike prefetch, this is synchronous and supported on all platforms and builds, but may be slower<\/li>\n<li>buffer: reads the requested range of blocks into the database buffer cache<\/li>\n<\/ul>\n<p>The default is &#8220;buffer&#8221;. If you write a little script which pre-warms the tables you need and put this at the end of your PostgreSQL startup script you can save the time it takes to load the blocks\/pages from disk when the first requests come in after a restart of the instance.<\/p>\n<p>There is another extension called <a href=\"https:\/\/github.com\/gurjeet\/pg_hibernator\" target=\"_blank\" rel=\"noopener\">pg_hibernater<\/a> which automatically stores the IDs of the buffers in the buffer cache when the server shuts down and re-reads them again automatically when the server starts. <\/p>\n<p>To install this module: Download, extract, make install as the postgres user:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/var\/tmp\/ [PG9] unzip pg_hibernator-master.zip \nArchive:  pg_hibernator-master.zip\n32b344fab58242552730e142adffa8650c7df4ac\n   creating: pg_hibernator-master\/\n  inflating: pg_hibernator-master\/LICENSE  \n  inflating: pg_hibernator-master\/Makefile  \n  inflating: pg_hibernator-master\/README.md  \n  inflating: pg_hibernator-master\/misc.c  \n  inflating: pg_hibernator-master\/pg_hibernate.c  \n  inflating: pg_hibernator-master\/pg_hibernate_9.3.c  \n  inflating: pg_hibernator-master\/pg_hibernator.h  \n   creating: pg_hibernator-master\/tests\/\n  inflating: pg_hibernator-master\/tests\/pg_hibernator_comparison_chart.ods  \n  inflating: pg_hibernator-master\/tests\/test_run.txt  \npostgres@oel7:\/var\/tmp\/ [PG9] cd pg_hibernator-master\npostgres@oel7:\/var\/tmp\/pg_hibernator-master\/ [PG9] make install\n<\/pre>\n<p>We&#8217;ll need to add the module to the shared_preload_libraries parameter for pg_hibernator to start up:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5001) [postgres] &gt; show shared_preload_libraries;\n shared_preload_libraries \n--------------------------\n \n(1 row)\n\nTime: 0.283 ms\n\n(postgres@[local]:5001) [postgres] &gt; alter system set shared_preload_libraries='pg_hibernator';\nALTER SYSTEM\nTime: 59.374 ms\n<\/pre>\n<p>Restart the server:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG9] pg_ctl -D \/u02\/pgdata\/PG9 restart -m fast\n<\/pre>\n<p>Double-check the setting:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\n(postgres@[local]:5001) [postgres] &gt; show shared_preload_libraries ;\n shared_preload_libraries \n--------------------------\n pg_hibernator\n(1 row)\n\nTime: 0.307 ms\n<\/pre>\n<p>There are a few parameters which control the behavior (<a href=\"https:\/\/github.com\/gurjeet\/pg_hibernator\" target=\"_blank\" rel=\"noopener\">check the documentation for details<\/a>):<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n(postgres@[local]:5001) [postgres] &gt; show pg_hibernator.enabled;\n pg_hibernator.enabled \n-----------------------\n on\n(1 row)\n\nTime: 0.148 ms\n(postgres@[local]:5001) [postgres] &gt; show pg_hibernator.parallel;\n pg_hibernator.parallel \n------------------------\n off\n(1 row)\n\nTime: 0.140 ms\n(postgres@[local]:5001) [postgres] &gt; show pg_hibernator.default_database;\n pg_hibernator.default_database \n--------------------------------\n postgres\n(1 row)\n\nTime: 0.142 ms\n<\/pre>\n<p>Once the module is running there is a new background process called &#8220;Buffer Saver&#8221;. This process will save the buffer IDs when the server shuts down.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG9] ps -ef | grep \"Buffer Saver\"\npostgres 22773 22764  0 16:12 ?        00:00:00 postgres: bgworker: Buffer Saver   \npostgres 22810 20779  0 16:17 pts\/2    00:00:00 grep --color=auto Buffer Saver\n<\/pre>\n<p>If you check your data directory you should find that pg_hibernater writes a file per database which has buffers in the cache on shutdown of the server: <\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG9] ls -la $PGDATA\/pg_hibernator\/\ntotal 12\ndrwx------.  2 postgres postgres   32 Mar  9 16:18 .\ndrwx------. 19 postgres postgres 4096 Mar  9 16:18 ..\n-rw-------.  1 postgres postgres   91 Mar  9 16:18 1.save\n-rw-------.  1 postgres postgres  619 Mar  9 16:18 2.save\n<\/pre>\n<p>So, lets do the same test again:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG9] pg_ctl -D \/u02\/pgdata\/PG9 stop -m fast\npostgres@oel7:\/home\/postgres\/ [PG9] sudo sh -c 'echo 3 &gt;\/proc\/sys\/vm\/drop_caches'\npostgres@oel7:\/home\/postgres\/ [PG9] pg_ctl -D \/u02\/pgdata\/PG9 start\n<\/pre>\n<p>How fast is it?<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@oel7:\/home\/postgres\/ [PG9] time psql -c \"select count(*) from prewarm\" postgres\n  count  \n---------\n 1000000\n(1 row)\n\n\nreal\t0m0.623s\nuser\t0m0.004s\nsys\t0m0.000s\n<\/pre>\n<p>Not as fast as with the pg_prewarm method but still faster as without any pre-warming. Maybe this is because the implementation is different, I did not test it entirely. At least it automates the save and restore of the buffer cache. For taking this into production some more testing is required.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>When a database gets shutdown for patching, operating system maintenance or other reasons you completely lose the contents of the buffer cache. No surprise. Memory is not persistent. Wouldn&#8217;t it be nice to load the most important tables to the cache when the instance starts automatically? This would reduce the time for the most important [&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-7240","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>Pre-warming the buffer cache in 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\/pre-warming-the-buffer-cache-in-postgresql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pre-warming the buffer cache in PostgreSQL\" \/>\n<meta property=\"og:description\" content=\"When a database gets shutdown for patching, operating system maintenance or other reasons you completely lose the contents of the buffer cache. No surprise. Memory is not persistent. Wouldn&#8217;t it be nice to load the most important tables to the cache when the instance starts automatically? This would reduce the time for the most important [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-03-11T05:11:34+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=\"6 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\/pre-warming-the-buffer-cache-in-postgresql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Pre-warming the buffer cache in PostgreSQL\",\"datePublished\":\"2016-03-11T05:11:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/\"},\"wordCount\":539,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/\",\"name\":\"Pre-warming the buffer cache in PostgreSQL - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2016-03-11T05:11:34+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pre-warming the buffer cache in 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":"Pre-warming the buffer cache in 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\/pre-warming-the-buffer-cache-in-postgresql\/","og_locale":"en_US","og_type":"article","og_title":"Pre-warming the buffer cache in PostgreSQL","og_description":"When a database gets shutdown for patching, operating system maintenance or other reasons you completely lose the contents of the buffer cache. No surprise. Memory is not persistent. Wouldn&#8217;t it be nice to load the most important tables to the cache when the instance starts automatically? This would reduce the time for the most important [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/","og_site_name":"dbi Blog","article_published_time":"2016-03-11T05:11:34+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Pre-warming the buffer cache in PostgreSQL","datePublished":"2016-03-11T05:11:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/"},"wordCount":539,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/","url":"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/","name":"Pre-warming the buffer cache in PostgreSQL - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2016-03-11T05:11:34+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/pre-warming-the-buffer-cache-in-postgresql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Pre-warming the buffer cache in 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\/7240","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=7240"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/7240\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=7240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=7240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=7240"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=7240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}