<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.postgresql.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Robe</id>
	<title>PostgreSQL wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.postgresql.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Robe"/>
	<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/wiki/Special:Contributions/Robe"/>
	<updated>2026-06-09T11:07:41Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22907</id>
		<title>Query Parsing</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22907"/>
		<updated>2014-07-25T16:19:58Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* pg_query */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Query Parsing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are quite a few use cases where it&#039;d be of great help if you could access the query tree Postgres uses internally for processing queries.&lt;br /&gt;
&lt;br /&gt;
For example, when you need to do non-trivial operations on queries, like:&lt;br /&gt;
&lt;br /&gt;
* Filtering out queries containing specific tables&lt;br /&gt;
* Reformatting &amp;amp; pretty-printing query strings&lt;br /&gt;
* Modifying or removing parts of the query string, e.g. rename a column&lt;br /&gt;
&lt;br /&gt;
The [http://www.postgresql.org/docs/current/static/overview.html Postgres documentation] gives a good overview how query execution is handled and what the intermediate tree representations of a query string are.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Approaches ===&lt;br /&gt;
&lt;br /&gt;
==== Using Postgres internals ====&lt;br /&gt;
&lt;br /&gt;
Postgres already offers tooling to create a query tree from a given query string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;raw_parser&amp;lt;/code&amp;gt; takes a query statement as input and will return a parse tree. This parse tree can then be pretty-printed by using &amp;lt;code&amp;gt;nodeToString&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example can be seen [https://github.com/pganalyze/queryparser/blob/master/queryparser.c here], this can be easily implemented in a [http://www.postgresql.org/docs/current/static/extend-extensions.html Postgres extension] as well as seen [https://github.com/pganalyze/queryparser/blob/master/extension/annotate_query.c here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    SELECT * FROM foo where bar = 42 ORDER BY id DESC LIMIT 23;&lt;br /&gt;
    (&lt;br /&gt;
       {SELECT &lt;br /&gt;
       :distinctClause &amp;lt;&amp;gt; &lt;br /&gt;
       :intoClause &amp;lt;&amp;gt; &lt;br /&gt;
       :targetList (&lt;br /&gt;
          {RESTARGET &lt;br /&gt;
          :name &amp;lt;&amp;gt; &lt;br /&gt;
          :indirection &amp;lt;&amp;gt; &lt;br /&gt;
          :val &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&lt;br /&gt;
                {A_STAR&lt;br /&gt;
                }&lt;br /&gt;
             )&lt;br /&gt;
             :location 7&lt;br /&gt;
             }&lt;br /&gt;
          :location 7&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :fromClause (&lt;br /&gt;
          {RANGEVAR &lt;br /&gt;
          :schemaname &amp;lt;&amp;gt; &lt;br /&gt;
          :relname foo &lt;br /&gt;
          :inhOpt 2 &lt;br /&gt;
          :relpersistence p &lt;br /&gt;
          :alias &amp;lt;&amp;gt; &lt;br /&gt;
          :location 14&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :whereClause &lt;br /&gt;
          {AEXPR  &lt;br /&gt;
          :name (&amp;quot;=&amp;quot;)&lt;br /&gt;
          :lexpr &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&amp;quot;bar&amp;quot;)&lt;br /&gt;
             :location 24&lt;br /&gt;
             }&lt;br /&gt;
          :rexpr &lt;br /&gt;
             {A_CONST &lt;br /&gt;
             :val 42 &lt;br /&gt;
             :location 30&lt;br /&gt;
             }&lt;br /&gt;
          :location 28&lt;br /&gt;
          }&lt;br /&gt;
       :groupClause &amp;lt;&amp;gt; &lt;br /&gt;
       :havingClause &amp;lt;&amp;gt; &lt;br /&gt;
       :windowClause &amp;lt;&amp;gt; &lt;br /&gt;
       :valuesLists &amp;lt;&amp;gt; &lt;br /&gt;
       :sortClause (&lt;br /&gt;
          {SORTBY &lt;br /&gt;
          :node &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&amp;quot;id&amp;quot;)&lt;br /&gt;
             :location 42&lt;br /&gt;
             }&lt;br /&gt;
          :sortby_dir 2 &lt;br /&gt;
          :sortby_nulls 0 &lt;br /&gt;
          :useOp &amp;lt;&amp;gt; &lt;br /&gt;
          :location -1&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :limitOffset &amp;lt;&amp;gt; &lt;br /&gt;
       :limitCount &lt;br /&gt;
          {A_CONST &lt;br /&gt;
          :val 23 &lt;br /&gt;
          :location 56&lt;br /&gt;
          }&lt;br /&gt;
       :lockingClause &amp;lt;&amp;gt; &lt;br /&gt;
       :withClause &amp;lt;&amp;gt; &lt;br /&gt;
       :op 0 &lt;br /&gt;
       :all false &lt;br /&gt;
       :larg &amp;lt;&amp;gt; &lt;br /&gt;
       :rarg &amp;lt;&amp;gt;&lt;br /&gt;
       }&lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This approach isn&#039;t without caveats though, since the nodeToString code is used only for printing out planned query trees. These trees are rewritten to contain only contain nodes ultimately needed by the [http://www.postgresql.org/docs/current/static/executor.html Executor]. This means that all nodes not to expected in later stages of the query execution can&#039;t be printed, for example INSERT/UPDATE/DELETE - these are all aggregated in a &amp;lt;code&amp;gt;ModifyStmt&amp;lt;/code&amp;gt; node.&lt;br /&gt;
&lt;br /&gt;
==== pg_query ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/pganalyze/pg_query pg_query] is a Ruby gem which can generate query trees in JSON representation. It accomplishes this by using a patched Postgres version which one hond adressess the shortcomings outlined above, on the other hand it provides a new function [https://github.com/pganalyze/postgres/blob/172e1dfc81705e9b14d81e8ef56c54b10ddfcd65/src/backend/nodes/outfuncs_json.c#L3502 &amp;lt;code&amp;gt;nodeToJSONString&amp;lt;/code&amp;gt;] which turns a query tree into a JSON representation instead of the native Postgres format.&lt;br /&gt;
&lt;br /&gt;
The Ruby bindings are just glue code around the Postgres code. More information can be found in this [https://pganalyze.com/blog/parse-postgresql-queries-in-ruby.html blog post]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    #&amp;lt;PgQuery:0x000000009673a0&lt;br /&gt;
     @query=&amp;quot;SELECT * FROM foo where bar = 42 ORDER BY id DESC LIMIT 23;&amp;quot;,&lt;br /&gt;
     @parsetree=&lt;br /&gt;
      [{&amp;quot;SELECT&amp;quot;=&amp;gt;&lt;br /&gt;
         {&amp;quot;distinctClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;intoClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;targetList&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;RESTARGET&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;name&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;indirection&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;val&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[{&amp;quot;A_STAR&amp;quot;=&amp;gt;{}}], &amp;quot;location&amp;quot;=&amp;gt;7}},&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;7}}],&lt;br /&gt;
          &amp;quot;fromClause&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;RANGEVAR&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;schemaname&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;relname&amp;quot;=&amp;gt;&amp;quot;foo&amp;quot;,&lt;br /&gt;
               &amp;quot;inhOpt&amp;quot;=&amp;gt;2,&lt;br /&gt;
               &amp;quot;relpersistence&amp;quot;=&amp;gt;&amp;quot;p&amp;quot;,&lt;br /&gt;
               &amp;quot;alias&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;14}}],&lt;br /&gt;
          &amp;quot;whereClause&amp;quot;=&amp;gt;&lt;br /&gt;
           {&amp;quot;AEXPR&amp;quot;=&amp;gt;&lt;br /&gt;
             {&amp;quot;name&amp;quot;=&amp;gt;[&amp;quot;=&amp;quot;],&lt;br /&gt;
              &amp;quot;lexpr&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[&amp;quot;bar&amp;quot;], &amp;quot;location&amp;quot;=&amp;gt;24}},&lt;br /&gt;
              &amp;quot;rexpr&amp;quot;=&amp;gt;{&amp;quot;A_CONST&amp;quot;=&amp;gt;{&amp;quot;val&amp;quot;=&amp;gt;42, &amp;quot;location&amp;quot;=&amp;gt;30}},&lt;br /&gt;
              &amp;quot;location&amp;quot;=&amp;gt;28}},&lt;br /&gt;
          &amp;quot;groupClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;havingClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;windowClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;valuesLists&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;sortClause&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;SORTBY&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;node&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[&amp;quot;id&amp;quot;], &amp;quot;location&amp;quot;=&amp;gt;42}},&lt;br /&gt;
               &amp;quot;sortby_dir&amp;quot;=&amp;gt;2,&lt;br /&gt;
               &amp;quot;sortby_nulls&amp;quot;=&amp;gt;0,&lt;br /&gt;
               &amp;quot;useOp&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;-1}}],&lt;br /&gt;
          &amp;quot;limitOffset&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;limitCount&amp;quot;=&amp;gt;{&amp;quot;A_CONST&amp;quot;=&amp;gt;{&amp;quot;val&amp;quot;=&amp;gt;23, &amp;quot;location&amp;quot;=&amp;gt;56}},&lt;br /&gt;
          &amp;quot;lockingClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;withClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;op&amp;quot;=&amp;gt;0,&lt;br /&gt;
          &amp;quot;all&amp;quot;=&amp;gt;false,&lt;br /&gt;
          &amp;quot;larg&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;rarg&amp;quot;=&amp;gt;nil}}],&lt;br /&gt;
     @warnings=[]&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== pgpool-II ====&lt;br /&gt;
&lt;br /&gt;
pgpool-II is a middleware for Postgresql which in it&#039;s simplest use-case is an connection broker between client and database servers.&lt;br /&gt;
&lt;br /&gt;
To be able to do advanced query routing it needs to understand the queries it gets sent form the query. To be able to do that, they forked the parser and implemented their own node &amp;lt;code&amp;gt;outFuncs&amp;lt;/code&amp;gt; to be able to recreated a query string from a given query tree.&lt;br /&gt;
&lt;br /&gt;
If you want to create your own as correct as possible Postgres query pretty-printer this might be a good starting point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sqlparse ====&lt;br /&gt;
&lt;br /&gt;
[https://pypi.python.org/pypi/sqlparse sqlparse] is a Python module which implements a non-validating SQL parser suitable for parsing, splitting and formatting SQL statements. It provides the backbone for http://sqlformat.org/ - a SQL pretty printer.&lt;br /&gt;
&lt;br /&gt;
Introspection into the queries is quite limited and since it&#039;s not specifically targed at Postgres it&#039;s capabilities are quite limited when it comes to drilling down into query trees.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
To make life easier for people using query trees the following things need to be addressed in Postgres core .&lt;br /&gt;
&lt;br /&gt;
* Implement outFuncs for all node types and not only those seen in a post-planning state.&lt;br /&gt;
* Ship alternate outFuncs suitable for generating JSON trees instead of the native Postgres tree format.&lt;br /&gt;
* Support a placeholder character suitable for mimicking all constant expressions in query strings. This would be of great help when trying to parse normalized queries as produced by pg_stat_statements.&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22906</id>
		<title>Query Parsing</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22906"/>
		<updated>2014-07-25T16:18:54Z</updated>

		<summary type="html">&lt;p&gt;Robe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Query Parsing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are quite a few use cases where it&#039;d be of great help if you could access the query tree Postgres uses internally for processing queries.&lt;br /&gt;
&lt;br /&gt;
For example, when you need to do non-trivial operations on queries, like:&lt;br /&gt;
&lt;br /&gt;
* Filtering out queries containing specific tables&lt;br /&gt;
* Reformatting &amp;amp; pretty-printing query strings&lt;br /&gt;
* Modifying or removing parts of the query string, e.g. rename a column&lt;br /&gt;
&lt;br /&gt;
The [http://www.postgresql.org/docs/current/static/overview.html Postgres documentation] gives a good overview how query execution is handled and what the intermediate tree representations of a query string are.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Approaches ===&lt;br /&gt;
&lt;br /&gt;
==== Using Postgres internals ====&lt;br /&gt;
&lt;br /&gt;
Postgres already offers tooling to create a query tree from a given query string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;raw_parser&amp;lt;/code&amp;gt; takes a query statement as input and will return a parse tree. This parse tree can then be pretty-printed by using &amp;lt;code&amp;gt;nodeToString&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example can be seen [https://github.com/pganalyze/queryparser/blob/master/queryparser.c here], this can be easily implemented in a [http://www.postgresql.org/docs/current/static/extend-extensions.html Postgres extension] as well as seen [https://github.com/pganalyze/queryparser/blob/master/extension/annotate_query.c here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    SELECT * FROM foo where bar = 42 ORDER BY id DESC LIMIT 23;&lt;br /&gt;
    (&lt;br /&gt;
       {SELECT &lt;br /&gt;
       :distinctClause &amp;lt;&amp;gt; &lt;br /&gt;
       :intoClause &amp;lt;&amp;gt; &lt;br /&gt;
       :targetList (&lt;br /&gt;
          {RESTARGET &lt;br /&gt;
          :name &amp;lt;&amp;gt; &lt;br /&gt;
          :indirection &amp;lt;&amp;gt; &lt;br /&gt;
          :val &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&lt;br /&gt;
                {A_STAR&lt;br /&gt;
                }&lt;br /&gt;
             )&lt;br /&gt;
             :location 7&lt;br /&gt;
             }&lt;br /&gt;
          :location 7&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :fromClause (&lt;br /&gt;
          {RANGEVAR &lt;br /&gt;
          :schemaname &amp;lt;&amp;gt; &lt;br /&gt;
          :relname foo &lt;br /&gt;
          :inhOpt 2 &lt;br /&gt;
          :relpersistence p &lt;br /&gt;
          :alias &amp;lt;&amp;gt; &lt;br /&gt;
          :location 14&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :whereClause &lt;br /&gt;
          {AEXPR  &lt;br /&gt;
          :name (&amp;quot;=&amp;quot;)&lt;br /&gt;
          :lexpr &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&amp;quot;bar&amp;quot;)&lt;br /&gt;
             :location 24&lt;br /&gt;
             }&lt;br /&gt;
          :rexpr &lt;br /&gt;
             {A_CONST &lt;br /&gt;
             :val 42 &lt;br /&gt;
             :location 30&lt;br /&gt;
             }&lt;br /&gt;
          :location 28&lt;br /&gt;
          }&lt;br /&gt;
       :groupClause &amp;lt;&amp;gt; &lt;br /&gt;
       :havingClause &amp;lt;&amp;gt; &lt;br /&gt;
       :windowClause &amp;lt;&amp;gt; &lt;br /&gt;
       :valuesLists &amp;lt;&amp;gt; &lt;br /&gt;
       :sortClause (&lt;br /&gt;
          {SORTBY &lt;br /&gt;
          :node &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&amp;quot;id&amp;quot;)&lt;br /&gt;
             :location 42&lt;br /&gt;
             }&lt;br /&gt;
          :sortby_dir 2 &lt;br /&gt;
          :sortby_nulls 0 &lt;br /&gt;
          :useOp &amp;lt;&amp;gt; &lt;br /&gt;
          :location -1&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :limitOffset &amp;lt;&amp;gt; &lt;br /&gt;
       :limitCount &lt;br /&gt;
          {A_CONST &lt;br /&gt;
          :val 23 &lt;br /&gt;
          :location 56&lt;br /&gt;
          }&lt;br /&gt;
       :lockingClause &amp;lt;&amp;gt; &lt;br /&gt;
       :withClause &amp;lt;&amp;gt; &lt;br /&gt;
       :op 0 &lt;br /&gt;
       :all false &lt;br /&gt;
       :larg &amp;lt;&amp;gt; &lt;br /&gt;
       :rarg &amp;lt;&amp;gt;&lt;br /&gt;
       }&lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This approach isn&#039;t without caveats though, since the nodeToString code is used only for printing out planned query trees. These trees are rewritten to contain only contain nodes ultimately needed by the [http://www.postgresql.org/docs/current/static/executor.html Executor]. This means that all nodes not to expected in later stages of the query execution can&#039;t be printed, for example INSERT/UPDATE/DELETE - these are all aggregated in a &amp;lt;code&amp;gt;ModifyStmt&amp;lt;/code&amp;gt; node.&lt;br /&gt;
&lt;br /&gt;
==== pg_query ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/pganalyze/pg_query pg_query] is a Ruby gem which can generate query trees in JSON representation. It accomplishes this by using a patched Postgres version which one hond adressess the shortcomings outlined above, on the other hand it provides a new function [https://github.com/pganalyze/postgres/blob/172e1dfc81705e9b14d81e8ef56c54b10ddfcd65/src/backend/nodes/outfuncs_json.c#L3502 &amp;lt;code&amp;gt;nodeToJSONString&amp;lt;/code&amp;gt;] which turns a query tree into a JSON representation instead of the native Postgres format.&lt;br /&gt;
&lt;br /&gt;
The Ruby bindings are just glue code around the Postgres code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    #&amp;lt;PgQuery:0x000000009673a0&lt;br /&gt;
     @query=&amp;quot;SELECT * FROM foo where bar = 42 ORDER BY id DESC LIMIT 23;&amp;quot;,&lt;br /&gt;
     @parsetree=&lt;br /&gt;
      [{&amp;quot;SELECT&amp;quot;=&amp;gt;&lt;br /&gt;
         {&amp;quot;distinctClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;intoClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;targetList&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;RESTARGET&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;name&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;indirection&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;val&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[{&amp;quot;A_STAR&amp;quot;=&amp;gt;{}}], &amp;quot;location&amp;quot;=&amp;gt;7}},&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;7}}],&lt;br /&gt;
          &amp;quot;fromClause&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;RANGEVAR&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;schemaname&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;relname&amp;quot;=&amp;gt;&amp;quot;foo&amp;quot;,&lt;br /&gt;
               &amp;quot;inhOpt&amp;quot;=&amp;gt;2,&lt;br /&gt;
               &amp;quot;relpersistence&amp;quot;=&amp;gt;&amp;quot;p&amp;quot;,&lt;br /&gt;
               &amp;quot;alias&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;14}}],&lt;br /&gt;
          &amp;quot;whereClause&amp;quot;=&amp;gt;&lt;br /&gt;
           {&amp;quot;AEXPR&amp;quot;=&amp;gt;&lt;br /&gt;
             {&amp;quot;name&amp;quot;=&amp;gt;[&amp;quot;=&amp;quot;],&lt;br /&gt;
              &amp;quot;lexpr&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[&amp;quot;bar&amp;quot;], &amp;quot;location&amp;quot;=&amp;gt;24}},&lt;br /&gt;
              &amp;quot;rexpr&amp;quot;=&amp;gt;{&amp;quot;A_CONST&amp;quot;=&amp;gt;{&amp;quot;val&amp;quot;=&amp;gt;42, &amp;quot;location&amp;quot;=&amp;gt;30}},&lt;br /&gt;
              &amp;quot;location&amp;quot;=&amp;gt;28}},&lt;br /&gt;
          &amp;quot;groupClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;havingClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;windowClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;valuesLists&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;sortClause&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;SORTBY&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;node&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[&amp;quot;id&amp;quot;], &amp;quot;location&amp;quot;=&amp;gt;42}},&lt;br /&gt;
               &amp;quot;sortby_dir&amp;quot;=&amp;gt;2,&lt;br /&gt;
               &amp;quot;sortby_nulls&amp;quot;=&amp;gt;0,&lt;br /&gt;
               &amp;quot;useOp&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;-1}}],&lt;br /&gt;
          &amp;quot;limitOffset&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;limitCount&amp;quot;=&amp;gt;{&amp;quot;A_CONST&amp;quot;=&amp;gt;{&amp;quot;val&amp;quot;=&amp;gt;23, &amp;quot;location&amp;quot;=&amp;gt;56}},&lt;br /&gt;
          &amp;quot;lockingClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;withClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;op&amp;quot;=&amp;gt;0,&lt;br /&gt;
          &amp;quot;all&amp;quot;=&amp;gt;false,&lt;br /&gt;
          &amp;quot;larg&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;rarg&amp;quot;=&amp;gt;nil}}],&lt;br /&gt;
     @warnings=[]&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More information can be found in this [https://pganalyze.com/blog/parse-postgresql-queries-in-ruby.html blog post]&lt;br /&gt;
&lt;br /&gt;
==== pgpool-II ====&lt;br /&gt;
&lt;br /&gt;
pgpool-II is a middleware for Postgresql which in it&#039;s simplest use-case is an connection broker between client and database servers.&lt;br /&gt;
&lt;br /&gt;
To be able to do advanced query routing it needs to understand the queries it gets sent form the query. To be able to do that, they forked the parser and implemented their own node &amp;lt;code&amp;gt;outFuncs&amp;lt;/code&amp;gt; to be able to recreated a query string from a given query tree.&lt;br /&gt;
&lt;br /&gt;
If you want to create your own as correct as possible Postgres query pretty-printer this might be a good starting point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sqlparse ====&lt;br /&gt;
&lt;br /&gt;
[https://pypi.python.org/pypi/sqlparse sqlparse] is a Python module which implements a non-validating SQL parser suitable for parsing, splitting and formatting SQL statements. It provides the backbone for http://sqlformat.org/ - a SQL pretty printer.&lt;br /&gt;
&lt;br /&gt;
Introspection into the queries is quite limited and since it&#039;s not specifically targed at Postgres it&#039;s capabilities are quite limited when it comes to drilling down into query trees.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
To make life easier for people using query trees the following things need to be addressed in Postgres core .&lt;br /&gt;
&lt;br /&gt;
* Implement outFuncs for all node types and not only those seen in a post-planning state.&lt;br /&gt;
* Ship alternate outFuncs suitable for generating JSON trees instead of the native Postgres tree format.&lt;br /&gt;
* Support a placeholder character suitable for mimicking all constant expressions in query strings. This would be of great help when trying to parse normalized queries as produced by pg_stat_statements.&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22905</id>
		<title>Query Parsing</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22905"/>
		<updated>2014-07-25T16:18:37Z</updated>

		<summary type="html">&lt;p&gt;Robe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Query Parsing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are quite a few use cases where it&#039;d be of great help if you could access the query tree Postgres uses internally for processing queries.&lt;br /&gt;
&lt;br /&gt;
For example, when you need to do non-trivial operations on queries, like:&lt;br /&gt;
&lt;br /&gt;
* Filtering out queries containing specific tables&lt;br /&gt;
* Reformatting &amp;amp; pretty-printing query strings&lt;br /&gt;
* Modifying or removing parts of the query string, e.g. rename a column&lt;br /&gt;
&lt;br /&gt;
The [http://www.postgresql.org/docs/current/static/overview.html Postgres documentation] gives a good overview how query execution is handled and what the intermediate tree representations of a query string are.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Approaches ===&lt;br /&gt;
&lt;br /&gt;
==== Using Postgres internals ====&lt;br /&gt;
&lt;br /&gt;
Postgres already offers tooling to create a query tree from a given query string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;raw_parser&amp;lt;/code&amp;gt; takes a query statement as input and will return a parse tree. This parse tree can then be pretty-printed by using &amp;lt;code&amp;gt;nodeToString&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example can be seen [https://github.com/pganalyze/queryparser/blob/master/queryparser.c here], this can be easily implemented in a [http://www.postgresql.org/docs/current/static/extend-extensions.html Postgres extension] as well as seen [https://github.com/pganalyze/queryparser/blob/master/extension/annotate_query.c here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    SELECT * FROM foo where bar = 42 ORDER BY id DESC LIMIT 23;&lt;br /&gt;
    (&lt;br /&gt;
       {SELECT &lt;br /&gt;
       :distinctClause &amp;lt;&amp;gt; &lt;br /&gt;
       :intoClause &amp;lt;&amp;gt; &lt;br /&gt;
       :targetList (&lt;br /&gt;
          {RESTARGET &lt;br /&gt;
          :name &amp;lt;&amp;gt; &lt;br /&gt;
          :indirection &amp;lt;&amp;gt; &lt;br /&gt;
          :val &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&lt;br /&gt;
                {A_STAR&lt;br /&gt;
                }&lt;br /&gt;
             )&lt;br /&gt;
             :location 7&lt;br /&gt;
             }&lt;br /&gt;
          :location 7&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :fromClause (&lt;br /&gt;
          {RANGEVAR &lt;br /&gt;
          :schemaname &amp;lt;&amp;gt; &lt;br /&gt;
          :relname foo &lt;br /&gt;
          :inhOpt 2 &lt;br /&gt;
          :relpersistence p &lt;br /&gt;
          :alias &amp;lt;&amp;gt; &lt;br /&gt;
          :location 14&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :whereClause &lt;br /&gt;
          {AEXPR  &lt;br /&gt;
          :name (&amp;quot;=&amp;quot;)&lt;br /&gt;
          :lexpr &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&amp;quot;bar&amp;quot;)&lt;br /&gt;
             :location 24&lt;br /&gt;
             }&lt;br /&gt;
          :rexpr &lt;br /&gt;
             {A_CONST &lt;br /&gt;
             :val 42 &lt;br /&gt;
             :location 30&lt;br /&gt;
             }&lt;br /&gt;
          :location 28&lt;br /&gt;
          }&lt;br /&gt;
       :groupClause &amp;lt;&amp;gt; &lt;br /&gt;
       :havingClause &amp;lt;&amp;gt; &lt;br /&gt;
       :windowClause &amp;lt;&amp;gt; &lt;br /&gt;
       :valuesLists &amp;lt;&amp;gt; &lt;br /&gt;
       :sortClause (&lt;br /&gt;
          {SORTBY &lt;br /&gt;
          :node &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&amp;quot;id&amp;quot;)&lt;br /&gt;
             :location 42&lt;br /&gt;
             }&lt;br /&gt;
          :sortby_dir 2 &lt;br /&gt;
          :sortby_nulls 0 &lt;br /&gt;
          :useOp &amp;lt;&amp;gt; &lt;br /&gt;
          :location -1&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :limitOffset &amp;lt;&amp;gt; &lt;br /&gt;
       :limitCount &lt;br /&gt;
          {A_CONST &lt;br /&gt;
          :val 23 &lt;br /&gt;
          :location 56&lt;br /&gt;
          }&lt;br /&gt;
       :lockingClause &amp;lt;&amp;gt; &lt;br /&gt;
       :withClause &amp;lt;&amp;gt; &lt;br /&gt;
       :op 0 &lt;br /&gt;
       :all false &lt;br /&gt;
       :larg &amp;lt;&amp;gt; &lt;br /&gt;
       :rarg &amp;lt;&amp;gt;&lt;br /&gt;
       }&lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This approach isn&#039;t without caveats though, since the nodeToString code is used only for printing out planned query trees. These trees are rewritten to contain only contain nodes ultimately needed by the [http://www.postgresql.org/docs/current/static/executor.html Executor]. This means that all nodes not to expected in later stages of the query execution can&#039;t be printed, for example INSERT/UPDATE/DELETE - these are all aggregated in a &amp;lt;code&amp;gt;ModifyStmt&amp;lt;/code&amp;gt; node.&lt;br /&gt;
&lt;br /&gt;
==== pg_query ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/pganalyze/pg_query pg_query] is a Ruby gem which can generate query trees in JSON representation. It accomplishes this by using a patched Postgres version which one hond adressess the shortcomings outlined above, on the other hand it provides a new function [https://github.com/pganalyze/postgres/blob/172e1dfc81705e9b14d81e8ef56c54b10ddfcd65/src/backend/nodes/outfuncs_json.c#L3502 &amp;lt;code&amp;gt;nodeToJSONString&amp;lt;/code&amp;gt;] which turns a query tree into a JSON representation instead of the native Postgres format.&lt;br /&gt;
&lt;br /&gt;
The Ruby bindings are just glue code around the Postgres code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    #&amp;lt;PgQuery:0x000000009673a0&lt;br /&gt;
     @query=&amp;quot;SELECT * FROM foo where bar = 42 ORDER BY id DESC LIMIT 23;&amp;quot;,&lt;br /&gt;
     @parsetree=&lt;br /&gt;
      [{&amp;quot;SELECT&amp;quot;=&amp;gt;&lt;br /&gt;
         {&amp;quot;distinctClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;intoClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;targetList&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;RESTARGET&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;name&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;indirection&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;val&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[{&amp;quot;A_STAR&amp;quot;=&amp;gt;{}}], &amp;quot;location&amp;quot;=&amp;gt;7}},&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;7}}],&lt;br /&gt;
          &amp;quot;fromClause&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;RANGEVAR&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;schemaname&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;relname&amp;quot;=&amp;gt;&amp;quot;foo&amp;quot;,&lt;br /&gt;
               &amp;quot;inhOpt&amp;quot;=&amp;gt;2,&lt;br /&gt;
               &amp;quot;relpersistence&amp;quot;=&amp;gt;&amp;quot;p&amp;quot;,&lt;br /&gt;
               &amp;quot;alias&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;14}}],&lt;br /&gt;
          &amp;quot;whereClause&amp;quot;=&amp;gt;&lt;br /&gt;
           {&amp;quot;AEXPR&amp;quot;=&amp;gt;&lt;br /&gt;
             {&amp;quot;name&amp;quot;=&amp;gt;[&amp;quot;=&amp;quot;],&lt;br /&gt;
              &amp;quot;lexpr&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[&amp;quot;bar&amp;quot;], &amp;quot;location&amp;quot;=&amp;gt;24}},&lt;br /&gt;
              &amp;quot;rexpr&amp;quot;=&amp;gt;{&amp;quot;A_CONST&amp;quot;=&amp;gt;{&amp;quot;val&amp;quot;=&amp;gt;42, &amp;quot;location&amp;quot;=&amp;gt;30}},&lt;br /&gt;
              &amp;quot;location&amp;quot;=&amp;gt;28}},&lt;br /&gt;
          &amp;quot;groupClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;havingClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;windowClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;valuesLists&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;sortClause&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;SORTBY&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;node&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[&amp;quot;id&amp;quot;], &amp;quot;location&amp;quot;=&amp;gt;42}},&lt;br /&gt;
               &amp;quot;sortby_dir&amp;quot;=&amp;gt;2,&lt;br /&gt;
               &amp;quot;sortby_nulls&amp;quot;=&amp;gt;0,&lt;br /&gt;
               &amp;quot;useOp&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;-1}}],&lt;br /&gt;
          &amp;quot;limitOffset&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;limitCount&amp;quot;=&amp;gt;{&amp;quot;A_CONST&amp;quot;=&amp;gt;{&amp;quot;val&amp;quot;=&amp;gt;23, &amp;quot;location&amp;quot;=&amp;gt;56}},&lt;br /&gt;
          &amp;quot;lockingClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;withClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;op&amp;quot;=&amp;gt;0,&lt;br /&gt;
          &amp;quot;all&amp;quot;=&amp;gt;false,&lt;br /&gt;
          &amp;quot;larg&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;rarg&amp;quot;=&amp;gt;nil}}],&lt;br /&gt;
     @warnings=[]&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More information can be found in this [https://pganalyze.com/blog/parse-postgresql-queries-in-ruby.html blog post]&lt;br /&gt;
&lt;br /&gt;
==== pgpool-II ====&lt;br /&gt;
&lt;br /&gt;
pgpool-II is a middleware for Postgresql which in it&#039;s simplest use-case is an connection broker between client and database servers.&lt;br /&gt;
&lt;br /&gt;
To be able to do advanced query routing it needs to understand the queries it gets sent form the query. To be able to do that, they forked the parser and implemented their own node &amp;lt;code&amp;gt;outFuncs&amp;lt;/code&amp;gt; to be able to recreated a query string from a given query tree.&lt;br /&gt;
&lt;br /&gt;
If you want to create your own as correct as possible Postgres query pretty-printer this might be a good starting point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sqlparse ====&lt;br /&gt;
&lt;br /&gt;
[https://pypi.python.org/pypi/sqlparse sqlparse] is a Python module which implements a non-validating SQL parser suitable for parsing, splitting and formatting SQL statements. It provides the backbone for http://sqlformat.org/ - a SQL pretty printer.&lt;br /&gt;
&lt;br /&gt;
Introspection into the queries is quite limited and since it&#039;s not specifically targed at Postgres it&#039;s capabilities are quite limited when it comes to drilling down into query trees.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
To make life easier for people using query trees the following things need to be addressed in Postgres core .&lt;br /&gt;
&lt;br /&gt;
* Implement outFuncs for all node types and not only those seen in a post-planning state.&lt;br /&gt;
* Ship alternate outFuncs suitable for generating JSON trees instead of the native Postgres tree format.&lt;br /&gt;
* Support a placeholder character suitable for mimicking all constant expressions in query strings. This would be of great help when trying to parse normalized queries as produced by pg_stat_statements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22904</id>
		<title>Query Parsing</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22904"/>
		<updated>2014-07-25T16:15:40Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* pg_query */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Query Parsing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are quite a few use cases where it&#039;d be of great help if you could access the query tree Postgres uses internally for processing queries.&lt;br /&gt;
&lt;br /&gt;
For example, when you need to do non-trivial operations on queries, like:&lt;br /&gt;
&lt;br /&gt;
* Filtering out queries containing specific tables&lt;br /&gt;
* Reformatting &amp;amp; pretty-printing query strings&lt;br /&gt;
* Modifying or removing parts of the query string, e.g. rename a column&lt;br /&gt;
&lt;br /&gt;
The [http://www.postgresql.org/docs/current/static/overview.html Postgres documentation] gives a good overview how query execution is handled and what the intermediate tree representations of a query string are.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Approaches ===&lt;br /&gt;
&lt;br /&gt;
==== Using Postgres internals ====&lt;br /&gt;
&lt;br /&gt;
Postgres already offers tooling to create a query tree from a given query string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;raw_parser&amp;lt;/code&amp;gt; takes a query statement as input and will return a parse tree. This parse tree can then be pretty-printed by using &amp;lt;code&amp;gt;nodeToString&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example can be seen [https://github.com/pganalyze/queryparser/blob/master/queryparser.c here], this can be easily implemented in a [http://www.postgresql.org/docs/current/static/extend-extensions.html Postgres extension] as well as seen [https://github.com/pganalyze/queryparser/blob/master/extension/annotate_query.c here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    SELECT * FROM foo where bar = 42 ORDER BY id DESC LIMIT 23;&lt;br /&gt;
    (&lt;br /&gt;
       {SELECT &lt;br /&gt;
       :distinctClause &amp;lt;&amp;gt; &lt;br /&gt;
       :intoClause &amp;lt;&amp;gt; &lt;br /&gt;
       :targetList (&lt;br /&gt;
          {RESTARGET &lt;br /&gt;
          :name &amp;lt;&amp;gt; &lt;br /&gt;
          :indirection &amp;lt;&amp;gt; &lt;br /&gt;
          :val &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&lt;br /&gt;
                {A_STAR&lt;br /&gt;
                }&lt;br /&gt;
             )&lt;br /&gt;
             :location 7&lt;br /&gt;
             }&lt;br /&gt;
          :location 7&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :fromClause (&lt;br /&gt;
          {RANGEVAR &lt;br /&gt;
          :schemaname &amp;lt;&amp;gt; &lt;br /&gt;
          :relname foo &lt;br /&gt;
          :inhOpt 2 &lt;br /&gt;
          :relpersistence p &lt;br /&gt;
          :alias &amp;lt;&amp;gt; &lt;br /&gt;
          :location 14&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :whereClause &lt;br /&gt;
          {AEXPR  &lt;br /&gt;
          :name (&amp;quot;=&amp;quot;)&lt;br /&gt;
          :lexpr &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&amp;quot;bar&amp;quot;)&lt;br /&gt;
             :location 24&lt;br /&gt;
             }&lt;br /&gt;
          :rexpr &lt;br /&gt;
             {A_CONST &lt;br /&gt;
             :val 42 &lt;br /&gt;
             :location 30&lt;br /&gt;
             }&lt;br /&gt;
          :location 28&lt;br /&gt;
          }&lt;br /&gt;
       :groupClause &amp;lt;&amp;gt; &lt;br /&gt;
       :havingClause &amp;lt;&amp;gt; &lt;br /&gt;
       :windowClause &amp;lt;&amp;gt; &lt;br /&gt;
       :valuesLists &amp;lt;&amp;gt; &lt;br /&gt;
       :sortClause (&lt;br /&gt;
          {SORTBY &lt;br /&gt;
          :node &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&amp;quot;id&amp;quot;)&lt;br /&gt;
             :location 42&lt;br /&gt;
             }&lt;br /&gt;
          :sortby_dir 2 &lt;br /&gt;
          :sortby_nulls 0 &lt;br /&gt;
          :useOp &amp;lt;&amp;gt; &lt;br /&gt;
          :location -1&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :limitOffset &amp;lt;&amp;gt; &lt;br /&gt;
       :limitCount &lt;br /&gt;
          {A_CONST &lt;br /&gt;
          :val 23 &lt;br /&gt;
          :location 56&lt;br /&gt;
          }&lt;br /&gt;
       :lockingClause &amp;lt;&amp;gt; &lt;br /&gt;
       :withClause &amp;lt;&amp;gt; &lt;br /&gt;
       :op 0 &lt;br /&gt;
       :all false &lt;br /&gt;
       :larg &amp;lt;&amp;gt; &lt;br /&gt;
       :rarg &amp;lt;&amp;gt;&lt;br /&gt;
       }&lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This approach isn&#039;t without caveats though, since the nodeToString code is used only for printing out planned query trees. These trees are rewritten to contain only contain nodes ultimately needed by the [http://www.postgresql.org/docs/current/static/executor.html Executor]. This means that all nodes not to expected in later stages of the query execution can&#039;t be printed, for example INSERT/UPDATE/DELETE - these are all aggregated in a &amp;lt;code&amp;gt;ModifyStmt&amp;lt;/code&amp;gt; node.&lt;br /&gt;
&lt;br /&gt;
==== pg_query ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/pganalyze/pg_query pg_query] is a Ruby gem which can generate query trees in JSON representation. It accomplishes this by using a patched Postgres version which one hond adressess the shortcomings outlined above, on the other hand it provides a new function [https://github.com/pganalyze/postgres/blob/172e1dfc81705e9b14d81e8ef56c54b10ddfcd65/src/backend/nodes/outfuncs_json.c#L3502 &amp;lt;code&amp;gt;nodeToJSONString&amp;lt;/code&amp;gt;] which turns a query tree into a JSON representation instead of the native Postgres format.&lt;br /&gt;
&lt;br /&gt;
The Ruby bindings are just glue code around the Postgres code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    #&amp;lt;PgQuery:0x000000009673a0&lt;br /&gt;
     @query=&amp;quot;SELECT * FROM foo where bar = 42 ORDER BY id DESC LIMIT 23;&amp;quot;,&lt;br /&gt;
     @parsetree=&lt;br /&gt;
      [{&amp;quot;SELECT&amp;quot;=&amp;gt;&lt;br /&gt;
         {&amp;quot;distinctClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;intoClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;targetList&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;RESTARGET&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;name&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;indirection&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;val&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[{&amp;quot;A_STAR&amp;quot;=&amp;gt;{}}], &amp;quot;location&amp;quot;=&amp;gt;7}},&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;7}}],&lt;br /&gt;
          &amp;quot;fromClause&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;RANGEVAR&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;schemaname&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;relname&amp;quot;=&amp;gt;&amp;quot;foo&amp;quot;,&lt;br /&gt;
               &amp;quot;inhOpt&amp;quot;=&amp;gt;2,&lt;br /&gt;
               &amp;quot;relpersistence&amp;quot;=&amp;gt;&amp;quot;p&amp;quot;,&lt;br /&gt;
               &amp;quot;alias&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;14}}],&lt;br /&gt;
          &amp;quot;whereClause&amp;quot;=&amp;gt;&lt;br /&gt;
           {&amp;quot;AEXPR&amp;quot;=&amp;gt;&lt;br /&gt;
             {&amp;quot;name&amp;quot;=&amp;gt;[&amp;quot;=&amp;quot;],&lt;br /&gt;
              &amp;quot;lexpr&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[&amp;quot;bar&amp;quot;], &amp;quot;location&amp;quot;=&amp;gt;24}},&lt;br /&gt;
              &amp;quot;rexpr&amp;quot;=&amp;gt;{&amp;quot;A_CONST&amp;quot;=&amp;gt;{&amp;quot;val&amp;quot;=&amp;gt;42, &amp;quot;location&amp;quot;=&amp;gt;30}},&lt;br /&gt;
              &amp;quot;location&amp;quot;=&amp;gt;28}},&lt;br /&gt;
          &amp;quot;groupClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;havingClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;windowClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;valuesLists&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;sortClause&amp;quot;=&amp;gt;&lt;br /&gt;
           [{&amp;quot;SORTBY&amp;quot;=&amp;gt;&lt;br /&gt;
              {&amp;quot;node&amp;quot;=&amp;gt;{&amp;quot;COLUMNREF&amp;quot;=&amp;gt;{&amp;quot;fields&amp;quot;=&amp;gt;[&amp;quot;id&amp;quot;], &amp;quot;location&amp;quot;=&amp;gt;42}},&lt;br /&gt;
               &amp;quot;sortby_dir&amp;quot;=&amp;gt;2,&lt;br /&gt;
               &amp;quot;sortby_nulls&amp;quot;=&amp;gt;0,&lt;br /&gt;
               &amp;quot;useOp&amp;quot;=&amp;gt;nil,&lt;br /&gt;
               &amp;quot;location&amp;quot;=&amp;gt;-1}}],&lt;br /&gt;
          &amp;quot;limitOffset&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;limitCount&amp;quot;=&amp;gt;{&amp;quot;A_CONST&amp;quot;=&amp;gt;{&amp;quot;val&amp;quot;=&amp;gt;23, &amp;quot;location&amp;quot;=&amp;gt;56}},&lt;br /&gt;
          &amp;quot;lockingClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;withClause&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;op&amp;quot;=&amp;gt;0,&lt;br /&gt;
          &amp;quot;all&amp;quot;=&amp;gt;false,&lt;br /&gt;
          &amp;quot;larg&amp;quot;=&amp;gt;nil,&lt;br /&gt;
          &amp;quot;rarg&amp;quot;=&amp;gt;nil}}],&lt;br /&gt;
     @warnings=[]&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More information can be found in this [https://pganalyze.com/blog/parse-postgresql-queries-in-ruby.html blog post]&lt;br /&gt;
&lt;br /&gt;
==== pgpool-II ====&lt;br /&gt;
&lt;br /&gt;
pgpool-II is a middleware for Postgresql which in it&#039;s simplest use-case is an connection broker between client and database servers.&lt;br /&gt;
&lt;br /&gt;
To be able to do advanced query routing it needs to understand the queries it gets sent form the query. To be able to do that, they forked the parser and implemented their own node &amp;lt;code&amp;gt;outFuncs&amp;lt;/code&amp;gt; to be able to recreated a query string from a given query tree.&lt;br /&gt;
&lt;br /&gt;
If you want to create your own as correct as possible Postgres query pretty-printer this might be a good starting point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sqlparse ====&lt;br /&gt;
&lt;br /&gt;
[https://pypi.python.org/pypi/sqlparse sqlparse] is a Python module which implements a non-validating SQL parser suitable for parsing, splitting and formatting SQL statements. It provides the backbone for http://sqlformat.org/ - a SQL pretty printer.&lt;br /&gt;
&lt;br /&gt;
Introspection into the queries is quite limited and since it&#039;s not specifically targed at Postgres it&#039;s capabilities are quite limited when it comes to drilling down into query trees.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
To make life easier for people using query trees the following things need to be addressed in Postgres core .&lt;br /&gt;
&lt;br /&gt;
* Implement outFuncs for all node types and not only those seen in a post-planning state.&lt;br /&gt;
* Ship alternate outFuncs suitable for generating JSON trees instead of the native Postgres tree format.&lt;br /&gt;
* Support a placeholder character suitable for mimicking all constant expressions in query strings. This would be of great help when trying to parse normalized queries as produced by pg_stat_statements.&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22903</id>
		<title>Query Parsing</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22903"/>
		<updated>2014-07-25T15:40:51Z</updated>

		<summary type="html">&lt;p&gt;Robe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Query Parsing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are quite a few use cases where it&#039;d be of great help if you could access the query tree Postgres uses internally for processing queries.&lt;br /&gt;
&lt;br /&gt;
For example, when you need to do non-trivial operations on queries, like:&lt;br /&gt;
&lt;br /&gt;
* Filtering out queries containing specific tables&lt;br /&gt;
* Reformatting &amp;amp; pretty-printing query strings&lt;br /&gt;
* Modifying or removing parts of the query string, e.g. rename a column&lt;br /&gt;
&lt;br /&gt;
The [http://www.postgresql.org/docs/current/static/overview.html Postgres documentation] gives a good overview how query execution is handled and what the intermediate tree representations of a query string are.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Approaches ===&lt;br /&gt;
&lt;br /&gt;
==== Using Postgres internals ====&lt;br /&gt;
&lt;br /&gt;
Postgres already offers tooling to create a query tree from a given query string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;raw_parser&amp;lt;/code&amp;gt; takes a query statement as input and will return a parse tree. This parse tree can then be pretty-printed by using &amp;lt;code&amp;gt;nodeToString&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example can be seen [https://github.com/pganalyze/queryparser/blob/master/queryparser.c here], this can be easily implemented in a [http://www.postgresql.org/docs/current/static/extend-extensions.html Postgres extension] as well as seen [https://github.com/pganalyze/queryparser/blob/master/extension/annotate_query.c here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    SELECT * FROM foo where bar = 42 ORDER BY id DESC LIMIT 23;&lt;br /&gt;
    (&lt;br /&gt;
       {SELECT &lt;br /&gt;
       :distinctClause &amp;lt;&amp;gt; &lt;br /&gt;
       :intoClause &amp;lt;&amp;gt; &lt;br /&gt;
       :targetList (&lt;br /&gt;
          {RESTARGET &lt;br /&gt;
          :name &amp;lt;&amp;gt; &lt;br /&gt;
          :indirection &amp;lt;&amp;gt; &lt;br /&gt;
          :val &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&lt;br /&gt;
                {A_STAR&lt;br /&gt;
                }&lt;br /&gt;
             )&lt;br /&gt;
             :location 7&lt;br /&gt;
             }&lt;br /&gt;
          :location 7&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :fromClause (&lt;br /&gt;
          {RANGEVAR &lt;br /&gt;
          :schemaname &amp;lt;&amp;gt; &lt;br /&gt;
          :relname foo &lt;br /&gt;
          :inhOpt 2 &lt;br /&gt;
          :relpersistence p &lt;br /&gt;
          :alias &amp;lt;&amp;gt; &lt;br /&gt;
          :location 14&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :whereClause &lt;br /&gt;
          {AEXPR  &lt;br /&gt;
          :name (&amp;quot;=&amp;quot;)&lt;br /&gt;
          :lexpr &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&amp;quot;bar&amp;quot;)&lt;br /&gt;
             :location 24&lt;br /&gt;
             }&lt;br /&gt;
          :rexpr &lt;br /&gt;
             {A_CONST &lt;br /&gt;
             :val 42 &lt;br /&gt;
             :location 30&lt;br /&gt;
             }&lt;br /&gt;
          :location 28&lt;br /&gt;
          }&lt;br /&gt;
       :groupClause &amp;lt;&amp;gt; &lt;br /&gt;
       :havingClause &amp;lt;&amp;gt; &lt;br /&gt;
       :windowClause &amp;lt;&amp;gt; &lt;br /&gt;
       :valuesLists &amp;lt;&amp;gt; &lt;br /&gt;
       :sortClause (&lt;br /&gt;
          {SORTBY &lt;br /&gt;
          :node &lt;br /&gt;
             {COLUMNREF &lt;br /&gt;
             :fields (&amp;quot;id&amp;quot;)&lt;br /&gt;
             :location 42&lt;br /&gt;
             }&lt;br /&gt;
          :sortby_dir 2 &lt;br /&gt;
          :sortby_nulls 0 &lt;br /&gt;
          :useOp &amp;lt;&amp;gt; &lt;br /&gt;
          :location -1&lt;br /&gt;
          }&lt;br /&gt;
       )&lt;br /&gt;
       :limitOffset &amp;lt;&amp;gt; &lt;br /&gt;
       :limitCount &lt;br /&gt;
          {A_CONST &lt;br /&gt;
          :val 23 &lt;br /&gt;
          :location 56&lt;br /&gt;
          }&lt;br /&gt;
       :lockingClause &amp;lt;&amp;gt; &lt;br /&gt;
       :withClause &amp;lt;&amp;gt; &lt;br /&gt;
       :op 0 &lt;br /&gt;
       :all false &lt;br /&gt;
       :larg &amp;lt;&amp;gt; &lt;br /&gt;
       :rarg &amp;lt;&amp;gt;&lt;br /&gt;
       }&lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This approach isn&#039;t without caveats though, since the nodeToString code is used only for printing out planned query trees. These trees are rewritten to contain only contain nodes ultimately needed by the [http://www.postgresql.org/docs/current/static/executor.html Executor]. This means that all nodes not to expected in later stages of the query execution can&#039;t be printed, for example INSERT/UPDATE/DELETE - these are all aggregated in a &amp;lt;code&amp;gt;ModifyStmt&amp;lt;/code&amp;gt; node.&lt;br /&gt;
&lt;br /&gt;
==== pg_query ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/pganalyze/pg_query pg_query] is a Ruby gem which can generate query trees in JSON representation. It accomplishes this by using a patched Postgres version which one hond adressess the shortcomings outlined above, on the other hand it provides a new function [https://github.com/pganalyze/postgres/blob/172e1dfc81705e9b14d81e8ef56c54b10ddfcd65/src/backend/nodes/outfuncs_json.c#L3502 &amp;lt;code&amp;gt;nodeToJSONString&amp;lt;/code&amp;gt;] which turns a query tree into a JSON representation instead of the native Postgres format.&lt;br /&gt;
&lt;br /&gt;
The Ruby bindings are just glue code around the Postgres code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[..example output..]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More information can be found in this [https://pganalyze.com/blog/parse-postgresql-queries-in-ruby.html blog post]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pgpool-II ====&lt;br /&gt;
&lt;br /&gt;
pgpool-II is a middleware for Postgresql which in it&#039;s simplest use-case is an connection broker between client and database servers.&lt;br /&gt;
&lt;br /&gt;
To be able to do advanced query routing it needs to understand the queries it gets sent form the query. To be able to do that, they forked the parser and implemented their own node &amp;lt;code&amp;gt;outFuncs&amp;lt;/code&amp;gt; to be able to recreated a query string from a given query tree.&lt;br /&gt;
&lt;br /&gt;
If you want to create your own as correct as possible Postgres query pretty-printer this might be a good starting point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sqlparse ====&lt;br /&gt;
&lt;br /&gt;
[https://pypi.python.org/pypi/sqlparse sqlparse] is a Python module which implements a non-validating SQL parser suitable for parsing, splitting and formatting SQL statements. It provides the backbone for http://sqlformat.org/ - a SQL pretty printer.&lt;br /&gt;
&lt;br /&gt;
Introspection into the queries is quite limited and since it&#039;s not specifically targed at Postgres it&#039;s capabilities are quite limited when it comes to drilling down into query trees.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
To make life easier for people using query trees the following things need to be addressed in Postgres core .&lt;br /&gt;
&lt;br /&gt;
* Implement outFuncs for all node types and not only those seen in a post-planning state.&lt;br /&gt;
* Ship alternate outFuncs suitable for generating JSON trees instead of the native Postgres tree format.&lt;br /&gt;
* Support a placeholder character suitable for mimicking all constant expressions in query strings. This would be of great help when trying to parse normalized queries as produced by pg_stat_statements.&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22902</id>
		<title>Query Parsing</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22902"/>
		<updated>2014-07-25T15:37:07Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Using Postgres internals */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Query Parsing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are quite a few use cases where it&#039;d be of great help if you could access the query tree Postgres uses internally for processing queries.&lt;br /&gt;
&lt;br /&gt;
For example, when you need to do non-trivial operations on queries, like:&lt;br /&gt;
&lt;br /&gt;
* Filtering out queries containing specific tables&lt;br /&gt;
* Reformatting &amp;amp; pretty-printing query strings&lt;br /&gt;
* Modifying or removing parts of the query string, e.g. rename a column&lt;br /&gt;
&lt;br /&gt;
The [http://www.postgresql.org/docs/current/static/overview.html Postgres documentation] gives a good overview how query execution is handled and what the intermediate tree representations of a query string are.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Approaches ===&lt;br /&gt;
&lt;br /&gt;
==== Using Postgres internals ====&lt;br /&gt;
&lt;br /&gt;
Postgres already offers tooling to create a query tree from a given query string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;raw_parser&amp;lt;/code&amp;gt; takes a query statement as input and will return a parse tree. This parse tree can then be pretty-printed by using &amp;lt;code&amp;gt;nodeToString&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example can be seen [https://github.com/pganalyze/queryparser/blob/master/queryparser.c here], this can be easily implemented in a [http://www.postgresql.org/docs/current/static/extend-extensions.html Postgres extension] as well as seen [https://github.com/pganalyze/queryparser/blob/master/extension/annotate_query.c here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT * FROM foo where bar = 42 ORDER BY id DESC LIMIT 23;&lt;br /&gt;
(&lt;br /&gt;
   {SELECT &lt;br /&gt;
   :distinctClause &amp;lt;&amp;gt; &lt;br /&gt;
   :intoClause &amp;lt;&amp;gt; &lt;br /&gt;
   :targetList (&lt;br /&gt;
      {RESTARGET &lt;br /&gt;
      :name &amp;lt;&amp;gt; &lt;br /&gt;
      :indirection &amp;lt;&amp;gt; &lt;br /&gt;
      :val &lt;br /&gt;
         {COLUMNREF &lt;br /&gt;
         :fields (&lt;br /&gt;
            {A_STAR&lt;br /&gt;
            }&lt;br /&gt;
         )&lt;br /&gt;
         :location 7&lt;br /&gt;
         }&lt;br /&gt;
      :location 7&lt;br /&gt;
      }&lt;br /&gt;
   )&lt;br /&gt;
   :fromClause (&lt;br /&gt;
      {RANGEVAR &lt;br /&gt;
      :schemaname &amp;lt;&amp;gt; &lt;br /&gt;
      :relname foo &lt;br /&gt;
      :inhOpt 2 &lt;br /&gt;
      :relpersistence p &lt;br /&gt;
      :alias &amp;lt;&amp;gt; &lt;br /&gt;
      :location 14&lt;br /&gt;
      }&lt;br /&gt;
   )&lt;br /&gt;
   :whereClause &lt;br /&gt;
      {AEXPR  &lt;br /&gt;
      :name (&amp;quot;=&amp;quot;)&lt;br /&gt;
      :lexpr &lt;br /&gt;
         {COLUMNREF &lt;br /&gt;
         :fields (&amp;quot;bar&amp;quot;)&lt;br /&gt;
         :location 24&lt;br /&gt;
         }&lt;br /&gt;
      :rexpr &lt;br /&gt;
         {A_CONST &lt;br /&gt;
         :val 42 &lt;br /&gt;
         :location 30&lt;br /&gt;
         }&lt;br /&gt;
      :location 28&lt;br /&gt;
      }&lt;br /&gt;
   :groupClause &amp;lt;&amp;gt; &lt;br /&gt;
   :havingClause &amp;lt;&amp;gt; &lt;br /&gt;
   :windowClause &amp;lt;&amp;gt; &lt;br /&gt;
   :valuesLists &amp;lt;&amp;gt; &lt;br /&gt;
   :sortClause (&lt;br /&gt;
      {SORTBY &lt;br /&gt;
      :node &lt;br /&gt;
         {COLUMNREF &lt;br /&gt;
         :fields (&amp;quot;id&amp;quot;)&lt;br /&gt;
         :location 42&lt;br /&gt;
         }&lt;br /&gt;
      :sortby_dir 2 &lt;br /&gt;
      :sortby_nulls 0 &lt;br /&gt;
      :useOp &amp;lt;&amp;gt; &lt;br /&gt;
      :location -1&lt;br /&gt;
      }&lt;br /&gt;
   )&lt;br /&gt;
   :limitOffset &amp;lt;&amp;gt; &lt;br /&gt;
   :limitCount &lt;br /&gt;
      {A_CONST &lt;br /&gt;
      :val 23 &lt;br /&gt;
      :location 56&lt;br /&gt;
      }&lt;br /&gt;
   :lockingClause &amp;lt;&amp;gt; &lt;br /&gt;
   :withClause &amp;lt;&amp;gt; &lt;br /&gt;
   :op 0 &lt;br /&gt;
   :all false &lt;br /&gt;
   :larg &amp;lt;&amp;gt; &lt;br /&gt;
   :rarg &amp;lt;&amp;gt;&lt;br /&gt;
   }&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This approach isn&#039;t without caveats though, since the nodeToString code is used only for printing out planned query trees. These trees are rewritten to contain only contain nodes ultimately needed by the [http://www.postgresql.org/docs/current/static/executor.html Executor]. This means that all nodes not to expected in later stages of the query execution can&#039;t be printed, for example INSERT/UPDATE/DELETE - these are all aggregated in a &amp;lt;code&amp;gt;ModifyStmt&amp;lt;/code&amp;gt; node.&lt;br /&gt;
&lt;br /&gt;
==== pg_query ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/pganalyze/pg_query pg_query] is a Ruby gem which can generate query trees in JSON representation. It accomplishes this by using a patched Postgres version which one hond adressess the shortcomings outlined above, on the other hand it provides a new function [https://github.com/pganalyze/postgres/blob/172e1dfc81705e9b14d81e8ef56c54b10ddfcd65/src/backend/nodes/outfuncs_json.c#L3502 &amp;lt;code&amp;gt;nodeToJSONString&amp;lt;/code&amp;gt;] which turns a query tree into a JSON representation instead of the native Postgres format.&lt;br /&gt;
&lt;br /&gt;
The Ruby bindings are just glue code around the Postgres code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[..example output..]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More information can be found in this [https://pganalyze.com/blog/parse-postgresql-queries-in-ruby.html blog post]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pgpool-II ====&lt;br /&gt;
&lt;br /&gt;
pgpool-II is a middleware for Postgresql which in it&#039;s simplest use-case is an connection broker between client and database servers.&lt;br /&gt;
&lt;br /&gt;
To be able to do advanced query routing it needs to understand the queries it gets sent form the query. To be able to do that, they forked the parser and implemented their own node &amp;lt;code&amp;gt;outFuncs&amp;lt;/code&amp;gt; to be able to recreated a query string from a given query tree.&lt;br /&gt;
&lt;br /&gt;
If you want to create your own as correct as possible Postgres query pretty-printer this might be a good starting point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sqlparse ====&lt;br /&gt;
&lt;br /&gt;
[https://pypi.python.org/pypi/sqlparse sqlparse] is a Python module which implements a non-validating SQL parser suitable for parsing, splitting and formatting SQL statements. It provides the backbone for http://sqlformat.org/ - a SQL pretty printer.&lt;br /&gt;
&lt;br /&gt;
Introspection into the queries is quite limited and since it&#039;s not specifically targed at Postgres it&#039;s capabilities are quite limited when it comes to drilling down into query trees.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
To make life easier for people using query trees the following things need to be addressed in Postgres core .&lt;br /&gt;
&lt;br /&gt;
* Implement outFuncs for all node types and not only those seen in a post-planning state.&lt;br /&gt;
* Ship alternate outFuncs suitable for generating JSON trees instead of the native Postgres tree format.&lt;br /&gt;
* Support a placeholder character suitable for mimicking all constant expressions in query strings. This would be of great help when trying to parse normalized queries as produced by pg_stat_statements.&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22901</id>
		<title>Query Parsing</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22901"/>
		<updated>2014-07-25T15:26:05Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Query Parsing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Query Parsing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are quite a few use cases where it&#039;d be of great help if you could access the query tree Postgres uses internally for processing queries.&lt;br /&gt;
&lt;br /&gt;
For example, when you need to do non-trivial operations on queries, like:&lt;br /&gt;
&lt;br /&gt;
* Filtering out queries containing specific tables&lt;br /&gt;
* Reformatting &amp;amp; pretty-printing query strings&lt;br /&gt;
* Modifying or removing parts of the query string, e.g. rename a column&lt;br /&gt;
&lt;br /&gt;
The [http://www.postgresql.org/docs/current/static/overview.html Postgres documentation] gives a good overview how query execution is handled and what the intermediate tree representations of a query string are.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Approaches ===&lt;br /&gt;
&lt;br /&gt;
==== Using Postgres internals ====&lt;br /&gt;
&lt;br /&gt;
Postgres already offers tooling to create a query tree from a given query string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;raw_parser&amp;lt;/code&amp;gt; takes a query statement as input and will return a parse tree. This parse tree can then be pretty-printed by using &amp;lt;code&amp;gt;nodeToString&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example can be seen [https://github.com/pganalyze/queryparser/blob/master/queryparser.c here], this can be easily implemented in a [http://www.postgresql.org/docs/current/static/extend-extensions.html Postgres extension] as well as seen [https://github.com/pganalyze/queryparser/blob/master/extension/annotate_query.c here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[..example output..]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This approach isn&#039;t without caveats though, since the nodeToString code is used only for printing out planned query trees. These trees are rewritten to contain only contain nodes ultimately needed by the [http://www.postgresql.org/docs/current/static/executor.html Executor]. This means that all nodes not to expected in later stages of the query execution can&#039;t be printed, for example INSERT/UPDATE/DELETE - these are all aggregated in a &amp;lt;code&amp;gt;ModifyStmt&amp;lt;/code&amp;gt; node.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pg_query ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/pganalyze/pg_query pg_query] is a Ruby gem which can generate query trees in JSON representation. It accomplishes this by using a patched Postgres version which one hond adressess the shortcomings outlined above, on the other hand it provides a new function [https://github.com/pganalyze/postgres/blob/172e1dfc81705e9b14d81e8ef56c54b10ddfcd65/src/backend/nodes/outfuncs_json.c#L3502 &amp;lt;code&amp;gt;nodeToJSONString&amp;lt;/code&amp;gt;] which turns a query tree into a JSON representation instead of the native Postgres format.&lt;br /&gt;
&lt;br /&gt;
The Ruby bindings are just glue code around the Postgres code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[..example output..]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More information can be found in this [https://pganalyze.com/blog/parse-postgresql-queries-in-ruby.html blog post]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pgpool-II ====&lt;br /&gt;
&lt;br /&gt;
pgpool-II is a middleware for Postgresql which in it&#039;s simplest use-case is an connection broker between client and database servers.&lt;br /&gt;
&lt;br /&gt;
To be able to do advanced query routing it needs to understand the queries it gets sent form the query. To be able to do that, they forked the parser and implemented their own node &amp;lt;code&amp;gt;outFuncs&amp;lt;/code&amp;gt; to be able to recreated a query string from a given query tree.&lt;br /&gt;
&lt;br /&gt;
If you want to create your own as correct as possible Postgres query pretty-printer this might be a good starting point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sqlparse ====&lt;br /&gt;
&lt;br /&gt;
[https://pypi.python.org/pypi/sqlparse sqlparse] is a Python module which implements a non-validating SQL parser suitable for parsing, splitting and formatting SQL statements. It provides the backbone for http://sqlformat.org/ - a SQL pretty printer.&lt;br /&gt;
&lt;br /&gt;
Introspection into the queries is quite limited and since it&#039;s not specifically targed at Postgres it&#039;s capabilities are quite limited when it comes to drilling down into query trees.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
To make life easier for people using query trees the following things need to be addressed in Postgres core .&lt;br /&gt;
&lt;br /&gt;
* Implement outFuncs for all node types and not only those seen in a post-planning state.&lt;br /&gt;
* Ship alternate outFuncs suitable for generating JSON trees instead of the native Postgres tree format.&lt;br /&gt;
* Support a placeholder character suitable for mimicking all constant expressions in query strings. This would be of great help when trying to parse normalized queries as produced by pg_stat_statements.&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22900</id>
		<title>Query Parsing</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Query_Parsing&amp;diff=22900"/>
		<updated>2014-07-25T15:19:21Z</updated>

		<summary type="html">&lt;p&gt;Robe: first version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Query Parsing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are quite a few use cases where it&#039;d be of great help if you could access the query tree Postgres uses internally for processing queries.&lt;br /&gt;
&lt;br /&gt;
For example, when you need to do non-trivial operations on queries, like:&lt;br /&gt;
&lt;br /&gt;
* Filtering out queries containing specific tables&lt;br /&gt;
* Reformatting &amp;amp; pretty-printing query strings&lt;br /&gt;
* Modifying or removing parts of the query string, e.g. rename a column&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Approaches ===&lt;br /&gt;
&lt;br /&gt;
==== Using Postgres internals ====&lt;br /&gt;
&lt;br /&gt;
Postgres already offers tooling to create a query tree from a given query string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;raw_parser&amp;lt;/code&amp;gt; takes a query statement as input and will return a parse tree. This parse tree can then be pretty-printed by using &amp;lt;code&amp;gt;nodeToString&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example can be seen [https://github.com/pganalyze/queryparser/blob/master/queryparser.c here], this can be easily implemented in a [http://www.postgresql.org/docs/current/static/extend-extensions.html Postgres extension] as well as seen [https://github.com/pganalyze/queryparser/blob/master/extension/annotate_query.c here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[..example output..]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This approach isn&#039;t without caveats though, since the nodeToString code is used only for printing out planned query trees. These trees are rewritten to contain only contain nodes ultimately needed by the [http://www.postgresql.org/docs/current/static/executor.html Executor]. This means that all nodes not to expected in later stages of the query execution can&#039;t be printed, for example INSERT/UPDATE/DELETE - these are all aggregated in a &amp;lt;code&amp;gt;ModifyStmt&amp;lt;/code&amp;gt; node.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pg_query ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/pganalyze/pg_query pg_query] is a Ruby gem which can generate query trees in JSON representation. It accomplishes this by using a patched Postgres version which one hond adressess the shortcomings outlined above, on the other hand it provides a new function [https://github.com/pganalyze/postgres/blob/172e1dfc81705e9b14d81e8ef56c54b10ddfcd65/src/backend/nodes/outfuncs_json.c#L3502 &amp;lt;code&amp;gt;nodeToJSONString&amp;lt;/code&amp;gt;] which turns a query tree into a JSON representation instead of the native Postgres format.&lt;br /&gt;
&lt;br /&gt;
The Ruby bindings are just glue code around the Postgres code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[..example output..]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More information can be found in this [https://pganalyze.com/blog/parse-postgresql-queries-in-ruby.html blog post]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pgpool-II ====&lt;br /&gt;
&lt;br /&gt;
pgpool-II is a middleware for Postgresql which in it&#039;s simplest use-case is an connection broker between client and database servers.&lt;br /&gt;
&lt;br /&gt;
To be able to do advanced query routing it needs to understand the queries it gets sent form the query. To be able to do that, they forked the parser and implemented their own node &amp;lt;code&amp;gt;outFuncs&amp;lt;/code&amp;gt; to be able to recreated a query string from a given query tree.&lt;br /&gt;
&lt;br /&gt;
If you want to create your own as correct as possible Postgres query pretty-printer this might be a good starting point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sqlparse ====&lt;br /&gt;
&lt;br /&gt;
[https://pypi.python.org/pypi/sqlparse sqlparse] is a Python module which implements a non-validating SQL parser suitable for parsing, splitting and formatting SQL statements. It provides the backbone for http://sqlformat.org/ - a SQL pretty printer.&lt;br /&gt;
&lt;br /&gt;
Introspection into the queries is quite limited and since it&#039;s not specifically targed at Postgres it&#039;s capabilities are quite limited when it comes to drilling down into query trees. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
To make life easier for people using query trees the following things need to be addressed in Postgres core .&lt;br /&gt;
&lt;br /&gt;
* Implement outFuncs for all node types and not only those seen in a post-planning state.&lt;br /&gt;
* Ship alternate outFuncs suitable for generating JSON trees instead of the native Postgres tree format.&lt;br /&gt;
* Support a placeholder character suitable for mimicking all constant expressions in query strings. This would be of great help when trying to parse normalized queries as produced by pg_stat_statements.&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Apt&amp;diff=21813</id>
		<title>Apt</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Apt&amp;diff=21813"/>
		<updated>2014-02-05T14:22:49Z</updated>

		<summary type="html">&lt;p&gt;Robe: change default distro to wheezy.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PostgreSQL packages for Debian and Ubuntu==&lt;br /&gt;
&lt;br /&gt;
The PostgreSQL Global Development Group (PGDG) maintains an APT repository of PostgreSQL packages for Debian and Ubuntu located at http://apt.postgresql.org/pub/repos/apt/.&lt;br /&gt;
We aim at building PostgreSQL server packages as well as extensions and modules packages on several Debian/Ubuntu releases for all PostgreSQL versions supported.&lt;br /&gt;
&lt;br /&gt;
Currently, we support&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Debian 6.0&#039;&#039;&#039; (squeeze), &#039;&#039;&#039;7.0&#039;&#039;&#039; (wheezy), and &#039;&#039;&#039;unstable&#039;&#039;&#039; (sid) 64/32 bit (amd64/i386)&lt;br /&gt;
* &#039;&#039;&#039;Ubuntu 10.04&#039;&#039;&#039; (lucid), &#039;&#039;&#039;12.04&#039;&#039;&#039; (precise), and &#039;&#039;&#039;14.04&#039;&#039;&#039; (trusty) 64/32 bit (amd64/i386) -- See the [[Apt/FAQ#I_am_using_a_non-LTS_release_of_Ubuntu|FAQ]] for other Ubuntu releases&lt;br /&gt;
* &#039;&#039;&#039;PostgreSQL 8.4, 9.0, 9.1, 9.2, 9.3&#039;&#039;&#039;&lt;br /&gt;
* Server extensions such as Slony-I, various PL languages, and datatypes&lt;br /&gt;
* Applications like pgadmin3, pgbouncer, and pgpool-II&lt;br /&gt;
&lt;br /&gt;
Packages for older PostgreSQL versions and older Debian/Ubuntu distributions will continue to stay in the repository; updates for those will be provided on an ad-hoc basis.&lt;br /&gt;
&lt;br /&gt;
==Quickstart==&lt;br /&gt;
&lt;br /&gt;
Create &#039;&#039;&#039;/etc/apt/sources.list.d/pgdg.list&#039;&#039;&#039;. The distributions are called &#039;&#039;codename&#039;&#039;&#039;&#039;&#039;-pgdg&#039;&#039;&#039;. In the example, replace &#039;&#039;wheezy&#039;&#039; with the actual distribution you are using:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;deb http://apt.postgresql.org/pub/repos/apt/&amp;lt;/nowiki&amp;gt; &#039;&#039;wheezy&#039;&#039;-pgdg main&lt;br /&gt;
&lt;br /&gt;
(You may determine the codename of your distribution by running &#039;&#039;&#039;lsb_release -c&#039;&#039;&#039;.)&lt;br /&gt;
&lt;br /&gt;
Import the repository key from &#039;&#039;&#039;https://www.postgresql.org/media/keys/ACCC4CF8.asc&#039;&#039;&#039;, update the package lists, and start installing packages:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get upgrade&lt;br /&gt;
 sudo apt-get install postgresql-9.3 pgadmin3&lt;br /&gt;
&lt;br /&gt;
Alternately, [http://anonscm.debian.org/loggerhead/pkg-postgresql/postgresql-common/trunk/download/head:/apt.postgresql.org.s-20130224224205-px3qyst90b3xp8zj-1/apt.postgresql.org.sh this shell script] will do the above steps for you.&lt;br /&gt;
&lt;br /&gt;
Have a look at the &#039;&#039;&#039;[[Apt/FAQ|FAQ]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This repository provides &amp;quot;postgresql&amp;quot;, &amp;quot;postgresql-contrib&amp;quot;, and &amp;quot;postgresql-client&amp;quot; &#039;&#039;meta-packages&#039;&#039; that depend on the latest postgresql-x.y, ... packages, similar to the ones present in Debian and Ubuntu. Once a new PostgreSQL version is released, these meta-packages will be updated to depend on the new version. If you rather want to stay with a particular PostgreSQL version, you should install specific packages like &amp;quot;postgresql-9.3&amp;quot; instead of &amp;quot;postgresql&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==News==&lt;br /&gt;
&lt;br /&gt;
* 2014-01-09: Ubuntu trusty (14.04) packages available: http://www.postgresql.org/message-id/20140109124716.GA5659@msgid.credativ.de&lt;br /&gt;
* 2013-11-22: Users concerned about the [[Nov2013ReplicationIssue]] can find 9.2.4/9.1.9/9.0.13 packages at http://apt.postgresql.org/pub/repos/apt/nov2013replicationissue/&lt;br /&gt;
* 2013-10-10: New pgdg-keyring version extending the key expiration date. The old expiration date is 2013-10-13. Announcement: http://www.postgresql.org/message-id/20131010083115.GC24812@msgid.df7cb.de Additional blog post: http://blog.endpoint.com/2013/10/postgresql-debian-apt-repository-gnupg.html&lt;br /&gt;
* 2013-09-09: postgresql-9.3 released! (This also includes new postgresql-9.2 and postgresql-common packages.)&lt;br /&gt;
* 2013-05-12: postgresql-9.3 beta1 is now available, see [[Apt/FAQ#I_want_to_try_the_beta_version_of_the_next_PostgreSQL_release|FAQ entry]] for instructions&lt;br /&gt;
* 2013-05-11: Temporary problems with libpq5 packages: http://www.postgresql.org/message-id/20130511050816.GB8469@msgid.df7cb.de&lt;br /&gt;
* 2013-04-10: New postgresql-common version 141 introducing a dependency on the pgdg-keyring package. (If you were following the (old) installation instructions, you already have that package installed.)&lt;br /&gt;
* 2013-02-23: pgapt.debian.net is gone now. If you were using that, change to apt.postgresql.org using the instructions above.&lt;br /&gt;
* 2013-02-22: Default repository pin priority changed; see [[Apt/FAQ#I_want_only_specific_packages_from_this_repository|Apt pinning]] for details.&lt;br /&gt;
* 2012-12-18: Ubuntu Lucid (10.04) is now part of the repository; PostgreSQL and pgadmin3 packages are built.&lt;br /&gt;
* 2012-12-06: Official announcement: http://archives.postgresql.org/pgsql-announce/2012-12/msg00008.php, http://www.postgresql.org/about/news/1432/&lt;br /&gt;
* 2012-12-06: Minor releases 9.2.2, 9.1.7, 9.0.11, 8.4.15, 8.3.22 built.&lt;br /&gt;
* 2012-11-30: pgadmin3 added to the repository&lt;br /&gt;
* 2012-11-22: Ubuntu Precise (12.04) added to the repository, and built 9.2.1, 9.1.6, 9.0.10, 8.4.14, 8.3.21 for it.&lt;br /&gt;
* 2012-10-13: Repository key renewed with new expiry date.&lt;br /&gt;
* 2012-10-02: Minor releases 9.2.1, 9.1.6, 9.0.10, 8.4.14, 8.3.21 built&lt;br /&gt;
* 2012-09-15: 9.2.0 is in the repository&lt;br /&gt;
* 2012-08-22: PostgreSQL in Debian Hackathon: [http://www.df7cb.de/blog/2012/PostgreSQL_in_Debian_Hackathon.html Blog posting] and [https://github.com/dimitri/apt.postgresql.org/blob/master/hackaton-20120821.md notes]. The distribution names changed from *-pgapt to *-pgdg, please update your sources.list.&lt;br /&gt;
* 2012-06-07: 9.2 added, Lenny marked unsupported now&lt;br /&gt;
* 2012-06-07: separate components &amp;quot;9.0&amp;quot;, &amp;quot;9.2&amp;quot; etc added for libpq5/libpg-dev/lib... packages that would otherwise overwrite packages from other versions in the same suite. (Usually, using the latest stable libpq5 version will be ok for users. The packages built from other PostgreSQL versions are provided only for completeness.)&lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
&lt;br /&gt;
* [[Apt/FAQ|FAQ]]&lt;br /&gt;
* [https://pgdgbuild.dus.dg-i.net/repos/apt/dists/ Overview of available packages and versions] (WIP)&lt;br /&gt;
* [http://apt.postgresql.org/pub/repos/apt/dists/ Dists directory]&lt;br /&gt;
* [http://apt.postgresql.org/pub/repos/apt/pool/ Packages pool directory]&lt;br /&gt;
* [[ExtensionPackaging]] (PostgreSQL Wiki)&lt;br /&gt;
* [http://wiki.debian.org/pkg-postgresql pkg-postgresql] (Debian Wiki) &lt;br /&gt;
&lt;br /&gt;
===Contact===&lt;br /&gt;
&lt;br /&gt;
* Mailing list: pgsql-pkg-debian@postgresql.org ([http://archives.postgresql.org/pgsql-pkg-debian/ Archives])&lt;br /&gt;
* IRC channel: #postgresql-apt @ irc.freenode.net&lt;br /&gt;
* People: Christoph Berg &amp;lt;myon@debian.org&amp;gt;, Dimitri Fontaine &amp;lt;dimitri@2ndquadrant.fr&amp;gt;, Magnus Hagander &amp;lt;magnus@hagander.net&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Bugs===&lt;br /&gt;
&lt;br /&gt;
Please report bugs on the pgsql-pkg-debian@postgresql.org mailing list, or open a bug in the [http://bugs.debian.org/ Debian BTS].&lt;br /&gt;
&lt;br /&gt;
===Documentation===&lt;br /&gt;
&lt;br /&gt;
* [[Apt/RepoDocs]]&lt;br /&gt;
* [[Apt/Jenkins]]&lt;br /&gt;
* [[Apt/NewPostgreSQLVersion]]&lt;br /&gt;
&lt;br /&gt;
==Acknowledgements==&lt;br /&gt;
&lt;br /&gt;
Work on setting up the archive was kindly supported by [http://www.credativ.de/ credativ], [http://www.2ndquadrant.com/ 2ndQuadrant], [http://redpill-linpro.com/ Redpill Linpro],&lt;br /&gt;
and funding from the European Union&#039;s Seventh Framework Programme (FP7/2007-2013) under grant agreement 258862.&lt;br /&gt;
&lt;br /&gt;
The build server is kindly hosted by [https://www.dg-i.net/ DG-i]. The archive is hosted on postgresql.org hardware.&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21461</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21461"/>
		<updated>2013-11-26T09:50:15Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Generic monitoring solutions with plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== CLI tools ===&lt;br /&gt;
&lt;br /&gt;
==== pg_view ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://tech.zalando.com/getting-a-quick-view-of-your-postgresql-stats/ pg_view]&amp;lt;/tt&amp;gt; is a Python-based tool to quickly get information about running databases and resources used by them as well as correlate running queries and why they might be slow.&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== Zabbix ====&lt;br /&gt;
&lt;br /&gt;
[http://pg-monz.github.io/pg_monz/index-en.html pg_monz] is a [http://www.zabbix.com/ Zabbix] monitoring template for Postgres.&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
There has been work done on building a Postgres template for [http://www.cacti.net/ Cacti], Details can be found at the [[Cacti]] page.&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
[http://www.enterprisedb.com/products-services-training/products/postgres-enterprise-manager Postgres Enterprise Manager] is a commercial application offered by EnterpriseDB which covers many aspects of Postgres operations &amp;amp; monitoring in large environments.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
[https://pganalyze.com/ pganalyze] is a commercial SaaS offering which focuses on performance monitoring and automated tuning suggestions.&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
[http://www.cybertec.at/en/products/pgwatch-cybertec-enterprise-postgresql-monitor/ pgwatch] is a PHP web application which offers interactive graphs for relevant Postgres data.&lt;br /&gt;
&lt;br /&gt;
==== pg_statsinfo &amp;amp; pg_stats_reporter ====&lt;br /&gt;
&lt;br /&gt;
[http://pgstatsinfo.projects.pgfoundry.org/ pg_statsinfo] is a Postgres extension that collects lots of performance-relevant information inside the Postgres server which then can be aggregated by pg_stats_reporter instances which provide a web interface to the collected data. Both are FOSS software maintained by NTT.&lt;br /&gt;
&lt;br /&gt;
==== PGObserver ====&lt;br /&gt;
&lt;br /&gt;
[http://zalando.github.io/PGObserver/ PGObserver] is a Python &amp;amp; Java-based Postgres monitoring solution developed by Zalando. It was developed with a focus on stored procedure performance but extended well beyond that. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pgCluu ====&lt;br /&gt;
[http://pgcluu.darold.net/ pgCluu] is a Perl-based monitoring solution which uses psql and [http://en.wikipedia.org/wiki/Sar_(Unix) sar] to collect information about Postgres servers and render comprehensive performance stats.&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21412</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21412"/>
		<updated>2013-11-19T11:54:44Z</updated>

		<summary type="html">&lt;p&gt;Robe: added pgcluu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== CLI tools ===&lt;br /&gt;
&lt;br /&gt;
==== pg_view ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://tech.zalando.com/getting-a-quick-view-of-your-postgresql-stats/ pg_view]&amp;lt;/tt&amp;gt; is a Python-based tool to quickly get information about running databases and resources used by them as well as correlate running queries and why they might be slow.&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
There has been work done on building a Postgres template for [http://www.cacti.net/ Cacti], Details can be found at the [[Cacti]] page.&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
[http://www.enterprisedb.com/products-services-training/products/postgres-enterprise-manager Postgres Enterprise Manager] is a commercial application offered by EnterpriseDB which covers many aspects of Postgres operations &amp;amp; monitoring in large environments.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
[https://pganalyze.com/ pganalyze] is a commercial SaaS offering which focuses on performance monitoring and automated tuning suggestions.&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
[http://www.cybertec.at/en/products/pgwatch-cybertec-enterprise-postgresql-monitor/ pgwatch] is a PHP web application which offers interactive graphs for relevant Postgres data.&lt;br /&gt;
&lt;br /&gt;
==== pg_statsinfo &amp;amp; pg_stats_reporter ====&lt;br /&gt;
&lt;br /&gt;
[http://pgstatsinfo.projects.pgfoundry.org/ pg_statsinfo] is a Postgres extension that collects lots of performance-relevant information inside the Postgres server which then can be aggregated by pg_stats_reporter instances which provide a web interface to the collected data. Both are FOSS software maintained by NTT.&lt;br /&gt;
&lt;br /&gt;
==== PGObserver ====&lt;br /&gt;
&lt;br /&gt;
[http://zalando.github.io/PGObserver/ PGObserver] is a Python &amp;amp; Java-based Postgres monitoring solution developed by Zalando. It was developed with a focus on stored procedure performance but extended well beyond that. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pgCluu ====&lt;br /&gt;
[http://pgcluu.darold.net/ pgCluu] is a Perl-based monitoring solution which uses psql and [http://en.wikipedia.org/wiki/Sar_(Unix) sar] to collect information about Postgres servers and render comprehensive performance stats.&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PostgreSQL_Conference_Europe_Talks_2013&amp;diff=21117</id>
		<title>PostgreSQL Conference Europe Talks 2013</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PostgreSQL_Conference_Europe_Talks_2013&amp;diff=21117"/>
		<updated>2013-11-01T14:19:09Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Lightning talks */ i can&amp;#039;t paranthese&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PostgreSQL Conference Europe 2013 Talks =&lt;br /&gt;
&lt;br /&gt;
== Conference Website ==&lt;br /&gt;
&lt;br /&gt;
http://2013.pgconf.eu/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Trainings: Tuesday 29th October, 2013 ==&lt;br /&gt;
&lt;br /&gt;
=== Dargle ===&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL &amp;amp; PostGIS (Gianni Ciolli)&lt;br /&gt;
* Writing &amp;amp; using Postgres Extensions (Dimitri Fontaine)&lt;br /&gt;
&lt;br /&gt;
=== Dodder ===&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL indexing (Hans-Jürgen Schönig)&lt;br /&gt;
&lt;br /&gt;
=== Liffey ===&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Performance Tuning (Bruce Momjian)&lt;br /&gt;
* Data Processing Inside PostgreSQL (Bruce Momjian)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Talks: Wednesday 30th October, 2013 ==&lt;br /&gt;
&lt;br /&gt;
=== Earlsfort ===&lt;br /&gt;
&lt;br /&gt;
* Keynote: Handling the Spotlight: How PostgreSQL can become the database of choice  (Mark Taylor)&lt;br /&gt;
* What&#039;s New in PostgreSQL 9.3 (Robert Treat)&lt;br /&gt;
* PostgreSQL - One of the most important Open Source projects (Michael Meskes)&lt;br /&gt;
* Going spatial with PostGIS and more (Hugo Mercier)&lt;br /&gt;
* Nulls Make Things Easier? (Bruce Momjian)&lt;br /&gt;
* PostgreSQL Disaster Recovery with Barman (Gabriele Bartolini)&lt;br /&gt;
&lt;br /&gt;
=== Leeson ===&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL for Rails (Roland Sonnenschein)&lt;br /&gt;
* Introduction of pg_statsinfo and pg_stats_reporter ~Statistics Reporting Tool for DBA~ (Mitsumasa KONDO)&lt;br /&gt;
* [http://de.slideshare.net/psoo1978/pg-fdw Writing a foreign data wrapper] (Bernd Helmle)&lt;br /&gt;
* Success stories on migrating from Sybase ASE to PostgreSQL (Achim Eisele, Jens Wilke)&lt;br /&gt;
* Multicorn: writing Foreign Data Wrappers in python (Ronan Dunklau)&lt;br /&gt;
&lt;br /&gt;
=== Pembroke ===&lt;br /&gt;
&lt;br /&gt;
* Writing a user-defined datatype (Heikki Linnakangas)&lt;br /&gt;
* LATERAL querying in 9.3; keep up with the new features! (Gianni Ciolli)&lt;br /&gt;
* Detecting performance bottlenecks (Hans-Jürgen Schönig)&lt;br /&gt;
* [http://www.slideshare.net/jkatz05/explain-the-index-of-postgresql-indexes Explaining the Index of PostgreSQL Indexes] (Jonathan S. Katz)&lt;br /&gt;
* Conduct change from Oracle to PostgreSQL (Jean-Paul Argudo)&lt;br /&gt;
&lt;br /&gt;
== Talks: Thursday 31th October, 2013 ==&lt;br /&gt;
&lt;br /&gt;
=== Earlsfort ===&lt;br /&gt;
&lt;br /&gt;
* Taking advantage of custom background workers (Michael Paquier)&lt;br /&gt;
* Doing PITR Right - There&#039;s more than just replication (Stephen Frost)&lt;br /&gt;
* [https://speakerdeck.com/craigkerstiens/postgres-what-they-really-use slides Postgres what they really use] ([http://www.craigkerstiens.com Craig Kerstiens])&lt;br /&gt;
* Indexes: The neglected performance all-rounder (Markus Winand)&lt;br /&gt;
* Migrating from MySQL to PostgreSQL (Dimitri Fontaine)&lt;br /&gt;
* Lightning talks (Harald Armin Massa)&lt;br /&gt;
&lt;br /&gt;
=== Leeson ===&lt;br /&gt;
&lt;br /&gt;
* Gotcha! Finer points of the postgres query planner and how to use them in your queries (Atri Sharma)&lt;br /&gt;
* [https://wiki.postgresql.org/images/a/ad/Materialised_views_now_and_the_future-pgconfeu_2013.pdf Materialised views now and the future] (Thom Brown)&lt;br /&gt;
* [http://www.slideshare.net/davidfetter/federation-with-foreigndatawrapperspgconfeu20131031 Federation with Foreign Data Wrappers] (David Fetter)&lt;br /&gt;
* Switching Horses Overnight - a Software Manufacturer&#039;s View on Replacing an Existing Database Management System with PostgreSQL (Robert Lichtenberger, Stefan Andreatta)&lt;br /&gt;
* My experience with embedding PostgreSQL (Jignesh Shah)&lt;br /&gt;
&lt;br /&gt;
=== Pembroke ===&lt;br /&gt;
&lt;br /&gt;
* pgBadger v.4 (Jean-Paul Argudo)&lt;br /&gt;
* Business Intelligence &amp;amp; Performance (Simon Riggs)&lt;br /&gt;
* [https://speakerdeck.com/peterg/concurrency-in-postgres Concurrency in Postgres] (Peter Geoghegan)&lt;br /&gt;
* Next generation of GIN (Alexander Korotkov, Oleg Bartunov) [http://www.sai.msu.su/~megera/postgres/talks/Next%20generation%20of%20GIN.pdf Slides(pdf)]&lt;br /&gt;
* [https://speakerdeck.com/leinweber/visualizing-postgres Visualizing Postgres] ([http://bitfission.com Will Leinweber])&lt;br /&gt;
&lt;br /&gt;
=== Lightning talks ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.slideshare.net/davidfetter/slides-pg-confeu20131031 Slides] (David Fetter)&lt;br /&gt;
* [https://wiki.postgresql.org/images/1/1c/Json-and-speed.pdf JSON &amp;amp; Speed] (Jonathan S. Katz)&lt;br /&gt;
* [https://wiki.postgresql.org/images/a/ab/Pganalyze_Lightning_talk.pdf pganalyze - Monitoring for Casual DBAs] (Michael Renner)&lt;br /&gt;
&lt;br /&gt;
== Talks: Friday 1st November, 2013 ==&lt;br /&gt;
&lt;br /&gt;
=== Earlsfort ===&lt;br /&gt;
&lt;br /&gt;
* Epic fails in the RDBMS world (Willem Leenen)&lt;br /&gt;
* Using Postgres FDW w/ a sharded PostgreSQL Database (Stephen Frost)&lt;br /&gt;
* Postgres versus an anonymous database from Redwood (Gregory Stark)&lt;br /&gt;
* Hierarchies Without Masters (Gianni Ciolli)&lt;br /&gt;
* PostgreSQL Futures (Simon Riggs)&lt;br /&gt;
* PostgreSQL in 5 years - Expectations from the market place (Keith Alsheimer)&lt;br /&gt;
* Closing (Dave Page, Magnus Hagander)&lt;br /&gt;
&lt;br /&gt;
=== Leeson ===&lt;br /&gt;
&lt;br /&gt;
* Pagination done the PostgreSQL way (Markus Winand)&lt;br /&gt;
* Postgres from Vision to Reality, ABNAMRO Client case (Michel Sijmons)&lt;br /&gt;
* PostgreSQL Backups, the good the bad and the ugly (Joshua D. Drake)&lt;br /&gt;
* Elephants in fashion (Valentine Gogichashvili)&lt;br /&gt;
&lt;br /&gt;
=== Pembroke ===&lt;br /&gt;
&lt;br /&gt;
* Agile Oracle to PostgreSQL migrations (Gabriele Bartolini)&lt;br /&gt;
* Useful PostgreSQL Extensions -- the extensions behind the scenes (Devrim GÜNDÜZ)&lt;br /&gt;
* Binary storage for nested data structures and application to hstore data type. (Oleg Bartunov, Teodor Sigaev), [http://www.sai.msu.su/~megera/postgres/talks/hstore-dublin-2013.pdf Slides(pdf)]&lt;br /&gt;
* Wiretapping the Wire Protocol: automatic data visualization for psql with Cartographer and FEMEBE (Maciek Sakrejda)&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PostgreSQL_Conference_Europe_Talks_2013&amp;diff=21116</id>
		<title>PostgreSQL Conference Europe Talks 2013</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PostgreSQL_Conference_Europe_Talks_2013&amp;diff=21116"/>
		<updated>2013-11-01T14:18:49Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Lightning talks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PostgreSQL Conference Europe 2013 Talks =&lt;br /&gt;
&lt;br /&gt;
== Conference Website ==&lt;br /&gt;
&lt;br /&gt;
http://2013.pgconf.eu/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Trainings: Tuesday 29th October, 2013 ==&lt;br /&gt;
&lt;br /&gt;
=== Dargle ===&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL &amp;amp; PostGIS (Gianni Ciolli)&lt;br /&gt;
* Writing &amp;amp; using Postgres Extensions (Dimitri Fontaine)&lt;br /&gt;
&lt;br /&gt;
=== Dodder ===&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL indexing (Hans-Jürgen Schönig)&lt;br /&gt;
&lt;br /&gt;
=== Liffey ===&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Performance Tuning (Bruce Momjian)&lt;br /&gt;
* Data Processing Inside PostgreSQL (Bruce Momjian)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Talks: Wednesday 30th October, 2013 ==&lt;br /&gt;
&lt;br /&gt;
=== Earlsfort ===&lt;br /&gt;
&lt;br /&gt;
* Keynote: Handling the Spotlight: How PostgreSQL can become the database of choice  (Mark Taylor)&lt;br /&gt;
* What&#039;s New in PostgreSQL 9.3 (Robert Treat)&lt;br /&gt;
* PostgreSQL - One of the most important Open Source projects (Michael Meskes)&lt;br /&gt;
* Going spatial with PostGIS and more (Hugo Mercier)&lt;br /&gt;
* Nulls Make Things Easier? (Bruce Momjian)&lt;br /&gt;
* PostgreSQL Disaster Recovery with Barman (Gabriele Bartolini)&lt;br /&gt;
&lt;br /&gt;
=== Leeson ===&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL for Rails (Roland Sonnenschein)&lt;br /&gt;
* Introduction of pg_statsinfo and pg_stats_reporter ~Statistics Reporting Tool for DBA~ (Mitsumasa KONDO)&lt;br /&gt;
* [http://de.slideshare.net/psoo1978/pg-fdw Writing a foreign data wrapper] (Bernd Helmle)&lt;br /&gt;
* Success stories on migrating from Sybase ASE to PostgreSQL (Achim Eisele, Jens Wilke)&lt;br /&gt;
* Multicorn: writing Foreign Data Wrappers in python (Ronan Dunklau)&lt;br /&gt;
&lt;br /&gt;
=== Pembroke ===&lt;br /&gt;
&lt;br /&gt;
* Writing a user-defined datatype (Heikki Linnakangas)&lt;br /&gt;
* LATERAL querying in 9.3; keep up with the new features! (Gianni Ciolli)&lt;br /&gt;
* Detecting performance bottlenecks (Hans-Jürgen Schönig)&lt;br /&gt;
* [http://www.slideshare.net/jkatz05/explain-the-index-of-postgresql-indexes Explaining the Index of PostgreSQL Indexes] (Jonathan S. Katz)&lt;br /&gt;
* Conduct change from Oracle to PostgreSQL (Jean-Paul Argudo)&lt;br /&gt;
&lt;br /&gt;
== Talks: Thursday 31th October, 2013 ==&lt;br /&gt;
&lt;br /&gt;
=== Earlsfort ===&lt;br /&gt;
&lt;br /&gt;
* Taking advantage of custom background workers (Michael Paquier)&lt;br /&gt;
* Doing PITR Right - There&#039;s more than just replication (Stephen Frost)&lt;br /&gt;
* [https://speakerdeck.com/craigkerstiens/postgres-what-they-really-use slides Postgres what they really use] ([http://www.craigkerstiens.com Craig Kerstiens])&lt;br /&gt;
* Indexes: The neglected performance all-rounder (Markus Winand)&lt;br /&gt;
* Migrating from MySQL to PostgreSQL (Dimitri Fontaine)&lt;br /&gt;
* Lightning talks (Harald Armin Massa)&lt;br /&gt;
&lt;br /&gt;
=== Leeson ===&lt;br /&gt;
&lt;br /&gt;
* Gotcha! Finer points of the postgres query planner and how to use them in your queries (Atri Sharma)&lt;br /&gt;
* [https://wiki.postgresql.org/images/a/ad/Materialised_views_now_and_the_future-pgconfeu_2013.pdf Materialised views now and the future] (Thom Brown)&lt;br /&gt;
* [http://www.slideshare.net/davidfetter/federation-with-foreigndatawrapperspgconfeu20131031 Federation with Foreign Data Wrappers] (David Fetter)&lt;br /&gt;
* Switching Horses Overnight - a Software Manufacturer&#039;s View on Replacing an Existing Database Management System with PostgreSQL (Robert Lichtenberger, Stefan Andreatta)&lt;br /&gt;
* My experience with embedding PostgreSQL (Jignesh Shah)&lt;br /&gt;
&lt;br /&gt;
=== Pembroke ===&lt;br /&gt;
&lt;br /&gt;
* pgBadger v.4 (Jean-Paul Argudo)&lt;br /&gt;
* Business Intelligence &amp;amp; Performance (Simon Riggs)&lt;br /&gt;
* [https://speakerdeck.com/peterg/concurrency-in-postgres Concurrency in Postgres] (Peter Geoghegan)&lt;br /&gt;
* Next generation of GIN (Alexander Korotkov, Oleg Bartunov) [http://www.sai.msu.su/~megera/postgres/talks/Next%20generation%20of%20GIN.pdf Slides(pdf)]&lt;br /&gt;
* [https://speakerdeck.com/leinweber/visualizing-postgres Visualizing Postgres] ([http://bitfission.com Will Leinweber])&lt;br /&gt;
&lt;br /&gt;
=== Lightning talks ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.slideshare.net/davidfetter/slides-pg-confeu20131031 Slides] (David Fetter)&lt;br /&gt;
* [https://wiki.postgresql.org/images/1/1c/Json-and-speed.pdf JSON &amp;amp; Speed] (Jonathan S. Katz)&lt;br /&gt;
* [https://wiki.postgresql.org/images/a/ab/Pganalyze_Lightning_talk.pdf pganalyze - Monitoring for Casual DBAs] (Michael Renner&lt;br /&gt;
&lt;br /&gt;
== Talks: Friday 1st November, 2013 ==&lt;br /&gt;
&lt;br /&gt;
=== Earlsfort ===&lt;br /&gt;
&lt;br /&gt;
* Epic fails in the RDBMS world (Willem Leenen)&lt;br /&gt;
* Using Postgres FDW w/ a sharded PostgreSQL Database (Stephen Frost)&lt;br /&gt;
* Postgres versus an anonymous database from Redwood (Gregory Stark)&lt;br /&gt;
* Hierarchies Without Masters (Gianni Ciolli)&lt;br /&gt;
* PostgreSQL Futures (Simon Riggs)&lt;br /&gt;
* PostgreSQL in 5 years - Expectations from the market place (Keith Alsheimer)&lt;br /&gt;
* Closing (Dave Page, Magnus Hagander)&lt;br /&gt;
&lt;br /&gt;
=== Leeson ===&lt;br /&gt;
&lt;br /&gt;
* Pagination done the PostgreSQL way (Markus Winand)&lt;br /&gt;
* Postgres from Vision to Reality, ABNAMRO Client case (Michel Sijmons)&lt;br /&gt;
* PostgreSQL Backups, the good the bad and the ugly (Joshua D. Drake)&lt;br /&gt;
* Elephants in fashion (Valentine Gogichashvili)&lt;br /&gt;
&lt;br /&gt;
=== Pembroke ===&lt;br /&gt;
&lt;br /&gt;
* Agile Oracle to PostgreSQL migrations (Gabriele Bartolini)&lt;br /&gt;
* Useful PostgreSQL Extensions -- the extensions behind the scenes (Devrim GÜNDÜZ)&lt;br /&gt;
* Binary storage for nested data structures and application to hstore data type. (Oleg Bartunov, Teodor Sigaev), [http://www.sai.msu.su/~megera/postgres/talks/hstore-dublin-2013.pdf Slides(pdf)]&lt;br /&gt;
* Wiretapping the Wire Protocol: automatic data visualization for psql with Cartographer and FEMEBE (Maciek Sakrejda)&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=File:Pganalyze_Lightning_talk.pdf&amp;diff=21114</id>
		<title>File:Pganalyze Lightning talk.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=File:Pganalyze_Lightning_talk.pdf&amp;diff=21114"/>
		<updated>2013-11-01T14:17:40Z</updated>

		<summary type="html">&lt;p&gt;Robe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21069</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21069"/>
		<updated>2013-10-31T16:47:54Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* CLI tools */ heading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== CLI tools ===&lt;br /&gt;
&lt;br /&gt;
==== pg_view ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://tech.zalando.com/getting-a-quick-view-of-your-postgresql-stats/ pg_view]&amp;lt;/tt&amp;gt; is a Python-based tool to quickly get information about running databases and resources used by them as well as correlate running queries and why they might be slow.&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
There has been work done on building a Postgres template for [http://www.cacti.net/ Cacti], Details can be found at the [[Cacti]] page.&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
[http://www.enterprisedb.com/products-services-training/products/postgres-enterprise-manager Postgres Enterprise Manager] is a commercial application offered by EnterpriseDB which covers many aspects of Postgres operations &amp;amp; monitoring in large environments.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
[https://pganalyze.com/ pganalyze] is a commercial SaaS offering which focuses on performance monitoring and automated tuning suggestions.&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
[http://www.cybertec.at/en/products/pgwatch-cybertec-enterprise-postgresql-monitor/ pgwatch] is a PHP web application which offers interactive graphs for relevant Postgres data.&lt;br /&gt;
&lt;br /&gt;
==== pg_statsinfo &amp;amp; pg_stats_reporter ====&lt;br /&gt;
&lt;br /&gt;
[http://pgstatsinfo.projects.pgfoundry.org/ pg_statsinfo] is a Postgres extension that collects lots of performance-relevant information inside the Postgres server which then can be aggregated by pg_stats_reporter instances which provide a web interface to the collected data. Both are FOSS software maintained by NTT.&lt;br /&gt;
&lt;br /&gt;
==== PGObserver ====&lt;br /&gt;
&lt;br /&gt;
[http://zalando.github.io/PGObserver/ PGObserver] is a Python &amp;amp; Java-based Postgres monitoring solution developed by Zalando. It was developed with a focus on stored procedure performance but extended well beyond that. &lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21068</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21068"/>
		<updated>2013-10-31T16:47:29Z</updated>

		<summary type="html">&lt;p&gt;Robe: pg_view&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== CLI tools ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://tech.zalando.com/getting-a-quick-view-of-your-postgresql-stats/ pg_view]&amp;lt;/tt&amp;gt; is a Python-based tool to quickly get information about running databases and resources used by them as well as correlate running queries and why they might be slow.&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
There has been work done on building a Postgres template for [http://www.cacti.net/ Cacti], Details can be found at the [[Cacti]] page.&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
[http://www.enterprisedb.com/products-services-training/products/postgres-enterprise-manager Postgres Enterprise Manager] is a commercial application offered by EnterpriseDB which covers many aspects of Postgres operations &amp;amp; monitoring in large environments.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
[https://pganalyze.com/ pganalyze] is a commercial SaaS offering which focuses on performance monitoring and automated tuning suggestions.&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
[http://www.cybertec.at/en/products/pgwatch-cybertec-enterprise-postgresql-monitor/ pgwatch] is a PHP web application which offers interactive graphs for relevant Postgres data.&lt;br /&gt;
&lt;br /&gt;
==== pg_statsinfo &amp;amp; pg_stats_reporter ====&lt;br /&gt;
&lt;br /&gt;
[http://pgstatsinfo.projects.pgfoundry.org/ pg_statsinfo] is a Postgres extension that collects lots of performance-relevant information inside the Postgres server which then can be aggregated by pg_stats_reporter instances which provide a web interface to the collected data. Both are FOSS software maintained by NTT.&lt;br /&gt;
&lt;br /&gt;
==== PGObserver ====&lt;br /&gt;
&lt;br /&gt;
[http://zalando.github.io/PGObserver/ PGObserver] is a Python &amp;amp; Java-based Postgres monitoring solution developed by Zalando. It was developed with a focus on stored procedure performance but extended well beyond that. &lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21067</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21067"/>
		<updated>2013-10-31T16:41:06Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Postgres-centric monitoring solutions */ pgobserver&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
There has been work done on building a Postgres template for [http://www.cacti.net/ Cacti], Details can be found at the [[Cacti]] page.&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
[http://www.enterprisedb.com/products-services-training/products/postgres-enterprise-manager Postgres Enterprise Manager] is a commercial application offered by EnterpriseDB which covers many aspects of Postgres operations &amp;amp; monitoring in large environments.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
[https://pganalyze.com/ pganalyze] is a commercial SaaS offering which focuses on performance monitoring and automated tuning suggestions.&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
[http://www.cybertec.at/en/products/pgwatch-cybertec-enterprise-postgresql-monitor/ pgwatch] is a PHP web application which offers interactive graphs for relevant Postgres data.&lt;br /&gt;
&lt;br /&gt;
==== pg_statsinfo &amp;amp; pg_stats_reporter ====&lt;br /&gt;
&lt;br /&gt;
[http://pgstatsinfo.projects.pgfoundry.org/ pg_statsinfo] is a Postgres extension that collects lots of performance-relevant information inside the Postgres server which then can be aggregated by pg_stats_reporter instances which provide a web interface to the collected data. Both are FOSS software maintained by NTT.&lt;br /&gt;
&lt;br /&gt;
==== PGObserver ====&lt;br /&gt;
&lt;br /&gt;
[http://zalando.github.io/PGObserver/ PGObserver] is a Python &amp;amp; Java-based Postgres monitoring solution developed by Zalando. It was developed with a focus on stored procedure performance but extended well beyond that. &lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21059</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21059"/>
		<updated>2013-10-30T14:08:23Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Postgres-centric monitoring solutions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
There has been work done on building a Postgres template for [http://www.cacti.net/ Cacti], Details can be found at the [[Cacti]] page.&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
[http://www.enterprisedb.com/products-services-training/products/postgres-enterprise-manager Postgres Enterprise Manager] is a commercial application offered by EnterpriseDB which covers many aspects of Postgres operations &amp;amp; monitoring in large environments.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
[https://pganalyze.com/ pganalyze] is a commercial SaaS offering which focuses on performance monitoring and automated tuning suggestions.&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
[http://www.cybertec.at/en/products/pgwatch-cybertec-enterprise-postgresql-monitor/ pgwatch] is a PHP web application which offers interactive graphs for relevant Postgres data.&lt;br /&gt;
&lt;br /&gt;
==== pg_statsinfo &amp;amp; pg_stats_reporter ====&lt;br /&gt;
&lt;br /&gt;
[http://pgstatsinfo.projects.pgfoundry.org/ pg_statsinfo] is a Postgres extension that collects lots of performance-relevant information inside the Postgres server which then can be aggregated by pg_stats_reporter instances which provide a web interface to the collected data. Both are FOSS software maintained by NTT.&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=User:Robe&amp;diff=21009</id>
		<title>User:Robe</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=User:Robe&amp;diff=21009"/>
		<updated>2013-10-22T15:36:02Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Ideas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ad personam =&lt;br /&gt;
&lt;br /&gt;
Michael Renner&lt;br /&gt;
http://amd.co.at/&lt;br /&gt;
&lt;br /&gt;
= Scribbles = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
After looking into Syslog per suggestions of pgfouine it seems as if Syslog-Logs are much easier to parse and overall more deterministic than &amp;quot;Standard&amp;quot; Logs.&lt;br /&gt;
&lt;br /&gt;
The main advantages are:&lt;br /&gt;
&lt;br /&gt;
* PID and&lt;br /&gt;
* per-backend Linecounter allow clear identification of interleaved/mangled messages&lt;br /&gt;
* Per-&amp;quot;chunk&amp;quot; identifier allows to identify lines which belong to the same log event.&lt;br /&gt;
&lt;br /&gt;
=== Standard Syslog Output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Oct  8 20:48:26 fst-prod-indexrevdb01 postgres[18134]: [6459-1] 2008-10-08 20:48:26 UTC ERROR:  duplicate key value violates unique constraint &amp;quot;newsgroups_name_key&amp;quot;&lt;br /&gt;
Oct  8 20:48:26 fst-prod-indexrevdb01 postgres[18134]: [6459-2] 2008-10-08 20:48:26 UTC STATEMENT:  insert into newsgroups&lt;br /&gt;
Oct  8 20:48:26 fst-prod-indexrevdb01 postgres[18134]: [6459-3]  (name,kategorie,first_art,last_art,last_checked,num_articles,num_files,num_threads,server,days_to_keep)&lt;br /&gt;
Oct  8 20:48:26 fst-prod-indexrevdb01 postgres[18134]: [6459-4]  values($1,&#039;--&#039;,$2,$3,0,$4,0,0,$5,$6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Logging Output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2008-10-05 05:29:20 UTC ERROR:  duplicate key value violates unique constraint &amp;quot;newsgroups_name_key&amp;quot;&lt;br /&gt;
2008-10-05 05:29:20 UTC STATEMENT:  insert into newsgroups (name,kategorie,first_art,last_art,last_checked,num_articles,num_files,num_threads,server,days_to_keep) values($1,&#039;--&#039;,$2,$3,0,$4,0,0,$5,$6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Syslog-Emulation ===&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;tt&amp;gt;log_line_prefix = &#039;%t postgres[%p]: [%l-1] &#039;&amp;lt;/tt&amp;gt; you can achieve the following output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2008-10-08 21:20:46 UTC postgres[30545]: [12911-1] ERROR:  duplicate key value violates unique constraint &amp;quot;newsgroups_name_key&amp;quot;&lt;br /&gt;
2008-10-08 21:20:46 UTC postgres[30545]: [12912-1] STATEMENT:  insert into newsgroups (name,kategorie,first_art,last_art,last_checked,num_articles,num_files,num_threads,server,days_to_keep) values($1&lt;br /&gt;
,&#039;--&#039;,$2,$3,0,$4,0,0,$5,$6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which is already much more deterministic than the defaults.&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21008</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21008"/>
		<updated>2013-10-22T15:23:28Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* pgwatch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
There has been work done on building a Postgres template for [http://www.cacti.net/ Cacti], Details can be found at the [[Cacti]] page.&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
[http://www.enterprisedb.com/products-services-training/products/postgres-enterprise-manager Postgres Enterprise Manager] is a commercial application offered by EnterpriseDB which covers many aspects of Postgres operations &amp;amp; monitoring in large environments.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
[https://pganalyze.com/ pganalyze] is a commercial SaaS offering which focuses on performance monitoring and automated tuning suggestions.&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
[http://www.cybertec.at/en/products/pgwatch-cybertec-enterprise-postgresql-monitor/ pgwatch] is a PHP web application which offers interactive graphs for relevant Postgres data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21007</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21007"/>
		<updated>2013-10-22T15:20:52Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* pganalyze */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
There has been work done on building a Postgres template for [http://www.cacti.net/ Cacti], Details can be found at the [[Cacti]] page.&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
[http://www.enterprisedb.com/products-services-training/products/postgres-enterprise-manager Postgres Enterprise Manager] is a commercial application offered by EnterpriseDB which covers many aspects of Postgres operations &amp;amp; monitoring in large environments.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
[https://pganalyze.com/ pganalyze] is a commercial SaaS offering which focuses on performance monitoring and automated tuning suggestions.&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21006</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21006"/>
		<updated>2013-10-22T15:10:06Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* EnterpriseDB Postgres Enterprise Manager */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
There has been work done on building a Postgres template for [http://www.cacti.net/ Cacti], Details can be found at the [[Cacti]] page.&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
[http://www.enterprisedb.com/products-services-training/products/postgres-enterprise-manager Postgres Enterprise Manager] is a commercial application offered by EnterpriseDB which covers many aspects of Postgres operations &amp;amp; monitoring in large environments.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21005</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21005"/>
		<updated>2013-10-22T15:00:57Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Cacti */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
There has been work done on building a Postgres template for [http://www.cacti.net/ Cacti], Details can be found at the [[Cacti]] page.&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21004</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21004"/>
		<updated>2013-10-22T14:55:43Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* NewRelic */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
[http://newrelic.com/ NewRelic] is a commercial SaaS application monitoring solution which offers a [https://newrelic.com/plugins/enterprisedb-corporation/30 PostgreSQL plugin] maintained by EnterpriseDB.&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21003</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21003"/>
		<updated>2013-10-22T14:52:12Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Munin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL Plugins developed in Perl are included in the Core [http://munin-monitoring.org/ Munin] Distribution. The following plugins are included by default: &amp;lt;tt&amp;gt;postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://aouyar.github.com/PyMunin/ PyMunin] includes a Multigraph Munin Plugin written in Python that implements the following graphs: &amp;lt;tt&amp;gt;pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detailed setup instructions for common Linux platforms can be found at [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ highperfpostgres.com]&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21002</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21002"/>
		<updated>2013-10-22T14:46:37Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Interfaces &amp;amp; collectors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
These tools either offer an interface to PostgreSQL monitoring-relevant data or can aggregate and prepare them for other systems.&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://pgsnmpd.projects.postgresql.org/ pgsnmpd]&amp;lt;/tt&amp;gt; can run as a standalone SNMP server and implements the [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS [http://en.wikipedia.org/wiki/Management_information_base MIB]&lt;br /&gt;
&lt;br /&gt;
This is useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/pganalyze/pganalyze-collector pganalyze-collector]&amp;lt;/tt&amp;gt; is a tool which collects &amp;lt;tt&amp;gt;pg_stat_plans&amp;lt;/tt&amp;gt; query information as well as various performance-relevant database parameters and converts them into a JSON structure for easy ingestion in other systems.&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Plugins developed in Perl are included in the Core Munin Distribution. The following plugins are included by default: postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_.&lt;br /&gt;
* [http://aouyar.github.com/PyMunin/ PyMunin - Multigraph Munin Plugins in Python] - PyMunin includes a Multigraph Munin Plugin for PostgreSQL that implements the following graphs: pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail.&lt;br /&gt;
* [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ PostgreSQL Monitoring With Munin].  Detailed setup instructions for common Linux platforms.&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21001</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21001"/>
		<updated>2013-10-22T14:39:14Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* check_postgres */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://bucardo.org/wiki/Check_postgres check_postgres]&amp;lt;/tt&amp;gt; is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
Useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
* [http://pgsnmpd.projects.postgresql.org/ pgsnmpd] implements [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS MIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Plugins developed in Perl are included in the Core Munin Distribution. The following plugins are included by default: postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_.&lt;br /&gt;
* [http://aouyar.github.com/PyMunin/ PyMunin - Multigraph Munin Plugins in Python] - PyMunin includes a Multigraph Munin Plugin for PostgreSQL that implements the following graphs: pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail.&lt;br /&gt;
* [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ PostgreSQL Monitoring With Munin].  Detailed setup instructions for common Linux platforms.&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21000</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=21000"/>
		<updated>2013-10-22T14:38:34Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* check_postgres */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[check_postgres http://bucardo.org/wiki/Check_postgres] is a command line tool which is designed to be run from software like Icinga, MRTG or as a standalone tool. It can monitor many aspects of the database and trigger warnings when thresholds are violated.&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
Useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
* [http://pgsnmpd.projects.postgresql.org/ pgsnmpd] implements [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS MIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Plugins developed in Perl are included in the Core Munin Distribution. The following plugins are included by default: postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_.&lt;br /&gt;
* [http://aouyar.github.com/PyMunin/ PyMunin - Multigraph Munin Plugins in Python] - PyMunin includes a Multigraph Munin Plugin for PostgreSQL that implements the following graphs: pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail.&lt;br /&gt;
* [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ PostgreSQL Monitoring With Munin].  Detailed setup instructions for common Linux platforms.&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20999</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20999"/>
		<updated>2013-10-22T14:29:25Z</updated>

		<summary type="html">&lt;p&gt;Robe: new outline&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== External projects ==&lt;br /&gt;
&lt;br /&gt;
=== Checkers === &lt;br /&gt;
&lt;br /&gt;
==== check_postgres ====&lt;br /&gt;
&lt;br /&gt;
=== Interfaces &amp;amp; collectors ===&lt;br /&gt;
&lt;br /&gt;
==== pgsnmpd ====&lt;br /&gt;
&lt;br /&gt;
Useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
* [http://pgsnmpd.projects.postgresql.org/ pgsnmpd] implements [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS MIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pganalyze-collector ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Generic monitoring solutions with plugins ===&lt;br /&gt;
&lt;br /&gt;
==== Munin ====&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Plugins developed in Perl are included in the Core Munin Distribution. The following plugins are included by default: postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_.&lt;br /&gt;
* [http://aouyar.github.com/PyMunin/ PyMunin - Multigraph Munin Plugins in Python] - PyMunin includes a Multigraph Munin Plugin for PostgreSQL that implements the following graphs: pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail.&lt;br /&gt;
* [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ PostgreSQL Monitoring With Munin].  Detailed setup instructions for common Linux platforms.&lt;br /&gt;
&lt;br /&gt;
==== NewRelic ====&lt;br /&gt;
&lt;br /&gt;
==== Cacti ====&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Postgres-centric monitoring solutions ===&lt;br /&gt;
&lt;br /&gt;
==== EnterpriseDB Postgres Enterprise Manager ====&lt;br /&gt;
&lt;br /&gt;
==== pganalyze ====&lt;br /&gt;
&lt;br /&gt;
==== pgwatch ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20998</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20998"/>
		<updated>2013-10-22T14:10:44Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* pg_buffercache */ formatting fail&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache]&amp;lt;/tt&amp;gt; gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== Monitoring PostgreSQL with [http://munin-monitoring.org Munin]  ==&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Plugins developed in Perl are included in the Core Munin Distribution. The following plugins are included by default: postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_.&lt;br /&gt;
* [http://aouyar.github.com/PyMunin/ PyMunin - Multigraph Munin Plugins in Python] - PyMunin includes a Multigraph Munin Plugin for PostgreSQL that implements the following graphs: pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail.&lt;br /&gt;
* [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ PostgreSQL Monitoring With Munin].  Detailed setup instructions for common Linux platforms.&lt;br /&gt;
&lt;br /&gt;
== Cacti ==&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
== SNMP agent ==&lt;br /&gt;
&lt;br /&gt;
Useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
* [http://pgsnmpd.projects.postgresql.org/ pgsnmpd] implements [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS MIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20997</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20997"/>
		<updated>2013-10-22T14:10:24Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* pg_buffercache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgbuffercache.html pg_buffercache] gives you introspection into Postgres&#039; [http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS shared buffers], showing how many pages of which relations are currently held in the cache.&lt;br /&gt;
&lt;br /&gt;
== Monitoring PostgreSQL with [http://munin-monitoring.org Munin]  ==&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Plugins developed in Perl are included in the Core Munin Distribution. The following plugins are included by default: postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_.&lt;br /&gt;
* [http://aouyar.github.com/PyMunin/ PyMunin - Multigraph Munin Plugins in Python] - PyMunin includes a Multigraph Munin Plugin for PostgreSQL that implements the following graphs: pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail.&lt;br /&gt;
* [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ PostgreSQL Monitoring With Munin].  Detailed setup instructions for common Linux platforms.&lt;br /&gt;
&lt;br /&gt;
== Cacti ==&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
== SNMP agent ==&lt;br /&gt;
&lt;br /&gt;
Useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
* [http://pgsnmpd.projects.postgresql.org/ pgsnmpd] implements [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS MIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20996</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20996"/>
		<updated>2013-10-22T14:06:23Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* pgstattuple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstattuple.html pgstattuple]&amp;lt;/tt&amp;gt; can generate statistics for tables and indexes, showing how much space in each table &amp;amp; index is consumed by live tuples, deleted tuples as well as how much unused space is available in each relation.&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
== Monitoring PostgreSQL with [http://munin-monitoring.org Munin]  ==&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Plugins developed in Perl are included in the Core Munin Distribution. The following plugins are included by default: postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_.&lt;br /&gt;
* [http://aouyar.github.com/PyMunin/ PyMunin - Multigraph Munin Plugins in Python] - PyMunin includes a Multigraph Munin Plugin for PostgreSQL that implements the following graphs: pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail.&lt;br /&gt;
* [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ PostgreSQL Monitoring With Munin].  Detailed setup instructions for common Linux platforms.&lt;br /&gt;
&lt;br /&gt;
== Cacti ==&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
== SNMP agent ==&lt;br /&gt;
&lt;br /&gt;
Useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
* [http://pgsnmpd.projects.postgresql.org/ pgsnmpd] implements [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS MIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20995</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20995"/>
		<updated>2013-10-22T14:03:00Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* pg_stat_plans */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[https://github.com/2ndQuadrant/pg_stat_plans pg_stat_plans]&amp;lt;/tt&amp;gt; extends on pg_stat_statements and records query plans for all executed quries. This is very helpful when you&#039;re experiencing performance regressions due to inefficient query plans due to changed parameters or table sizes.&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
== Monitoring PostgreSQL with [http://munin-monitoring.org Munin]  ==&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Plugins developed in Perl are included in the Core Munin Distribution. The following plugins are included by default: postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_.&lt;br /&gt;
* [http://aouyar.github.com/PyMunin/ PyMunin - Multigraph Munin Plugins in Python] - PyMunin includes a Multigraph Munin Plugin for PostgreSQL that implements the following graphs: pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail.&lt;br /&gt;
* [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ PostgreSQL Monitoring With Munin].  Detailed setup instructions for common Linux platforms.&lt;br /&gt;
&lt;br /&gt;
== Cacti ==&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
== SNMP agent ==&lt;br /&gt;
&lt;br /&gt;
Useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
* [http://pgsnmpd.projects.postgresql.org/ pgsnmpd] implements [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS MIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20994</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20994"/>
		<updated>2013-10-22T14:01:16Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* pg_stat_statements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;[http://www.postgresql.org/docs/current/static/pgstatstatements.html pg_stat_statements]&amp;lt;/tt&amp;gt; tracks all queries that are executed on the server and records average runtime per query &amp;quot;class&amp;quot; among other parameters.&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
== Monitoring PostgreSQL with [http://munin-monitoring.org Munin]  ==&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Plugins developed in Perl are included in the Core Munin Distribution. The following plugins are included by default: postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_.&lt;br /&gt;
* [http://aouyar.github.com/PyMunin/ PyMunin - Multigraph Munin Plugins in Python] - PyMunin includes a Multigraph Munin Plugin for PostgreSQL that implements the following graphs: pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail.&lt;br /&gt;
* [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ PostgreSQL Monitoring With Munin].  Detailed setup instructions for common Linux platforms.&lt;br /&gt;
&lt;br /&gt;
== Cacti ==&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
== SNMP agent ==&lt;br /&gt;
&lt;br /&gt;
Useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
* [http://pgsnmpd.projects.postgresql.org/ pgsnmpd] implements [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS MIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20993</id>
		<title>Monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Monitoring&amp;diff=20993"/>
		<updated>2013-10-22T13:47:39Z</updated>

		<summary type="html">&lt;p&gt;Robe: Start work on postgres contrib extensions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PostgreSQL builtin &amp;amp; contrib ==&lt;br /&gt;
&lt;br /&gt;
=== Statistics collector ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL collects lots of data on its own and offers it via the &amp;lt;tt&amp;gt;pg_stat(io)_&amp;lt;/tt&amp;gt; system views&lt;br /&gt;
&lt;br /&gt;
* Official documentation on the [http://www.postgresql.org/docs/current/static/monitoring-stats.html Statistics Collector]&lt;br /&gt;
* [http://www.varlena.com/GeneralBits/107.php Interpreting pg_stat Views]&lt;br /&gt;
&lt;br /&gt;
=== contrib extensions ===&lt;br /&gt;
&lt;br /&gt;
The following extensions offer access to Postgres internals which may be of interest or collect additional information. Most of them are shipped with Postgres (the &amp;lt;tt&amp;gt;-contrib&amp;lt;/tt&amp;gt; packages may need to be installed) and can be activated via the [http://www.postgresql.org/docs/current/static/sql-createextension.html extension interface].&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_statements ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== pg_stat_plans ====&lt;br /&gt;
&lt;br /&gt;
==== pgstattuple ====&lt;br /&gt;
&lt;br /&gt;
==== pg_buffercache ====&lt;br /&gt;
&lt;br /&gt;
== Monitoring PostgreSQL with [http://munin-monitoring.org Munin]  ==&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL Plugins developed in Perl are included in the Core Munin Distribution. The following plugins are included by default: postgres_bgwriter, postgres_locks_, postgres_tuples_, postgres_cache_, postgres_querylength_, postgres_users, postgres_checkpoints, postgres_scans_, postgres_xlog, postgres_connections_, postgres_size_, postgres_connections_db, postgres_transactions_.&lt;br /&gt;
* [http://aouyar.github.com/PyMunin/ PyMunin - Multigraph Munin Plugins in Python] - PyMunin includes a Multigraph Munin Plugin for PostgreSQL that implements the following graphs: pg_connections, pg_diskspace, pg_blockreads, pg_xact, pg_tup_read, pg_tup_write, pg_blockreads_detail, pg_xact_commit_detail, pg_xact_rollback_detail, pg_tup_return_detail, pg_tup_fetch_detail, pg_tup_delete_detail, pg_tup_update_detail, pg_tup_insert_detail.&lt;br /&gt;
* [http://highperfpostgres.com/guides/postgresql-monitoring-with-munin/ PostgreSQL Monitoring With Munin].  Detailed setup instructions for common Linux platforms.&lt;br /&gt;
&lt;br /&gt;
== Cacti ==&lt;br /&gt;
&lt;br /&gt;
* [[Cacti]]&lt;br /&gt;
&lt;br /&gt;
== SNMP agent ==&lt;br /&gt;
&lt;br /&gt;
Useful for network management systems which are limited to SNMP protocol.&lt;br /&gt;
&lt;br /&gt;
* [http://pgsnmpd.projects.postgresql.org/ pgsnmpd] implements [http://www.faqs.org/rfcs/rfc1697.html RFC 1697 MIB] which is generic RDBMS MIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Monitoring|!]]&lt;br /&gt;
[[Category:Performance]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Shared_Database_Hosting&amp;diff=20296</id>
		<title>Shared Database Hosting</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Shared_Database_Hosting&amp;diff=20296"/>
		<updated>2013-06-26T10:08:35Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* PostgreSQL issues that affect shared hosting */ pg_terminate_backend implemented since 8.4, dropping caveat/problem&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The objective of this page is to provide a place to exchange ideas on how&lt;br /&gt;
best to run PostgreSQL in a shared hosting environment as suggested [http://archives.postgresql.org/pgsql-admin/2008-08/msg00073.php here].&lt;br /&gt;
If you are interested in debating the intrinsics of running PostgreSQL under similiar preconditions, please contact me directly by email at &#039;&#039;&#039;jacob at internet24 dot de&#039;&#039;&#039;, as I only check this site rather infrequently and the change notification system doesn&#039;t seem to work for me.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Defining shared hosting ==&lt;br /&gt;
&lt;br /&gt;
For the purpose&lt;br /&gt;
of this document, shared database hosting is the process of running PostgreSQL clusters for the benifit of third parties (henceforth called &#039;&#039;&#039;customers&#039;&#039;&#039;) by a DBMS management authority (the &#039;&#039;&#039;hosting provider&#039;&#039;&#039;). Customers have no organizational relationship&lt;br /&gt;
to each other but each one has a relationship to the hosting provider. Customers typically require complete control over a small number of databases but do not want to manage their own PostgreSQL cluster. Sharing the resources of a single cluster system among many customers is economically attractive.&lt;br /&gt;
&lt;br /&gt;
== Goals of a shared hosting setup ==&lt;br /&gt;
&lt;br /&gt;
# Complete isolation of customers from each other&lt;br /&gt;
# Standardized procedures for creating and deleting databases and users&lt;br /&gt;
&lt;br /&gt;
== Approaches ==&lt;br /&gt;
&lt;br /&gt;
=== Approach 1 ===&lt;br /&gt;
&lt;br /&gt;
* Manage cluster only via access to a super user account&lt;br /&gt;
** no permanent modification of pg_hba.conf etc. required&lt;br /&gt;
** central managing system can manage several clusters without the need for additional control channels&lt;br /&gt;
* Customers cannot directly create new roles and databases&lt;br /&gt;
* Each customer database is given an associated &#039;&#039;&#039;main user&#039;&#039;&#039;&lt;br /&gt;
** acting as a database local super user&lt;br /&gt;
** typically creates and owns all objects&lt;br /&gt;
* The can be a number of additional users per database&lt;br /&gt;
** Rights of these users are granted by the main user&lt;br /&gt;
&lt;br /&gt;
==== pg_hba.conf ====&lt;br /&gt;
&lt;br /&gt;
We allow TCP/IP access to all databases in&lt;br /&gt;
the cluster using md5 authentication from&lt;br /&gt;
the local hosting network. A role can only&lt;br /&gt;
login if it is member of a role that has the&lt;br /&gt;
same name as the database.&lt;br /&gt;
&lt;br /&gt;
 #host samerole all hosting_network md5&lt;br /&gt;
 host samerole all 192.168.0.0/24 md5&lt;br /&gt;
&lt;br /&gt;
==== template1 ====&lt;br /&gt;
&lt;br /&gt;
We modify template1 to revoke all rights&lt;br /&gt;
from &amp;quot;PUBLIC&amp;quot; to the public schema, to prevent&lt;br /&gt;
access to the public schema of indiviudial customer&lt;br /&gt;
databases by other customers. Also we add support&lt;br /&gt;
for PL/PGSQL.&lt;br /&gt;
&lt;br /&gt;
 psql -U postgres template1 -f - &amp;lt;&amp;lt; EOT&lt;br /&gt;
 &lt;br /&gt;
 REVOKE ALL ON DATABASE template1 FROM public;&lt;br /&gt;
 REVOKE ALL ON SCHEMA public FROM public;&lt;br /&gt;
 GRANT ALL ON SCHEMA public TO postgres;&lt;br /&gt;
 CREATE LANGUAGE plpgsql;&lt;br /&gt;
 &lt;br /&gt;
 EOT&lt;br /&gt;
&lt;br /&gt;
If you deem it acceptable to break certain PostgreSQL&lt;br /&gt;
management applications (pgadmin, phppgadmin, parts of psql&#039;s functionality), &lt;br /&gt;
then you could also revoke some more rights from pg_catalog to &amp;quot;resolve&amp;quot; problem&lt;br /&gt;
1 in the last section of this document:&lt;br /&gt;
&lt;br /&gt;
 psql -U postgres template1 -f - &amp;lt;&amp;lt; EOT&lt;br /&gt;
 &lt;br /&gt;
 REVOKE ALL ON pg_user FROM public;&lt;br /&gt;
 REVOKE ALL ON pg_roles FROM public;&lt;br /&gt;
 REVOKE ALL ON pg_group FROM public;&lt;br /&gt;
 REVOKE ALL ON pg_authid FROM public;&lt;br /&gt;
 REVOKE ALL ON pg_auth_members FROM public;&lt;br /&gt;
 &lt;br /&gt;
 REVOKE ALL ON pg_database FROM public;&lt;br /&gt;
 REVOKE ALL ON pg_tablespace FROM public;&lt;br /&gt;
 REVOKE ALL ON pg_settings FROM public;&lt;br /&gt;
&lt;br /&gt;
 EOT&lt;br /&gt;
&lt;br /&gt;
==== Creating a new database + main user ====&lt;br /&gt;
&lt;br /&gt;
We create a role without any special access&lt;br /&gt;
rights named after our planned database name&lt;br /&gt;
and a login role for our main user &lt;br /&gt;
that becomes a member of the former role. Then&lt;br /&gt;
we create the database with the main user&lt;br /&gt;
as its owner. Finally we grant all rights&lt;br /&gt;
to the public schema in the new database&lt;br /&gt;
to the main user&lt;br /&gt;
&lt;br /&gt;
 psql -U postgres template1 -f - &amp;lt;&amp;lt;EOT&lt;br /&gt;
 &lt;br /&gt;
 CREATE ROLE &amp;lt;DBNAME&amp;gt; NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT NOLOGIN;&lt;br /&gt;
 CREATE ROLE &amp;lt;DBMAINUSER&amp;gt; NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN ENCRYPTED PASSWORD &#039;&amp;lt;DBMAINUSERPASS&amp;gt;&#039;;&lt;br /&gt;
 GRANT &amp;lt;DBNAME&amp;gt; TO &amp;lt;DBMAINUSER&amp;gt;;&lt;br /&gt;
 CREATE DATABASE &amp;lt;DBNAME&amp;gt; WITH OWNER=&amp;lt;DBMAINUSER&amp;gt;;&lt;br /&gt;
 REVOKE ALL ON DATABASE &amp;lt;DBNAME&amp;gt; FROM public;&lt;br /&gt;
 &lt;br /&gt;
 EOT&lt;br /&gt;
&lt;br /&gt;
 psql -U postgres &amp;lt;DBNAME&amp;gt; -f - &amp;lt;&amp;lt;EOT&lt;br /&gt;
 &lt;br /&gt;
 GRANT ALL ON SCHEMA public TO &amp;lt;DBMAINUSER&amp;gt; WITH GRANT OPTION;&lt;br /&gt;
 &lt;br /&gt;
 EOT&lt;br /&gt;
&lt;br /&gt;
==== Create an additional user ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 psql -U postgres &amp;lt;DBNAME&amp;gt; -f - &amp;lt;&amp;lt;EOT&lt;br /&gt;
 &lt;br /&gt;
 CREATE ROLE &amp;lt;DBEXTRAUSER&amp;gt; NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN ENCRYPTED PASSWORD &#039;&amp;lt;DBEXTRAUSERPASS&amp;gt;&#039;;&lt;br /&gt;
 GRANT USAGE ON SCHEMA public TO &amp;lt;DBEXTRAUSER&amp;gt;;&lt;br /&gt;
 GRANT CONNECT,TEMPORARY ON DATABASE &amp;lt;DBNAME&amp;gt; TO &amp;lt;DBEXTRAUSER&amp;gt;;&lt;br /&gt;
 GRANT &amp;lt;DBNAME&amp;gt; TO &amp;lt;DBEXTRAUSER&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
 EOT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Remove an additional user ====&lt;br /&gt;
&lt;br /&gt;
 psql -U postgres &amp;lt;DBNAME&amp;gt; -f - &amp;lt;&amp;lt;EOT&lt;br /&gt;
 &lt;br /&gt;
 -- REMOVE ALL PERMISSIONS FROM ALL OBJECTS OWNED BY DBEXTRAUSER&lt;br /&gt;
 -- TERMINATE CONNECTIONS OF DBEXTRAUSER&lt;br /&gt;
 REASSIGN OWNED BY &amp;lt;DBEXTRAUSER&amp;gt; TO &amp;lt;DBMAINUSER&amp;gt;;&lt;br /&gt;
 DROP ROLE &amp;lt;DBEXTRAUSER&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 EOT&lt;br /&gt;
&lt;br /&gt;
==== Remove a database + main user ====&lt;br /&gt;
&lt;br /&gt;
 psql -U postgres template1 -f - &amp;lt;&amp;lt;EOT&lt;br /&gt;
 &lt;br /&gt;
 -- TERMINATE CONNECTIONS OF ALL USERS CONNECTED TO &amp;lt;DBNAME&amp;gt;&lt;br /&gt;
 DROP DATABASE &amp;lt;DBNAME&amp;gt;;&lt;br /&gt;
 DROP ROLE &amp;lt;DBMAINUSER&amp;gt;&lt;br /&gt;
 DROP ROLE &amp;lt;DBNAME&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 EOT&lt;br /&gt;
&lt;br /&gt;
== PostgreSQL issues that affect shared hosting ==&lt;br /&gt;
&lt;br /&gt;
This is meant to be a list of problem areas where the current&lt;br /&gt;
PostgreSQL version leaves something to be desired with respect to&lt;br /&gt;
shared hosting requirements.&lt;br /&gt;
&lt;br /&gt;
# pg_catalog allows access to database and user names for everyone, however access to this schema cannot be disabled without breaking essential features&lt;br /&gt;
# no support for limiting database sizes&lt;br /&gt;
# database local usernames are not fully supported yet (md5 auth)&lt;br /&gt;
# removing all rights granted to user (prerequisite to deleting that user) must be done for each single object (no &amp;quot;REASSIGN&amp;quot; equivalent)&lt;br /&gt;
# No built-in support for setting [[Priorities|user, query or database priorities]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Administration]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Row-security&amp;diff=19174</id>
		<title>Row-security</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Row-security&amp;diff=19174"/>
		<updated>2013-03-07T15:26:57Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Row-Level Security */ reference commitfest entry&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Row-Level Security =&lt;br /&gt;
&lt;br /&gt;
This page is for discussing the implementation of Row-Level Security (RLS) in PostgreSQL. You can find the current progress of this proposal at the [https://commitfest.postgresql.org/action/patch_view?id=874 commitfest page].&lt;br /&gt;
&lt;br /&gt;
RLS is a security feature which allows users to give access to a sub-set of data in their table to others.  Traditional RDBMS permission systems don&#039;t distinguish the individual rows in a table- GRANT SELECT on a table will allow a user to access all rows of that table.  With RLS, requirements such as &amp;quot;a manager can only view sensetive employee information for those employees who report to them.&amp;quot; can be specified and enforced by the database.&lt;br /&gt;
&lt;br /&gt;
== Jobs of access control feature ==&lt;br /&gt;
&lt;br /&gt;
According to the definition of ISO/IEC27001 (information security management), design target of information security feature is to ensure confidentiality, integrity and availability of information asset. In short, these are often called C.I.A.&lt;br /&gt;
Access control contributes towards both confidentiality and integrity. Access controls prevent unprivileged users from reading or writing information asset base on the rules which are configured in the access control system. Information or data itself does not have a particularly tangible form and therefore it must be stored in an object. Usually, access control features allow or prohibit users access to the object that contains the information or data.  The intent of this feature (RLS) is to allow a more fine-grained control over the information inside of the objects.&lt;br /&gt;
For example, regular GRANT/REVOKE mechanisms control access on the specified database object according to the access control list, but they do not allow anything more granular.&lt;br /&gt;
&lt;br /&gt;
== Design Target ==&lt;br /&gt;
&lt;br /&gt;
The purpose of row-level security feature is to prevent users (not means database roles, just users) from accessing unprivileged rows. Please note that &amp;quot;access&amp;quot; means two different direction of information (1) data read (rows =&amp;gt; users) for confidentiality, and (2) data write (users =&amp;gt; rows) for data integrity.&lt;br /&gt;
Due to the nature of database access, it is the most straight-forwards way to describe the rule with regular qualifier style of WHERE clause; that is an expression returning a boolean value.&lt;br /&gt;
&lt;br /&gt;
Overall, RLS prevents users from reading and writing rows that do not satisfy the rule (also know as a row-security policy). If we support per-command configuration, the row-security policy to be checked depends on the command. RLS design accepts individual row-security policy to be applied on SELECT, INSERT, UPDATE or DELETE. Relevant discussions are below.&lt;br /&gt;
&lt;br /&gt;
We have some SQL commands that allow users to access database rows; SELECT, INSERT, UPDATE or DELETE. COPY TO/FROM is synonym of SELECT and INSERT from security perspective.&lt;br /&gt;
In case of SELECT (data read), what we should do is quite simple: any rows that don&#039;t match with the configured row-security policy shall be filtered out for unprivileged users.&lt;br /&gt;
In case of INSERT or UPDATE (data write), RLS prevents unprivileged rows from being written to the table, as if CHECK constraint performing.&lt;br /&gt;
In case of UPDATE or DELETE (data write), RLS prevents unprivileged rows from appearing as candidates of modification; that means row-security policy should be applied on the table scan stage. We also need to pay attention on potential information leaks using the leaky-view scenario below. So, UPDATE and DELETE shall also take row-security checks of SELECT command on table scanning stage.&lt;br /&gt;
&lt;br /&gt;
TRUNCATE command performs as if DELETE, but much faster. It has its own permission separated from DELETE. So, we re-define meaning of TRUNCATE permission; that also implies to ignore row-security policy of DELETE.&lt;br /&gt;
&lt;br /&gt;
Row-security policy is set by table owner, using the following syntax.&lt;br /&gt;
If no &amp;quot;ON &amp;lt;command&amp;gt;&amp;quot; given, a unique security policy shall be applied on all the supported privileges (SELECT, INSERT, UPDATE and DELETE).&lt;br /&gt;
&lt;br /&gt;
For example, an UPDATE command requires SELECT privilege to read a row, yet UPDATE privilege to change a row.&lt;br /&gt;
&lt;br /&gt;
 ALTER TABLE &amp;lt;relname&amp;gt; SET ROW SECURITY FOR &amp;lt;privilege&amp;gt; TO (&amp;lt;expression&amp;gt;);&lt;br /&gt;
 &lt;br /&gt;
 ALTER TABLE &amp;lt;relname&amp;gt; RESET ROW SECURITY FOR &amp;lt;privilege&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;privilege&amp;gt; can be one of: ALL, SELECT, INSERT, UPDATE, DELETE.  The initial implementation may only support &#039;ALL&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;ALL&#039; would simply define the same policy for all the commands.  Later commands which update only a single command would replace the policy for that command only, leaving the policy for the other commands to what was set from the initial &#039;ALL&#039;.  The same goes for a RESET.  Listing the policies in a table form would look like:&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE mytable SET ROW SECURITY FOR ALL TO (where user = 1);&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:200px; height:200px;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ Example&lt;br /&gt;
|-&lt;br /&gt;
! table&lt;br /&gt;
! command&lt;br /&gt;
! expression&lt;br /&gt;
|-&lt;br /&gt;
| mytable || select || user = 1&lt;br /&gt;
|-&lt;br /&gt;
| mytable || insert || user = 1&lt;br /&gt;
|-&lt;br /&gt;
| mytable || update || user = 1&lt;br /&gt;
|-&lt;br /&gt;
| mytable || delete || user = 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If it was followed by:&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE mytable SET ROW SECURITY FOR SELECT TO (where user = 2);&lt;br /&gt;
the result would be:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:200px; height:200px;&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ Example&lt;br /&gt;
|-&lt;br /&gt;
! table&lt;br /&gt;
! command&lt;br /&gt;
! expression&lt;br /&gt;
|-&lt;br /&gt;
| mytable || select || user = 2&lt;br /&gt;
|-&lt;br /&gt;
| mytable || insert || user = 1&lt;br /&gt;
|-&lt;br /&gt;
| mytable || update || user = 1&lt;br /&gt;
|-&lt;br /&gt;
| mytable || delete || user = 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
and so on.  If no row security policy has been set for a given command type (or the security policy has been reset for that command type), no row-level security would apply and regular GRANT permissions for the operation would be used.  Note that row-level security does not override existing GRANT permissions but provide a more fine-grained control.  For example, setting &#039;ROW SECURITY FOR SELECT&#039; to allow a given user to give rows would only give that user access if the user ALSO has &#039;SELECT&#039; privileges on the column or table in question.&lt;br /&gt;
&lt;br /&gt;
Superuser bypass row-security policy (1) to avoid Trojan-horse attack by table owner (2) to ensure consistent view for database backup, however, row-security policy injected by extension (such as sepgsql) is exception.&lt;br /&gt;
&lt;br /&gt;
== Issues &amp;amp; discussion ==&lt;br /&gt;
&lt;br /&gt;
=== Per-command security policy ===&lt;br /&gt;
Asymmetric row-security policy may cause unexpected information leaks using UPDATE or DELETE command with RETURNING clause or leaky functions in WHERE clause.&lt;br /&gt;
It is an idea to append row-security policy of SELECT when executor scan the result relation. It ensures the rows to be modified are also visible to the user executing the UPDATE.&lt;br /&gt;
One other idea was to enforce a unique policy for all commands, however, it has a problematic scenario when user wants to define INSERT-only relation.&lt;br /&gt;
&lt;br /&gt;
=== Writer-side checks ===&lt;br /&gt;
Now we can implement writer-side checks on INSERT or UPDATE command using before-row triggers.&lt;br /&gt;
On the other hand, it makes users to synchronize the configuration of RLS with triggers of this checks. One model case to solve this concern is implementation of FK constraints; that automatically defines before-row triggers that checks newer version of tuples to be inserted or updated.&lt;br /&gt;
&lt;br /&gt;
=== Table statistics ===&lt;br /&gt;
pg_statistic hold some example of values on the table being analyzed.&lt;br /&gt;
Right now, we have no way to prevent users to see collected values on statistical board.&lt;br /&gt;
An idea is to mask the field if the relation has RLS policy.&lt;br /&gt;
&lt;br /&gt;
=== Minimal core feature set ===&lt;br /&gt;
* Checks are only applied on table scanning. If writer-side checks are required, users &#039;&#039;&#039;can&#039;&#039;&#039; do that using triggers, even though it takes complex setting.&lt;br /&gt;
* A unique security policy can be configurable on a table. Even though RLS design allows per-command policy, we need to investigate whether asymmetric policy is harmless.&lt;br /&gt;
&lt;br /&gt;
= Previous discussion in 2010 =&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* Before we can try to tackle row-level security generally, using labels or not, we need to fix the issues with data leaks in views.&lt;br /&gt;
&lt;br /&gt;
* Related topics in -hackers&lt;br /&gt;
** [http://archives.postgresql.org/pgsql-hackers/2010-06/msg00014.php Thread to discuss the way to tackle this problem]&lt;br /&gt;
** [http://archives.postgresql.org/pgsql-hackers/2009-10/msg01346.php Thread on information leak due to views]&lt;br /&gt;
** [http://archives.postgresql.org/pgsql-hackers/2009-02/msg00861.php Earlier discussion of view leak]&lt;br /&gt;
&lt;br /&gt;
=== Issue: A leaky VIEWs for RLS ===&lt;br /&gt;
&lt;br /&gt;
* This issue is summarized as: an untrusted user can define a function which stores all information it is presented, then query a view using that function in a way which will convince the planner to send every row of the underlying table to the function, thus leaking data in the table which the view was intended to prevent.&lt;br /&gt;
&lt;br /&gt;
In [http://archives.postgresql.org/pgsql-hackers/2010-06/msg00014.php this message], KaiGai pointed out we have two different causes of the problem, but both of them can cause same information leaks.&lt;br /&gt;
* [1] Unexpected order to evaluate qualifiers on a certain scan plan&lt;br /&gt;
** When a scan-plan has multiple qualifiers to filter scanned tuples, the optimizer sort the qualifiers based on their estimated cost to execute. If an exogenetic function has smaller cost than other qualifiers come from view definition, the exogenetic function shall be evaluated earlier than others, then contents of invisible tuples may be provided to malicious user-defined functions.&lt;br /&gt;
** It is reordered at &amp;lt;tt&amp;gt;order_qual_clauses()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* [2] Unexpected qualifier distributions into inside of join loop&lt;br /&gt;
** When planner makes a scan plan, it tries to distribute qualifiers of scans into smaller unit as possible as it can. For example, if a function takes arguments only come from a certain table, it will be distributed into scan plan of the table, not outside of the join.&lt;br /&gt;
** When a view contains JOIN clause between A and B, user can reference the view with his own WHERE clause. If a clause takes arguments depending on only A, the planner distribute the clause into the scan plan of A. In the reault, tuples to be filtered out may become visible to user defined functions.&lt;br /&gt;
** It is distributed at &amp;lt;tt&amp;gt;distribute_qual_to_rels()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Discussion ===&lt;br /&gt;
&lt;br /&gt;
* At the point [2], if we prevent all exogenetic functions to push down into join loops, it will make unignorable performance degradation, although the view might not be  intended to security purpose.&lt;br /&gt;
* It needs a way to provide a hint whether the view is defined for security purpose, or not.&lt;br /&gt;
** Tom Lane [http://archives.postgresql.org/pgsql-hackers/2010-06/msg00033.php suggested] &amp;lt;tt&amp;gt;CREATE SECURITY VIEW AS ...&amp;lt;/tt&amp;gt; statement.&lt;br /&gt;
** It was not concluded which is the default. Security view? Regular view?&lt;br /&gt;
** How about a GUC option to specify the default? NACKed.&lt;br /&gt;
* In addition, Robert Haas [http://archives.postgresql.org/pgsql-hackers/2010-06/msg00053.php suggested] to test privileges of users whether they have privileges to reference underlaying tables without vires, or not. If available, it is eventually harmless even if user defined functions are evaluated within join loop.&lt;br /&gt;
** Here was one opposition because this check will be applied on planner stage, not execution stage.&lt;br /&gt;
* KaiGai submitted a [http://archives.postgresql.org/pgsql-hackers/2010-06/msg00150.php proof of concept patch] that prevents to push down exogenetic functions into security views.&lt;br /&gt;
&lt;br /&gt;
* At the point [1], we don&#039;t have any active discussions yet.&lt;br /&gt;
&lt;br /&gt;
== Discussions of RLS in PG ==&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2009-12/msg01095.php Current thread on -hackers]&lt;br /&gt;
* [http://it.toolbox.com/blogs/database-soup/thinking-about-row-level-security-part-1-30732 Josh Berkus on RLS in PG, Part 1]&lt;br /&gt;
* [http://it.toolbox.com/blogs/database-soup/thinking-about-row-level-security-part-2-30757 Josh Berkus on RLS in PG, Part 2]&lt;br /&gt;
* [[SEPostgreSQL_Specifications Specifications for SEPostgreSQL, includes RLS]]&lt;br /&gt;
&lt;br /&gt;
== Articles/Documentation of existing RLS implementations ==&lt;br /&gt;
* [http://www.securityfocus.com/infocus/1743 Oracle RLS Article, Part 1]&lt;br /&gt;
* [http://www.securityfocus.com/infocus/1744 Oracle RLS Article, Part 2]&lt;br /&gt;
* [http://www.devshed.com/c/a/Oracle/RowLevel-Security-with-Virtual-Private-Database/ Oracle RLS and VPD Article]&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/cc966395.aspx SQL Server RLS with Classified Systems]&lt;br /&gt;
* [http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.admin/db2z_implementmls4row.htm IBM/DB2 RLS Documentation]&lt;br /&gt;
* Other?&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
* PCI Compliant implementations&lt;br /&gt;
* Classified Environments&lt;br /&gt;
* Other?&lt;br /&gt;
&lt;br /&gt;
== Components of an implementation ==&lt;br /&gt;
* Overview&lt;br /&gt;
** Allow the query to be modified, prior to being passed to the planner, in such a way that the rows returned will be those the user is authorized for&lt;br /&gt;
** This depends on being able to tell the planner that this filter must be done, in some way, prior to user-defined functions being called&lt;br /&gt;
** This issue is related to the VIEW leak described above.  Once that issue has been resolved, this should be pretty straight-forward to implement&lt;br /&gt;
* Grammar for catalog updates/changes; user-interface for specifying how RLS is to be done&lt;br /&gt;
* Catalog changes for storing RLS information&lt;br /&gt;
* Storage - Could this just be a regular column in the table?  It would be good to avoid changing the header or creating a system column for this.&lt;br /&gt;
** We would need to track, in some fashion, the &amp;quot;security&amp;quot; column in the catalog, perhaps as a flag on pg_attribute, or a &#039;security_attnum&#039; in pg_class, etc.&lt;br /&gt;
* Planner updates to enforce the filter based on RLS- this can&#039;t be done till after we deal with the issue with VIEWs&lt;br /&gt;
* Executor changes may not be required..  but how to deal with stored plans?  Use invalidation if anything changes with regard to RLS?&lt;br /&gt;
* Other?&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
* Covert Channel&lt;br /&gt;
** If we try to insert a value which violates a PK constraint, we can assume existence of invisible PK from the error.&lt;br /&gt;
** The same issue exists in a Foreign Key relationship situation&lt;br /&gt;
** Other databases with row-level security don&#039;t address this issue, so it&#039;s unclear if we really need to (reference?)&lt;br /&gt;
** In any case, this isn&#039;t something we need to address in our initial RLS implementation&lt;br /&gt;
&lt;br /&gt;
* Order to evaluate row level policy&lt;br /&gt;
** Addressed above with regard to views, once we solve that, this will be handled&lt;br /&gt;
&lt;br /&gt;
* TRUNCATE statement&lt;br /&gt;
** TRUNCATE is expected to be fast.&lt;br /&gt;
** If the user does not have rights to remove all rows from the table regardless of row-level policy, then any TRUNCATE must be denied.&lt;br /&gt;
** Turning TRUNCATE (a PostgreSQL extension which is not in the SQL spec anyway) into a DELETE FROM doesn&#039;t make sense.&lt;br /&gt;
&lt;br /&gt;
* COPY TO statement&lt;br /&gt;
** COPY can just be reformed into a COPY statement with a query being used instead, eg:&lt;br /&gt;
** &amp;lt;nowiki&amp;gt;COPY tblname TO xxx;&amp;lt;/nowiki&amp;gt; can be replaced by &amp;lt;nowiki&amp;gt;COPY (SELECT * FROM tblname) TO xxx;&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Table inheritance&lt;br /&gt;
** Not something we really need to deal with in the initial version, so long as it doesn&#039;t completely break (or we make sure it does for inheritance)&lt;br /&gt;
** What policy should be applied on the parent and child relations.&lt;br /&gt;
** idea: Also copy row-level policies from the parent tables.&lt;br /&gt;
&lt;br /&gt;
* Foreign Key constraint&lt;br /&gt;
** Adding multiple modes for FK should be a separate, follow-on patch, it doesn&#039;t need to be in the initial version. &lt;br /&gt;
** idea: We can provide two modes: The first is filter-mode, the second is abort-mode.&lt;br /&gt;
*** filter-mode: A normal mode. Row-level policy is evaluated earlier than user given condition, and returns false, if violated.&lt;br /&gt;
*** abort-mode: A special internal mode. Row-level policy is evaluated after all the condition, and raises an error, if violated. The condition shall be evaluated earlier than row-level policy, the query has to be trusted. Such as queries in FK constraint.&lt;br /&gt;
&lt;br /&gt;
== Considerations ==&lt;br /&gt;
* Performance&lt;br /&gt;
** With RLS&lt;br /&gt;
** Without RLS&lt;br /&gt;
** The page.16 of [http://sepgsql.googlecode.com/files/JLS2009-KaiGai-LAPP_SELinux.pdf LAPP/SELinux slides] shows a pgbench comparison between pgsql-8.4.1 vs SE-PostgreSQL with RLS.&lt;br /&gt;
*** It has 2-4% of performance tradeoff depending on database size.&lt;br /&gt;
*** Note that SE-PostgreSQL implemented RLS in a different way than what is being proposed here; our goal is to get RLS support into core PG&lt;br /&gt;
* Integration with external security manager (eg: SELinux, SMACK)&lt;br /&gt;
** This will not be included in the initial support of RLS (unless we happen to get support for external security managers implemented first in PG)&lt;br /&gt;
&lt;br /&gt;
[[Category:SELinux]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=What%27s_new_in_PostgreSQL_9.2&amp;diff=16410</id>
		<title>What&#039;s new in PostgreSQL 9.2</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=What%27s_new_in_PostgreSQL_9.2&amp;diff=16410"/>
		<updated>2012-03-20T13:37:44Z</updated>

		<summary type="html">&lt;p&gt;Robe: fix version numbers in headline&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
This document showcases many of the latest developments in PostgreSQL 9.2, compared to the last major release &amp;amp;ndash; PostgreSQL 9.1. There are many improvements in this release, so this wiki page covers many of the more important changes in detail. The full list of changes is itemised in &#039;&#039;Release Notes&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This page is incomplete!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Major new features=&lt;br /&gt;
&lt;br /&gt;
==Index-only scans==&lt;br /&gt;
Index-only scans is a new performance feature whereby PostgreSQL can skip the heap visibility check if the index contains all necessary columns, for pages that are known to be all-visible. This feature is similar to &#039;&#039;&#039;covering indexes&#039;&#039;&#039; in other database systems, although the implementation is different. (More info: [http://www.depesz.com/2011/10/08/waiting-for-9-2-index-only-scans/ depesz blog])&lt;br /&gt;
&lt;br /&gt;
In previous PostgreSQL versions, all matching index rows in an index scan had to consult the table heap for visibility information. In version 9.2, an index-only scan first checks the smaller [http://www.postgresql.org/docs/devel/static/storage-vm.html visibility map] to see whether all the rows on the particular page are visible. If true, the table heap fetch can be skipped. VACUUM is responsible for setting the visibility map bits.&lt;br /&gt;
&lt;br /&gt;
This required making visibility map changes crash-safe, so visibility map bit changes are now WAL-logged.&lt;br /&gt;
&lt;br /&gt;
==Cascading replication==&lt;br /&gt;
Streaming replication slaves can now serve as a source for other slaves. This can be used to reduce the impact of replication on the master server. (More info: [http://www.depesz.com/2011/07/26/waiting-for-9-2-cascading-streaming-replication/ depesz blog])&lt;br /&gt;
&lt;br /&gt;
A related feature, the pg_basebackup command now also works from slaves (More info: [http://www.depesz.com/2012/02/03/waiting-for-9-2-pg_basebackup-from-slave/ depesz blog])&lt;br /&gt;
&lt;br /&gt;
==Multi-processor scalability improvements==&lt;br /&gt;
The lock contention of several big locks has been significantly reduced, leading to better multi-processor scalability. (More info: [http://rhaas.blogspot.com/2011/09/scalability-in-graphical-form-analyzed.html Robert Haas blog])&lt;br /&gt;
&lt;br /&gt;
==JSON datatype==&lt;br /&gt;
The JSON datatype is meant for storing JSON-structured data. (More info: [http://www.depesz.com/2012/02/12/waiting-for-9-2-json/ depesz blog])&lt;br /&gt;
&lt;br /&gt;
=Performance improvements=&lt;br /&gt;
&lt;br /&gt;
* The performance of in-memory sorts has been improved by up to 25% in some situations, with type-specific specializations. (More info: [http://momjian.us/main/blogs/pgblog/2012.html#February_16_2012 Bruce Momjian&#039;s blog])&lt;br /&gt;
&lt;br /&gt;
* An idle PostgreSQL server now makes less wakeups, leading to lower power consumption ([http://pgeoghegan.blogspot.com/2012/01/power-consumption-in-postgres-92.html Peter Geoghegan&#039;s blog])&lt;br /&gt;
&lt;br /&gt;
* Timing can now be disabled with EXPLAIN (analyze on, timing off), leading to lower overhead on platforms where getting the current time is expensive ([http://www.depesz.com/2012/02/13/waiting-for-9-2-explain-timing/ depesz blog])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:PostgreSQL 9.2]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=LDAP_Authentication_against_AD&amp;diff=16220</id>
		<title>LDAP Authentication against AD</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=LDAP_Authentication_against_AD&amp;diff=16220"/>
		<updated>2012-01-30T15:37:13Z</updated>

		<summary type="html">&lt;p&gt;Robe: drop ownership info, this is a wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Howto SSL enable Postgresql LDAP Authentication against Active Directory ==&lt;br /&gt;
&lt;br /&gt;
The following instruction applies to Redhat RPM installation.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Download SRPMs from website and rebuild with --with-ldap flag.&#039;&#039;&#039;&lt;br /&gt;
#:The binary release from postgresql website does not include LDAP authentication support.  If you want LDAP support, you will need build it from the source with a flag: --with-ldap.  If you are deploying it to Redhat 4, you can download the source RPM from srpm folder of the release.  You can simply add --with-ldap flag into the RPM specification file.&lt;br /&gt;
# &#039;&#039;&#039;Install all the needed rpms as root.&#039;&#039;&#039;&lt;br /&gt;
#:&amp;lt;pre&amp;gt;&lt;br /&gt;
#:postgresql-8.2.3-1PGDG.i386.rpm&lt;br /&gt;
#:postgresql-libs-8.2.3-1PGDG.i386.rpm&lt;br /&gt;
#:postgresql-server-8.2.3-1PGDG.i386.rpm&lt;br /&gt;
#:&amp;lt;/pre&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;Fix a permission on directory:&#039;&#039;&#039; &lt;br /&gt;
#:&amp;lt;pre&amp;gt;&lt;br /&gt;
#:chmod 755  /usr/share/pgsql/timezonesets/&lt;br /&gt;
#:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#&#039;&#039;&#039;Initialize the database&#039;&#039;&#039; &lt;br /&gt;
#:&amp;lt;pre&amp;gt;&lt;br /&gt;
#:/sbin/service postgresql initdb&lt;br /&gt;
#:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#&#039;&#039;&#039;Modify client authentication configuration by editing /var/lib/pgsql/data/pg_hba.conf&#039;&#039;&#039;&lt;br /&gt;
#:&amp;lt;pre&amp;gt;&lt;br /&gt;
#: # For testing, allow any local user without a password&lt;br /&gt;
#: # Remote connection for admin and postgres users require a password.  Everybody else use LDAP&lt;br /&gt;
#: # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD&lt;br /&gt;
#: # &amp;quot;local&amp;quot; is for Unix domain socket connections only&lt;br /&gt;
#: local   all         all                               trust sameuser&lt;br /&gt;
#: # IPv4 local connections:&lt;br /&gt;
#: host    all         all          127.0.0.1/32         trust sameuser&lt;br /&gt;
#: # IPv6 local connections:&lt;br /&gt;
#: host    all         all          ::1/128              trust sameuser&lt;br /&gt;
#: # Remote TCP/IP connection&lt;br /&gt;
#: host    all         postgres,admin 172.20.0.0/16      password&lt;br /&gt;
#: host    all         all            172.20.0.0/16      ldap &amp;quot;ldaps://172.20.13.130/basedn;cn=;,cn=users,dc=concert,dc=music&amp;quot;&lt;br /&gt;
#:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#*In this configuration, we assume all users are under cn=users,dc=concert,dc=music. Otherwise, user Name defined inside postgresql needs to include ou:&lt;br /&gt;
#*:&amp;lt;pre&amp;gt;&lt;br /&gt;
#*:Jzw,ou=dev&lt;br /&gt;
#*:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#*Note that basedn is ignored in the Postgresql 8.2.3 build, but you will have to put it there in order for it to work.  See bug report reference: 3095. &lt;br /&gt;
#*It is important to use double-quote around ldap url.&lt;br /&gt;
#*LDAP authentication only verifies user credentials from AD, but the user has to be pre-created inside Postgresql.&lt;br /&gt;
#&#039;&#039;&#039;Update /var/lib/pgsql/data/postgresql.conf&#039;&#039;&#039;&lt;br /&gt;
#* Listen to connections on all IP addresses&lt;br /&gt;
#*:&amp;lt;pre&amp;gt;&lt;br /&gt;
#*:listen_addresses =&#039;*&#039;&lt;br /&gt;
#*:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#*Enable SSL&lt;br /&gt;
#*:&amp;lt;pre&amp;gt;&lt;br /&gt;
#*:Ssl=on&lt;br /&gt;
#*:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#&#039;&#039;&#039;Generate self-signed key and certificate:&#039;&#039;&#039;&lt;br /&gt;
#*This is needed for SSL communication between client with DB.  Follow the directions on the [http://www.postgresql.org/docs/current/static/ssl-tcp.html Postgresql official documentation.]&lt;br /&gt;
#&#039;&#039;&#039;Create database&#039;&#039;&#039;&lt;br /&gt;
#:&amp;lt;pre&amp;gt;&lt;br /&gt;
#:createdb mydb&lt;br /&gt;
#:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#&#039;&#039;&#039;Make LDAPs to work with AD&#039;&#039;&#039;&lt;br /&gt;
#*For the test, you may want to create your self-signed certificate on AD:&lt;br /&gt;
##Create Root Certificate Authority&lt;br /&gt;
##*If you are importing a certificate from Verisign, skip this part and go to part 2 (Import server cert into AD).&lt;br /&gt;
###Start the Control Panel &#039;&#039;&#039;Add/Remove Programs&#039;&#039;&#039; applet.&lt;br /&gt;
###Click &#039;&#039;&#039;Add/Remove Windows Components&#039;&#039;&#039; to start the Windows Components wizard.&lt;br /&gt;
###Click Next when the welcome screen appears.&lt;br /&gt;
###When the list of components displays, select the &#039;&#039;&#039;Certificate Services&#039;&#039;&#039; checkbox and click Next.&lt;br /&gt;
###Select type &#039;&#039;&#039;Enterprise root CA&#039;&#039;&#039;, and click Next.&lt;br /&gt;
###Enter a CA name and other information about the organization, as the screen shows. Click Next.&lt;br /&gt;
###Accept the default location for the certificate database (i.e., %systemroot%\System32\CertLog), and click Next.&lt;br /&gt;
###If Microsoft IIS is running, the service will stop and a dialog box will display. Click OK.&lt;br /&gt;
###A list of files to copy will generate, and the files will install. Service and system configurations will also install. You might need to insert the Windows 2000 Server CD-ROM.&lt;br /&gt;
###When the wizard completes, click &#039;&#039;&#039;Finish&#039;&#039;&#039;.&lt;br /&gt;
##Import server certificate into Active Directory&lt;br /&gt;
###Open &#039;&#039;&#039;Default Group Policy&#039;&#039;&#039; editor. Navigate to Computer configuration-&amp;gt;windows settings-&amp;gt;security settings-&amp;gt;Public key policies-&amp;gt;Trusted root certificate authorities.&lt;br /&gt;
###Right click on &#039;&#039;&#039;Trusted root certificate authorities&#039;&#039;&#039; and choose import.&lt;br /&gt;
###Click on Next and browse to the certificate (.crt file) issued by CA. Click on open.&lt;br /&gt;
##Export CA from Active Directory&lt;br /&gt;
###Click on &#039;&#039;&#039;Trusted root certificate authorities&#039;&#039;&#039; to open the folder&lt;br /&gt;
###Right click on the CA you want to export and choose open&lt;br /&gt;
###Click on &#039;&#039;&#039;Details&#039;&#039;&#039; tab and click on copy to file button.&lt;br /&gt;
###You will see Certificate export wizard. Click on &#039;&#039;&#039;Next&#039;&#039;&#039;.&lt;br /&gt;
###Choose the format to export. For use with OpenSSL (OpenLDAP), choose &#039;&#039;&#039;base-64 encoded X.509&#039;&#039;&#039; format.&lt;br /&gt;
###Copy the file to appropriate location on Redhat 4 server: &#039;&#039;&#039;/etc/openldap/concerto.cer&#039;&#039;&#039;&lt;br /&gt;
##Configure LDAPS connection to Active Directory&lt;br /&gt;
##*Configure &#039;&#039;&#039;ldap.conf&#039;&#039;&#039; and add the following lines:&lt;br /&gt;
##*:&amp;lt;pre&amp;gt;&lt;br /&gt;
##*: TLS_CACERT /etc/openldap/concerto.cer&lt;br /&gt;
##*: TLS_CACERTDIR /etc/openldap/&lt;br /&gt;
##*: # TLS_REQCERT never&lt;br /&gt;
##*:&amp;lt;/pre&amp;gt;&lt;br /&gt;
##Start DB&lt;br /&gt;
##:&amp;lt;pre&amp;gt;&lt;br /&gt;
##: service postgresql start&lt;br /&gt;
##:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#&#039;&#039;&#039;Try to connect DB remotely:&#039;&#039;&#039;&lt;br /&gt;
#* On Windows client, download win32 binary from http://www.postgresql.org. It also includes a .NET library for integrating with .NET client software.  Install only psql package.&lt;br /&gt;
#* Login using password of AD user jzw:&lt;br /&gt;
#*:&amp;lt;pre&amp;gt;&lt;br /&gt;
#*:psql -d mydb -h 172.20.x.x. -U jzw -W&lt;br /&gt;
#*:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#*Make sure one see this line to verify that SSL connection is established between client and DB&lt;br /&gt;
#*:&amp;lt;pre&amp;gt;&lt;br /&gt;
#*:SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256). &lt;br /&gt;
#*:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#*To verify if SSL is working between Postgresql and AD, you can run tcpdump to see if content is encrypted.  I found that psql client does not verify the certificate. Not sure if that is a bug or a default settings.&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=Streaming_Replication&amp;diff=15492</id>
		<title>Streaming Replication</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=Streaming_Replication&amp;diff=15492"/>
		<updated>2011-09-28T09:58:09Z</updated>

		<summary type="html">&lt;p&gt;Robe: reworded archive_mode necessity&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Streaming Replication&#039;&#039;&#039; (SR) provides the capability to continuously ship and&lt;br /&gt;
apply the [http://www.postgresql.org/docs/current/static/wal.html WAL XLOG] records to some number of standby servers in order to keep them current.&lt;br /&gt;
&lt;br /&gt;
= Project =&lt;br /&gt;
SR was developed for inclusion in PostgreSQL 9.0 by NTT OSS Center. The lead developer is [mailto:masao.fujii@gmail.com Masao Fujii].  [http://www.pgcon.org/2008/schedule/events/76.en.html Synchronous Log Shipping Replication Presentation] introduces the early design of the feature.&lt;br /&gt;
&lt;br /&gt;
The feature is now committed to CVS and is included in PostgreSQL 9.0 Alpha4 and later.&lt;br /&gt;
&lt;br /&gt;
= Usage =&lt;br /&gt;
== Users Overview ==&lt;br /&gt;
* &#039;&#039;&#039;Log-shipping&#039;&#039;&#039;&lt;br /&gt;
** XLOG records generated in the primary are periodically shipped to the standby via the network.&lt;br /&gt;
** In the existing warm standby, only records in a filled file are shipped, what&#039;s referred to as file-based log-shipping.  In SR, XLOG records in partially-filled XLOG file are shipped too, implementing record-based log-shipping.  This means the window for data loss in SR is usually smaller than in warm standby, unless the warm standby was also configured for record-based shipping (which is complicated to setup).&lt;br /&gt;
** The content of XLOG files written to the standby are exactly the same as those on the primary. XLOG files shipped can be used for a normal recovery and PITR.&lt;br /&gt;
* &#039;&#039;&#039;Multiple standbys&#039;&#039;&#039;&lt;br /&gt;
** More than one standby can establish a connection to the primary for SR. XLOG records are concurrently shipped to all these standbys. The delay/death of a standby does not harm log-shipping to other standbys.&lt;br /&gt;
** The maximum number of standbys can be specified as a GUC variable.&lt;br /&gt;
* &#039;&#039;&#039;Continuous recovery&#039;&#039;&#039;&lt;br /&gt;
** The standby continuously replays XLOG records shipped without using pg_standby.&lt;br /&gt;
** XLOG records shipped are replayed as soon as possible without waiting until XLOG file has been filled. The combination of [[Hot Standby]] and SR would make the latest data inserted into the primary visible in the standby almost immediately.&lt;br /&gt;
** The standby periodically removes old XLOG files which are no longer needed for recovery, to prevent excessive disk usage.&lt;br /&gt;
* &#039;&#039;&#039;Setup&#039;&#039;&#039;&lt;br /&gt;
** The start of log-shipping does not interfere with any query processing on the primary.&lt;br /&gt;
** The standby can be started in various conditions.&lt;br /&gt;
*** If there are XLOG files in archive directory and restore_command is supplied, at first those files are replayed. Then the standby requests XLOG records following the last applied one to the primary. This prevents XLOG files already present in the standby from being shipped again. Similarly, XLOG files in pg_xlog are also replayed before starting log-shipping.&lt;br /&gt;
*** If there is no XLOG files on the standby, the standby requests XLOG records following the starting XLOG location of recovery (the redo starting location).&lt;br /&gt;
* &#039;&#039;&#039;Connection settings and authentication&#039;&#039;&#039;&lt;br /&gt;
** A user can configure the same settings as a normal connection to a connection for SR (e.g., keepalive, pg_hba.conf).&lt;br /&gt;
* &#039;&#039;&#039;Activation&#039;&#039;&#039;&lt;br /&gt;
** The standby can keep waiting for activation as long as a user likes. This prevents the standby from being automatically brought up by failure of recovery or network outage.&lt;br /&gt;
* &#039;&#039;&#039;Progress report&#039;&#039;&#039;&lt;br /&gt;
** The primary and standby report the progress of log-shipping in PS display.&lt;br /&gt;
* &#039;&#039;&#039;Graceful shutdown&#039;&#039;&#039;&lt;br /&gt;
** When smart/fast shutdown is requested, the primary waits to exit until XLOG records have been sent to the standby, up to the shutdown checkpoint record.&lt;br /&gt;
&lt;br /&gt;
== Restrictions ==&lt;br /&gt;
* &#039;&#039;&#039;Synchronous log-shipping&#039;&#039;&#039;&lt;br /&gt;
** Currently SR supports only asynchronous log-shipping. The commit command might return a &amp;quot;success&amp;quot; to a client before the corresponding XLOG records are shipped to the standby.&lt;br /&gt;
* &#039;&#039;&#039;Replication beyond timeline&#039;&#039;&#039;&lt;br /&gt;
** A user has to get a fresh backup whenever making the old standby catch up.&lt;br /&gt;
* &#039;&#039;&#039;Clustering&#039;&#039;&#039;&lt;br /&gt;
** Postgres doesn&#039;t provide any clustering feature.&lt;br /&gt;
&lt;br /&gt;
== How to Use ==&lt;br /&gt;
* &#039;&#039;&#039;1.&#039;&#039;&#039; Install postgres in the primary and standby server as usual.  This requires only &#039;&#039;configure&#039;&#039;, &#039;&#039;make&#039;&#039; and &#039;&#039;make install&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;2.&#039;&#039;&#039; Create the initial database cluster in the primary server as usual, using &#039;&#039;initdb&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;3.&#039;&#039;&#039; Set up connections and authentication so that the standby server can successfully connect to the &#039;&#039;replication&#039;&#039; pseudo-database on the primary.&lt;br /&gt;
 $ $EDITOR postgresql.conf&lt;br /&gt;
 &lt;br /&gt;
 listen_addresses = &#039;192.168.0.10&#039;&lt;br /&gt;
 &lt;br /&gt;
 $ $EDITOR pg_hba.conf&lt;br /&gt;
 &lt;br /&gt;
 # The standby server must have superuser access privileges.&lt;br /&gt;
 host  replication  postgres  192.168.0.20/22  trust&lt;br /&gt;
* &#039;&#039;&#039;4.&#039;&#039;&#039; Set up the streaming replication related parameters on the primary server.&lt;br /&gt;
 $ $EDITOR postgresql.conf&lt;br /&gt;
 &lt;br /&gt;
 # To enable read-only queries on a standby server, wal_level must be set to&lt;br /&gt;
 # &amp;quot;hot_standby&amp;quot;. But you can choose &amp;quot;archive&amp;quot; if you never connect to the&lt;br /&gt;
 # server in standby mode.&lt;br /&gt;
 wal_level = hot_standby&lt;br /&gt;
 &lt;br /&gt;
 # Set the maximum number of concurrent connections from the standby servers.&lt;br /&gt;
 max_wal_senders = 5&lt;br /&gt;
 &lt;br /&gt;
 # To prevent the primary server from removing the WAL segments required for&lt;br /&gt;
 # the standby server before shipping them, set the minimum number of segments&lt;br /&gt;
 # retained in the pg_xlog directory. At least wal_keep_segments should be&lt;br /&gt;
 # larger than the number of segments generated between the beginning of&lt;br /&gt;
 # online-backup and the startup of streaming replication. If you enable WAL&lt;br /&gt;
 # archiving to an archive directory accessible from the standby, this may&lt;br /&gt;
 # not be necessary.&lt;br /&gt;
 wal_keep_segments = 32&lt;br /&gt;
 &lt;br /&gt;
 # Enable WAL archiving on the primary to an archive directory accessible from&lt;br /&gt;
 # the standby. If wal_keep_segments is a high enough number to retain the WAL&lt;br /&gt;
 # segments required for the standby server, this is not necessary.&lt;br /&gt;
 archive_mode    = on&lt;br /&gt;
 archive_command = &#039;cp %p /path_to/archive/%f&#039;&lt;br /&gt;
* &#039;&#039;&#039;5.&#039;&#039;&#039; Start postgres on the primary server.&lt;br /&gt;
* &#039;&#039;&#039;6.&#039;&#039;&#039; Make a base backup by copying the primary server&#039;s data directory to the standby server.&lt;br /&gt;
 $ psql -c &amp;quot;SELECT pg_start_backup(&#039;label&#039;, true)&amp;quot;&lt;br /&gt;
 $ rsync -a ${PGDATA}/ standby:/srv/pgsql/standby/ --exclude postmaster.pid&lt;br /&gt;
 $ psql -c &amp;quot;SELECT pg_stop_backup()&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;7.&#039;&#039;&#039; Set up replication-related parameters, connections and authentication in the standby server like the primary, so that the standby might work as a primary after failover.&lt;br /&gt;
* &#039;&#039;&#039;8.&#039;&#039;&#039; Enable read-only queries on the standby server. But if wal_level is &#039;&#039;archive&#039;&#039; on the primary, leave hot_standby unchanged (i.e., off).&lt;br /&gt;
 $ $EDITOR postgresql.conf&lt;br /&gt;
 &lt;br /&gt;
 hot_standby = on&lt;br /&gt;
* &#039;&#039;&#039;9.&#039;&#039;&#039; Create a recovery command file in the standby server; the following parameters are required for streaming replication.&lt;br /&gt;
 $ $EDITOR recovery.conf&lt;br /&gt;
 # Note that recovery.conf must be in $PGDATA directory.&lt;br /&gt;
 &lt;br /&gt;
 # Specifies whether to start the server as a standby. In streaming replication,&lt;br /&gt;
 # this parameter must to be set to on.&lt;br /&gt;
 standby_mode          = &#039;on&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Specifies a connection string which is used for the standby server to connect&lt;br /&gt;
 # with the primary.&lt;br /&gt;
 primary_conninfo      = &#039;host=192.168.0.10 port=5432 user=postgres&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Specifies a trigger file whose presence should cause streaming replication to&lt;br /&gt;
 # end (i.e., failover).&lt;br /&gt;
 trigger_file = &#039;/path_to/trigger&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Specifies a command to load archive segments from the WAL archive. If&lt;br /&gt;
 # wal_keep_segments is a high enough number to retain the WAL segments&lt;br /&gt;
 # required for the standby server, this may not be necessary. But&lt;br /&gt;
 # a large workload can cause segments to be recycled before the standby&lt;br /&gt;
 # is fully synchronized, requiring you to start again from a new base backup.&lt;br /&gt;
 restore_command = &#039;cp /path_to/archive/%f &amp;quot;%p&amp;quot;&#039;&lt;br /&gt;
* &#039;&#039;&#039;10.&#039;&#039;&#039; Start postgres in the standby server. It will start streaming replication.&lt;br /&gt;
* &#039;&#039;&#039;11.&#039;&#039;&#039; You can calculate the replication lag by comparing the current WAL write location on the primary with the last WAL location received/replayed by the standby. They can be retrieved using &#039;&#039;pg_current_xlog_location&#039;&#039; on the primary and the &#039;&#039;pg_last_xlog_receive_location&#039;&#039;/&#039;&#039;pg_last_xlog_replay_location&#039;&#039; on the standby, respectively.&lt;br /&gt;
 $ psql -c &amp;quot;SELECT pg_current_xlog_location()&amp;quot; -h192.168.0.10 (primary host)&lt;br /&gt;
  pg_current_xlog_location &lt;br /&gt;
 --------------------------&lt;br /&gt;
  0/2000000&lt;br /&gt;
 (1 row)&lt;br /&gt;
 &lt;br /&gt;
 $ psql -c &amp;quot;select pg_last_xlog_receive_location()&amp;quot; -h192.168.0.20 (standby host)&lt;br /&gt;
  pg_last_xlog_receive_location &lt;br /&gt;
 -------------------------------&lt;br /&gt;
  0/2000000&lt;br /&gt;
 (1 row)&lt;br /&gt;
 &lt;br /&gt;
 $ psql -c &amp;quot;select pg_last_xlog_replay_location()&amp;quot; -h192.168.0.20 (standby host)&lt;br /&gt;
  pg_last_xlog_replay_location &lt;br /&gt;
 ------------------------------&lt;br /&gt;
  0/2000000&lt;br /&gt;
 (1 row)&lt;br /&gt;
* &#039;&#039;&#039;12.&#039;&#039;&#039; You can also check the progress of streaming replication by using &#039;&#039;ps&#039;&#039; command.&lt;br /&gt;
 # The displayed LSNs indicate the byte position that the standby server has&lt;br /&gt;
 # written up to in the xlogs.&lt;br /&gt;
 [primary] $ ps -ef | grep sender&lt;br /&gt;
 postgres  6879  6831  0 10:31 ?        00:00:00 postgres: wal sender process postgres 127.0.0.1(44663) streaming 0/2000000&lt;br /&gt;
 &lt;br /&gt;
 [standby] $ ps -ef | grep receiver&lt;br /&gt;
 postgres  6878  6872  1 10:31 ?        00:00:01 postgres: wal receiver process   streaming 0/2000000&lt;br /&gt;
* How to do failover&lt;br /&gt;
** Create the trigger file in the standby after the primary fails.&lt;br /&gt;
* How to stop the primary or the standby server&lt;br /&gt;
** Shut down it as usual (&#039;&#039;pg_ctl stop&#039;&#039;).&lt;br /&gt;
* How to restart streaming replication after failover&lt;br /&gt;
** Repeat the operations from &#039;&#039;&#039;6th&#039;&#039;&#039;; making a fresh backup, some configurations and starting the original primary as the standby. The primary server doesn&#039;t need to be stopped during these operations.&lt;br /&gt;
* How to restart streaming replication after the standby fails&lt;br /&gt;
** Restart postgres in the standby server after eliminating the cause of failure.&lt;br /&gt;
* How to disconnect the standby from the primary&lt;br /&gt;
** Create the trigger file in the standby while the primary is running. Then the standby would be brought up.&lt;br /&gt;
* How to re-synchronize the stand-alone standby after isolation&lt;br /&gt;
** Shut down the standby as usual. And repeat the operations from &#039;&#039;&#039;6th&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Todo =&lt;br /&gt;
== v9.0 ==&lt;br /&gt;
&lt;br /&gt;
Moved to [[PostgreSQL_9.0_Open_Items]]&lt;br /&gt;
&lt;br /&gt;
=== Committed ===&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01455.php Retrying from archive and some refactoring around Read/FetchRecord().] - [http://archives.postgresql.org/pgsql-committers/2010-01/msg00395.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg02601.php SR wrongly treats the WAL-boundary.] - [http://archives.postgresql.org/pgsql-committers/2010-01/msg00396.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01715.php Adjust SR for some later changes about wal-skipping.] - [http://archives.postgresql.org/pgsql-committers/2010-01/msg00399.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg00024.php VACUUM FULL unexpectedly writes an XLOG UNLOGGED record.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00038.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01754.php Add a message type header.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00037.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01536.php Documentation: Add a new &amp;quot;Replication&amp;quot; chapter.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00115.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg00350.php Failed assertion during recovery of partial WAL file.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00124.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg00712.php A PANIC error might occur in the standby because of a partially-filled archived WAL file.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00137.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg00330.php Improve the standby messages.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00140.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01672.php pq_getbyte_if_available() is not working because the win32 socket emulation layer simply wasn&#039;t designed to deal with non-blocking sockets.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00198.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg01488.php Walsender might emit unfit messages.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00239.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg01236.php Streaming replication on win32, still broken.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00270.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg00992.php Create new section for recovery.conf.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00295.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg01824.php Assertion failure in walreceiver.] - [http://archives.postgresql.org/pgsql-committers/2010-02/msg00356.php commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01717.php Forbid a startup of walsender during recovery, and emit a suitable message? Or allow walsender to be started also during recovery?] - [http://archives.postgresql.org/message-id/20100316090955.9A5107541D0@cvs.postgresql.org commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg01003.php How do we clean down the archive without using pg_standby?] - [http://archives.postgresql.org/message-id/20100318091718.BC14D7541D0@cvs.postgresql.org commit]&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2010-02/msg01510.php File-based log shipping without pg_standby doesn&#039;t replay the WAL files in pg_xlog.] - [http://archives.postgresql.org/pgsql-committers/2010-03/msg00356.php commit]&lt;br /&gt;
&lt;br /&gt;
== v9.1 ==&lt;br /&gt;
=== Synchronization capability ===&lt;br /&gt;
* Introduce the replication mode which can control how long transaction commit waits for replication before the commit command returns a &amp;quot;success&amp;quot; to a client. The valid modes are &#039;&#039;async&#039;&#039;, &#039;&#039;recv&#039;&#039; and &#039;&#039;fsync&#039;&#039;.&lt;br /&gt;
** &#039;&#039;async&#039;&#039; doesn&#039;t make transaction commit wait for replication, i.e., asynchronous replication.&lt;br /&gt;
** &#039;&#039;recv&#039;&#039; or &#039;&#039;fsync&#039;&#039; makes transaction commit wait for XLOG to be received or fsynced by the standby, respectively.&lt;br /&gt;
** (&#039;&#039;apply&#039;&#039; makes transaction commit wait for XLOG to be replayed by the standby. This mode will be supported in v9.2 or later)&lt;br /&gt;
** The replication mode is specified in recovery.conf of the standby as well as other parameters for replication.&lt;br /&gt;
*** The startup process reads the replication mode from recovery.conf and shares it to walreceiver via new shared-memory variable.&lt;br /&gt;
*** Walreceiver also shares it to walsender by using the replication handshake message (existing protocol needs to be extended).&lt;br /&gt;
** Based on the replication mode, walreceiver sends the reply meaning that replication is done up to the specified location to the primary.&lt;br /&gt;
*** In async, walreceiver doesn&#039;t need to send any reply other than end-of-replication message.&lt;br /&gt;
*** In recv or fsync, walreceiver sends the reply just after receiving or flushing XLOG, respectively.&lt;br /&gt;
*** New message type for the reply needs to be defined. The reply is sent as CopyData message.&lt;br /&gt;
** Walreceiver writes all the outstanding XLOG to disk before shutting down.&lt;br /&gt;
** Walsender receives the reply from the standby, updates the location of the last record replicated, and announces completion of replication.&lt;br /&gt;
*** New shared-memory variable to keep that location is required.&lt;br /&gt;
** When processing the commit command, backend waits for XLOG to be replicated to only the standbys which are in the recv or fsync replication mode.&lt;br /&gt;
*** Also smart shutdown waits for XLOG of shutdown checkpoint to be replicated.&lt;br /&gt;
* Required optimization&lt;br /&gt;
** Walsender should send outstanding XLOG without waiting wal_sender_delay.&lt;br /&gt;
*** When processing the commit command, backend signals walsender to send outstanding XLOG immediately.&lt;br /&gt;
** Backend should exit the wait loop as soon as the reply arrives at the primary.&lt;br /&gt;
*** When receiving the reply, walsender signals backends to get up from the sleep and determine whether to exit the wait loop by checking the location of the last XLOG replicated.&lt;br /&gt;
*** Only backends waiting for XLOG to be replicated up to the location contained in the reply are sent the signal.&lt;br /&gt;
** Walsender waits for the signal from backends and the reply from the standby at the same time, by using select/poll.&lt;br /&gt;
** Walsender reads XLOG from not only disk but also shared memory (wal buffers).&lt;br /&gt;
** Walreceiver should flush XLOG file only when XLOG file is switched or the related page is flushed.&lt;br /&gt;
*** When startup process or bgwriter flushes the buffer page, it checks whether the related XLOG has already been flushed via shared memory (location of the last XLOG flushed).&lt;br /&gt;
*** It flushes the buffer page, if XLOG file has already been flushed.&lt;br /&gt;
*** It signals walreceiver to flush XLOG file immediately and waits for the flush to complete, if XLOG file has not been flushed yet.&lt;br /&gt;
** While the standby is catching up with the primary, those servers should ignore the replication mode and perform asynchronous replication.&lt;br /&gt;
*** After those servers have almost gotten into synchronization, they perform replication based on the specified replication mode.&lt;br /&gt;
*** New replication states like &#039;catching-up&#039;, &#039;sync&#039;, etc need to be defined, and the state machine for them is required on both servers.&lt;br /&gt;
*** Current replication state can be monitored on both servers via SQL.&lt;br /&gt;
* Required timeout&lt;br /&gt;
** Add new parameter replication_timeout which is the maximum time to wait until XLOG is replicated to the standby.&lt;br /&gt;
** Add new parameter (replication_timeout_action) to specify the reaction to replication_timeout.&lt;br /&gt;
&lt;br /&gt;
== Future release ==&lt;br /&gt;
* &#039;&#039;&#039;Synchronization capability&#039;&#039;&#039;&lt;br /&gt;
** Introduce the synchronization mode which can control how long transaction commit waits for replication before the commit command returns a &amp;quot;success&amp;quot; to a client. The valid modes are &#039;&#039;async&#039;&#039;, &#039;&#039;recv&#039;&#039;, &#039;&#039;fsync&#039;&#039; and &#039;&#039;apply&#039;&#039;.&lt;br /&gt;
*** &#039;&#039;async&#039;&#039; doesn&#039;t make transaction commit wait for replication, i.e., asynchronous replication.&lt;br /&gt;
*** &#039;&#039;recv&#039;&#039;, &#039;&#039;fsync&#039;&#039; and &#039;&#039;apply&#039;&#039; makes transaction commit wait for XLOG records to be received, fsynced and applied on the standby, respectively.&lt;br /&gt;
** Change walsender to be able to read XLOG from not only the disk but also shared memory.&lt;br /&gt;
** Add new parameter replication_timeout which is the maximum time to wait until XLOG records are replicated to the standby.&lt;br /&gt;
** Add new parameter (replication_timeout_action) to specify the reaction to replication_timeout.&lt;br /&gt;
* &#039;&#039;&#039;Monitoring&#039;&#039;&#039;&lt;br /&gt;
** Provide the capability to check the progress and gap of streaming replication via one query. A collaboration of HS and SR is necessary to provide that capability on the standby side.&lt;br /&gt;
** Provide the capability to check if the specified repliation is in progress via a query. Also more detailed status information might be necessary, e.g, the standby is catching up now, has already gotten into sync, and so on.&lt;br /&gt;
** Change the stats collector to collect the statistics information about replication, e.g., average delay of replication time.&lt;br /&gt;
** Develop the tool to calculate the latest XLOG position from XLOG files. This is necessary to check the gap of replication after the server fails.&lt;br /&gt;
** Also develop the tool to extract the user-readable contents from XLOG files. This is necessary to see the contents of the gap, and manually restore them.&lt;br /&gt;
* &#039;&#039;&#039;Easy to Use&#039;&#039;&#039;&lt;br /&gt;
** Introduce the parameters like:&lt;br /&gt;
*** replication_halt_timeout - replication will halt if no data has been sent for this much time.&lt;br /&gt;
*** replication_halt_segments - replication will halt if number of WAL files in pg_xlog exceeds this threshold.&lt;br /&gt;
*** These parameters allow us to avoid disk overflow.&lt;br /&gt;
** Add new feature which transfers also base backup via the direct connection between the primary and the standby.&lt;br /&gt;
** Add new hooks like walsender_hook and walreceiver_hook to cooperate with the add-on program for compression like pglesslog.&lt;br /&gt;
** Provide a graceful termination of replication via a query on the primary. On the standby, a trigger file mechanism already provides that capability.&lt;br /&gt;
** Support replication beyond timeline. The timeline history files need to be shipped from the primary to the standby.&lt;br /&gt;
* &#039;&#039;&#039;Robustness&#039;&#039;&#039;&lt;br /&gt;
** Support keepalive in libpq. This is useful for a client and the standby to detect a failure of the primary immediately.&lt;br /&gt;
** [http://archives.postgresql.org/pgsql-hackers/2010-01/msg01536.php New privilege for replication.]&lt;br /&gt;
*** Currently superuser privilege is required when the standby connects to the primary. But there is the complaint that we should add new privilege for replication and use it instead of superuser because current approach is not good for security.&lt;br /&gt;
* &#039;&#039;&#039;Miscellaneous&#039;&#039;&#039;&lt;br /&gt;
** Standalone walreceiver tool, which connects to the primary, continuously receives and writes XLOG records, independently from postgres server.&lt;br /&gt;
** Cascade streaming replication. Allow walsender to send XLOG to another standby during recovery.&lt;br /&gt;
** WAL archiving during recovery.&lt;br /&gt;
&lt;br /&gt;
[[Category:Replication]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PGUG_EU_Media_Coordination&amp;diff=11302</id>
		<title>PGUG EU Media Coordination</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PGUG_EU_Media_Coordination&amp;diff=11302"/>
		<updated>2010-06-26T16:59:02Z</updated>

		<summary type="html">&lt;p&gt;Robe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an overview of publications where we want to have regular PostgreSQL exposure. Feel free to extend the list with interesting Publications in your area.&lt;br /&gt;
&lt;br /&gt;
= Publications =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Publication&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Publisher&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Language&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Target audience&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Contact&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.linux-magazin.de/ Linux Magazin] || [http://www.linuxnewmedia.de/ Linux New Media AG] || Monthly Magazine || German || Professional/Commercial FOSS Users || [mailto:jbrendel@linuxnewmedia.de Jens-Christoph Brendel]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.admin-magazin.de/ Admin Magazin] || [http://www.linuxnewmedia.de/ Linux New Media AG] || Monthly Magazine || German || IT-Administrators || [mailto:jbrendel@linuxnewmedia.de Jens-Christoph Brendel]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.linuxtechnicalreview.de/ Linux Technical Review] || [http://www.linuxnewmedia.de/ Linux New Media AG] || Subscriber-only Online Publication || German || Architects &amp;amp; Decision Makers || [mailto:jbrendel@linuxnewmedia.de Jens-Christoph Brendel]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.heise.de/ix/ iX] || [http://www.heise-medien.de/default.php/mediengruppe,zeitschriften/11/2 Heise Zeitschriften Verlag GmbH &amp;amp; Co. KG] || Monthly Magazine || German || IT-Administrators || FIXME&lt;br /&gt;
|-&lt;br /&gt;
| [http://entwickler-magazin.de/ Entwickler Magazin] || [http://software-support.biz/ Software &amp;amp; Support Verlag GmbH] || Monthly Magazine || German || Developers? || FIXME&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Published articles =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Publication&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Title&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Autor&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date/Issue&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Linux Magazin || FIXME || Andreas Scherbaum || FIXME&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PGUG_EU_Media_Coordination&amp;diff=11301</id>
		<title>PGUG EU Media Coordination</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PGUG_EU_Media_Coordination&amp;diff=11301"/>
		<updated>2010-06-26T16:58:39Z</updated>

		<summary type="html">&lt;p&gt;Robe: New page: This is an overview of publications where we want to have regular PostgreSQL exposure. Feel free to extend the list with interesting Publications in your area.  = Publications =  {| | alig...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an overview of publications where we want to have regular PostgreSQL exposure. Feel free to extend the list with interesting Publications in your area.&lt;br /&gt;
&lt;br /&gt;
= Publications =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Publication&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Publisher&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Language&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Target audience&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Contact&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.linux-magazin.de/ Linux Magazin] || [http://www.linuxnewmedia.de/ Linux New Media AG] || Monthly Magazine || German || Professional/Commercial FOSS Users || [mailto:jbrendel@linuxnewmedia.de Jens-Christoph Brendel]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.admin-magazin.de/ Admin Magazin] || [http://www.linuxnewmedia.de/ Linux New Media AG] || Monthly Magazine || German || IT-Administrators || [mailto:jbrendel@linuxnewmedia.de Jens-Christoph Brendel]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.linuxtechnicalreview.de/ Linux Technical Review] || [http://www.linuxnewmedia.de/ Linux New Media AG] || Subscriber-only Online Publication || German || Architects &amp;amp; Decision Makers || [mailto:jbrendel@linuxnewmedia.de Jens-Christoph Brendel]&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.heise.de/ix/ iX] || [http://www.heise-medien.de/default.php/mediengruppe,zeitschriften/11/2 Heise Zeitschriften Verlag GmbH &amp;amp; Co. KG] || Monthly Magazine || || German IT-Administrators || FIXME&lt;br /&gt;
|-&lt;br /&gt;
| [http://entwickler-magazin.de/ Entwickler Magazin] || [http://software-support.biz/ Software &amp;amp; Support Verlag GmbH] || Monthly Magazine || German || Developers? || FIXME&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Published articles =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Publication&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Title&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Autor&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date/Issue&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Linux Magazin || FIXME || Andreas Scherbaum || FIXME&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11300</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11300"/>
		<updated>2010-06-26T16:27:22Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Completed Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conferences = &lt;br /&gt;
&lt;br /&gt;
Recurring events in the Euro zone where PostgreSQL activities might be beneficial&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Location&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;URL&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Contact Information&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Duration&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Approx. Time&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Language&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&lt;br /&gt;
|-&lt;br /&gt;
| P2D2||Prague, Czech Rep ||http://www.p2d2.cz/||||PostgreSQL Czech Community conference||||One day||February||Czech&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||Hanover, Germany||http://www.cebit.de/||||Trade fair||~300k Visitors||Tuesday - Saturday||Early March||German&lt;br /&gt;
|-&lt;br /&gt;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||German?&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||Chemnitz, Germany||http://chemnitzer.linux-tage.de/2010/||||FOSS community conference||||Weekend||Mid March||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Solutions Linux||Paris, France||http://www.solutionslinux.fr/||||Trade fair||||Tuesday-Thursday||Mid March||French&lt;br /&gt;
|-&lt;br /&gt;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&lt;br /&gt;
|-&lt;br /&gt;
| Wiener Linuxwochen||Wien, Austria||http://www.linuxwochen.at/||||FOSS community conference||||Weekend||Early May||German&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||Nuremberg, Germany||http://www.netways.de/en/osdc/||||Commercial conference||~100 Attendees||Wednesday &amp;amp; Thursday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Linuxtag||Berlin, Germany||http://www.linuxtag.org/||||FOSS community conference||||Wednesday - Saturday||Mid June||German?&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||Rostock, Germany||http://www.amoocon.de/||||Commercial conference||~100 Attendees||Friday - Sunday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||St. Augustin, Germany||http://www.froscon.de/||||FOSS community conference||||Weekend||Late August||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||Zurich, Switzerland||http://wiki.froscamp.org/||||FOSS community conference||||Friday &amp;amp; Saturday||Mid September||German? English? French?&lt;br /&gt;
|-&lt;br /&gt;
| Kieler Linuxtage||Kiel, Germany||http://www.kieler-linuxtage.de/||||FOSS community conference||||Friday &amp;amp; Saturday||Early October||German?&lt;br /&gt;
|-&lt;br /&gt;
| OpenRheinRuhr ||&amp;quot;Im Pott&amp;quot;, Germany||http://www.openrheinruhr.de/||||FOSS community conference||||TBD||November||German?&lt;br /&gt;
|-&lt;br /&gt;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Europe||changing||http://2009.pgday.eu/||||PostgreSQL Community conference||||Friday &amp;amp; Saturday||November||English&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Fr||France ||http://www.pgday.fr/||||PostgreSQL French-speaking Community conference||||Friday &amp;amp; Saturday||October-November||French&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||21st &amp;amp; 22nd Aug||Michael Renner, Andreas Scherbaum||DevRoom with Talks||Project submitted, Talks TBD&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||17th &amp;amp; 18th Sept||Markus Wanner||Booth &amp;amp; Talks||Project submitted, waiting for affirmation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Completed Events =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February 2010||Andreas Scherbaum, ..||Talks &amp;amp; Booth||&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March 2010||Andreas Scherbaum, ..||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March 2010||Andreas Scherbaum, Andreas Kretschmer, ...||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Wiener Linuxwochen||6th - 8th May 2010||Hans-Jürgen Schöning||[http://www.linuxwochen.at/index.php?option=com_content&amp;amp;view=article&amp;amp;id=152&amp;amp;Itemid=69 Talk]||Talk PostgreSQL 9.0&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||4th - 6th June 2010||Michael Renner||[http://www.amoocon.de/speakers/214 Talk]||Talk PostgreSQL 9.0&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June 2010||Michael Renner||[http://www.netways.de/osdc/y2010/programm/ Talk]||Talk PostgreSQL Replication with 9.0&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11299</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11299"/>
		<updated>2010-06-26T16:26:23Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Completed Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conferences = &lt;br /&gt;
&lt;br /&gt;
Recurring events in the Euro zone where PostgreSQL activities might be beneficial&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Location&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;URL&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Contact Information&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Duration&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Approx. Time&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Language&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&lt;br /&gt;
|-&lt;br /&gt;
| P2D2||Prague, Czech Rep ||http://www.p2d2.cz/||||PostgreSQL Czech Community conference||||One day||February||Czech&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||Hanover, Germany||http://www.cebit.de/||||Trade fair||~300k Visitors||Tuesday - Saturday||Early March||German&lt;br /&gt;
|-&lt;br /&gt;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||German?&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||Chemnitz, Germany||http://chemnitzer.linux-tage.de/2010/||||FOSS community conference||||Weekend||Mid March||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Solutions Linux||Paris, France||http://www.solutionslinux.fr/||||Trade fair||||Tuesday-Thursday||Mid March||French&lt;br /&gt;
|-&lt;br /&gt;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&lt;br /&gt;
|-&lt;br /&gt;
| Wiener Linuxwochen||Wien, Austria||http://www.linuxwochen.at/||||FOSS community conference||||Weekend||Early May||German&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||Nuremberg, Germany||http://www.netways.de/en/osdc/||||Commercial conference||~100 Attendees||Wednesday &amp;amp; Thursday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Linuxtag||Berlin, Germany||http://www.linuxtag.org/||||FOSS community conference||||Wednesday - Saturday||Mid June||German?&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||Rostock, Germany||http://www.amoocon.de/||||Commercial conference||~100 Attendees||Friday - Sunday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||St. Augustin, Germany||http://www.froscon.de/||||FOSS community conference||||Weekend||Late August||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||Zurich, Switzerland||http://wiki.froscamp.org/||||FOSS community conference||||Friday &amp;amp; Saturday||Mid September||German? English? French?&lt;br /&gt;
|-&lt;br /&gt;
| Kieler Linuxtage||Kiel, Germany||http://www.kieler-linuxtage.de/||||FOSS community conference||||Friday &amp;amp; Saturday||Early October||German?&lt;br /&gt;
|-&lt;br /&gt;
| OpenRheinRuhr ||&amp;quot;Im Pott&amp;quot;, Germany||http://www.openrheinruhr.de/||||FOSS community conference||||TBD||November||German?&lt;br /&gt;
|-&lt;br /&gt;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Europe||changing||http://2009.pgday.eu/||||PostgreSQL Community conference||||Friday &amp;amp; Saturday||November||English&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Fr||France ||http://www.pgday.fr/||||PostgreSQL French-speaking Community conference||||Friday &amp;amp; Saturday||October-November||French&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||21st &amp;amp; 22nd Aug||Michael Renner, Andreas Scherbaum||DevRoom with Talks||Project submitted, Talks TBD&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||17th &amp;amp; 18th Sept||Markus Wanner||Booth &amp;amp; Talks||Project submitted, waiting for affirmation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Completed Events =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February 2010||Andreas Scherbaum, ..||Talks &amp;amp; Booth||&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March 2010||Andreas Scherbaum, ..||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March 2010||Andreas Scherbaum, Andreas Kretschmer, ...||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Wiener Linuxwochen||6th - 8th May 2010||Hans-Jürgen Schöning||Talk PostgreSQL 9.0&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||4th - 6th June 2010||Michael Renner||[http://www.amoocon.de/speakers/214 Talk]||Talk PostgreSQL 9.0&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June 2010||Michael Renner||[http://www.netways.de/osdc/y2010/programm/ Talk]||Talk PostgreSQL Replication with 9.0&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11298</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11298"/>
		<updated>2010-06-26T16:25:00Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Conferences */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conferences = &lt;br /&gt;
&lt;br /&gt;
Recurring events in the Euro zone where PostgreSQL activities might be beneficial&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Location&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;URL&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Contact Information&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Duration&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Approx. Time&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Language&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&lt;br /&gt;
|-&lt;br /&gt;
| P2D2||Prague, Czech Rep ||http://www.p2d2.cz/||||PostgreSQL Czech Community conference||||One day||February||Czech&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||Hanover, Germany||http://www.cebit.de/||||Trade fair||~300k Visitors||Tuesday - Saturday||Early March||German&lt;br /&gt;
|-&lt;br /&gt;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||German?&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||Chemnitz, Germany||http://chemnitzer.linux-tage.de/2010/||||FOSS community conference||||Weekend||Mid March||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Solutions Linux||Paris, France||http://www.solutionslinux.fr/||||Trade fair||||Tuesday-Thursday||Mid March||French&lt;br /&gt;
|-&lt;br /&gt;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&lt;br /&gt;
|-&lt;br /&gt;
| Wiener Linuxwochen||Wien, Austria||http://www.linuxwochen.at/||||FOSS community conference||||Weekend||Early May||German&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||Nuremberg, Germany||http://www.netways.de/en/osdc/||||Commercial conference||~100 Attendees||Wednesday &amp;amp; Thursday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Linuxtag||Berlin, Germany||http://www.linuxtag.org/||||FOSS community conference||||Wednesday - Saturday||Mid June||German?&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||Rostock, Germany||http://www.amoocon.de/||||Commercial conference||~100 Attendees||Friday - Sunday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||St. Augustin, Germany||http://www.froscon.de/||||FOSS community conference||||Weekend||Late August||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||Zurich, Switzerland||http://wiki.froscamp.org/||||FOSS community conference||||Friday &amp;amp; Saturday||Mid September||German? English? French?&lt;br /&gt;
|-&lt;br /&gt;
| Kieler Linuxtage||Kiel, Germany||http://www.kieler-linuxtage.de/||||FOSS community conference||||Friday &amp;amp; Saturday||Early October||German?&lt;br /&gt;
|-&lt;br /&gt;
| OpenRheinRuhr ||&amp;quot;Im Pott&amp;quot;, Germany||http://www.openrheinruhr.de/||||FOSS community conference||||TBD||November||German?&lt;br /&gt;
|-&lt;br /&gt;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Europe||changing||http://2009.pgday.eu/||||PostgreSQL Community conference||||Friday &amp;amp; Saturday||November||English&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Fr||France ||http://www.pgday.fr/||||PostgreSQL French-speaking Community conference||||Friday &amp;amp; Saturday||October-November||French&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||21st &amp;amp; 22nd Aug||Michael Renner, Andreas Scherbaum||DevRoom with Talks||Project submitted, Talks TBD&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||17th &amp;amp; 18th Sept||Markus Wanner||Booth &amp;amp; Talks||Project submitted, waiting for affirmation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Completed Events =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February 2010||Andreas Scherbaum, ..||Talks &amp;amp; Booth||&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March 2010||Andreas Scherbaum, ..||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March 2010||Andreas Scherbaum, Andreas Kretschmer, ...||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||4th - 6th June 2010||Michael Renner||[http://www.amoocon.de/speakers/214 Talk]||Talk PostgreSQL 9.0&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June 2010||Michael Renner||[http://www.netways.de/osdc/y2010/programm/ Talk]||Talk PostgreSQL Replication with 9.0&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11281</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11281"/>
		<updated>2010-06-25T12:05:11Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Planning 2010 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conferences = &lt;br /&gt;
&lt;br /&gt;
Recurring events in the Euro zone where PostgreSQL activities might be beneficial&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Location&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;URL&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Contact Information&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Duration&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Approx. Time&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Language&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&lt;br /&gt;
|-&lt;br /&gt;
| P2D2||Prague, Czech Rep ||http://www.p2d2.cz/||||PostgreSQL Czech Community conference||||One day||February||Czech&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||Hanover, Germany||http://www.cebit.de/||||Trade fair||~300k Visitors||Tuesday - Saturday||Early March||German&lt;br /&gt;
|-&lt;br /&gt;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||German?&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||Chemnitz, Germany||http://chemnitzer.linux-tage.de/2010/||||FOSS community conference||||Weekend||Mid March||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Solutions Linux||Paris, France||http://www.solutionslinux.fr/||||Trade fair||||Tuesday-Thursday||Mid March||French&lt;br /&gt;
|-&lt;br /&gt;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||Nuremberg, Germany||http://www.netways.de/en/osdc/||||Commercial conference||~100 Attendees||Wednesday &amp;amp; Thursday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Linuxtag||Berlin, Germany||http://www.linuxtag.org/||||FOSS community conference||||Wednesday - Saturday||Mid June||German?&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||Rostock, Germany||http://www.amoocon.de/||||Commercial conference||~100 Attendees||Friday - Sunday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||St. Augustin, Germany||http://www.froscon.de/||||FOSS community conference||||Weekend||Late August||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||Zurich, Switzerland||http://wiki.froscamp.org/||||FOSS community conference||||Friday &amp;amp; Saturday||Mid September||German? English? French?&lt;br /&gt;
|-&lt;br /&gt;
| Kieler Linuxtage||Kiel, Germany||http://www.kieler-linuxtage.de/||||FOSS community conference||||Friday &amp;amp; Saturday||Early October||German?&lt;br /&gt;
|-&lt;br /&gt;
| OpenRheinRuhr ||&amp;quot;Im Pott&amp;quot;, Germany||http://www.openrheinruhr.de/||||FOSS community conference||||TBD||November||German?&lt;br /&gt;
|-&lt;br /&gt;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Europe||changing||http://2009.pgday.eu/||||PostgreSQL Community conference||||Friday &amp;amp; Saturday||November||English&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Fr||France ||http://www.pgday.fr/||||PostgreSQL French-speaking Community conference||||Friday &amp;amp; Saturday||October-November||French&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||21st &amp;amp; 22nd Aug||Michael Renner, Andreas Scherbaum||DevRoom with Talks||Project submitted, Talks TBD&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||17th &amp;amp; 18th Sept||Markus Wanner||Booth &amp;amp; Talks||Project submitted, waiting for affirmation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Completed Events =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February 2010||Andreas Scherbaum, ..||Talks &amp;amp; Booth||&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March 2010||Andreas Scherbaum, ..||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March 2010||Andreas Scherbaum, Andreas Kretschmer, ...||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||4th - 6th June 2010||Michael Renner||[http://www.amoocon.de/speakers/214 Talk]||Talk PostgreSQL 9.0&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June 2010||Michael Renner||[http://www.netways.de/osdc/y2010/programm/ Talk]||Talk PostgreSQL Replication with 9.0&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11280</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11280"/>
		<updated>2010-06-25T11:24:27Z</updated>

		<summary type="html">&lt;p&gt;Robe: /* Completed Events */ added year to completed events&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conferences = &lt;br /&gt;
&lt;br /&gt;
Recurring events in the Euro zone where PostgreSQL activities might be beneficial&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Location&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;URL&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Contact Information&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Duration&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Approx. Time&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Language&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&lt;br /&gt;
|-&lt;br /&gt;
| P2D2||Prague, Czech Rep ||http://www.p2d2.cz/||||PostgreSQL Czech Community conference||||One day||February||Czech&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||Hanover, Germany||http://www.cebit.de/||||Trade fair||~300k Visitors||Tuesday - Saturday||Early March||German&lt;br /&gt;
|-&lt;br /&gt;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||German?&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||Chemnitz, Germany||http://chemnitzer.linux-tage.de/2010/||||FOSS community conference||||Weekend||Mid March||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Solutions Linux||Paris, France||http://www.solutionslinux.fr/||||Trade fair||||Tuesday-Thursday||Mid March||French&lt;br /&gt;
|-&lt;br /&gt;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||Nuremberg, Germany||http://www.netways.de/en/osdc/||||Commercial conference||~100 Attendees||Wednesday &amp;amp; Thursday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Linuxtag||Berlin, Germany||http://www.linuxtag.org/||||FOSS community conference||||Wednesday - Saturday||Mid June||German?&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||Rostock, Germany||http://www.amoocon.de/||||Commercial conference||~100 Attendees||Friday - Sunday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||St. Augustin, Germany||http://www.froscon.de/||||FOSS community conference||||Weekend||Late August||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||Zurich, Switzerland||http://wiki.froscamp.org/||||FOSS community conference||||Friday &amp;amp; Saturday||Mid September||German? English? French?&lt;br /&gt;
|-&lt;br /&gt;
| Kieler Linuxtage||Kiel, Germany||http://www.kieler-linuxtage.de/||||FOSS community conference||||Friday &amp;amp; Saturday||Early October||German?&lt;br /&gt;
|-&lt;br /&gt;
| OpenRheinRuhr ||&amp;quot;Im Pott&amp;quot;, Germany||http://www.openrheinruhr.de/||||FOSS community conference||||TBD||November||German?&lt;br /&gt;
|-&lt;br /&gt;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Europe||changing||http://2009.pgday.eu/||||PostgreSQL Community conference||||Friday &amp;amp; Saturday||November||English&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Fr||France ||http://www.pgday.fr/||||PostgreSQL French-speaking Community conference||||Friday &amp;amp; Saturday||October-November||French&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||21st &amp;amp; 22nd Aug||Michael Renner, Andreas Scherbaum||DevRoom &amp;amp; Talks||Project submitted, Talks TBD&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||17th &amp;amp; 18th Sept||Markus Wanner||Booth &amp;amp; Talks||Project submitted, waiting for affirmation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Completed Events =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February 2010||Andreas Scherbaum, ..||Talks &amp;amp; Booth||&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March 2010||Andreas Scherbaum, ..||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March 2010||Andreas Scherbaum, Andreas Kretschmer, ...||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||4th - 6th June 2010||Michael Renner||[http://www.amoocon.de/speakers/214 Talk]||Talk PostgreSQL 9.0&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June 2010||Michael Renner||[http://www.netways.de/osdc/y2010/programm/ Talk]||Talk PostgreSQL Replication with 9.0&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11279</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11279"/>
		<updated>2010-06-25T11:23:48Z</updated>

		<summary type="html">&lt;p&gt;Robe: osdc done, added froscon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conferences = &lt;br /&gt;
&lt;br /&gt;
Recurring events in the Euro zone where PostgreSQL activities might be beneficial&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Location&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;URL&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Contact Information&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Duration&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Approx. Time&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Language&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&lt;br /&gt;
|-&lt;br /&gt;
| P2D2||Prague, Czech Rep ||http://www.p2d2.cz/||||PostgreSQL Czech Community conference||||One day||February||Czech&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||Hanover, Germany||http://www.cebit.de/||||Trade fair||~300k Visitors||Tuesday - Saturday||Early March||German&lt;br /&gt;
|-&lt;br /&gt;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||German?&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||Chemnitz, Germany||http://chemnitzer.linux-tage.de/2010/||||FOSS community conference||||Weekend||Mid March||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Solutions Linux||Paris, France||http://www.solutionslinux.fr/||||Trade fair||||Tuesday-Thursday||Mid March||French&lt;br /&gt;
|-&lt;br /&gt;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||Nuremberg, Germany||http://www.netways.de/en/osdc/||||Commercial conference||~100 Attendees||Wednesday &amp;amp; Thursday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Linuxtag||Berlin, Germany||http://www.linuxtag.org/||||FOSS community conference||||Wednesday - Saturday||Mid June||German?&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||Rostock, Germany||http://www.amoocon.de/||||Commercial conference||~100 Attendees||Friday - Sunday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||St. Augustin, Germany||http://www.froscon.de/||||FOSS community conference||||Weekend||Late August||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||Zurich, Switzerland||http://wiki.froscamp.org/||||FOSS community conference||||Friday &amp;amp; Saturday||Mid September||German? English? French?&lt;br /&gt;
|-&lt;br /&gt;
| Kieler Linuxtage||Kiel, Germany||http://www.kieler-linuxtage.de/||||FOSS community conference||||Friday &amp;amp; Saturday||Early October||German?&lt;br /&gt;
|-&lt;br /&gt;
| OpenRheinRuhr ||&amp;quot;Im Pott&amp;quot;, Germany||http://www.openrheinruhr.de/||||FOSS community conference||||TBD||November||German?&lt;br /&gt;
|-&lt;br /&gt;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Europe||changing||http://2009.pgday.eu/||||PostgreSQL Community conference||||Friday &amp;amp; Saturday||November||English&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Fr||France ||http://www.pgday.fr/||||PostgreSQL French-speaking Community conference||||Friday &amp;amp; Saturday||October-November||French&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||21st &amp;amp; 22nd Aug||Michael Renner, Andreas Scherbaum||DevRoom &amp;amp; Talks||Project submitted, Talks TBD&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||17th &amp;amp; 18th Sept||Markus Wanner||Booth &amp;amp; Talks||Project submitted, waiting for affirmation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Completed Events =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February 2010||Andreas Scherbaum, ..||Talks &amp;amp; Booth||&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March 2010||Andreas Scherbaum, ..||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March 2010||Andreas Scherbaum, Andreas Kretschmer, ...||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||4th - 6th June||Michael Renner||[http://www.amoocon.de/speakers/214 Talk]||Talk PostgreSQL 9.0&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June||Michael Renner||[http://www.netways.de/osdc/y2010/programm/ Talk]||Talk PostgreSQL Replication with 9.0&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11148</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=PGUG_EU_Conference_Coordination&amp;diff=11148"/>
		<updated>2010-06-07T06:25:52Z</updated>

		<summary type="html">&lt;p&gt;Robe: amoocon done&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Conferences = &lt;br /&gt;
&lt;br /&gt;
Recurring events in the Euro zone where PostgreSQL activities might be beneficial&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Location&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;URL&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Contact Information&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Size&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Duration&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Approx. Time&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Language&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&lt;br /&gt;
|-&lt;br /&gt;
| P2D2||Prague, Czech Rep ||http://www.p2d2.cz/||||PostgreSQL Czech Community conference||||One day||February||Czech&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||Hanover, Germany||http://www.cebit.de/||||Trade fair||~300k Visitors||Tuesday - Saturday||Early March||German&lt;br /&gt;
|-&lt;br /&gt;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||German?&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||Chemnitz, Germany||http://chemnitzer.linux-tage.de/2010/||||FOSS community conference||||Weekend||Mid March||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Solutions Linux||Paris, France||http://www.solutionslinux.fr/||||Trade fair||||Tuesday-Thursday||Mid March||French&lt;br /&gt;
|-&lt;br /&gt;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||Nuremberg, Germany||http://www.netways.de/en/osdc/||||Commercial conference||~100 Attendees||Wednesday &amp;amp; Thursday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| Linuxtag||Berlin, Germany||http://www.linuxtag.org/||||FOSS community conference||||Wednesday - Saturday||Mid June||German?&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||Rostock, Germany||http://www.amoocon.de/||||Commercial conference||~100 Attendees||Friday - Sunday||Early June||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCon||St. Augustin, Germany||http://www.froscon.de/||||FOSS community conference||||Weekend||Late August||German &amp;amp; English&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||Zurich, Switzerland||http://wiki.froscamp.org/||||FOSS community conference||||Friday &amp;amp; Saturday||Mid September||German? English? French?&lt;br /&gt;
|-&lt;br /&gt;
| Kieler Linuxtage||Kiel, Germany||http://www.kieler-linuxtage.de/||||FOSS community conference||||Friday &amp;amp; Saturday||Early October||German?&lt;br /&gt;
|-&lt;br /&gt;
| OpenRheinRuhr ||&amp;quot;Im Pott&amp;quot;, Germany||http://www.openrheinruhr.de/||||FOSS community conference||||TBD||November||German?&lt;br /&gt;
|-&lt;br /&gt;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Europe||changing||http://2009.pgday.eu/||||PostgreSQL Community conference||||Friday &amp;amp; Saturday||November||English&lt;br /&gt;
|-&lt;br /&gt;
| PGDay Fr||France ||http://www.pgday.fr/||||PostgreSQL French-speaking Community conference||||Friday &amp;amp; Saturday||October-November||French&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June||Michael Renner||[http://www.netways.de/osdc/y2010/programm/ Talk]||Talk accepted&lt;br /&gt;
|-&lt;br /&gt;
| FrOSCamp||17th &amp;amp; 18th Sept||Markus Wanner||Booth &amp;amp; Talks||Project submitted, waiting for affirmation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Completed Events =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Date&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Attendees&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Type of attendance&#039;&#039;&#039;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|&#039;&#039;&#039;Comments&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February 2010||Andreas Scherbaum, ..||Talks &amp;amp; Booth||&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March 2010||Andreas Scherbaum, ..||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March 2010||Andreas Scherbaum, Andreas Kretschmer, ...||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||4th - 6th June||Michael Renner||[http://www.amoocon.de/speakers/214 Talk]||Talk PostgreSQL 9.0&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
	<entry>
		<id>https://wiki.postgresql.org/index.php?title=User:Robe&amp;diff=10968</id>
		<title>User:Robe</title>
		<link rel="alternate" type="text/html" href="https://wiki.postgresql.org/index.php?title=User:Robe&amp;diff=10968"/>
		<updated>2010-05-24T21:57:26Z</updated>

		<summary type="html">&lt;p&gt;Robe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ad personam =&lt;br /&gt;
&lt;br /&gt;
Michael Renner&lt;br /&gt;
http://amd.co.at/&lt;br /&gt;
&lt;br /&gt;
= Scribbles = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
After looking into Syslog per suggestions of pgfouine it seems as if Syslog-Logs are much easier to parse and overall more deterministic than &amp;quot;Standard&amp;quot; Logs.&lt;br /&gt;
&lt;br /&gt;
The main advantages are:&lt;br /&gt;
&lt;br /&gt;
* PID and&lt;br /&gt;
* per-backend Linecounter allow clear identification of interleaved/mangled messages&lt;br /&gt;
* Per-&amp;quot;chunk&amp;quot; identifier allows to identify lines which belong to the same log event.&lt;br /&gt;
&lt;br /&gt;
=== Standard Syslog Output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Oct  8 20:48:26 fst-prod-indexrevdb01 postgres[18134]: [6459-1] 2008-10-08 20:48:26 UTC ERROR:  duplicate key value violates unique constraint &amp;quot;newsgroups_name_key&amp;quot;&lt;br /&gt;
Oct  8 20:48:26 fst-prod-indexrevdb01 postgres[18134]: [6459-2] 2008-10-08 20:48:26 UTC STATEMENT:  insert into newsgroups&lt;br /&gt;
Oct  8 20:48:26 fst-prod-indexrevdb01 postgres[18134]: [6459-3]  (name,kategorie,first_art,last_art,last_checked,num_articles,num_files,num_threads,server,days_to_keep)&lt;br /&gt;
Oct  8 20:48:26 fst-prod-indexrevdb01 postgres[18134]: [6459-4]  values($1,&#039;--&#039;,$2,$3,0,$4,0,0,$5,$6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Logging Output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2008-10-05 05:29:20 UTC ERROR:  duplicate key value violates unique constraint &amp;quot;newsgroups_name_key&amp;quot;&lt;br /&gt;
2008-10-05 05:29:20 UTC STATEMENT:  insert into newsgroups (name,kategorie,first_art,last_art,last_checked,num_articles,num_files,num_threads,server,days_to_keep) values($1,&#039;--&#039;,$2,$3,0,$4,0,0,$5,$6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Syslog-Emulation ===&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;tt&amp;gt;log_line_prefix = &#039;%t postgres[%p]: [%l-1] &#039;&amp;lt;/tt&amp;gt; you can achieve the following output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2008-10-08 21:20:46 UTC postgres[30545]: [12911-1] ERROR:  duplicate key value violates unique constraint &amp;quot;newsgroups_name_key&amp;quot;&lt;br /&gt;
2008-10-08 21:20:46 UTC postgres[30545]: [12912-1] STATEMENT:  insert into newsgroups (name,kategorie,first_art,last_art,last_checked,num_articles,num_files,num_threads,server,days_to_keep) values($1&lt;br /&gt;
,&#039;--&#039;,$2,$3,0,$4,0,0,$5,$6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which is already much more deterministic than the defaults.&lt;br /&gt;
&lt;br /&gt;
= Ideas =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Fix Status Quo of VACUUM Full&lt;br /&gt;
* Fix Cluster&lt;br /&gt;
* Add more Aliases for different Encodings&lt;br /&gt;
* Ease Table Partitioning&lt;br /&gt;
* Revisit all non-transactional/WAL logged commands&lt;br /&gt;
* Key Compression for Btree indexes&lt;br /&gt;
* Revisit insert fill behavior in pgexerciser.pl&lt;/div&gt;</summary>
		<author><name>Robe</name></author>
	</entry>
</feed>