<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.postgresql.org/skins/common/feed.css?207"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.postgresql.org/index.php?title=Special:Contributions&amp;feed=atom&amp;target=Robe</id>
		<title>PostgreSQL wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.postgresql.org/index.php?title=Special:Contributions&amp;feed=atom&amp;target=Robe"/>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Special:Contributions/Robe"/>
		<updated>2013-05-22T23:02:05Z</updated>
		<subtitle>From PostgreSQL wiki</subtitle>
		<generator>MediaWiki 1.15.5-2squeeze5</generator>

	<entry>
		<id>http://wiki.postgresql.org/wiki/RLS</id>
		<title>RLS</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/RLS"/>
				<updated>2013-03-07T15:26:57Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* 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'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'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 'ALL'.&lt;br /&gt;
&lt;br /&gt;
'ALL' 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 'ALL'.  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 'ROW SECURITY FOR SELECT' to allow a given user to give rows would only give that user access if the user ALSO has 'SELECT' 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 '''can''' 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'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 'security_attnum' in pg_class, etc.&lt;br /&gt;
* Planner updates to enforce the filter based on RLS- this can'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't address this issue, so it's unclear if we really need to (reference?)&lt;br /&gt;
** In any case, this isn'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'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'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'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>http://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.2</id>
		<title>What's new in PostgreSQL 9.2</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.2"/>
				<updated>2012-03-20T13:37:44Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;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 ''Release Notes''.&lt;br /&gt;
&lt;br /&gt;
'''This page is incomplete!'''&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 '''covering indexes''' 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'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'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>http://wiki.postgresql.org/wiki/LDAP_Authentication_against_AD</id>
		<title>LDAP Authentication against AD</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/LDAP_Authentication_against_AD"/>
				<updated>2012-01-30T15:37:13Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;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;
# '''Download SRPMs from website and rebuild with --with-ldap flag.'''&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;
# '''Install all the needed rpms as root.'''&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;
# '''Fix a permission on directory:''' &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;
#'''Initialize the database''' &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;
#'''Modify client authentication configuration by editing /var/lib/pgsql/data/pg_hba.conf'''&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;
#'''Update /var/lib/pgsql/data/postgresql.conf'''&lt;br /&gt;
#* Listen to connections on all IP addresses&lt;br /&gt;
#*:&amp;lt;pre&amp;gt;&lt;br /&gt;
#*:listen_addresses ='*'&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;
#'''Generate self-signed key and certificate:'''&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;
#'''Create database'''&lt;br /&gt;
#:&amp;lt;pre&amp;gt;&lt;br /&gt;
#:createdb mydb&lt;br /&gt;
#:&amp;lt;/pre&amp;gt;&lt;br /&gt;
#'''Make LDAPs to work with AD'''&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 '''Add/Remove Programs''' applet.&lt;br /&gt;
###Click '''Add/Remove Windows Components''' 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 '''Certificate Services''' checkbox and click Next.&lt;br /&gt;
###Select type '''Enterprise root CA''', 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 '''Finish'''.&lt;br /&gt;
##Import server certificate into Active Directory&lt;br /&gt;
###Open '''Default Group Policy''' 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 '''Trusted root certificate authorities''' 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 '''Trusted root certificate authorities''' to open the folder&lt;br /&gt;
###Right click on the CA you want to export and choose open&lt;br /&gt;
###Click on '''Details''' tab and click on copy to file button.&lt;br /&gt;
###You will see Certificate export wizard. Click on '''Next'''.&lt;br /&gt;
###Choose the format to export. For use with OpenSSL (OpenLDAP), choose '''base-64 encoded X.509''' format.&lt;br /&gt;
###Copy the file to appropriate location on Redhat 4 server: '''/etc/openldap/concerto.cer'''&lt;br /&gt;
##Configure LDAPS connection to Active Directory&lt;br /&gt;
##*Configure '''ldap.conf''' 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;
#'''Try to connect DB remotely:'''&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>http://wiki.postgresql.org/wiki/Streaming_Replication</id>
		<title>Streaming Replication</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Streaming_Replication"/>
				<updated>2011-09-28T09:58:09Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;reworded archive_mode necessity&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Streaming Replication''' (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;
* '''Log-shipping'''&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'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;
* '''Multiple standbys'''&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;
* '''Continuous recovery'''&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;
* '''Setup'''&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;
* '''Connection settings and authentication'''&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;
* '''Activation'''&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;
* '''Progress report'''&lt;br /&gt;
** The primary and standby report the progress of log-shipping in PS display.&lt;br /&gt;
* '''Graceful shutdown'''&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;
* '''Synchronous log-shipping'''&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;
* '''Replication beyond timeline'''&lt;br /&gt;
** A user has to get a fresh backup whenever making the old standby catch up.&lt;br /&gt;
* '''Clustering'''&lt;br /&gt;
** Postgres doesn't provide any clustering feature.&lt;br /&gt;
&lt;br /&gt;
== How to Use ==&lt;br /&gt;
* '''1.''' Install postgres in the primary and standby server as usual.  This requires only ''configure'', ''make'' and ''make install''.&lt;br /&gt;
* '''2.''' Create the initial database cluster in the primary server as usual, using ''initdb''.&lt;br /&gt;
* '''3.''' Set up connections and authentication so that the standby server can successfully connect to the ''replication'' pseudo-database on the primary.&lt;br /&gt;
 $ $EDITOR postgresql.conf&lt;br /&gt;
 &lt;br /&gt;
 listen_addresses = '192.168.0.10'&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;
* '''4.''' 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 = 'cp %p /path_to/archive/%f'&lt;br /&gt;
* '''5.''' Start postgres on the primary server.&lt;br /&gt;
* '''6.''' Make a base backup by copying the primary server's data directory to the standby server.&lt;br /&gt;
 $ psql -c &amp;quot;SELECT pg_start_backup('label', 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;
* '''7.''' 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;
* '''8.''' Enable read-only queries on the standby server. But if wal_level is ''archive'' 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;
* '''9.''' 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          = 'on'&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      = 'host=192.168.0.10 port=5432 user=postgres'&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 = '/path_to/trigger'&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 = 'cp /path_to/archive/%f &amp;quot;%p&amp;quot;'&lt;br /&gt;
* '''10.''' Start postgres in the standby server. It will start streaming replication.&lt;br /&gt;
* '''11.''' 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 ''pg_current_xlog_location'' on the primary and the ''pg_last_xlog_receive_location''/''pg_last_xlog_replay_location'' 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;
* '''12.''' You can also check the progress of streaming replication by using ''ps'' 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 (''pg_ctl stop'').&lt;br /&gt;
* How to restart streaming replication after failover&lt;br /&gt;
** Repeat the operations from '''6th'''; making a fresh backup, some configurations and starting the original primary as the standby. The primary server doesn'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 '''6th'''.&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'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'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 ''async'', ''recv'' and ''fsync''.&lt;br /&gt;
** ''async'' doesn't make transaction commit wait for replication, i.e., asynchronous replication.&lt;br /&gt;
** ''recv'' or ''fsync'' makes transaction commit wait for XLOG to be received or fsynced by the standby, respectively.&lt;br /&gt;
** (''apply'' 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'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 'catching-up', 'sync', 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;
* '''Synchronization capability'''&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 ''async'', ''recv'', ''fsync'' and ''apply''.&lt;br /&gt;
*** ''async'' doesn't make transaction commit wait for replication, i.e., asynchronous replication.&lt;br /&gt;
*** ''recv'', ''fsync'' and ''apply'' 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;
* '''Monitoring'''&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;
* '''Easy to Use'''&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;
* '''Robustness'''&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;
* '''Miscellaneous'''&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>http://wiki.postgresql.org/wiki/PGUG_EU_Media_Coordination</id>
		<title>PGUG EU Media Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Media_Coordination"/>
				<updated>2010-06-26T16:59:02Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;&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;|'''Publication'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Publisher'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Target audience'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact'''&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;|'''Publication'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Title'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Autor'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date/Issue'''&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>http://wiki.postgresql.org/wiki/PGUG_EU_Media_Coordination</id>
		<title>PGUG EU Media Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Media_Coordination"/>
				<updated>2010-06-26T16:58:39Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;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;|'''Publication'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Publisher'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Target audience'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact'''&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;|'''Publication'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Title'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Autor'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date/Issue'''&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>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-06-26T16:27:22Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* 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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-06-26T16:26:23Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* 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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-06-26T16:25:00Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* 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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-06-25T12:05:11Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* 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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-06-25T11:24:27Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* 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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-06-25T11:23:48Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-06-07T06:25:52Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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>http://wiki.postgresql.org/wiki/User:Robe</id>
		<title>User:Robe</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/User:Robe"/>
				<updated>2010-05-24T21:57:26Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;&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,'--',$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,'--',$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 = '%t postgres[%p]: [%l-1] '&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;
,'--',$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>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-04-30T17:35:22Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Planning 2010 */ -&amp;gt; netways accepted&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||4th - 6th June||Michael Renner||[http://www.amoocon.de/speakers/214 Talks]||Talks accepted&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-04-13T08:40:48Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Planning 2010 */ Added AMOOCON&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&lt;br /&gt;
|-&lt;br /&gt;
| AMOOCON||4th - 6th June||Michael Renner||[http://www.amoocon.de/speakers/214 Talks]||Talks accepted&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June||Michael Renner||Talk||Talk submitted, waiting for affirmation&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-04-13T08:39:07Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Conferences */  added amoocon&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June||Michael Renner||Talk||Talk submitted, waiting for affirmation&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;
&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-03-22T13:48:01Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;dropped the google docs note.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;
| 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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June||Michael Renner||Talk||Talk submitted, waiting for affirmation&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;
&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-03-22T08:32:37Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Conferences */ added froscamp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohai! Work in progress.&lt;br /&gt;
&lt;br /&gt;
All tables available as Google Spreadsheet (contact [[User:Robe|Michael Renner]]) and easily [http://excel2wiki.net/ convertible].&lt;br /&gt;
&lt;br /&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;
| 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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June||Michael Renner||Talk||Talk submitted, waiting for affirmation&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;
&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&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;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-03-14T23:40:44Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Conferences */  sort by date&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohai! Work in progress.&lt;br /&gt;
&lt;br /&gt;
All tables available as Google Spreadsheet (contact [[User:Robe|Michael Renner]]) and easily [http://excel2wiki.net/ convertible].&lt;br /&gt;
&lt;br /&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;
| 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;
| 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;
| FrOSCon||St. Augustin, Germany||http://www.froscon.de/||||FOSS community conference||||Weekend||Late August||German &amp;amp; English&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;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
Scheduled and completed Events in 2010&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February||Andreas Scherbaum, ..||Talks &amp;amp; Booth||&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March||Andreas Scherbaum, ..||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March||Andreas Scherbaum, Andreas Kretschmer, ...||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June||Michael Renner||Talk||Talk submitted, waiting for affirmation&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-03-14T23:20:41Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Planning 2010 */ add osdc to 2010&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohai! Work in progress.&lt;br /&gt;
&lt;br /&gt;
All tables available as Google Spreadsheet (contact [[User:Robe|Michael Renner]]) and easily [http://excel2wiki.net/ convertible].&lt;br /&gt;
&lt;br /&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&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;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&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;
| PGDay Europe||changing||http://2009.pgday.eu/||||PostgreSQL Community conference||||Friday &amp;amp; Saturday||November||English&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;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||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;
| 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;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
Scheduled and completed Events in 2010&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Comments'''&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February||Andreas Scherbaum, ..||Talks &amp;amp; Booth||&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March||Andreas Scherbaum, ..||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March||Andreas Scherbaum, Andreas Kretschmer, ...||Booth||&lt;br /&gt;
|-&lt;br /&gt;
| Netways OSDC||23rd &amp;amp; 24th June||Michael Renner||Talk||Talk submitted, waiting for affirmation&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-03-14T23:15:20Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Conferences */ add a few ballpark figures wrt visitors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohai! Work in progress.&lt;br /&gt;
&lt;br /&gt;
All tables available as Google Spreadsheet (contact [[User:Robe|Michael Renner]]) and easily [http://excel2wiki.net/ convertible].&lt;br /&gt;
&lt;br /&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&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;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&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;
| PGDay Europe||changing||http://2009.pgday.eu/||||PostgreSQL Community conference||||Friday &amp;amp; Saturday||November||English&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;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||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;
| 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;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
Scheduled and completed Events in 2010&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February||Andreas Scherbaum, ..||Talks &amp;amp; Booth&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March||Andreas Scherbaum, ..||Booth&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March||Andreas Scherbaum, Andreas Kretschmer, ...||Booth&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-03-14T23:11:30Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohai! Work in progress.&lt;br /&gt;
&lt;br /&gt;
All tables available as Google Spreadsheet (contact [[User:Robe|Michael Renner]]) and easily [http://excel2wiki.net/ convertible].&lt;br /&gt;
&lt;br /&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&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;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||Hanover, Germany||http://www.cebit.de/||||Trade fair||||Tuesday - Saturday||Early March||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;
| Netways OSDC||Nuremberg, Germany||http://www.netways.de/en/osdc/||||Commercial conference||||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;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||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;
| 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;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
Scheduled and completed Events in 2010&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February||Andreas Scherbaum, ..||Talks &amp;amp; Booth&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March||Andreas Scherbaum, ..||Booth&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March||Andreas Scherbaum, Andreas Kretschmer, ...||Booth&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-03-14T23:09:18Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohai! Work in progress.&lt;br /&gt;
&lt;br /&gt;
All tables available as Google Spreadsheet and easily [http://excel2wiki.net/ convertible].&lt;br /&gt;
&lt;br /&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&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;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||Hanover, Germany||http://www.cebit.de/||||Trade fair||||Tuesday - Saturday||Early March||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;
| Netways OSDC||Nuremberg, Germany||http://www.netways.de/en/osdc/||||Commercial conference||||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;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||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;
| 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;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
Scheduled and completed Events in 2010&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Date'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Attendees'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type of attendance'''&lt;br /&gt;
|-&lt;br /&gt;
| FOSDEM||6th &amp;amp; 7th February||Andreas Scherbaum, ..||Talks &amp;amp; Booth&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||2nd - 6th March||Andreas Scherbaum, ..||Booth&lt;br /&gt;
|-&lt;br /&gt;
| Chemnitzer Linuxtage||13th &amp;amp; 14th March||Andreas Scherbaum, Andreas Kretschmer, ...||Booth&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination</id>
		<title>PGUG EU Conference Coordination</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PGUG_EU_Conference_Coordination"/>
				<updated>2010-03-14T23:03:19Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;initial commit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohai! Work in progress.&lt;br /&gt;
&lt;br /&gt;
All tables available as Google Spreadsheet and easily [http://excel2wiki.net/ convertible].&lt;br /&gt;
&lt;br /&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;|'''Name'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Location'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''URL'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Contact Information'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Type'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Size'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Duration'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Approx. Time'''&lt;br /&gt;
| align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f0f0f0;&amp;quot;|'''Language'''&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;
| Grazer Linuxtage||Graz, Austria||http://www.linuxtage.at/||||FOSS community conference||||Weekend||Late April||German&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;
| FOSDEM||Brussels, Belgium||http://fosdem.org/2010/||||FOSS community conference||||Weekend||Early February||English&lt;br /&gt;
|-&lt;br /&gt;
| CeBIT||Hanover, Germany||http://www.cebit.de/||||Trade fair||||Tuesday - Saturday||Early March||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;
| Netways OSDC||Nuremberg, Germany||http://www.netways.de/en/osdc/||||Commercial conference||||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;
| FOSSGIS||Osnabrück, Germany||http://www.fossgis.de/konferenz/||||FOSS GIS community conference||||Tuesday - Friday||Early March||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;
| 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;
| Brandenburger Linux Info-Tag||Potsdam, Germany||http://www.blit.org/||||FOSS community conference||||Saturday||Mid November||German?&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
= Planning 2010 =&lt;br /&gt;
&lt;br /&gt;
Scheduled and completed Events in 2010&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/User:Robe</id>
		<title>User:Robe</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/User:Robe"/>
				<updated>2010-03-03T00:37:18Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* For 8.5 */&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,'--',$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,'--',$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 = '%t postgres[%p]: [%l-1] '&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;
,'--',$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;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/User:Robe</id>
		<title>User:Robe</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/User:Robe"/>
				<updated>2010-03-03T00:37:09Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* For 8.5 */&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,'--',$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,'--',$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 = '%t postgres[%p]: [%l-1] '&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;
,'--',$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;
== For 8.5 ==&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;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Hot_Standby</id>
		<title>Hot Standby</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Hot_Standby"/>
				<updated>2009-05-17T16:04:05Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;fixing second version mentioning&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hot Standby is the name for the capability to run queries on a database that is currently performing archive recovery. Log Shipping replication allows you to create one or more standby nodes that are replicas of the primary node (or master node). Standby nodes can then be used for read-only query access.&lt;br /&gt;
&lt;br /&gt;
Hot Standby is being developed for inclusion in PostgreSQL 8.5 by 2ndQuadrant via public sponsorship.&lt;br /&gt;
&lt;br /&gt;
This feature will augment the capabilities of streaming replication that have also been discussed for inclusion in r8.5, though does not rely on it and has minimal interaction with it.&lt;br /&gt;
&lt;br /&gt;
Changes will appear on this page, as and when design changes or clarifications are required. Please reply to posts on pgsql-hackers, or email simon@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
= Project Status Tracking =&lt;br /&gt;
&lt;br /&gt;
== Version History == &lt;br /&gt;
&lt;br /&gt;
Latest version is always at top of this section&lt;br /&gt;
&lt;br /&gt;
* [[:Image:hs.v9g.20090123_3.tar.bz2|hs.v9g.20090123_3.tar.bz2]] - v9g - bug fixes&lt;br /&gt;
* [[:Image:hs.v9d.20090122_4.tar.bz2|hs.v9d.20090122_4.tar.bz2]] - v9 - new conflict resolution and various refactorings&lt;br /&gt;
* [[:Image:hs.v8.20090114_1.tar.bz2|hs.v8.20090114_1.tar.bz2]] - v8 - bug fixes and knock-on effects of refactoring&lt;br /&gt;
* [[:Image:hs.v7.20090112_1.tar.bz2|hs.v7.20090112_1.tar.bz2]] - v7 - includes slotId removal refactoring&lt;br /&gt;
* [[:Image:hs.v6b.20090107_1.tar.bz2|hs.v6b.20090107_1.tar.bz2]] - v6b&lt;br /&gt;
* [[:Image:hs.v6a.20090103_1.tar.bz2|hs.v6a.20090103_1.tar.bz2]] - v6a new test cycle commencing (replaces v6)&lt;br /&gt;
* [[:Image:hs.v5.20081218_1.tar.bz2|hs.v5.20081218_1.tar.bz2]] - v5 corrected patch application to CVS HEAD, doc typos fixed&lt;br /&gt;
* [[:Image:hs.v5.20081217_2.tar|hs.v5.20081217_2.tar]] - v5 broken down into smaller patches for review&lt;br /&gt;
&lt;br /&gt;
== Remaining Work Items for Nov 2008 CommitFest ==&lt;br /&gt;
&lt;br /&gt;
* Latest commit that is being tested: 4fe66...&lt;br /&gt;
&lt;br /&gt;
Reported problems (Identified by) (Target release)&lt;br /&gt;
* (none)&lt;br /&gt;
&lt;br /&gt;
Infrastructure changes&lt;br /&gt;
* (none)&lt;br /&gt;
&lt;br /&gt;
Main work/required additional items (Proposed by) (Target release)&lt;br /&gt;
* (none)&lt;br /&gt;
&lt;br /&gt;
Performance tuning opportunities (Proposed by) (Target release)&lt;br /&gt;
* (none)&lt;br /&gt;
&lt;br /&gt;
Usability enhancements (Proposed by)&lt;br /&gt;
* max_standby_delay set as a normal GUC, so it can be changed during normal execution (Simon)&lt;br /&gt;
* more accurately determine users to disconnect if we drop a tablespace that contains temp files currently in use&lt;br /&gt;
* more work possible on btree deletes to reduce impact&lt;br /&gt;
* input datatypes for functions (Simon)&lt;br /&gt;
* main docs required (put Wiki into SGML) (Simon)&lt;br /&gt;
&lt;br /&gt;
Items deferred until next release&lt;br /&gt;
* make pg_start_backup() work on standby - synchronisation is already possible using pg_latest_recovered_lsn()&lt;br /&gt;
* connection from standby to master to prevent xmin horizon moving forwards on master&lt;br /&gt;
* buffer manager optimization targeted to reduce I/O for replay of btree vacuum when scanning uncleaned blocks (Simon)&lt;br /&gt;
* Canceled queries when idle in transaction cause client-side mismatch [slightly unrelated) (Simon) This only effects transactions that are idle-in-transaction AND either hold locks, are serializable or have open cursors. Current solution is upgrade to a FATAL error. The same problem occurs if we have an error while processing invalidation messages.&lt;br /&gt;
&lt;br /&gt;
Tests needed&lt;br /&gt;
* Is there a performance regression on normal running from any overheads introduced? Patch v HEAD comparison&lt;br /&gt;
* Is there a performance regression on recovery? Patch v HEAD comparison (4% degradation on simple test at v4, need retest for later versions)&lt;br /&gt;
* Usability tests: How does query conflict handling work in practice? User experience needed&lt;br /&gt;
&lt;br /&gt;
Code has been reviewed in various parts by Pavan, Heikki and Tom. Further detailed review/ers are still required.&lt;br /&gt;
&lt;br /&gt;
== Resolved Items/Issues ==&lt;br /&gt;
&lt;br /&gt;
Reported problems (Reported by/Requested by) (Resolved in version...) (Most recent at top)&lt;br /&gt;
&lt;br /&gt;
=== Bugs present on Nov 1 ===&lt;br /&gt;
&lt;br /&gt;
* minSafeStart point reset to earlier in some cases (Heikki) (Infra)&lt;br /&gt;
* signal postmaster to refresh password cache if auth file changes (Simon) (v9g)&lt;br /&gt;
* fix query cancel because of locks so it includes AbortOutOfAnyTransaction(); (Simon) (v9e)&lt;br /&gt;
* fix memory leak in GetRunningXactData() (Simon) (v9)&lt;br /&gt;
* conflict resolution for redo of database drop/move/rename while users are connected to that database (Simon) (v9)&lt;br /&gt;
* conflict resolution for redo of drop tablespace while users are using temp files in that tablespace - correct but needs work (Simon) (v9)&lt;br /&gt;
* Handle out of procs state gracefully, prevent snapshots and throw user query errors (Heikki) (v8d)&lt;br /&gt;
* AccessExclusiveLock must be held by subtransaction, not top-level transaction (Heikki/Simon) (v8)&lt;br /&gt;
&lt;br /&gt;
* Block unlocking required during VACUUM scan (Heikki) (v6b)&lt;br /&gt;
* XLOG_BTREE_DELETE records handled correctly (Heikki) (v6)&lt;br /&gt;
* btree VACUUM code - must scan every block of index (Heikki) (v6)&lt;br /&gt;
* BEGIN TRANSACTION READ WRITE (Pavan) (v6)&lt;br /&gt;
* Must ignore_killed_tuples and never kill_prior_tuple during index scans in recovery (Greg) (v6) same fix, subtlely different scope (v8)&lt;br /&gt;
* uint unsupported on Windows (Jaime) (v6b)&lt;br /&gt;
* SIGINT cancels idle-in-transaction sessions (Pavan) (v6b)&lt;br /&gt;
* WALInsertLock still held at failover (Pavan) (v5)&lt;br /&gt;
* flat file updates for DDL incorrect (Mark) (v5)&lt;br /&gt;
&lt;br /&gt;
=== Refactoring, bugs, tuning, usability tweaks ===&lt;br /&gt;
&lt;br /&gt;
Functionality changes since Nov 1&lt;br /&gt;
&lt;br /&gt;
* Complete Prepared Transaction support (Simon) &lt;br /&gt;
* fix bugs with recovery_starts_paused(), allow shutdown while paused (Simon)&lt;br /&gt;
* Compile error with WAL_DEBUG set (Bernd)&lt;br /&gt;
* removed reliance on pg_subtrans marking optimisation (Heikki/Simon)&lt;br /&gt;
* merged changes with Heikki's most recent review of recoveryinfra changes (Simon)&lt;br /&gt;
* tuning of RecordKnownAssignedTransactionIds() to avoid taking ProcArrayLock in most common case (Simon) (v9p)&lt;br /&gt;
* tuning of RecordKnownAssignedTransactionIds() using hash table (Heikki) (v9m)&lt;br /&gt;
* deferred buffer recovery conflict cache (Simon) (v9k)&lt;br /&gt;
* rename parameter used to turn on/off hot standby (Merlin) (v9i)&lt;br /&gt;
* Allow option to start recovery in paused mode (Kevin) (v9i)&lt;br /&gt;
* startup process waits, even when issuing deferred query cancellation (Heikki/Gianni) (v9i)&lt;br /&gt;
* Workaround: Canceled queries when idle in transaction cause FATAL errors because of client-side mismatch bug (Simon) (v9i)&lt;br /&gt;
* XidCacheRemoveXid (Simon) (v9i)&lt;br /&gt;
* rare assertion failure in pg_subtrans - caused by invalid assumption about when to mark subtrans (Gianni)&lt;br /&gt;
* snapshot bug (v9h) (Gianni &amp;amp; Mark)&lt;br /&gt;
* using wrong LSN in conflict handling causing more cancels than required (Gianni) (v9f)&lt;br /&gt;
* add parameter to disable standby query capability (&amp;quot;hot_standby&amp;quot;) (Heikki) (v9e)&lt;br /&gt;
* fix race condition for SetBufferRecoveryConflictLSN(), recheck MyProc-&amp;gt;xmin (Simon) (v9e)&lt;br /&gt;
* streamline commit/abort processing to bare minimum (Simon) (v9d)&lt;br /&gt;
* improved debug error messages for unobserved xids (Gianni) (v9c)&lt;br /&gt;
* missed some calls to RecordKnownAssignedTransactions() during last refactoring (Simon) (v9c)&lt;br /&gt;
* pg_recovery_advance() regression - fixed (Simon) (v9b)&lt;br /&gt;
* alter location of debug messages for AssignTransactionId (Simon) (v9a)&lt;br /&gt;
* remove docs for pg_recovery_pause_cleanup() (Simon) (v9)&lt;br /&gt;
* reduce use of ProcArrayLock to once per record, plus one at commit/abort (Simon) (v9)&lt;br /&gt;
* RecoveryConflictLSN, deferred cancellation of xmin horizon conflicts and skip cancellation if idle-in-xact (Andreas) (v9)&lt;br /&gt;
* make btree delete watertight (can't use RecentGlobalXmin) - correct but needs work (Heikki) (v9)&lt;br /&gt;
* must not do conflict processing when snapshots disabled - need to refactor some more, groan (Simon) (v9)&lt;br /&gt;
* rearrange call to UnobservedTransactionsPruneXids() to speed up calls to UnobservedTransactionsRemoveXid() (Simon) (v9)&lt;br /&gt;
* remove pg_recovery_pause_cleanup() which stopped working in v8e because of refactoring (Simon) (v9)&lt;br /&gt;
* downgrade &amp;quot;WARNING:  proc array entry was missing for transaction&amp;quot; to DEBUG2 (Happens because of the race condition between XidGenLock and WALInsertLock. Occurred 4 times in 10 hour bash test on dual CPU server, but all cases have been normal and explainable since the xid was the latestRunningXid in all cases.) (Gianni) (v9)&lt;br /&gt;
* refactor rmgr &amp;quot;isCleanupRecord&amp;quot; code (Heikki) (v8e)&lt;br /&gt;
* remove databaseId, roleId and vacFlags from RunningXactData (Simon) (v8d)&lt;br /&gt;
* complete refactoring required change of ProcArrayUpdateRecoveryTransactions() (Heikki), plus fix one stupid and one very subtle bug while doing so (Simon) (v8c)&lt;br /&gt;
* not updating pg_auth when appropriate (Gianni) (v8b) -- trivial logic error&lt;br /&gt;
* optimize UnobservedTransactionsPruneXids() and fix corner case bug (Gianni) (v8b)&lt;br /&gt;
* split recovery procs into different pools, allowing error messages when overflowed (Simon) (v8a)&lt;br /&gt;
* refactor pre-allocation of Recovery Procs, need to trace dependency that prevents removal (Simon) (v8a)&lt;br /&gt;
* refactor XactCompletionHasUnmarkedSubxids() (Simon) (v8a)&lt;br /&gt;
* fix bug caused by earlier refactoring in ProcArrayClearRecoveryProcs() (Simon) (v8a)&lt;br /&gt;
* UnobservedXids leak warning - trivial fix (Gianni) (v8a)&lt;br /&gt;
* avoid starting autovac launcher for wraparound avoidance during recovery (Simon) (v8a)&lt;br /&gt;
* clarify meaning of last_recovered... functions during/after recovery (Simon) (v8)&lt;br /&gt;
* add function last_recovered_xlog_location() to allow synchronisation between master and standby based on an LSN (Simon) (v8)&lt;br /&gt;
* Document that index locking is correct and why (Heikki) (v8)&lt;br /&gt;
* add README comments to access/transam/README (Simon) (v8)&lt;br /&gt;
* document need to set max_connections correctly on standby (Simon) (v8)&lt;br /&gt;
* refactor/remove special case logic in GetRunningTransactionData() (Heikki) (v8)&lt;br /&gt;
* pg_subtrans could not open file (Heikki) (v8)&lt;br /&gt;
* added pg_current_recovery_target() (Gianni) (v8)&lt;br /&gt;
* allow startup process to delay at start to allow debugger attach where pg_ctl -o &amp;quot;-W n&amp;quot; sets a delay of n secs (Simon) (v8)&lt;br /&gt;
* adjust all XXX comments related to Hot Standby to be XXXHS (Simon) (v8)&lt;br /&gt;
* renamed last_completed... functions to last_recovered... (Simon) (v8)&lt;br /&gt;
* slotid refactoring, comments changed (Heikki) (v7)&lt;br /&gt;
* Cannot Assert(pmState == PM_STARTUP) when postmaster catches PMSIGNAL_RECOVERY_START (regression from earlier report) (v6b)&lt;br /&gt;
* Use of #define may mask bugs in 1-2 locations in procarray.c (Pavan) (v6b)&lt;br /&gt;
&lt;br /&gt;
Do we need/want? (Current answer)&lt;br /&gt;
* recovery_safe_start_location; I think we do (Not implemented)&lt;br /&gt;
* to automatically reset default_transaction_read_only following startup (No)&lt;br /&gt;
* Creating temp tables in recovery mode. Not sure if that is spec compliant? We may want to relax that restriction. If we do, we already have a design in place for changes to make this work: http://archives.postgresql.org/pgsql-hackers/2008-07/msg00616.php. (Not in 8,4)&lt;br /&gt;
&lt;br /&gt;
Resolved Issues/Questions&lt;br /&gt;
* No need to send invalidations when index metapages change - already handled at xact commit&lt;br /&gt;
* Added further user/admin documentation via this Wiki&lt;br /&gt;
&lt;br /&gt;
Excluded items&lt;br /&gt;
* hash index handling (or any index type that doesn't write WAL)&lt;br /&gt;
* Cancelled queries to show errcode(ERRCODE_T_R_SERIALIZATION_FAILURE) (cannot do, unable to identify source of cancellation)&lt;br /&gt;
&lt;br /&gt;
= Usage =&lt;br /&gt;
&lt;br /&gt;
== Users Overview ==&lt;br /&gt;
&lt;br /&gt;
Users will be able to connect to the database while the postmaster is in recovery state and perform read-only queries. Read-only access to catalogs and views will also occur as normal.&lt;br /&gt;
&lt;br /&gt;
When you connect in this mode, default_transaction_read_only will be forced to be true, whatever its setting in postgresql.conf. As a result, all transactions started during this time will be limited to read-only actions only. In all other ways, connected sessions will appear identical to sessions initiated during normal processing mode. There are no special commands required to initiate a connection at this time, so all interfaces will work normally without change.&lt;br /&gt;
&lt;br /&gt;
Read-only here means &amp;quot;no writes to the permanent database tables&amp;quot;. So temporary sort and work files will be used, just as with normal SQL execution. Temporary tables cannot be created and therefore cannot be used at all in recovery mode. &lt;br /&gt;
&lt;br /&gt;
Actions that are allowed&lt;br /&gt;
* Transaction management commands: BEGIN, END, ABORT, START TRANSACTION&lt;br /&gt;
* SELECT, COPY TO&lt;br /&gt;
* Cursor commands: DECLARE, FETCH, CLOSE, &lt;br /&gt;
* Parameters: SHOW, SET, RESET, DISCARD&lt;br /&gt;
* LOAD&lt;br /&gt;
* Plans: PREPARE, EXECUTE, DEALLOCATE&lt;br /&gt;
* LOCK (see later)&lt;br /&gt;
* SAVEPOINT commands: SAVEPOINT, RELEASE, ROLLBACK TO SAVEPOINT&lt;br /&gt;
* EXCEPTION blocks in internal subtransactions&lt;br /&gt;
* Activation of Select RULEs&lt;br /&gt;
&lt;br /&gt;
Actions not allowed on Standby are:&lt;br /&gt;
* Transaction management commands which explicitly set non-read only state: SET TRANSACTION, SET SESSION CHARACTERISTICS, BEGIN, START TRANSACTION, direct SET&lt;br /&gt;
* Two-phase commit commands (PREPARE TRANSACTION, COMMIT PREPARED, ROLLBACK PREPARED) because even read-only transactions need to write WAL in the prepare (first phase of two phase commit).&lt;br /&gt;
* SELECT ... FOR SHARE | UPDATE which cause row locks to be written&lt;br /&gt;
* DML - Insert, Update, Delete, COPY FROM, Truncate which all write data&lt;br /&gt;
* DDL - Create, Drop, Alter, Comment (even for temporary tables because currently these cause writes to catalog tables)&lt;br /&gt;
* Access to nextval on sequences because nextval causes the value of the sequence to be increment&lt;br /&gt;
* LISTEN, UNLISTEN, NOTIFY since they currently write to system tables&lt;br /&gt;
* Remember: Triggers will never be executed!&lt;br /&gt;
All of these are allowed on primary, just not on standby in read-only mode. When failover, switchover occurs these commands will then be possible.&lt;br /&gt;
&lt;br /&gt;
It is possible that the restrictions on LISTEN, UNLISTEN, NOTIFY and temporary tables may be lifted in a future release, if their internal implementation allows it.&lt;br /&gt;
&lt;br /&gt;
Note that current behaviour of read only transactions is to allow these&lt;br /&gt;
* nextval on sequences&lt;br /&gt;
* LISTEN, UNLISTEN, NOTIFY&lt;br /&gt;
So there is a subtle difference in behaviour between standby read-only transactions and non-recovery read only transactions.&lt;br /&gt;
&lt;br /&gt;
If failover or switchover occurs the database will switch to normal processing mode. Sessions will remain connected while the server changes mode. Current transactions will continue, though will remain read-only. After this, it will be possible to initiate read-write transactions, though users must *manually* reset their default_transaction_read_only setting first.&lt;br /&gt;
&lt;br /&gt;
Users will be able to tell whether their session is read-only by issuing SHOW default_transaction_read_only, or by running an information function pg_is_in_recovery() returns bool. There is also be a function that allows you to read the last known transaction end timestamp (pg_last_completed_xact_timestamp) and the transactionid (pg_last_completed_xid).&lt;br /&gt;
&lt;br /&gt;
In recovery, transactions will not be permitted to take any lock higher than AccessShareLock nor assign a TransactionId. This mostly prevents writing WAL, but we protect against that specifically as well, just in case some user code attempts it. &lt;br /&gt;
&lt;br /&gt;
The LOCK TABLE command by default applies an AccessExclusiveLock. This will generate WAL messages when executed on the primary node. When executed on the standby node the default will be to issue an AccessShareLock. Any LOCK TABLE command that runs on the standby and requests a specific lock type other than AccessShareLock will be rejected.&lt;br /&gt;
&lt;br /&gt;
During recovery database writes will only be performed by startup process as it processes WAL records and replays them (also known as WAL redo or simply &amp;quot;apply&amp;quot;). In general this means that queries will not experience lock conflicts with writes, just like normal Postgres concurrency control (MVCC).&lt;br /&gt;
&lt;br /&gt;
=== Query Conflicts ===&lt;br /&gt;
&lt;br /&gt;
However, there is some potential for conflict between standby queries and WAL redo from the primary node. The user is provided with a number of optional ways to handle these conflicts.&lt;br /&gt;
&lt;br /&gt;
Conflicts can occur for four reasons&lt;br /&gt;
* Access Exclusive Locks from primary node (including both locks and various kinds of DDL action)&lt;br /&gt;
* Early cleanup of data still visible to the current query's snapshot&lt;br /&gt;
* Dropping tablespaces on the master while standby queries are using those tablespace for temporary work files (work_mem overflow)&lt;br /&gt;
* Dropping users, databases or tablespaces on the master while those objects are connected on standby&lt;br /&gt;
* Waiting to acquire buffer cleanup locks (for which there is no time out)&lt;br /&gt;
discussed in more detail below.&lt;br /&gt;
&lt;br /&gt;
Some WAL redo actions will be for DDL actions. These DDL actions are repeating actions that have already committed on the primary node, so they must not fail on the standby node. These DDL locks take priority and will automatically *cancel* any read-only transactions that get in their way, after a grace period. This is similar to the possibility of being canceled by the deadlock detector, but in this case the standby process always wins, since the repeated actions must not fail. This also ensures that replication doesn't fall behind while we wait for a query to complete. Again, we assume that the standby is there for high availability purposes primarily.&lt;br /&gt;
&lt;br /&gt;
An example of the above would be:&lt;br /&gt;
* User on Standby running a query against table X&lt;br /&gt;
* Administrator on Primary runs DROP TABLE&lt;br /&gt;
Clearly the query cannot continue if we let the DROP TABLE proceed. If this situation occurred on the primary, the DROP TABLE would wait until the query has finished. When the query is on the standby and the DROP TABLE is on the primary, the primary doesn't have information about what the standby is running and so cannot wait. In most cases this is desirable, so the workload on the standby has little or no effect on the primary and so we would say the two nodes are only loosely coupled.&lt;br /&gt;
&lt;br /&gt;
The second reason for conflict between standby queries and WAL redo is &amp;quot;early cleanup&amp;quot;. Normally, PostgreSQL allows cleanup of old row versions when there are no users who may need to see them to ensure correct visibility of data (known as MVCC). If there is a standby query that has been running for longer than any query on the primary then it is possible for old row versions to be removed by either VACUUM or HOT. This will then generate WAL records that, if applied, would remove data on the standby that might *potentially* be required by the standby query. In more technical language, the Primary's xmin hozrizon is later than the Standby's xmin horizon, allowing dead rows to be removed.&lt;br /&gt;
&lt;br /&gt;
We have a number of choices for resolving query conflicts. Choice (1) is automatic, options (2) and (3) should be taken as remedial actions if an annoying number of cancelations occur.&lt;br /&gt;
&lt;br /&gt;
1. We wait and hope the query completes. If the recovery is not paused, then we will wait automatically until the server is max_standby_delay behind. Once that grace period expires, we then take one of the following actions:&lt;br /&gt;
&lt;br /&gt;
a) If the conflict is caused by a lock, we cancel the standby transaction immediately, even if it is idle-in-transaction.&lt;br /&gt;
&lt;br /&gt;
b) If the conflict is not caused by a lock, we tell the standby query that a conflict has occurred and that it must cancel itself if there is a risk that it attempts to read data that has been cleaned up already. Specifically, if the standby query reads a data block that has been recently modified it will cancel itself. Note it only needs one modified data block to cause a cancel and that the data block does *not* need to have been modified by a cleanup record - any change is sufficient to create this risk. (This is very similar to the much feared Oracle error message &amp;quot;snapshot too old&amp;quot;). Note also that this means that idle-in-transaction sessions are never canceled except by locks. Users should be clear that tables that are regularly and heavily updated on primary server will quickly cause cancellation of any longer running queries made against those tables.&lt;br /&gt;
&lt;br /&gt;
If cancellation does occur, the query and/or transaction is repeatable - i.e. the error is dynamic and will not necessarily occur the same way if the query is executed again.&lt;br /&gt;
&lt;br /&gt;
2. We connect to Primary server from Standby server and keep a transaction open. This guarantees that a cleanup record is never generated and we don't ever get into situation 1(b). This option can be performed fairly simply using contrib/dblink functions. &lt;br /&gt;
&lt;br /&gt;
3. We pause recovery by issuing a pg_recovery_pause() function. This halts application of WAL records completely and allows queries to proceed to completion without problem. We can issue pg_recovery_continue() at any time, so the pause can be held for long or short periods, as the administrator allows. This method of conflict resolution may mean that there is a build up of WAL records waiting to be applied and this will progressively increase the failover delay. If there is regular arrival of WAL records this would quickly prevent the use of the standby as a high availability failover target. Some users may wish to use multiple standby servers for various purposes. Pauses in recovery stay until explicitly released, i.e. max_standby_delay is overridden by the use of pauses.&lt;br /&gt;
&lt;br /&gt;
An example of the above would be:&lt;br /&gt;
* User on Standby running a long query involving tables X and Y&lt;br /&gt;
* User on Primary repeatedly updates table Z&lt;br /&gt;
The user on the primary will be generating HOT updates on table Z and these will generate cleanup WAL records. In this case the rows cleaned up are very recent and on the standby node we are able to detect that removing those row versions could *potentially* prevent the Standby query from executing correctly and so there is a conflict. Initially, we will wait for max_standby_delay, but then afterwards we will give the standby query notice to quit. In this case, the standby query never does read data that has been cleaned, since it is looking at different tables, so the standby query runs to completion normally.&lt;br /&gt;
&lt;br /&gt;
We keep track of the first 8 relations (that is, indexes and/or tables) that cause conflicts. When we have conflicts with more than 8 tables we apply the conflict handling to all relations. So in the above example if we had already recorded conflicts with eight other tables (plus Z means 9 tables, more than our cache) then we *would* cancel the query against tables X and Y, even though those tables have not been touched. Conflict processing increases quickly with number of tables in the conflict cache, so raising the number above 8 is not practical.&lt;br /&gt;
&lt;br /&gt;
Note that max_standby_delay is set in recovery.conf. It applies to the server as a whole, so once used it may not be available for other users. They will have to wait for the server to catch up again before the grace period is available again. So max_standby_delay is a configuration parameter set by the administrator which controls the maximum acceptable failover delay, rather than a user parameter to specify how long their query needs to run in.&lt;br /&gt;
&lt;br /&gt;
Waits for buffer cleanup locks do not currently result in query cancellation. Long waits are uncommon, though can happen in some cases with long running nested loop joins.&lt;br /&gt;
&lt;br /&gt;
These two items are discussed in the administrator's section since they are not typical user situations&lt;br /&gt;
* Dropping tablespaces on the master while standby queries are using those tablespace for temporary work files (work_mem overflow)&lt;br /&gt;
* Dropping users, databases or tablespaces on the master while those objects are connected on standby&lt;br /&gt;
&lt;br /&gt;
== Administrators Overview == &lt;br /&gt;
&lt;br /&gt;
Hot Standby is enabled by default, though can be disabled by setting &amp;quot;recovery_connections = off&amp;quot; in recovery.conf. &lt;br /&gt;
&lt;br /&gt;
A second parameter, &amp;quot;max_standby_delay&amp;quot; should also be set by the administrator in recovery.conf. The default is 30 seconds. This should be set according to business priorities. For example if the server is primarily tasked as a High Availability server, then you may wish to lower max_standby_delay or even set it to zero. If the standby server is tasked as an additional server for decision support then it may be acceptable to set this to a value of many hours, e.g. max_standby_delay = 43200 (12 hours). It is also possible to set max_standby_delay to -1 which means &amp;quot;always wait&amp;quot; if there are conflicts, though if unmonitored this may not be a useful mode.&lt;br /&gt;
&lt;br /&gt;
It is strongly recommended that the setting of max_connections on the standby should be equal to or greater than the setting of max_connections on the primary. This is to ensure that standby has sufficient resources to manage incoming transactions. If the standby is asked to manage too many concurrent *write* transactions it will run out of recovery session resources. Read only transactions have no effect on the standby. If the standby runs out of recovery session resources then recovery will continue normally, but it will prevent MVCC snapshots from being taken and all standby queries will fail with an ERROR. Snapshots will be re-enabled after the next checkpoint on the primary for which the number of write transactions has fallen back below the cutoff.&lt;br /&gt;
&lt;br /&gt;
Users will be able to write large sort temp files and re-generate relcache info files, so there is no part of the database that is truly read-only during hot standby mode. There is no restriction on use of set returning functions, or other users of tuplestore/tuplesort code.&lt;br /&gt;
&lt;br /&gt;
Statspack functions should work OK, so tools such as pgAdminIII should work. pgAgent will not, though the next version will allow execution of jobs on a read only node.&lt;br /&gt;
&lt;br /&gt;
Failover can be initiated at any time by allowing the startup process to reach the end of WAL, or by issuing the function pg_recovery_stop() as superuser. (see next section).&lt;br /&gt;
&lt;br /&gt;
Stats collector is active during recovery. All scans, reads, blocks, index usage etc will all be recorded normally on the standby. Replayed actions will not duplicate their effects on primary, so replaying an insert will not increment the Inserts column of pg_stat_user_tables. The stats file is deleted at start of recovery, so stats from master and standby will differ. &lt;br /&gt;
&lt;br /&gt;
pg_cancel_backend() will work on user backends, but not Startup process. pg_locks will show locks held by backends and by startup process. pg_stat_activity will not show an entry for startup process.&lt;br /&gt;
&lt;br /&gt;
check_pgsql will work, but its very simple. check_postgres will also work, though many some actions could give&lt;br /&gt;
different or confusing results. e.g. last vacuum time will not be&lt;br /&gt;
maintained for example, since no vacuum occurs on the standby.&lt;br /&gt;
&lt;br /&gt;
Dynamically loadable modules work, including the new pg_stat_statements. &lt;br /&gt;
&lt;br /&gt;
Advisory locks work normally in recovery, including deadlock detection. No other form of deadlock is possible in recovery because the only only lock type that can be taken on database objects is AccessShareLock. Please note that advisory locks are never WAL logged, so it is not possible for an advisory lock to conflict with WAL replay.&lt;br /&gt;
&lt;br /&gt;
slony won't run on the standby either! The Standby is a Clone and not a Slave. A Slave is a separate database that is forced to duplicate the actions of the Master. The Standby is an exact copy, in every detail that matters.&lt;br /&gt;
&lt;br /&gt;
New oids cannot be assigned, though various UUID generators may still work if required.&lt;br /&gt;
&lt;br /&gt;
Currently, creating temp tables is not allowed during read only transactions, so in some cases existing scripts will not run correctly. It is possible we may relax that restriction in a later release. This is both a SQL Standard compliance issue and a technical issue, so will not be resolved in this release.&lt;br /&gt;
&lt;br /&gt;
Running DROP TABLESPACE on master has no effect on users on standby, though can only succeed if the tablespace is empty. Some standby users may be actively using the tablespace via their temp_tablespaces parameter. If so, those users will be have their current queries cancelled, so that they remove their temp files and allow WAL replay to proceed.&lt;br /&gt;
&lt;br /&gt;
Running DROP DATABASE, ALTER DATABASE SET TABLESPACE, or ALTER DATABASE RENAME on master will cause all users connected to that database on the standby to be forcibly disconnected, once max_standby_delay has been reached. Similarly, running DROP USER or DROP ROLE for a role with login capability will cause all users connected using that role to be forcibly disconnected, once max_standby_delay has been reached.&lt;br /&gt;
&lt;br /&gt;
WAL file control commands will not work during recovery e.g. pg_start_backup(), pg_switch_xlog() etc..&lt;br /&gt;
&lt;br /&gt;
The following administrator commands will not be accepted during recovery mode&lt;br /&gt;
* ANALYZE&lt;br /&gt;
* VACUUM&lt;br /&gt;
* CLUSTER&lt;br /&gt;
* REINDEX&lt;br /&gt;
* CHECKPOINT&lt;br /&gt;
* GRANT, REVOKE, REASSIGN&lt;br /&gt;
* DDL - e.g. CREATE INDEX&lt;br /&gt;
Note again that some of these commands are actually allowed during &amp;quot;read only&amp;quot; mode transactions on the master.&lt;br /&gt;
&lt;br /&gt;
So you cannot create additional indexes on the standby node, nor can you collect statistics via ANALYZE in new/different ways. (EXPLAIN ANALYZE still works, it is a different command).&lt;br /&gt;
&lt;br /&gt;
If you wish to perform maintenance on the standby, run commands on the primary and the standby will then also mimic those changes. e.g. if you need to ANALYZE a table, do so on the primary. &lt;br /&gt;
&lt;br /&gt;
Autovacuum is *not* active during recovery, though will start normally if recovery ends. Bgwriter is active during recovery and will perform restartpoints (similar to checkpoints on primary) and normal block cleaning activities.&lt;br /&gt;
&lt;br /&gt;
Please be reminded that hash indexes are unusable on hot standby, due to already existing and documented limitations for that index type.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Control of Recovery ===&lt;br /&gt;
&lt;br /&gt;
The functions shown in Table 9-56 assist in archive recovery. Except for the first three functions, these are restricted to superusers. All of these functions can only be executed during recovery.&lt;br /&gt;
&lt;br /&gt;
Table 9-56. Recovery Control Functions&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Name||Return Type||Description&lt;br /&gt;
|-&lt;br /&gt;
|pg_is_in_recovery||bool||True if recovery is still in progress.&lt;br /&gt;
|-&lt;br /&gt;
|pg_last_recovered_xact_timestamp() 	||timestamp with time zone	||Returns the original completion timestamp with timezone of the last completed transaction in the current recovery.&lt;br /&gt;
|-&lt;br /&gt;
|pg_last_recovered_xid() 	||integer	||Returns the transaction id (32-bit) of last completed transaction in the current recovery. Later numbered transaction ids may already have completed. This is unrelated to transactions on the source server.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_pause() 	||void	||Pause recovery processing, unconditionally.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_continue() 	||void	||If recovery is paused, continue processing.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_stop() 	||void	||End recovery and begin normal processing.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_pause_xid(int) 	||void	||Continue recovery until specified xid completes, if it is ever seen, then pause recovery.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_pause_time(timestamp)||void	||Continue recovery until a transaction with specified timestamp completes, if one is ever seen, then pause recovery.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_advance(int)||void	||Advance recovery specified number of records then pause.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
pg_recovery_pause and pg_recovery_continue allow a superuser to control the progress of recovery of the database server. This allows queries to be executed to determine how far recovery should progress. If the superuser wishes recovery to complete and normal processing mode to start, execute pg_recovery_stop.&lt;br /&gt;
&lt;br /&gt;
Variations of the pause function exist, mainly to allow PITR to dynamically control where it should progress to. pg_recovery_pause_xid and pg_recovery_pause_time allow the specification of a trial recovery target. Recovery will then progress to that point, and then the database can be inspected to see if this is the correct stopping point.&lt;br /&gt;
&lt;br /&gt;
pg_recovery_advance allows recovery to progress record by record, for very careful analysis or debugging. Step size can be 1 or more records. If recovery is not yet paused then pg_recovery_advance will process the specified number of records then pause. If recovery is already paused, recovery will continue for another N records before pausing again.&lt;br /&gt;
&lt;br /&gt;
If you pause recovery while the server is waiting for a WAL file when operating in standby mode it will have apparently no effect until the file arrives. Once the server begins processing WAL records again it will notice the pause request and will act upon it. This is not a bug. &lt;br /&gt;
&lt;br /&gt;
Once recovery is paused it will stay paused until you release it, even after the server falls further behind than max_standby_delay.&lt;br /&gt;
&lt;br /&gt;
You can specify &amp;quot;recovery_starts_paused = true&amp;quot; in recovery.conf, though the default is not-paused.&lt;br /&gt;
&lt;br /&gt;
== Diagnosing problems ==&lt;br /&gt;
&lt;br /&gt;
First, check that your are connected to the correct server and that the server is in recovery. You can check this by looking at &amp;quot;ps&amp;quot; output and looking for a &amp;quot;startup process&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are sometimes reasons why you cannot connect. Check the log for messages.&lt;br /&gt;
&lt;br /&gt;
If you think you should be able to see an object or some data, check that the standby has processed all oustanding WAL. It may just be the standby is lagging behind.&lt;br /&gt;
&lt;br /&gt;
Look at the current snapshot using &amp;quot;select txid_current_snapshot();&amp;quot;.&lt;br /&gt;
Look at pg_locks and pg_stat_activity.&lt;br /&gt;
&lt;br /&gt;
= Design Overview = &lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
Accuracy: Some changes since this was written, refer to main patch for current details&lt;br /&gt;
&lt;br /&gt;
=== What already works ===&lt;br /&gt;
&lt;br /&gt;
The most difficult part of running queries during recovery is creating a valid MVCC snapshot. The route we have chosen is to have WAL records emulate transaction entries in the procarray, thus allowing users to see entries for TransactionIds that have started writing WAL but not yet had their commit records applied.&lt;br /&gt;
&lt;br /&gt;
The following items for prerequisites for emulating transactions during recovery.&lt;br /&gt;
&lt;br /&gt;
* TransactionIds are densely allocated in increasing order. This means that there are no gaps and the assignment is monotonic. Read-only transactions do not create &lt;br /&gt;
TransactionIds so we can run read-only transactions without disrupting duplicating already used ids.&lt;br /&gt;
&lt;br /&gt;
* Subtransaction commit does not write WAL, so it is important that it also does not write clog entries until commit. This then allows us to perform all the actions of subtransaction commit at the same time as we process the commit record.&lt;br /&gt;
&lt;br /&gt;
As a result, we have the infrastructure on which to build to make Hot Standby work.&lt;br /&gt;
&lt;br /&gt;
=== Transactions ===&lt;br /&gt;
&lt;br /&gt;
In 8.3, recovery maintains the commit log (or clog) as transactions commit or abort. This alone is insufficient to allow user queries to have full visibility of MVCC data.&lt;br /&gt;
&lt;br /&gt;
For Hot Standby we will maintain 3 data structures:&lt;br /&gt;
* ProcArray - records emulated &amp;quot;running&amp;quot; transactions&lt;br /&gt;
* Clog - required to identify visibility of transactions&lt;br /&gt;
* Subtrans - required to identify visibility of subtransactions&lt;br /&gt;
&lt;br /&gt;
We do not need to maintain Multitrans during recovery. We will not be running HeapTupleSatisfiesVacuum() during recovery.&lt;br /&gt;
&lt;br /&gt;
The events that maintain these structures are:&lt;br /&gt;
* new transaction - add a recovery proc with this top-level xid&lt;br /&gt;
* new subtransaction - new subxids are marked with top-level xid, so add new subxid onto recovery proc's subxidcache. We may also add entry to subtrans.&lt;br /&gt;
* commit/abort - remove recovery proc&lt;br /&gt;
&lt;br /&gt;
To allow the above, each WAL record has both the xid and the top-level xid&lt;br /&gt;
&lt;br /&gt;
We expect new xids to come in dense order, i.e. each new xid is 1 later than previous (allowing for wraparound). However, there is a race condition between xid assignment (XidGenLock) and xid use (WALInsertLock), so the xids can arrive with gaps in the sequence. We will generally see the first WAL records for those intermediate xids appearing shortly afterwards, but even so we must keep track of these as yet UnobservedXids.&lt;br /&gt;
&lt;br /&gt;
=== Row Removal ===&lt;br /&gt;
&lt;br /&gt;
Various type of block-level actions were performed on the primary with Super-Exclusive/BufferCleanupLocks held. This same level of lock must be held otherwise queries may attempt to re-access data blocks while they are being cleaned. We will need to change many redo actions so that they take BufferCleanup locks, using a new XLogReadBufferForCleanup(). Changes would be required to HEAP2 actions (freeze, clean and cleanmove) as well as to all index vacuuming actions.&lt;br /&gt;
&lt;br /&gt;
We can't cancel a query that holds a pin on a particular block since we don't keep track of who holds a pin. We just know a backend has a pin and that the startup process must wait.&lt;br /&gt;
&lt;br /&gt;
This may become a problem, or it may not. In most cases, backends hold 5-15 pins concurrently and pins are held for relatively short times. Startup process will provide debug information for when pin times are extended, and for monitoring total delay from pin waits.&lt;br /&gt;
&lt;br /&gt;
Some strategies, if this becomes a problem:&lt;br /&gt;
* minimise pin hold times wherever this occurs&lt;br /&gt;
* deferring application of WAL for pinned blocks (requiring us to use conditional locking)&lt;br /&gt;
* making VACUUM FREEZE hold stronger locks on standby to prevent query access (but doesn't help HOT)&lt;br /&gt;
* ensuring that we perform read ahead I/O for WAL records that have not yet reached head of apply queue&lt;br /&gt;
* change some of the ways index AMs work with respect to row removal (see later)&lt;br /&gt;
&lt;br /&gt;
Hot Standby may work best with full_page_writes = off.&lt;br /&gt;
&lt;br /&gt;
In general, we must do one of these three things:&lt;br /&gt;
1) pass OldestXmin for read-only snapshots to the master&lt;br /&gt;
2) make WAL replay halt while queries complete&lt;br /&gt;
3) cancel queries that could see the data about to be removed&lt;br /&gt;
&lt;br /&gt;
We will implement a combination of strategies 2 and 3, while allowing 1 to exist also. (It might be trivial to make (1) work using dblink).&lt;br /&gt;
&lt;br /&gt;
Each WAL record that cleans tuples has a latestRemovedTransactionId on it. If latestRemovedTransactionId&lt;br /&gt;
is later than a running query on standby then we wait. When we stop waiting we tell all at-risk queries the LSN of the first WAL record that&lt;br /&gt;
has potentially removed tuples they can see. If they see a block with a higher LSN they cancel *themselves*. &lt;br /&gt;
&lt;br /&gt;
This works OK, since SeqScans never read blocks at end of file that&lt;br /&gt;
didn't exist when they started, so long queries need not be cancelled&lt;br /&gt;
when they access growing tables.&lt;br /&gt;
&lt;br /&gt;
The wait is controlled by a parameter called max_standby_delay. The standby delay is the time taken to complete all outstanding WAL activity. max_standby_delay is thus the additional time we think acceptable should we choose to perform failover from the primary to the standby. max_standby_delay = 0..1000000s with typical values being 0s for a very High Availability server, or 3600s for a typical reporting server.&lt;br /&gt;
&lt;br /&gt;
When Startup waits, as described above, this causes the standby_delay for the whole server to increase. Probably more discussion required about how this would work.&lt;br /&gt;
&lt;br /&gt;
Sounds like we need some a balancing system that has a target or optimal standby delay and an absolute max, so that if we are between optimal and max we try to return to optimal. Maybe this would be max_query_standby_delay and max_server_standby_delay. Individual queries can force the server to wait for up to max_query_standby_delay, though no wait occurs that would make the whole server get more behind than max_server_standby_delay. If max_query_standby_delay &amp;gt;= max_server_standby_delay the server delay takes precedence.&lt;br /&gt;
&lt;br /&gt;
We would perform a planned switchover by first setting max_standby_delay=0 on standby, so it catches up. Then shutoff primary users, wait for all WAL to drain across to standby and let her start up.&lt;br /&gt;
&lt;br /&gt;
We will maintain OldestXmin in shared memory to allow it to be accessed quickly.&lt;br /&gt;
&lt;br /&gt;
Issues: Many different use cases here. Doubt we can provide for all of them in first release.&lt;br /&gt;
&lt;br /&gt;
=== Transaction Snapshots ===&lt;br /&gt;
&lt;br /&gt;
All queries will use MVCC Snapshot Isolation in either Read Committed or Serializable modes. These require snapshots, plus visibility information as described above.&lt;br /&gt;
&lt;br /&gt;
Snapshots will be derived directly from shared memory on stanbdy, since data is maintained as transactions arrive/complete. We will also track latest_completed_xid.&lt;br /&gt;
&lt;br /&gt;
=== Relcache ===&lt;br /&gt;
&lt;br /&gt;
All read-only transactions will use and maintain a relcache, allowing them to plan and execute queries using a cached copy of the current database catalog tables. The relcache will be maintained on each backend normally, re-reading catalog tables when invalidation messages are received.&lt;br /&gt;
&lt;br /&gt;
Invalidation messages will be sent by the Startup process, though the Startip process will not maintain its own copy of the relcache. Invalidation messages will be issued when new WAL messages are received. XLOG_RELCACHE_INVAL messages will be sent every time we make a change to a cached heap tuple within CacheInvalidateHeapTuple(). These always occur after a change and will include all required information to send a full invalidation message.&lt;br /&gt;
&lt;br /&gt;
This means that Startup process will continue to use XLogReadBuffer(), minimising the changes required in current ResourceManager's _redo functions - there are still some, see later. It also means that read-only backends will use ReadBuffer() calls normally, so again, no changes required throughout the normal executor code.&lt;br /&gt;
&lt;br /&gt;
=== Relation Locking ===&lt;br /&gt;
&lt;br /&gt;
In recovery, transactions will not be permitted to take any lock higher than AccessShareLock nor assign a TransactionId. This should also prevent us from writing WAL, but we protect against that specifically as well, just in case. (Maybe we can relax that to Assert sometime later).&lt;br /&gt;
We can dirty data blocks but only to set hint bits. (That's another reason to differentiate between those two cases anyway).&lt;br /&gt;
Note that in recovery, we will always be allowed to set hint bits - no need to check for asynchronous commits. &lt;br /&gt;
All other actions which cause dirty data blocks should not be allowed, though this will be just an Assert. Specifically, HOT pruning will not be allowed in recovery mode.&lt;br /&gt;
&lt;br /&gt;
Since read-only backends will only be allowed to take AccessShareLocks there will be no lock conflicts apart from with AccessExclusiveLocks. (If we allowed higher levels of lock we would then need to maintain Multitrans to examine lock details, which we would also rather avoid). So Startup process will not take, hold or release relation locks for any purpose, *apart* from when AccessExclusiveLocks are required.&lt;br /&gt;
&lt;br /&gt;
The Startup process will emulate locking behaviour for transactions that require AccessExclusiveLocks (AELs). AELs will be held by first inserting a dummy TransactionLock entry into the lock table with the TransactionId of the transaction that requests the lock. Then the lock entry will be made. Locks will be released when processing a transaction commit, abort or shutdown checkpoint message, and the lock table entry for the transaction will be removed.&lt;br /&gt;
&lt;br /&gt;
Locks will be taken by the Startup process when it receives a new WAL message. XLOG_LOCK_ACCESSEXCLUSIVE messages will be sent each time a backend *successfully* acquires an AccessExclusiveLock.&lt;br /&gt;
&lt;br /&gt;
Any AEL request that conflicts with an existing lock will cause some action: if it conflicts with an existing AEL then an error is raised; if the AEL request conflicts with a read-only backend then we wait for a while (see Row Removal above) then the read-only backend will receive a cancel message to make it go away. &lt;br /&gt;
&lt;br /&gt;
If Startup process crashes it is a PANIC anyway, so there is no difficulties in cleanup for the lock manager with this approach.&lt;br /&gt;
&lt;br /&gt;
The LOCK TABLE command by default applies an AccessExclusiveLock. This will generate WAL messages when executed on the primary node. When executed on the standby node the default will be to issue an AccessShareLock. Any LOCK TABLE command that runs on the standby and requests a specific lock type will be rejected.&lt;br /&gt;
&lt;br /&gt;
Issues: How will advisory locks work?&lt;br /&gt;
&lt;br /&gt;
=== Index Locking ===&lt;br /&gt;
&lt;br /&gt;
Recovery queries will also wish to use indexes, so all index structures are assumed to be uncorrupted and able to be used during recovery. (This is the same asumption we make immediately after recovery completes, but it is worth noting this explicitly). &lt;br /&gt;
&lt;br /&gt;
An index type may not be usable during recovery if it's WAL _redo() function does not take and hold buffer locks in the same (or at least, an equally correct) manner during recovery. For example, btree indexes have strict rules on buffer locking that must be followed during block splits. &lt;br /&gt;
&lt;br /&gt;
* btree - initial analysis shows locking is correct for btrees (other opinions welcome)&lt;br /&gt;
* GIST, GIN need some changes, but no problems foreseen (says Teodor)&lt;br /&gt;
* hash - doesn't generate WAL yet, so unusable during recovery&lt;br /&gt;
* bitmap - locking protocol works without needing cleanup locks, just exclusive (looking at patch)&lt;br /&gt;
&lt;br /&gt;
Changes to index metapages must also generate cache invalidations by using XLOG_RELCACHE_INVAL messages in WAL. Metapage changes will require cleanup locks, though these are almost certain to be granted because of cacheing.&lt;br /&gt;
&lt;br /&gt;
B-tree index tuples are removed by&lt;br /&gt;
* inserts when the page is full - require only an exclusive lock&lt;br /&gt;
* VACUUMs - require a cleanup lock&lt;br /&gt;
The same lock requirements apply to Hot Standby, so we will need to differentiate the two uses of XLOG_BTREE_DELETE so that we can re-apply the appropriate lock during btree_redo()&lt;br /&gt;
&lt;br /&gt;
HOT imposes some tricky conditions as to when it is safe to use a new index. These conditions also apply to Hot Standby, so there is nothing we need do. (Note also that Hot Standby has got nothing to do with the HOT feature).&lt;br /&gt;
&lt;br /&gt;
=== Summary of changes to WAL records ===&lt;br /&gt;
&lt;br /&gt;
* New WAL record for successfully acquired AccessExclusiveLocks&lt;br /&gt;
* New WAL record for cache invalidation messages &lt;br /&gt;
* Two new fields on each XLogRecord - xid2, a TransactionId and info2, 2 bytes of flags/data &lt;br /&gt;
&lt;br /&gt;
The last change uses up the 6 bytes that were being wasted on 64-bit servers, and adds 4 bytes on to the XLogRecord length for 32-bit servers.&lt;br /&gt;
&lt;br /&gt;
I would like to use 3 of the flag bits for Hot Standby:&lt;br /&gt;
&lt;br /&gt;
* flag1 to indicate the first WAL record for an xid. This tells us Hot&lt;br /&gt;
Standby to efficiently manage a recovery snapshot.&lt;br /&gt;
&lt;br /&gt;
* flag2 to indicate the first WAL record for a subxid. That tells us to&lt;br /&gt;
maintain subtrans during Hot Standby.&lt;br /&gt;
&lt;br /&gt;
* flag3 to indicate that this is a cleanup record. This tells us to use latestRemovedTransactionId to inform user queries of cleanup having taken place.&lt;br /&gt;
&lt;br /&gt;
If flag2 is set then xid2 contains the xid of xl_xid's parent.&lt;br /&gt;
else if flag3 is set then xid2 contains the latestRemovedTransactionId&lt;br /&gt;
&lt;br /&gt;
Note that flag2 and flag3 are mutually exclusive. cleanup records do not make transactional changes, they just cleanup what can no longer be seen. The first change made by a subtransaction is always on another WAL record from any cleanup associated with the block (HOT etc).&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
Additional thinking behind the technical designs above, not necessarily fully coherent sets of thoughts.&lt;br /&gt;
&lt;br /&gt;
=== Transaction Snapshots ===&lt;br /&gt;
&lt;br /&gt;
Deriving transaction snapshots is probably the most difficult problem for Hot Standby to resolve. We *must* have a transaction snapshot to access table data in a consistent way. (See discussion later on Transaction Isolation).&lt;br /&gt;
&lt;br /&gt;
We can derive transaction snapshots&lt;br /&gt;
* remotely from primary node&lt;br /&gt;
* locally on the standby node&lt;br /&gt;
&lt;br /&gt;
If we derive a snapshot locally, then we will end up with a situation where the xmin of the local snapshot precedes the xmin of the primary node. When this occurs it will then be possible for WAL records to arrive on the standby that request removal of rows that a transaction might wish to see. Preventing that situation can be done by either deferring WAL apply or by cancelling queries. &lt;br /&gt;
&lt;br /&gt;
We can defer WAL apply for particular tables only, but this could significantly complicate the apply process and is not a suggested option for the first release of this feature.&lt;br /&gt;
&lt;br /&gt;
We might control query cancellation by tracking which tables have had rows removed that would have been visible to particular queries. Again, possible but suffers from the problem that tables on which HOT is frequently active would be almost unusable.&lt;br /&gt;
&lt;br /&gt;
Simply ignoring WAL removal has been discussed and rejected (so far). http://archives.postgresql.org/pgsql-hackers/2008-05/msg00753.php &lt;br /&gt;
Explicitly defining the tables a transaction wishes to see has also been discussed and rejected (so far).&lt;br /&gt;
http://archives.postgresql.org/pgsql-hackers/2008-08/msg00268.php&lt;br /&gt;
&lt;br /&gt;
So the most generally applicable and simplest initial solution is to take snapshots from the remote primary node. The proposal for this follows:&lt;br /&gt;
&lt;br /&gt;
Transaction snapshots will be managed by a new process, Snapshot. Snapshot will start only in recovery mode and will exit when normal processing mode begins. Snapshot process will connect to the remote primary node and export snapshot data and copy this to shared memory on the standby node. When all standby backends have run UnregisterSnapshot() then the snapshot will then be unregistered on the remote primary node also.&lt;br /&gt;
&lt;br /&gt;
The standby must not think a transaction is visible until all changes made by it are have been applied. So snapshots from the primary cannot be used on the standby until the LSN at which they were taken has been reached by WAL apply on the standby. Snapshots don't normally have an LSN, so we must derive that information as well when we take a Snapshot. With asynchronous commits a transaction can be committed and yet not yet written to disk, so we cannot rely on the current WAL write pointer. Taking the WAL insert pointer is the safest thing to do, though most heavily contended. We don't want to hold ProcArrayLock while requesting WALInsertLock, so we will discover the LSN of the WAL insert pointer *after* the Snapshot has been derived.&lt;br /&gt;
&lt;br /&gt;
So snapshots from the primary take time to before they can be used. The delay is exactly the current processing delay from primary to standby, so another reason why we do not wish to fall behind.&lt;br /&gt;
&lt;br /&gt;
Taking snapshots from primary has a few disadvantages&lt;br /&gt;
* snapshots take time before they are usable&lt;br /&gt;
* requesting new snapshots is via remote request&lt;br /&gt;
* snapshots on primary prevent row removal (but this was also an advantage of this technique!)&lt;br /&gt;
&lt;br /&gt;
If primary and standby node are connected by private ethernet then the snapshot request time will be ~10ms, though that is probably 100 times slower than current snapshot access. If primary and standby are opposite sides of an ocean then times could be as high as 500ms. Taking snapshots directly could be annoyingly slow for small read-only statements, so we need to buffer this process in various ways. For larger queries, this may not be a problem at all, but we do not wish to limit or assume the uses of the standby node. &lt;br /&gt;
&lt;br /&gt;
First of all, each backend will have the opportunity to reuse previous snapshots both within transactions and across them. A userset parameter snapshot_reuse_window = 0..60000ms will define the time window  in which any request for a new snapshot will simply result in being fed the last snapshot again. When the window on a snapshot has expired a newer snapshot will be presented instead. This idea is similar to serializable transactions, which continually reuse the same snapshot. This is a useful parameter for normal processing as well, since it will reduce contention on the ProcArrayLock for many applications. &lt;br /&gt;
&lt;br /&gt;
Snapshots can be reused across transactions in recovery mode, since they are held in shared memory. Amount of shared memory dedicated to storing snapshots will be max_connections * size of snapshots.&lt;br /&gt;
&lt;br /&gt;
Since there is a delay between obtaining a new snapshot and it becoming usable the Snapshot process will buffer them until they become &amp;quot;mature&amp;quot;, like a good Whiskey. Snapshot process will take regular snapshots and pre-age them so that when a backend requests a snapshot it will be given the most recently matured snapshot. Time between snapshots is set by snapshot_preread_timeout = 0..60000ms. If a request for a snapshot arrives and there are no snapshots waiting to mature then this will trigger snapshot process to request a new primary snapshot. (This parameter could be automatically set based upon the arrival rate of snapshot requests, but this is a something to consider later).&lt;br /&gt;
&lt;br /&gt;
If snapshot_reuse_window = 0 then a backend will be presented with a freshly obtained snapshot and will then wait until the exact first moment it can be used before returning.&lt;br /&gt;
&lt;br /&gt;
We can continue to reuse snapshots from the primary even if the primary crashes, becomes disconnected or is shutdown/restarted. New snapshots are obviously not possible until it appears again. It's not that common for us to lose contact with the primary *and* for it to *not* be a failover, so this seems like an acceptable restriction.&lt;br /&gt;
&lt;br /&gt;
txid_current_snapshot() is sufficient for our needs. We only need to know about top-level xids. This means we will need a working subtrans data structure, which means we will need some way to update it. Proposal is for the first WAL record in any subtransaction to note the parentxid. WAL apply loop will update subtrans during recovery when a WAL record arrives with an augmented parentxid.&lt;br /&gt;
&lt;br /&gt;
=== Performance ===&lt;br /&gt;
&lt;br /&gt;
Query performance may slow down WAL apply if too many queries execute concurrently and use up CPU and I/O resources that would have been used by the Startup process. Queries that hold pins for long periods on tables with frequent updates will slow down WAL apply.&lt;br /&gt;
&lt;br /&gt;
Performance is not expected to be impaired by these new WAL message types since they apply only to AccessExclusiveLocks, which are reasonably rare even in applications that issue many DDL requests.&lt;br /&gt;
&lt;br /&gt;
== Correctness ==&lt;br /&gt;
&lt;br /&gt;
=== Two Phase Commit ===&lt;br /&gt;
&lt;br /&gt;
Will need to maintain locking for prepared transactions. So will need to read twophase state and re-create any AELs therein. No other actions foreseen.&lt;br /&gt;
&lt;br /&gt;
=== Tuple Locking ===&lt;br /&gt;
&lt;br /&gt;
Tuple level locks are WAL-logged, so WAL replay will make the changes on blocks to emulate locking. There is no required access to lock manager.&lt;br /&gt;
&lt;br /&gt;
From correctness perspective, no changes to tuples that are locked should appear in WAL, so we ignore the possibility. &lt;br /&gt;
&lt;br /&gt;
No changes required here. No users can wait on locks, since they all use AccessShareLocks. So they just ignore tuple locks.&lt;br /&gt;
&lt;br /&gt;
=== Data structure Check ===&lt;br /&gt;
&lt;br /&gt;
* Heap - discussed above&lt;br /&gt;
* Index - discussed above&lt;br /&gt;
* FSM - checked with Heikki and new FSM causes no issues for Hot Standby&lt;br /&gt;
* twophase - just files, so structure is OK&lt;br /&gt;
* pg_log - writable&lt;br /&gt;
* pg_xlog - not writable by WAL apply or users&lt;br /&gt;
* clog - data structure valid and usable &lt;br /&gt;
* subtrans - data structure is non transactional&lt;br /&gt;
* multixact - is not required&lt;br /&gt;
&lt;br /&gt;
== Acknowledgements ==&lt;br /&gt;
&lt;br /&gt;
Florian Pflug's contribution to making Hot Standby was an important one. The single hardest problem in 2007 was how we would get access to a TransactionId. Florian's careful analysis resulted in the idea that is now critical to the rest of this project: VirtualTransactionIds. In addition, various internal changes made by a range of developers for 8.3 have made this significantly easier than it was previously.&lt;br /&gt;
&lt;br /&gt;
Florian also identified the problems of relcache handling and block cleanup locks. Unfortunately, none of Florian's earlier code can/has been reused.&lt;br /&gt;
&lt;br /&gt;
This design includes technical feedback from many PostgreSQL hackers, all of whom I thank and acknowledge.&lt;br /&gt;
&lt;br /&gt;
== Project Plans ==&lt;br /&gt;
&lt;br /&gt;
Priorities:&lt;br /&gt;
*1 Correctness&lt;br /&gt;
*2 Performance&lt;br /&gt;
&lt;br /&gt;
Phases&lt;br /&gt;
&lt;br /&gt;
* Design (2008!)&lt;br /&gt;
&lt;br /&gt;
* Connection during recovery (mid-July)&lt;br /&gt;
  &lt;br /&gt;
* Infrastructure changes (1 Sept)&lt;br /&gt;
&lt;br /&gt;
* Queries work when no WAL changes arrive (snapshots)&lt;br /&gt;
&lt;br /&gt;
* Queries work while WAL changes arrive (block locking)&lt;br /&gt;
&lt;br /&gt;
* Queries work while DDL changes arrive (locking, relcache)&lt;br /&gt;
&lt;br /&gt;
* Performance&lt;br /&gt;
&lt;br /&gt;
* Queries work with two-phase commit&lt;br /&gt;
&lt;br /&gt;
== Features not planned for this release ==&lt;br /&gt;
(Or at least not by us in this release.)&lt;br /&gt;
&lt;br /&gt;
* Automatic offloading - run a query on primary node and have it offload processing of larger queries onto standby nodes.&lt;br /&gt;
&lt;br /&gt;
* Different mechanisms for deriving standby snapshots&lt;br /&gt;
&lt;br /&gt;
* LISTEN, NOTIFY - should be possible when this happens via shared memory rather than pg_listener&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Hot_Standby</id>
		<title>Hot Standby</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Hot_Standby"/>
				<updated>2009-05-17T16:03:11Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;correcting targets&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hot Standby is the name for the capability to run queries on a database that is currently performing archive recovery. Log Shipping replication allows you to create one or more standby nodes that are replicas of the primary node (or master node). Standby nodes can then be used for read-only query access.&lt;br /&gt;
&lt;br /&gt;
Hot Standby is being developed for inclusion in PostgreSQL 8.5 by 2ndQuadrant via public sponsorship.&lt;br /&gt;
&lt;br /&gt;
This feature will augment the capabilities of streaming replication that have also been discussed for inclusion in r8.4, though does not rely on it and has minimal interaction with it.&lt;br /&gt;
&lt;br /&gt;
Changes will appear on this page, as and when design changes or clarifications are required. Please reply to posts on pgsql-hackers, or email simon@2ndquadrant.com&lt;br /&gt;
&lt;br /&gt;
= Project Status Tracking =&lt;br /&gt;
&lt;br /&gt;
== Version History == &lt;br /&gt;
&lt;br /&gt;
Latest version is always at top of this section&lt;br /&gt;
&lt;br /&gt;
* [[:Image:hs.v9g.20090123_3.tar.bz2|hs.v9g.20090123_3.tar.bz2]] - v9g - bug fixes&lt;br /&gt;
* [[:Image:hs.v9d.20090122_4.tar.bz2|hs.v9d.20090122_4.tar.bz2]] - v9 - new conflict resolution and various refactorings&lt;br /&gt;
* [[:Image:hs.v8.20090114_1.tar.bz2|hs.v8.20090114_1.tar.bz2]] - v8 - bug fixes and knock-on effects of refactoring&lt;br /&gt;
* [[:Image:hs.v7.20090112_1.tar.bz2|hs.v7.20090112_1.tar.bz2]] - v7 - includes slotId removal refactoring&lt;br /&gt;
* [[:Image:hs.v6b.20090107_1.tar.bz2|hs.v6b.20090107_1.tar.bz2]] - v6b&lt;br /&gt;
* [[:Image:hs.v6a.20090103_1.tar.bz2|hs.v6a.20090103_1.tar.bz2]] - v6a new test cycle commencing (replaces v6)&lt;br /&gt;
* [[:Image:hs.v5.20081218_1.tar.bz2|hs.v5.20081218_1.tar.bz2]] - v5 corrected patch application to CVS HEAD, doc typos fixed&lt;br /&gt;
* [[:Image:hs.v5.20081217_2.tar|hs.v5.20081217_2.tar]] - v5 broken down into smaller patches for review&lt;br /&gt;
&lt;br /&gt;
== Remaining Work Items for Nov 2008 CommitFest ==&lt;br /&gt;
&lt;br /&gt;
* Latest commit that is being tested: 4fe66...&lt;br /&gt;
&lt;br /&gt;
Reported problems (Identified by) (Target release)&lt;br /&gt;
* (none)&lt;br /&gt;
&lt;br /&gt;
Infrastructure changes&lt;br /&gt;
* (none)&lt;br /&gt;
&lt;br /&gt;
Main work/required additional items (Proposed by) (Target release)&lt;br /&gt;
* (none)&lt;br /&gt;
&lt;br /&gt;
Performance tuning opportunities (Proposed by) (Target release)&lt;br /&gt;
* (none)&lt;br /&gt;
&lt;br /&gt;
Usability enhancements (Proposed by)&lt;br /&gt;
* max_standby_delay set as a normal GUC, so it can be changed during normal execution (Simon)&lt;br /&gt;
* more accurately determine users to disconnect if we drop a tablespace that contains temp files currently in use&lt;br /&gt;
* more work possible on btree deletes to reduce impact&lt;br /&gt;
* input datatypes for functions (Simon)&lt;br /&gt;
* main docs required (put Wiki into SGML) (Simon)&lt;br /&gt;
&lt;br /&gt;
Items deferred until next release&lt;br /&gt;
* make pg_start_backup() work on standby - synchronisation is already possible using pg_latest_recovered_lsn()&lt;br /&gt;
* connection from standby to master to prevent xmin horizon moving forwards on master&lt;br /&gt;
* buffer manager optimization targeted to reduce I/O for replay of btree vacuum when scanning uncleaned blocks (Simon)&lt;br /&gt;
* Canceled queries when idle in transaction cause client-side mismatch [slightly unrelated) (Simon) This only effects transactions that are idle-in-transaction AND either hold locks, are serializable or have open cursors. Current solution is upgrade to a FATAL error. The same problem occurs if we have an error while processing invalidation messages.&lt;br /&gt;
&lt;br /&gt;
Tests needed&lt;br /&gt;
* Is there a performance regression on normal running from any overheads introduced? Patch v HEAD comparison&lt;br /&gt;
* Is there a performance regression on recovery? Patch v HEAD comparison (4% degradation on simple test at v4, need retest for later versions)&lt;br /&gt;
* Usability tests: How does query conflict handling work in practice? User experience needed&lt;br /&gt;
&lt;br /&gt;
Code has been reviewed in various parts by Pavan, Heikki and Tom. Further detailed review/ers are still required.&lt;br /&gt;
&lt;br /&gt;
== Resolved Items/Issues ==&lt;br /&gt;
&lt;br /&gt;
Reported problems (Reported by/Requested by) (Resolved in version...) (Most recent at top)&lt;br /&gt;
&lt;br /&gt;
=== Bugs present on Nov 1 ===&lt;br /&gt;
&lt;br /&gt;
* minSafeStart point reset to earlier in some cases (Heikki) (Infra)&lt;br /&gt;
* signal postmaster to refresh password cache if auth file changes (Simon) (v9g)&lt;br /&gt;
* fix query cancel because of locks so it includes AbortOutOfAnyTransaction(); (Simon) (v9e)&lt;br /&gt;
* fix memory leak in GetRunningXactData() (Simon) (v9)&lt;br /&gt;
* conflict resolution for redo of database drop/move/rename while users are connected to that database (Simon) (v9)&lt;br /&gt;
* conflict resolution for redo of drop tablespace while users are using temp files in that tablespace - correct but needs work (Simon) (v9)&lt;br /&gt;
* Handle out of procs state gracefully, prevent snapshots and throw user query errors (Heikki) (v8d)&lt;br /&gt;
* AccessExclusiveLock must be held by subtransaction, not top-level transaction (Heikki/Simon) (v8)&lt;br /&gt;
&lt;br /&gt;
* Block unlocking required during VACUUM scan (Heikki) (v6b)&lt;br /&gt;
* XLOG_BTREE_DELETE records handled correctly (Heikki) (v6)&lt;br /&gt;
* btree VACUUM code - must scan every block of index (Heikki) (v6)&lt;br /&gt;
* BEGIN TRANSACTION READ WRITE (Pavan) (v6)&lt;br /&gt;
* Must ignore_killed_tuples and never kill_prior_tuple during index scans in recovery (Greg) (v6) same fix, subtlely different scope (v8)&lt;br /&gt;
* uint unsupported on Windows (Jaime) (v6b)&lt;br /&gt;
* SIGINT cancels idle-in-transaction sessions (Pavan) (v6b)&lt;br /&gt;
* WALInsertLock still held at failover (Pavan) (v5)&lt;br /&gt;
* flat file updates for DDL incorrect (Mark) (v5)&lt;br /&gt;
&lt;br /&gt;
=== Refactoring, bugs, tuning, usability tweaks ===&lt;br /&gt;
&lt;br /&gt;
Functionality changes since Nov 1&lt;br /&gt;
&lt;br /&gt;
* Complete Prepared Transaction support (Simon) &lt;br /&gt;
* fix bugs with recovery_starts_paused(), allow shutdown while paused (Simon)&lt;br /&gt;
* Compile error with WAL_DEBUG set (Bernd)&lt;br /&gt;
* removed reliance on pg_subtrans marking optimisation (Heikki/Simon)&lt;br /&gt;
* merged changes with Heikki's most recent review of recoveryinfra changes (Simon)&lt;br /&gt;
* tuning of RecordKnownAssignedTransactionIds() to avoid taking ProcArrayLock in most common case (Simon) (v9p)&lt;br /&gt;
* tuning of RecordKnownAssignedTransactionIds() using hash table (Heikki) (v9m)&lt;br /&gt;
* deferred buffer recovery conflict cache (Simon) (v9k)&lt;br /&gt;
* rename parameter used to turn on/off hot standby (Merlin) (v9i)&lt;br /&gt;
* Allow option to start recovery in paused mode (Kevin) (v9i)&lt;br /&gt;
* startup process waits, even when issuing deferred query cancellation (Heikki/Gianni) (v9i)&lt;br /&gt;
* Workaround: Canceled queries when idle in transaction cause FATAL errors because of client-side mismatch bug (Simon) (v9i)&lt;br /&gt;
* XidCacheRemoveXid (Simon) (v9i)&lt;br /&gt;
* rare assertion failure in pg_subtrans - caused by invalid assumption about when to mark subtrans (Gianni)&lt;br /&gt;
* snapshot bug (v9h) (Gianni &amp;amp; Mark)&lt;br /&gt;
* using wrong LSN in conflict handling causing more cancels than required (Gianni) (v9f)&lt;br /&gt;
* add parameter to disable standby query capability (&amp;quot;hot_standby&amp;quot;) (Heikki) (v9e)&lt;br /&gt;
* fix race condition for SetBufferRecoveryConflictLSN(), recheck MyProc-&amp;gt;xmin (Simon) (v9e)&lt;br /&gt;
* streamline commit/abort processing to bare minimum (Simon) (v9d)&lt;br /&gt;
* improved debug error messages for unobserved xids (Gianni) (v9c)&lt;br /&gt;
* missed some calls to RecordKnownAssignedTransactions() during last refactoring (Simon) (v9c)&lt;br /&gt;
* pg_recovery_advance() regression - fixed (Simon) (v9b)&lt;br /&gt;
* alter location of debug messages for AssignTransactionId (Simon) (v9a)&lt;br /&gt;
* remove docs for pg_recovery_pause_cleanup() (Simon) (v9)&lt;br /&gt;
* reduce use of ProcArrayLock to once per record, plus one at commit/abort (Simon) (v9)&lt;br /&gt;
* RecoveryConflictLSN, deferred cancellation of xmin horizon conflicts and skip cancellation if idle-in-xact (Andreas) (v9)&lt;br /&gt;
* make btree delete watertight (can't use RecentGlobalXmin) - correct but needs work (Heikki) (v9)&lt;br /&gt;
* must not do conflict processing when snapshots disabled - need to refactor some more, groan (Simon) (v9)&lt;br /&gt;
* rearrange call to UnobservedTransactionsPruneXids() to speed up calls to UnobservedTransactionsRemoveXid() (Simon) (v9)&lt;br /&gt;
* remove pg_recovery_pause_cleanup() which stopped working in v8e because of refactoring (Simon) (v9)&lt;br /&gt;
* downgrade &amp;quot;WARNING:  proc array entry was missing for transaction&amp;quot; to DEBUG2 (Happens because of the race condition between XidGenLock and WALInsertLock. Occurred 4 times in 10 hour bash test on dual CPU server, but all cases have been normal and explainable since the xid was the latestRunningXid in all cases.) (Gianni) (v9)&lt;br /&gt;
* refactor rmgr &amp;quot;isCleanupRecord&amp;quot; code (Heikki) (v8e)&lt;br /&gt;
* remove databaseId, roleId and vacFlags from RunningXactData (Simon) (v8d)&lt;br /&gt;
* complete refactoring required change of ProcArrayUpdateRecoveryTransactions() (Heikki), plus fix one stupid and one very subtle bug while doing so (Simon) (v8c)&lt;br /&gt;
* not updating pg_auth when appropriate (Gianni) (v8b) -- trivial logic error&lt;br /&gt;
* optimize UnobservedTransactionsPruneXids() and fix corner case bug (Gianni) (v8b)&lt;br /&gt;
* split recovery procs into different pools, allowing error messages when overflowed (Simon) (v8a)&lt;br /&gt;
* refactor pre-allocation of Recovery Procs, need to trace dependency that prevents removal (Simon) (v8a)&lt;br /&gt;
* refactor XactCompletionHasUnmarkedSubxids() (Simon) (v8a)&lt;br /&gt;
* fix bug caused by earlier refactoring in ProcArrayClearRecoveryProcs() (Simon) (v8a)&lt;br /&gt;
* UnobservedXids leak warning - trivial fix (Gianni) (v8a)&lt;br /&gt;
* avoid starting autovac launcher for wraparound avoidance during recovery (Simon) (v8a)&lt;br /&gt;
* clarify meaning of last_recovered... functions during/after recovery (Simon) (v8)&lt;br /&gt;
* add function last_recovered_xlog_location() to allow synchronisation between master and standby based on an LSN (Simon) (v8)&lt;br /&gt;
* Document that index locking is correct and why (Heikki) (v8)&lt;br /&gt;
* add README comments to access/transam/README (Simon) (v8)&lt;br /&gt;
* document need to set max_connections correctly on standby (Simon) (v8)&lt;br /&gt;
* refactor/remove special case logic in GetRunningTransactionData() (Heikki) (v8)&lt;br /&gt;
* pg_subtrans could not open file (Heikki) (v8)&lt;br /&gt;
* added pg_current_recovery_target() (Gianni) (v8)&lt;br /&gt;
* allow startup process to delay at start to allow debugger attach where pg_ctl -o &amp;quot;-W n&amp;quot; sets a delay of n secs (Simon) (v8)&lt;br /&gt;
* adjust all XXX comments related to Hot Standby to be XXXHS (Simon) (v8)&lt;br /&gt;
* renamed last_completed... functions to last_recovered... (Simon) (v8)&lt;br /&gt;
* slotid refactoring, comments changed (Heikki) (v7)&lt;br /&gt;
* Cannot Assert(pmState == PM_STARTUP) when postmaster catches PMSIGNAL_RECOVERY_START (regression from earlier report) (v6b)&lt;br /&gt;
* Use of #define may mask bugs in 1-2 locations in procarray.c (Pavan) (v6b)&lt;br /&gt;
&lt;br /&gt;
Do we need/want? (Current answer)&lt;br /&gt;
* recovery_safe_start_location; I think we do (Not implemented)&lt;br /&gt;
* to automatically reset default_transaction_read_only following startup (No)&lt;br /&gt;
* Creating temp tables in recovery mode. Not sure if that is spec compliant? We may want to relax that restriction. If we do, we already have a design in place for changes to make this work: http://archives.postgresql.org/pgsql-hackers/2008-07/msg00616.php. (Not in 8,4)&lt;br /&gt;
&lt;br /&gt;
Resolved Issues/Questions&lt;br /&gt;
* No need to send invalidations when index metapages change - already handled at xact commit&lt;br /&gt;
* Added further user/admin documentation via this Wiki&lt;br /&gt;
&lt;br /&gt;
Excluded items&lt;br /&gt;
* hash index handling (or any index type that doesn't write WAL)&lt;br /&gt;
* Cancelled queries to show errcode(ERRCODE_T_R_SERIALIZATION_FAILURE) (cannot do, unable to identify source of cancellation)&lt;br /&gt;
&lt;br /&gt;
= Usage =&lt;br /&gt;
&lt;br /&gt;
== Users Overview ==&lt;br /&gt;
&lt;br /&gt;
Users will be able to connect to the database while the postmaster is in recovery state and perform read-only queries. Read-only access to catalogs and views will also occur as normal.&lt;br /&gt;
&lt;br /&gt;
When you connect in this mode, default_transaction_read_only will be forced to be true, whatever its setting in postgresql.conf. As a result, all transactions started during this time will be limited to read-only actions only. In all other ways, connected sessions will appear identical to sessions initiated during normal processing mode. There are no special commands required to initiate a connection at this time, so all interfaces will work normally without change.&lt;br /&gt;
&lt;br /&gt;
Read-only here means &amp;quot;no writes to the permanent database tables&amp;quot;. So temporary sort and work files will be used, just as with normal SQL execution. Temporary tables cannot be created and therefore cannot be used at all in recovery mode. &lt;br /&gt;
&lt;br /&gt;
Actions that are allowed&lt;br /&gt;
* Transaction management commands: BEGIN, END, ABORT, START TRANSACTION&lt;br /&gt;
* SELECT, COPY TO&lt;br /&gt;
* Cursor commands: DECLARE, FETCH, CLOSE, &lt;br /&gt;
* Parameters: SHOW, SET, RESET, DISCARD&lt;br /&gt;
* LOAD&lt;br /&gt;
* Plans: PREPARE, EXECUTE, DEALLOCATE&lt;br /&gt;
* LOCK (see later)&lt;br /&gt;
* SAVEPOINT commands: SAVEPOINT, RELEASE, ROLLBACK TO SAVEPOINT&lt;br /&gt;
* EXCEPTION blocks in internal subtransactions&lt;br /&gt;
* Activation of Select RULEs&lt;br /&gt;
&lt;br /&gt;
Actions not allowed on Standby are:&lt;br /&gt;
* Transaction management commands which explicitly set non-read only state: SET TRANSACTION, SET SESSION CHARACTERISTICS, BEGIN, START TRANSACTION, direct SET&lt;br /&gt;
* Two-phase commit commands (PREPARE TRANSACTION, COMMIT PREPARED, ROLLBACK PREPARED) because even read-only transactions need to write WAL in the prepare (first phase of two phase commit).&lt;br /&gt;
* SELECT ... FOR SHARE | UPDATE which cause row locks to be written&lt;br /&gt;
* DML - Insert, Update, Delete, COPY FROM, Truncate which all write data&lt;br /&gt;
* DDL - Create, Drop, Alter, Comment (even for temporary tables because currently these cause writes to catalog tables)&lt;br /&gt;
* Access to nextval on sequences because nextval causes the value of the sequence to be increment&lt;br /&gt;
* LISTEN, UNLISTEN, NOTIFY since they currently write to system tables&lt;br /&gt;
* Remember: Triggers will never be executed!&lt;br /&gt;
All of these are allowed on primary, just not on standby in read-only mode. When failover, switchover occurs these commands will then be possible.&lt;br /&gt;
&lt;br /&gt;
It is possible that the restrictions on LISTEN, UNLISTEN, NOTIFY and temporary tables may be lifted in a future release, if their internal implementation allows it.&lt;br /&gt;
&lt;br /&gt;
Note that current behaviour of read only transactions is to allow these&lt;br /&gt;
* nextval on sequences&lt;br /&gt;
* LISTEN, UNLISTEN, NOTIFY&lt;br /&gt;
So there is a subtle difference in behaviour between standby read-only transactions and non-recovery read only transactions.&lt;br /&gt;
&lt;br /&gt;
If failover or switchover occurs the database will switch to normal processing mode. Sessions will remain connected while the server changes mode. Current transactions will continue, though will remain read-only. After this, it will be possible to initiate read-write transactions, though users must *manually* reset their default_transaction_read_only setting first.&lt;br /&gt;
&lt;br /&gt;
Users will be able to tell whether their session is read-only by issuing SHOW default_transaction_read_only, or by running an information function pg_is_in_recovery() returns bool. There is also be a function that allows you to read the last known transaction end timestamp (pg_last_completed_xact_timestamp) and the transactionid (pg_last_completed_xid).&lt;br /&gt;
&lt;br /&gt;
In recovery, transactions will not be permitted to take any lock higher than AccessShareLock nor assign a TransactionId. This mostly prevents writing WAL, but we protect against that specifically as well, just in case some user code attempts it. &lt;br /&gt;
&lt;br /&gt;
The LOCK TABLE command by default applies an AccessExclusiveLock. This will generate WAL messages when executed on the primary node. When executed on the standby node the default will be to issue an AccessShareLock. Any LOCK TABLE command that runs on the standby and requests a specific lock type other than AccessShareLock will be rejected.&lt;br /&gt;
&lt;br /&gt;
During recovery database writes will only be performed by startup process as it processes WAL records and replays them (also known as WAL redo or simply &amp;quot;apply&amp;quot;). In general this means that queries will not experience lock conflicts with writes, just like normal Postgres concurrency control (MVCC).&lt;br /&gt;
&lt;br /&gt;
=== Query Conflicts ===&lt;br /&gt;
&lt;br /&gt;
However, there is some potential for conflict between standby queries and WAL redo from the primary node. The user is provided with a number of optional ways to handle these conflicts.&lt;br /&gt;
&lt;br /&gt;
Conflicts can occur for four reasons&lt;br /&gt;
* Access Exclusive Locks from primary node (including both locks and various kinds of DDL action)&lt;br /&gt;
* Early cleanup of data still visible to the current query's snapshot&lt;br /&gt;
* Dropping tablespaces on the master while standby queries are using those tablespace for temporary work files (work_mem overflow)&lt;br /&gt;
* Dropping users, databases or tablespaces on the master while those objects are connected on standby&lt;br /&gt;
* Waiting to acquire buffer cleanup locks (for which there is no time out)&lt;br /&gt;
discussed in more detail below.&lt;br /&gt;
&lt;br /&gt;
Some WAL redo actions will be for DDL actions. These DDL actions are repeating actions that have already committed on the primary node, so they must not fail on the standby node. These DDL locks take priority and will automatically *cancel* any read-only transactions that get in their way, after a grace period. This is similar to the possibility of being canceled by the deadlock detector, but in this case the standby process always wins, since the repeated actions must not fail. This also ensures that replication doesn't fall behind while we wait for a query to complete. Again, we assume that the standby is there for high availability purposes primarily.&lt;br /&gt;
&lt;br /&gt;
An example of the above would be:&lt;br /&gt;
* User on Standby running a query against table X&lt;br /&gt;
* Administrator on Primary runs DROP TABLE&lt;br /&gt;
Clearly the query cannot continue if we let the DROP TABLE proceed. If this situation occurred on the primary, the DROP TABLE would wait until the query has finished. When the query is on the standby and the DROP TABLE is on the primary, the primary doesn't have information about what the standby is running and so cannot wait. In most cases this is desirable, so the workload on the standby has little or no effect on the primary and so we would say the two nodes are only loosely coupled.&lt;br /&gt;
&lt;br /&gt;
The second reason for conflict between standby queries and WAL redo is &amp;quot;early cleanup&amp;quot;. Normally, PostgreSQL allows cleanup of old row versions when there are no users who may need to see them to ensure correct visibility of data (known as MVCC). If there is a standby query that has been running for longer than any query on the primary then it is possible for old row versions to be removed by either VACUUM or HOT. This will then generate WAL records that, if applied, would remove data on the standby that might *potentially* be required by the standby query. In more technical language, the Primary's xmin hozrizon is later than the Standby's xmin horizon, allowing dead rows to be removed.&lt;br /&gt;
&lt;br /&gt;
We have a number of choices for resolving query conflicts. Choice (1) is automatic, options (2) and (3) should be taken as remedial actions if an annoying number of cancelations occur.&lt;br /&gt;
&lt;br /&gt;
1. We wait and hope the query completes. If the recovery is not paused, then we will wait automatically until the server is max_standby_delay behind. Once that grace period expires, we then take one of the following actions:&lt;br /&gt;
&lt;br /&gt;
a) If the conflict is caused by a lock, we cancel the standby transaction immediately, even if it is idle-in-transaction.&lt;br /&gt;
&lt;br /&gt;
b) If the conflict is not caused by a lock, we tell the standby query that a conflict has occurred and that it must cancel itself if there is a risk that it attempts to read data that has been cleaned up already. Specifically, if the standby query reads a data block that has been recently modified it will cancel itself. Note it only needs one modified data block to cause a cancel and that the data block does *not* need to have been modified by a cleanup record - any change is sufficient to create this risk. (This is very similar to the much feared Oracle error message &amp;quot;snapshot too old&amp;quot;). Note also that this means that idle-in-transaction sessions are never canceled except by locks. Users should be clear that tables that are regularly and heavily updated on primary server will quickly cause cancellation of any longer running queries made against those tables.&lt;br /&gt;
&lt;br /&gt;
If cancellation does occur, the query and/or transaction is repeatable - i.e. the error is dynamic and will not necessarily occur the same way if the query is executed again.&lt;br /&gt;
&lt;br /&gt;
2. We connect to Primary server from Standby server and keep a transaction open. This guarantees that a cleanup record is never generated and we don't ever get into situation 1(b). This option can be performed fairly simply using contrib/dblink functions. &lt;br /&gt;
&lt;br /&gt;
3. We pause recovery by issuing a pg_recovery_pause() function. This halts application of WAL records completely and allows queries to proceed to completion without problem. We can issue pg_recovery_continue() at any time, so the pause can be held for long or short periods, as the administrator allows. This method of conflict resolution may mean that there is a build up of WAL records waiting to be applied and this will progressively increase the failover delay. If there is regular arrival of WAL records this would quickly prevent the use of the standby as a high availability failover target. Some users may wish to use multiple standby servers for various purposes. Pauses in recovery stay until explicitly released, i.e. max_standby_delay is overridden by the use of pauses.&lt;br /&gt;
&lt;br /&gt;
An example of the above would be:&lt;br /&gt;
* User on Standby running a long query involving tables X and Y&lt;br /&gt;
* User on Primary repeatedly updates table Z&lt;br /&gt;
The user on the primary will be generating HOT updates on table Z and these will generate cleanup WAL records. In this case the rows cleaned up are very recent and on the standby node we are able to detect that removing those row versions could *potentially* prevent the Standby query from executing correctly and so there is a conflict. Initially, we will wait for max_standby_delay, but then afterwards we will give the standby query notice to quit. In this case, the standby query never does read data that has been cleaned, since it is looking at different tables, so the standby query runs to completion normally.&lt;br /&gt;
&lt;br /&gt;
We keep track of the first 8 relations (that is, indexes and/or tables) that cause conflicts. When we have conflicts with more than 8 tables we apply the conflict handling to all relations. So in the above example if we had already recorded conflicts with eight other tables (plus Z means 9 tables, more than our cache) then we *would* cancel the query against tables X and Y, even though those tables have not been touched. Conflict processing increases quickly with number of tables in the conflict cache, so raising the number above 8 is not practical.&lt;br /&gt;
&lt;br /&gt;
Note that max_standby_delay is set in recovery.conf. It applies to the server as a whole, so once used it may not be available for other users. They will have to wait for the server to catch up again before the grace period is available again. So max_standby_delay is a configuration parameter set by the administrator which controls the maximum acceptable failover delay, rather than a user parameter to specify how long their query needs to run in.&lt;br /&gt;
&lt;br /&gt;
Waits for buffer cleanup locks do not currently result in query cancellation. Long waits are uncommon, though can happen in some cases with long running nested loop joins.&lt;br /&gt;
&lt;br /&gt;
These two items are discussed in the administrator's section since they are not typical user situations&lt;br /&gt;
* Dropping tablespaces on the master while standby queries are using those tablespace for temporary work files (work_mem overflow)&lt;br /&gt;
* Dropping users, databases or tablespaces on the master while those objects are connected on standby&lt;br /&gt;
&lt;br /&gt;
== Administrators Overview == &lt;br /&gt;
&lt;br /&gt;
Hot Standby is enabled by default, though can be disabled by setting &amp;quot;recovery_connections = off&amp;quot; in recovery.conf. &lt;br /&gt;
&lt;br /&gt;
A second parameter, &amp;quot;max_standby_delay&amp;quot; should also be set by the administrator in recovery.conf. The default is 30 seconds. This should be set according to business priorities. For example if the server is primarily tasked as a High Availability server, then you may wish to lower max_standby_delay or even set it to zero. If the standby server is tasked as an additional server for decision support then it may be acceptable to set this to a value of many hours, e.g. max_standby_delay = 43200 (12 hours). It is also possible to set max_standby_delay to -1 which means &amp;quot;always wait&amp;quot; if there are conflicts, though if unmonitored this may not be a useful mode.&lt;br /&gt;
&lt;br /&gt;
It is strongly recommended that the setting of max_connections on the standby should be equal to or greater than the setting of max_connections on the primary. This is to ensure that standby has sufficient resources to manage incoming transactions. If the standby is asked to manage too many concurrent *write* transactions it will run out of recovery session resources. Read only transactions have no effect on the standby. If the standby runs out of recovery session resources then recovery will continue normally, but it will prevent MVCC snapshots from being taken and all standby queries will fail with an ERROR. Snapshots will be re-enabled after the next checkpoint on the primary for which the number of write transactions has fallen back below the cutoff.&lt;br /&gt;
&lt;br /&gt;
Users will be able to write large sort temp files and re-generate relcache info files, so there is no part of the database that is truly read-only during hot standby mode. There is no restriction on use of set returning functions, or other users of tuplestore/tuplesort code.&lt;br /&gt;
&lt;br /&gt;
Statspack functions should work OK, so tools such as pgAdminIII should work. pgAgent will not, though the next version will allow execution of jobs on a read only node.&lt;br /&gt;
&lt;br /&gt;
Failover can be initiated at any time by allowing the startup process to reach the end of WAL, or by issuing the function pg_recovery_stop() as superuser. (see next section).&lt;br /&gt;
&lt;br /&gt;
Stats collector is active during recovery. All scans, reads, blocks, index usage etc will all be recorded normally on the standby. Replayed actions will not duplicate their effects on primary, so replaying an insert will not increment the Inserts column of pg_stat_user_tables. The stats file is deleted at start of recovery, so stats from master and standby will differ. &lt;br /&gt;
&lt;br /&gt;
pg_cancel_backend() will work on user backends, but not Startup process. pg_locks will show locks held by backends and by startup process. pg_stat_activity will not show an entry for startup process.&lt;br /&gt;
&lt;br /&gt;
check_pgsql will work, but its very simple. check_postgres will also work, though many some actions could give&lt;br /&gt;
different or confusing results. e.g. last vacuum time will not be&lt;br /&gt;
maintained for example, since no vacuum occurs on the standby.&lt;br /&gt;
&lt;br /&gt;
Dynamically loadable modules work, including the new pg_stat_statements. &lt;br /&gt;
&lt;br /&gt;
Advisory locks work normally in recovery, including deadlock detection. No other form of deadlock is possible in recovery because the only only lock type that can be taken on database objects is AccessShareLock. Please note that advisory locks are never WAL logged, so it is not possible for an advisory lock to conflict with WAL replay.&lt;br /&gt;
&lt;br /&gt;
slony won't run on the standby either! The Standby is a Clone and not a Slave. A Slave is a separate database that is forced to duplicate the actions of the Master. The Standby is an exact copy, in every detail that matters.&lt;br /&gt;
&lt;br /&gt;
New oids cannot be assigned, though various UUID generators may still work if required.&lt;br /&gt;
&lt;br /&gt;
Currently, creating temp tables is not allowed during read only transactions, so in some cases existing scripts will not run correctly. It is possible we may relax that restriction in a later release. This is both a SQL Standard compliance issue and a technical issue, so will not be resolved in this release.&lt;br /&gt;
&lt;br /&gt;
Running DROP TABLESPACE on master has no effect on users on standby, though can only succeed if the tablespace is empty. Some standby users may be actively using the tablespace via their temp_tablespaces parameter. If so, those users will be have their current queries cancelled, so that they remove their temp files and allow WAL replay to proceed.&lt;br /&gt;
&lt;br /&gt;
Running DROP DATABASE, ALTER DATABASE SET TABLESPACE, or ALTER DATABASE RENAME on master will cause all users connected to that database on the standby to be forcibly disconnected, once max_standby_delay has been reached. Similarly, running DROP USER or DROP ROLE for a role with login capability will cause all users connected using that role to be forcibly disconnected, once max_standby_delay has been reached.&lt;br /&gt;
&lt;br /&gt;
WAL file control commands will not work during recovery e.g. pg_start_backup(), pg_switch_xlog() etc..&lt;br /&gt;
&lt;br /&gt;
The following administrator commands will not be accepted during recovery mode&lt;br /&gt;
* ANALYZE&lt;br /&gt;
* VACUUM&lt;br /&gt;
* CLUSTER&lt;br /&gt;
* REINDEX&lt;br /&gt;
* CHECKPOINT&lt;br /&gt;
* GRANT, REVOKE, REASSIGN&lt;br /&gt;
* DDL - e.g. CREATE INDEX&lt;br /&gt;
Note again that some of these commands are actually allowed during &amp;quot;read only&amp;quot; mode transactions on the master.&lt;br /&gt;
&lt;br /&gt;
So you cannot create additional indexes on the standby node, nor can you collect statistics via ANALYZE in new/different ways. (EXPLAIN ANALYZE still works, it is a different command).&lt;br /&gt;
&lt;br /&gt;
If you wish to perform maintenance on the standby, run commands on the primary and the standby will then also mimic those changes. e.g. if you need to ANALYZE a table, do so on the primary. &lt;br /&gt;
&lt;br /&gt;
Autovacuum is *not* active during recovery, though will start normally if recovery ends. Bgwriter is active during recovery and will perform restartpoints (similar to checkpoints on primary) and normal block cleaning activities.&lt;br /&gt;
&lt;br /&gt;
Please be reminded that hash indexes are unusable on hot standby, due to already existing and documented limitations for that index type.&lt;br /&gt;
&lt;br /&gt;
=== Dynamic Control of Recovery ===&lt;br /&gt;
&lt;br /&gt;
The functions shown in Table 9-56 assist in archive recovery. Except for the first three functions, these are restricted to superusers. All of these functions can only be executed during recovery.&lt;br /&gt;
&lt;br /&gt;
Table 9-56. Recovery Control Functions&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Name||Return Type||Description&lt;br /&gt;
|-&lt;br /&gt;
|pg_is_in_recovery||bool||True if recovery is still in progress.&lt;br /&gt;
|-&lt;br /&gt;
|pg_last_recovered_xact_timestamp() 	||timestamp with time zone	||Returns the original completion timestamp with timezone of the last completed transaction in the current recovery.&lt;br /&gt;
|-&lt;br /&gt;
|pg_last_recovered_xid() 	||integer	||Returns the transaction id (32-bit) of last completed transaction in the current recovery. Later numbered transaction ids may already have completed. This is unrelated to transactions on the source server.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_pause() 	||void	||Pause recovery processing, unconditionally.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_continue() 	||void	||If recovery is paused, continue processing.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_stop() 	||void	||End recovery and begin normal processing.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_pause_xid(int) 	||void	||Continue recovery until specified xid completes, if it is ever seen, then pause recovery.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_pause_time(timestamp)||void	||Continue recovery until a transaction with specified timestamp completes, if one is ever seen, then pause recovery.&lt;br /&gt;
|-&lt;br /&gt;
|pg_recovery_advance(int)||void	||Advance recovery specified number of records then pause.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
pg_recovery_pause and pg_recovery_continue allow a superuser to control the progress of recovery of the database server. This allows queries to be executed to determine how far recovery should progress. If the superuser wishes recovery to complete and normal processing mode to start, execute pg_recovery_stop.&lt;br /&gt;
&lt;br /&gt;
Variations of the pause function exist, mainly to allow PITR to dynamically control where it should progress to. pg_recovery_pause_xid and pg_recovery_pause_time allow the specification of a trial recovery target. Recovery will then progress to that point, and then the database can be inspected to see if this is the correct stopping point.&lt;br /&gt;
&lt;br /&gt;
pg_recovery_advance allows recovery to progress record by record, for very careful analysis or debugging. Step size can be 1 or more records. If recovery is not yet paused then pg_recovery_advance will process the specified number of records then pause. If recovery is already paused, recovery will continue for another N records before pausing again.&lt;br /&gt;
&lt;br /&gt;
If you pause recovery while the server is waiting for a WAL file when operating in standby mode it will have apparently no effect until the file arrives. Once the server begins processing WAL records again it will notice the pause request and will act upon it. This is not a bug. &lt;br /&gt;
&lt;br /&gt;
Once recovery is paused it will stay paused until you release it, even after the server falls further behind than max_standby_delay.&lt;br /&gt;
&lt;br /&gt;
You can specify &amp;quot;recovery_starts_paused = true&amp;quot; in recovery.conf, though the default is not-paused.&lt;br /&gt;
&lt;br /&gt;
== Diagnosing problems ==&lt;br /&gt;
&lt;br /&gt;
First, check that your are connected to the correct server and that the server is in recovery. You can check this by looking at &amp;quot;ps&amp;quot; output and looking for a &amp;quot;startup process&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are sometimes reasons why you cannot connect. Check the log for messages.&lt;br /&gt;
&lt;br /&gt;
If you think you should be able to see an object or some data, check that the standby has processed all oustanding WAL. It may just be the standby is lagging behind.&lt;br /&gt;
&lt;br /&gt;
Look at the current snapshot using &amp;quot;select txid_current_snapshot();&amp;quot;.&lt;br /&gt;
Look at pg_locks and pg_stat_activity.&lt;br /&gt;
&lt;br /&gt;
= Design Overview = &lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
Accuracy: Some changes since this was written, refer to main patch for current details&lt;br /&gt;
&lt;br /&gt;
=== What already works ===&lt;br /&gt;
&lt;br /&gt;
The most difficult part of running queries during recovery is creating a valid MVCC snapshot. The route we have chosen is to have WAL records emulate transaction entries in the procarray, thus allowing users to see entries for TransactionIds that have started writing WAL but not yet had their commit records applied.&lt;br /&gt;
&lt;br /&gt;
The following items for prerequisites for emulating transactions during recovery.&lt;br /&gt;
&lt;br /&gt;
* TransactionIds are densely allocated in increasing order. This means that there are no gaps and the assignment is monotonic. Read-only transactions do not create &lt;br /&gt;
TransactionIds so we can run read-only transactions without disrupting duplicating already used ids.&lt;br /&gt;
&lt;br /&gt;
* Subtransaction commit does not write WAL, so it is important that it also does not write clog entries until commit. This then allows us to perform all the actions of subtransaction commit at the same time as we process the commit record.&lt;br /&gt;
&lt;br /&gt;
As a result, we have the infrastructure on which to build to make Hot Standby work.&lt;br /&gt;
&lt;br /&gt;
=== Transactions ===&lt;br /&gt;
&lt;br /&gt;
In 8.3, recovery maintains the commit log (or clog) as transactions commit or abort. This alone is insufficient to allow user queries to have full visibility of MVCC data.&lt;br /&gt;
&lt;br /&gt;
For Hot Standby we will maintain 3 data structures:&lt;br /&gt;
* ProcArray - records emulated &amp;quot;running&amp;quot; transactions&lt;br /&gt;
* Clog - required to identify visibility of transactions&lt;br /&gt;
* Subtrans - required to identify visibility of subtransactions&lt;br /&gt;
&lt;br /&gt;
We do not need to maintain Multitrans during recovery. We will not be running HeapTupleSatisfiesVacuum() during recovery.&lt;br /&gt;
&lt;br /&gt;
The events that maintain these structures are:&lt;br /&gt;
* new transaction - add a recovery proc with this top-level xid&lt;br /&gt;
* new subtransaction - new subxids are marked with top-level xid, so add new subxid onto recovery proc's subxidcache. We may also add entry to subtrans.&lt;br /&gt;
* commit/abort - remove recovery proc&lt;br /&gt;
&lt;br /&gt;
To allow the above, each WAL record has both the xid and the top-level xid&lt;br /&gt;
&lt;br /&gt;
We expect new xids to come in dense order, i.e. each new xid is 1 later than previous (allowing for wraparound). However, there is a race condition between xid assignment (XidGenLock) and xid use (WALInsertLock), so the xids can arrive with gaps in the sequence. We will generally see the first WAL records for those intermediate xids appearing shortly afterwards, but even so we must keep track of these as yet UnobservedXids.&lt;br /&gt;
&lt;br /&gt;
=== Row Removal ===&lt;br /&gt;
&lt;br /&gt;
Various type of block-level actions were performed on the primary with Super-Exclusive/BufferCleanupLocks held. This same level of lock must be held otherwise queries may attempt to re-access data blocks while they are being cleaned. We will need to change many redo actions so that they take BufferCleanup locks, using a new XLogReadBufferForCleanup(). Changes would be required to HEAP2 actions (freeze, clean and cleanmove) as well as to all index vacuuming actions.&lt;br /&gt;
&lt;br /&gt;
We can't cancel a query that holds a pin on a particular block since we don't keep track of who holds a pin. We just know a backend has a pin and that the startup process must wait.&lt;br /&gt;
&lt;br /&gt;
This may become a problem, or it may not. In most cases, backends hold 5-15 pins concurrently and pins are held for relatively short times. Startup process will provide debug information for when pin times are extended, and for monitoring total delay from pin waits.&lt;br /&gt;
&lt;br /&gt;
Some strategies, if this becomes a problem:&lt;br /&gt;
* minimise pin hold times wherever this occurs&lt;br /&gt;
* deferring application of WAL for pinned blocks (requiring us to use conditional locking)&lt;br /&gt;
* making VACUUM FREEZE hold stronger locks on standby to prevent query access (but doesn't help HOT)&lt;br /&gt;
* ensuring that we perform read ahead I/O for WAL records that have not yet reached head of apply queue&lt;br /&gt;
* change some of the ways index AMs work with respect to row removal (see later)&lt;br /&gt;
&lt;br /&gt;
Hot Standby may work best with full_page_writes = off.&lt;br /&gt;
&lt;br /&gt;
In general, we must do one of these three things:&lt;br /&gt;
1) pass OldestXmin for read-only snapshots to the master&lt;br /&gt;
2) make WAL replay halt while queries complete&lt;br /&gt;
3) cancel queries that could see the data about to be removed&lt;br /&gt;
&lt;br /&gt;
We will implement a combination of strategies 2 and 3, while allowing 1 to exist also. (It might be trivial to make (1) work using dblink).&lt;br /&gt;
&lt;br /&gt;
Each WAL record that cleans tuples has a latestRemovedTransactionId on it. If latestRemovedTransactionId&lt;br /&gt;
is later than a running query on standby then we wait. When we stop waiting we tell all at-risk queries the LSN of the first WAL record that&lt;br /&gt;
has potentially removed tuples they can see. If they see a block with a higher LSN they cancel *themselves*. &lt;br /&gt;
&lt;br /&gt;
This works OK, since SeqScans never read blocks at end of file that&lt;br /&gt;
didn't exist when they started, so long queries need not be cancelled&lt;br /&gt;
when they access growing tables.&lt;br /&gt;
&lt;br /&gt;
The wait is controlled by a parameter called max_standby_delay. The standby delay is the time taken to complete all outstanding WAL activity. max_standby_delay is thus the additional time we think acceptable should we choose to perform failover from the primary to the standby. max_standby_delay = 0..1000000s with typical values being 0s for a very High Availability server, or 3600s for a typical reporting server.&lt;br /&gt;
&lt;br /&gt;
When Startup waits, as described above, this causes the standby_delay for the whole server to increase. Probably more discussion required about how this would work.&lt;br /&gt;
&lt;br /&gt;
Sounds like we need some a balancing system that has a target or optimal standby delay and an absolute max, so that if we are between optimal and max we try to return to optimal. Maybe this would be max_query_standby_delay and max_server_standby_delay. Individual queries can force the server to wait for up to max_query_standby_delay, though no wait occurs that would make the whole server get more behind than max_server_standby_delay. If max_query_standby_delay &amp;gt;= max_server_standby_delay the server delay takes precedence.&lt;br /&gt;
&lt;br /&gt;
We would perform a planned switchover by first setting max_standby_delay=0 on standby, so it catches up. Then shutoff primary users, wait for all WAL to drain across to standby and let her start up.&lt;br /&gt;
&lt;br /&gt;
We will maintain OldestXmin in shared memory to allow it to be accessed quickly.&lt;br /&gt;
&lt;br /&gt;
Issues: Many different use cases here. Doubt we can provide for all of them in first release.&lt;br /&gt;
&lt;br /&gt;
=== Transaction Snapshots ===&lt;br /&gt;
&lt;br /&gt;
All queries will use MVCC Snapshot Isolation in either Read Committed or Serializable modes. These require snapshots, plus visibility information as described above.&lt;br /&gt;
&lt;br /&gt;
Snapshots will be derived directly from shared memory on stanbdy, since data is maintained as transactions arrive/complete. We will also track latest_completed_xid.&lt;br /&gt;
&lt;br /&gt;
=== Relcache ===&lt;br /&gt;
&lt;br /&gt;
All read-only transactions will use and maintain a relcache, allowing them to plan and execute queries using a cached copy of the current database catalog tables. The relcache will be maintained on each backend normally, re-reading catalog tables when invalidation messages are received.&lt;br /&gt;
&lt;br /&gt;
Invalidation messages will be sent by the Startup process, though the Startip process will not maintain its own copy of the relcache. Invalidation messages will be issued when new WAL messages are received. XLOG_RELCACHE_INVAL messages will be sent every time we make a change to a cached heap tuple within CacheInvalidateHeapTuple(). These always occur after a change and will include all required information to send a full invalidation message.&lt;br /&gt;
&lt;br /&gt;
This means that Startup process will continue to use XLogReadBuffer(), minimising the changes required in current ResourceManager's _redo functions - there are still some, see later. It also means that read-only backends will use ReadBuffer() calls normally, so again, no changes required throughout the normal executor code.&lt;br /&gt;
&lt;br /&gt;
=== Relation Locking ===&lt;br /&gt;
&lt;br /&gt;
In recovery, transactions will not be permitted to take any lock higher than AccessShareLock nor assign a TransactionId. This should also prevent us from writing WAL, but we protect against that specifically as well, just in case. (Maybe we can relax that to Assert sometime later).&lt;br /&gt;
We can dirty data blocks but only to set hint bits. (That's another reason to differentiate between those two cases anyway).&lt;br /&gt;
Note that in recovery, we will always be allowed to set hint bits - no need to check for asynchronous commits. &lt;br /&gt;
All other actions which cause dirty data blocks should not be allowed, though this will be just an Assert. Specifically, HOT pruning will not be allowed in recovery mode.&lt;br /&gt;
&lt;br /&gt;
Since read-only backends will only be allowed to take AccessShareLocks there will be no lock conflicts apart from with AccessExclusiveLocks. (If we allowed higher levels of lock we would then need to maintain Multitrans to examine lock details, which we would also rather avoid). So Startup process will not take, hold or release relation locks for any purpose, *apart* from when AccessExclusiveLocks are required.&lt;br /&gt;
&lt;br /&gt;
The Startup process will emulate locking behaviour for transactions that require AccessExclusiveLocks (AELs). AELs will be held by first inserting a dummy TransactionLock entry into the lock table with the TransactionId of the transaction that requests the lock. Then the lock entry will be made. Locks will be released when processing a transaction commit, abort or shutdown checkpoint message, and the lock table entry for the transaction will be removed.&lt;br /&gt;
&lt;br /&gt;
Locks will be taken by the Startup process when it receives a new WAL message. XLOG_LOCK_ACCESSEXCLUSIVE messages will be sent each time a backend *successfully* acquires an AccessExclusiveLock.&lt;br /&gt;
&lt;br /&gt;
Any AEL request that conflicts with an existing lock will cause some action: if it conflicts with an existing AEL then an error is raised; if the AEL request conflicts with a read-only backend then we wait for a while (see Row Removal above) then the read-only backend will receive a cancel message to make it go away. &lt;br /&gt;
&lt;br /&gt;
If Startup process crashes it is a PANIC anyway, so there is no difficulties in cleanup for the lock manager with this approach.&lt;br /&gt;
&lt;br /&gt;
The LOCK TABLE command by default applies an AccessExclusiveLock. This will generate WAL messages when executed on the primary node. When executed on the standby node the default will be to issue an AccessShareLock. Any LOCK TABLE command that runs on the standby and requests a specific lock type will be rejected.&lt;br /&gt;
&lt;br /&gt;
Issues: How will advisory locks work?&lt;br /&gt;
&lt;br /&gt;
=== Index Locking ===&lt;br /&gt;
&lt;br /&gt;
Recovery queries will also wish to use indexes, so all index structures are assumed to be uncorrupted and able to be used during recovery. (This is the same asumption we make immediately after recovery completes, but it is worth noting this explicitly). &lt;br /&gt;
&lt;br /&gt;
An index type may not be usable during recovery if it's WAL _redo() function does not take and hold buffer locks in the same (or at least, an equally correct) manner during recovery. For example, btree indexes have strict rules on buffer locking that must be followed during block splits. &lt;br /&gt;
&lt;br /&gt;
* btree - initial analysis shows locking is correct for btrees (other opinions welcome)&lt;br /&gt;
* GIST, GIN need some changes, but no problems foreseen (says Teodor)&lt;br /&gt;
* hash - doesn't generate WAL yet, so unusable during recovery&lt;br /&gt;
* bitmap - locking protocol works without needing cleanup locks, just exclusive (looking at patch)&lt;br /&gt;
&lt;br /&gt;
Changes to index metapages must also generate cache invalidations by using XLOG_RELCACHE_INVAL messages in WAL. Metapage changes will require cleanup locks, though these are almost certain to be granted because of cacheing.&lt;br /&gt;
&lt;br /&gt;
B-tree index tuples are removed by&lt;br /&gt;
* inserts when the page is full - require only an exclusive lock&lt;br /&gt;
* VACUUMs - require a cleanup lock&lt;br /&gt;
The same lock requirements apply to Hot Standby, so we will need to differentiate the two uses of XLOG_BTREE_DELETE so that we can re-apply the appropriate lock during btree_redo()&lt;br /&gt;
&lt;br /&gt;
HOT imposes some tricky conditions as to when it is safe to use a new index. These conditions also apply to Hot Standby, so there is nothing we need do. (Note also that Hot Standby has got nothing to do with the HOT feature).&lt;br /&gt;
&lt;br /&gt;
=== Summary of changes to WAL records ===&lt;br /&gt;
&lt;br /&gt;
* New WAL record for successfully acquired AccessExclusiveLocks&lt;br /&gt;
* New WAL record for cache invalidation messages &lt;br /&gt;
* Two new fields on each XLogRecord - xid2, a TransactionId and info2, 2 bytes of flags/data &lt;br /&gt;
&lt;br /&gt;
The last change uses up the 6 bytes that were being wasted on 64-bit servers, and adds 4 bytes on to the XLogRecord length for 32-bit servers.&lt;br /&gt;
&lt;br /&gt;
I would like to use 3 of the flag bits for Hot Standby:&lt;br /&gt;
&lt;br /&gt;
* flag1 to indicate the first WAL record for an xid. This tells us Hot&lt;br /&gt;
Standby to efficiently manage a recovery snapshot.&lt;br /&gt;
&lt;br /&gt;
* flag2 to indicate the first WAL record for a subxid. That tells us to&lt;br /&gt;
maintain subtrans during Hot Standby.&lt;br /&gt;
&lt;br /&gt;
* flag3 to indicate that this is a cleanup record. This tells us to use latestRemovedTransactionId to inform user queries of cleanup having taken place.&lt;br /&gt;
&lt;br /&gt;
If flag2 is set then xid2 contains the xid of xl_xid's parent.&lt;br /&gt;
else if flag3 is set then xid2 contains the latestRemovedTransactionId&lt;br /&gt;
&lt;br /&gt;
Note that flag2 and flag3 are mutually exclusive. cleanup records do not make transactional changes, they just cleanup what can no longer be seen. The first change made by a subtransaction is always on another WAL record from any cleanup associated with the block (HOT etc).&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
Additional thinking behind the technical designs above, not necessarily fully coherent sets of thoughts.&lt;br /&gt;
&lt;br /&gt;
=== Transaction Snapshots ===&lt;br /&gt;
&lt;br /&gt;
Deriving transaction snapshots is probably the most difficult problem for Hot Standby to resolve. We *must* have a transaction snapshot to access table data in a consistent way. (See discussion later on Transaction Isolation).&lt;br /&gt;
&lt;br /&gt;
We can derive transaction snapshots&lt;br /&gt;
* remotely from primary node&lt;br /&gt;
* locally on the standby node&lt;br /&gt;
&lt;br /&gt;
If we derive a snapshot locally, then we will end up with a situation where the xmin of the local snapshot precedes the xmin of the primary node. When this occurs it will then be possible for WAL records to arrive on the standby that request removal of rows that a transaction might wish to see. Preventing that situation can be done by either deferring WAL apply or by cancelling queries. &lt;br /&gt;
&lt;br /&gt;
We can defer WAL apply for particular tables only, but this could significantly complicate the apply process and is not a suggested option for the first release of this feature.&lt;br /&gt;
&lt;br /&gt;
We might control query cancellation by tracking which tables have had rows removed that would have been visible to particular queries. Again, possible but suffers from the problem that tables on which HOT is frequently active would be almost unusable.&lt;br /&gt;
&lt;br /&gt;
Simply ignoring WAL removal has been discussed and rejected (so far). http://archives.postgresql.org/pgsql-hackers/2008-05/msg00753.php &lt;br /&gt;
Explicitly defining the tables a transaction wishes to see has also been discussed and rejected (so far).&lt;br /&gt;
http://archives.postgresql.org/pgsql-hackers/2008-08/msg00268.php&lt;br /&gt;
&lt;br /&gt;
So the most generally applicable and simplest initial solution is to take snapshots from the remote primary node. The proposal for this follows:&lt;br /&gt;
&lt;br /&gt;
Transaction snapshots will be managed by a new process, Snapshot. Snapshot will start only in recovery mode and will exit when normal processing mode begins. Snapshot process will connect to the remote primary node and export snapshot data and copy this to shared memory on the standby node. When all standby backends have run UnregisterSnapshot() then the snapshot will then be unregistered on the remote primary node also.&lt;br /&gt;
&lt;br /&gt;
The standby must not think a transaction is visible until all changes made by it are have been applied. So snapshots from the primary cannot be used on the standby until the LSN at which they were taken has been reached by WAL apply on the standby. Snapshots don't normally have an LSN, so we must derive that information as well when we take a Snapshot. With asynchronous commits a transaction can be committed and yet not yet written to disk, so we cannot rely on the current WAL write pointer. Taking the WAL insert pointer is the safest thing to do, though most heavily contended. We don't want to hold ProcArrayLock while requesting WALInsertLock, so we will discover the LSN of the WAL insert pointer *after* the Snapshot has been derived.&lt;br /&gt;
&lt;br /&gt;
So snapshots from the primary take time to before they can be used. The delay is exactly the current processing delay from primary to standby, so another reason why we do not wish to fall behind.&lt;br /&gt;
&lt;br /&gt;
Taking snapshots from primary has a few disadvantages&lt;br /&gt;
* snapshots take time before they are usable&lt;br /&gt;
* requesting new snapshots is via remote request&lt;br /&gt;
* snapshots on primary prevent row removal (but this was also an advantage of this technique!)&lt;br /&gt;
&lt;br /&gt;
If primary and standby node are connected by private ethernet then the snapshot request time will be ~10ms, though that is probably 100 times slower than current snapshot access. If primary and standby are opposite sides of an ocean then times could be as high as 500ms. Taking snapshots directly could be annoyingly slow for small read-only statements, so we need to buffer this process in various ways. For larger queries, this may not be a problem at all, but we do not wish to limit or assume the uses of the standby node. &lt;br /&gt;
&lt;br /&gt;
First of all, each backend will have the opportunity to reuse previous snapshots both within transactions and across them. A userset parameter snapshot_reuse_window = 0..60000ms will define the time window  in which any request for a new snapshot will simply result in being fed the last snapshot again. When the window on a snapshot has expired a newer snapshot will be presented instead. This idea is similar to serializable transactions, which continually reuse the same snapshot. This is a useful parameter for normal processing as well, since it will reduce contention on the ProcArrayLock for many applications. &lt;br /&gt;
&lt;br /&gt;
Snapshots can be reused across transactions in recovery mode, since they are held in shared memory. Amount of shared memory dedicated to storing snapshots will be max_connections * size of snapshots.&lt;br /&gt;
&lt;br /&gt;
Since there is a delay between obtaining a new snapshot and it becoming usable the Snapshot process will buffer them until they become &amp;quot;mature&amp;quot;, like a good Whiskey. Snapshot process will take regular snapshots and pre-age them so that when a backend requests a snapshot it will be given the most recently matured snapshot. Time between snapshots is set by snapshot_preread_timeout = 0..60000ms. If a request for a snapshot arrives and there are no snapshots waiting to mature then this will trigger snapshot process to request a new primary snapshot. (This parameter could be automatically set based upon the arrival rate of snapshot requests, but this is a something to consider later).&lt;br /&gt;
&lt;br /&gt;
If snapshot_reuse_window = 0 then a backend will be presented with a freshly obtained snapshot and will then wait until the exact first moment it can be used before returning.&lt;br /&gt;
&lt;br /&gt;
We can continue to reuse snapshots from the primary even if the primary crashes, becomes disconnected or is shutdown/restarted. New snapshots are obviously not possible until it appears again. It's not that common for us to lose contact with the primary *and* for it to *not* be a failover, so this seems like an acceptable restriction.&lt;br /&gt;
&lt;br /&gt;
txid_current_snapshot() is sufficient for our needs. We only need to know about top-level xids. This means we will need a working subtrans data structure, which means we will need some way to update it. Proposal is for the first WAL record in any subtransaction to note the parentxid. WAL apply loop will update subtrans during recovery when a WAL record arrives with an augmented parentxid.&lt;br /&gt;
&lt;br /&gt;
=== Performance ===&lt;br /&gt;
&lt;br /&gt;
Query performance may slow down WAL apply if too many queries execute concurrently and use up CPU and I/O resources that would have been used by the Startup process. Queries that hold pins for long periods on tables with frequent updates will slow down WAL apply.&lt;br /&gt;
&lt;br /&gt;
Performance is not expected to be impaired by these new WAL message types since they apply only to AccessExclusiveLocks, which are reasonably rare even in applications that issue many DDL requests.&lt;br /&gt;
&lt;br /&gt;
== Correctness ==&lt;br /&gt;
&lt;br /&gt;
=== Two Phase Commit ===&lt;br /&gt;
&lt;br /&gt;
Will need to maintain locking for prepared transactions. So will need to read twophase state and re-create any AELs therein. No other actions foreseen.&lt;br /&gt;
&lt;br /&gt;
=== Tuple Locking ===&lt;br /&gt;
&lt;br /&gt;
Tuple level locks are WAL-logged, so WAL replay will make the changes on blocks to emulate locking. There is no required access to lock manager.&lt;br /&gt;
&lt;br /&gt;
From correctness perspective, no changes to tuples that are locked should appear in WAL, so we ignore the possibility. &lt;br /&gt;
&lt;br /&gt;
No changes required here. No users can wait on locks, since they all use AccessShareLocks. So they just ignore tuple locks.&lt;br /&gt;
&lt;br /&gt;
=== Data structure Check ===&lt;br /&gt;
&lt;br /&gt;
* Heap - discussed above&lt;br /&gt;
* Index - discussed above&lt;br /&gt;
* FSM - checked with Heikki and new FSM causes no issues for Hot Standby&lt;br /&gt;
* twophase - just files, so structure is OK&lt;br /&gt;
* pg_log - writable&lt;br /&gt;
* pg_xlog - not writable by WAL apply or users&lt;br /&gt;
* clog - data structure valid and usable &lt;br /&gt;
* subtrans - data structure is non transactional&lt;br /&gt;
* multixact - is not required&lt;br /&gt;
&lt;br /&gt;
== Acknowledgements ==&lt;br /&gt;
&lt;br /&gt;
Florian Pflug's contribution to making Hot Standby was an important one. The single hardest problem in 2007 was how we would get access to a TransactionId. Florian's careful analysis resulted in the idea that is now critical to the rest of this project: VirtualTransactionIds. In addition, various internal changes made by a range of developers for 8.3 have made this significantly easier than it was previously.&lt;br /&gt;
&lt;br /&gt;
Florian also identified the problems of relcache handling and block cleanup locks. Unfortunately, none of Florian's earlier code can/has been reused.&lt;br /&gt;
&lt;br /&gt;
This design includes technical feedback from many PostgreSQL hackers, all of whom I thank and acknowledge.&lt;br /&gt;
&lt;br /&gt;
== Project Plans ==&lt;br /&gt;
&lt;br /&gt;
Priorities:&lt;br /&gt;
*1 Correctness&lt;br /&gt;
*2 Performance&lt;br /&gt;
&lt;br /&gt;
Phases&lt;br /&gt;
&lt;br /&gt;
* Design (2008!)&lt;br /&gt;
&lt;br /&gt;
* Connection during recovery (mid-July)&lt;br /&gt;
  &lt;br /&gt;
* Infrastructure changes (1 Sept)&lt;br /&gt;
&lt;br /&gt;
* Queries work when no WAL changes arrive (snapshots)&lt;br /&gt;
&lt;br /&gt;
* Queries work while WAL changes arrive (block locking)&lt;br /&gt;
&lt;br /&gt;
* Queries work while DDL changes arrive (locking, relcache)&lt;br /&gt;
&lt;br /&gt;
* Performance&lt;br /&gt;
&lt;br /&gt;
* Queries work with two-phase commit&lt;br /&gt;
&lt;br /&gt;
== Features not planned for this release ==&lt;br /&gt;
(Or at least not by us in this release.)&lt;br /&gt;
&lt;br /&gt;
* Automatic offloading - run a query on primary node and have it offload processing of larger queries onto standby nodes.&lt;br /&gt;
&lt;br /&gt;
* Different mechanisms for deriving standby snapshots&lt;br /&gt;
&lt;br /&gt;
* LISTEN, NOTIFY - should be possible when this happens via shared memory rather than pg_listener&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/User:Robe</id>
		<title>User:Robe</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/User:Robe"/>
				<updated>2009-04-24T17:08:31Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* For 8.5 */&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,'--',$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,'--',$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 = '%t postgres[%p]: [%l-1] '&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;
,'--',$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;
== For 8.5 ==&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;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Waiting_for_8.4</id>
		<title>Waiting for 8.4</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Waiting_for_8.4"/>
				<updated>2009-04-22T15:02:43Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;adding category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [http://developer.postgresql.org/pgdocs/postgres/release-8-4.html 8.4 Release Notes] briefly mention all of the features in the new version.&lt;br /&gt;
&lt;br /&gt;
== Waiting for 8.4 ==&lt;br /&gt;
The &amp;quot;Waiting for 8.4&amp;quot; series from Hubert Lubaczewski covers features added to 8.4 as they are committed.  A similar listing to this one is presented in [http://www.depesz.com/index.php/2009/04/10/waiting-for-84-final-post/ &amp;quot;final post&amp;quot;] or you can just go directly to [http://www.depesz.com/index.php/tag/pg84/ series index]:&lt;br /&gt;
&lt;br /&gt;
*[http://www.depesz.com/index.php/2009/04/10/waiting-for-84-final-post/ final post (?)]&lt;br /&gt;
*[http://www.depesz.com/index.php/2009/03/22/waiting-for-84-no-more-d-in-pg_dump/ no more -d in pg_dump!]&lt;br /&gt;
*[http://www.depesz.com/index.php/2009/02/09/waiting-for-84-parallel-restoration-of-dumps/ parallel restoration of dumps]&lt;br /&gt;
*[http://www.depesz.com/index.php/2009/01/21/waiting-for-84-window-functions/ window functions]&lt;br /&gt;
*[http://www.depesz.com/index.php/2009/01/13/waiting-for-84-pg_stat_statements/ pg_stat_statements]&lt;br /&gt;
*[http://www.depesz.com/index.php/2009/01/08/waiting-for-84-remove-system-objects-from-dx/ remove system objects from \dX]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/12/29/waiting-for-84-window-functions-teaser/ Window Functions - teaser]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/12/09/waiting-for-84-default-values-for-function-arguments-integer-in-any-base/ Default values for function arguments + integer in any base]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/12/08/waiting-for-84-visibility-maps/ Visibility maps]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/11/23/waiting-for-84-table/ TABLE]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/11/23/waiting-for-84-auto-explain/ auto-explain]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/11/14/waiting-for-84-array-aggregate-and-array-unpacker/ array aggregate and array unpacker]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/11/05/waiting-for-84-suppress_redundant_updates_trigger/ suppress_redundant_updates_trigger]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/11/03/waiting-for-84-sql-wrappable-returning/ Waiting for 8.4 - sql-wrappable RETURNING]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/11/03/waiting-for-84-pl-srf-functions-in-selects/ pl/* srf functions in selects]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/10/07/waiting-for-84-common-table-expressions-with-queries/ Common Table Expressions (WITH queries)]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/10/04/waiting-for-84-new-fsm-free-space-map/ new FSM (Free Space Map)]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/09/28/waiting-for-84-database-level-lc_collation-and-lc_ctype/ database-level lc_collation and lc_ctype]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/09/13/waiting-for-84-pgbench-with-timed-execution/ pgbench with timed execution]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/08/10/waiting-for-84-case-insensitive-text-citext/ case insensitive text ( citext )]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/08/10/waiting-for-84-union-intersect-except/ UNION / INTERSECT / EXCEPT]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/09/08/waiting-for-84-ordered-data-loading-in-pg_dump/ ordered data loading in pg_dump]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/08/05/waiting-for-84-hash-based-distinct/ hash based DISTINCT]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/08/04/waiting-for-84-returns-table/ RETURNS TABLE]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/07/31/waiting-for-84-variadic-functions/ variadic functions]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/07/30/waiting-for-84-storage-types-for-table-columns/ storage types for table columns]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/07/30/waiting-for-84-sequence-details/ sequence details]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/06/11/waiting-for-84-waiting-onoff/ timing on/off]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/05/17/waiting-for-84-partial-match-support-in-gin-and-sequence-restart/ partial-match support in GIN, and sequence restart]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/05/16/waiting-for-84-case-in-plpgsql/ CASE in pl/PgSQL]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/05/15/waiting-for-84-function-stats/ function stats]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/05/14/waiting-for-84-plpgsql-raise/ pl/PgSQL RAISE]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/05/09/waiting-for-84-psql-vs-tabs-wrapped-output/ psql vs. tabs + wrapped output]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/05/05/waiting-for-84-pg_conf_load_time-time-related-generate_series-and-enum-values-in-dt/ pg_conf_load_time, time-related generate_series and enum values in \dT+]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/05/03/waiting-for-84-return-query-execute-and-cursor_tuple_fraction/ RETURN QUERY EXECUTE and cursor_tuple_fraction]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/05/02/waiting-for-84-o-and-d-in-psql/ \o and \d+ in psql]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/04/29/waiting-for-84-generate_subscripts/ generate_subscripts]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/04/18/waiting-for-84-explain-verbose/ “EXPLAIN VERBOSE”]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/04/05/waiting-for-84-current_query/ current_query()]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/04/02/waiting-for-84-3/ EXECUTE USING in plpgsql]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/03/31/waiting-for-84-2/ \l+ and \d in psql]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/03/28/waiting-for-84/ Statement-level ON TRUNCATE triggers]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/03/24/waiting-for-pg-84-4/ quote_nullable()]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/03/22/waiting-for-pg-84-3/ Report queries in a deadlock]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/03/10/waiting-for-pg-84-2/ enum type for guc parameters]&lt;br /&gt;
*[http://www.depesz.com/index.php/2008/02/16/waiting-for-pg-84/ limit (select ) and optional as in select]&lt;br /&gt;
&lt;br /&gt;
==8.4 Talks and Discussion==&lt;br /&gt;
* [http://www.slideshare.net/xzilla/postgres-84-tutorial Intro to Postgres 8.4 Tutorial] by Robert Treat&lt;br /&gt;
* [http://www.hagander.net/talks/ What's new in PostgreSQL 8.4] by Magnus Hagander&lt;br /&gt;
* [http://blog.hagander.net/archives/141-Whats-your-favorite-8.4-feature.html What's your favorite 8.4 feature?]&lt;br /&gt;
* [http://lwn.net/SubscriberLink/328591/3fdb051da4bfee26/ PostgreSQL 8.4 Beta: &amp;quot;We've got momentum&amp;quot;]&lt;br /&gt;
* [http://fetter.org/ David Fetter talks]:  &amp;quot;Trees and More in SQL&amp;quot; and &amp;quot;Windowing Functions: Putting the TPS in TPS Reports&amp;quot; cover 8.4 features&lt;br /&gt;
* [http://momjian.us/main/writings/pgsql/features.pdf Upcoming PostgreSQL Features] by Bruce Momjian&lt;br /&gt;
&lt;br /&gt;
[[Category:  PostgreSQL 8.4]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_8.4_Development_Plan</id>
		<title>PostgreSQL 8.4 Development Plan</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_8.4_Development_Plan"/>
				<updated>2009-04-22T15:02:25Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;adding category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a copy of the [http://archives.postgresql.org/pgsql-hackers/2008-02/msg00193.php email sent to -hackers on 2008-02-06] outlining the core team's plan for attacking the 8.4 development cycle.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Hackers,&lt;br /&gt;
&lt;br /&gt;
As you know we've finally released PostgreSQL 8.3, after a development&lt;br /&gt;
cycle that lasted well over a year despite our original plans for a 6&lt;br /&gt;
month cycle. The core team are aware that there are a number of&lt;br /&gt;
factors that contributed to this slippage:&lt;br /&gt;
&lt;br /&gt;
*Lack of prompt and early review of patches.&lt;br /&gt;
*A significant rise in the number and complexity of patches submitted.&lt;br /&gt;
*Prioritising completion of incomplete patches over meeting the timetable.&lt;br /&gt;
&lt;br /&gt;
In the 8.4 development cycle we would like to try a new style of&lt;br /&gt;
development, designed to keep the patch queue to a limited size and to&lt;br /&gt;
provide timely feedback to developers on the work they submit. To do&lt;br /&gt;
this we will replace the traditional 'feature freeze' with a series of&lt;br /&gt;
'commit fests' throughout the development cycle. The idea of commit&lt;br /&gt;
fests was discussed last October in -hackers, and it seemed to meet&lt;br /&gt;
with general approval. Whenever a commit fest is in progress, the&lt;br /&gt;
focus will shift from development to review, feedback and commit of&lt;br /&gt;
patches. Each fest will continue until all patches in the queue have&lt;br /&gt;
either been committed to the CVS repository, returned to the author&lt;br /&gt;
for additional work, or rejected outright, and until that has&lt;br /&gt;
happened, no new patches will be considered. Of course, individual&lt;br /&gt;
developers are free to continue working on their&lt;br /&gt;
patches throughout the fest, but we encourage everyone to do what they&lt;br /&gt;
can to help work through the patch queue. We feel that this idea can&lt;br /&gt;
only be successful if the whole development community is willing to&lt;br /&gt;
focus on patch review during the commit fests, in the same way that&lt;br /&gt;
everyone is expected to focus on testing during beta period.&lt;br /&gt;
&lt;br /&gt;
The proposed timetable for the cycle is as follows:&lt;br /&gt;
&lt;br /&gt;
*'''[[CommitFest 2008-03|1st March 2008]]''' - commit fest begins&lt;br /&gt;
*'''[[CommitFest 2008-05|1st May 2008]]''' - commit fest begins&lt;br /&gt;
*'''[[CommitFest 2008-07|1st July 2008]]''' - commit fest begins&lt;br /&gt;
*'''[[CommitFest 2008-09|1st September 2008]]''' - commit fest begins&lt;br /&gt;
*'''[[CommitFest 2008-11|1st November 2008]]''' - final commit fest begins&lt;br /&gt;
*'''1st January 2009''' - beta 1&lt;br /&gt;
*'''1st March 2009''' - 8.4.0 release&lt;br /&gt;
&lt;br /&gt;
Note the lack of any 'feature freeze' date as such. However, any&lt;br /&gt;
significant feature patches not submitted by 1st November will clearly&lt;br /&gt;
not make it into 8.4.&lt;br /&gt;
&lt;br /&gt;
The hope here is that we will not have enormous, previously unreviewed&lt;br /&gt;
patches landing on us at the end of October --- if that happens, we'll&lt;br /&gt;
be back in the same position we were in at 8.3 feature freeze.&lt;br /&gt;
Although this schedule allows for the final commit fest to take a good&lt;br /&gt;
deal of time, we'll reserve the right to reject patches that are too&lt;br /&gt;
large to be reviewed in a timely fashion. We want to encourage people&lt;br /&gt;
to do development of large features in an incremental fashion, with a&lt;br /&gt;
new increment landing during each commit fest.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:  PostgreSQL 8.4]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Archives_Policy</id>
		<title>Archives Policy</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Archives_Policy"/>
				<updated>2009-04-16T08:23:10Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''DRAFT'''&lt;br /&gt;
&lt;br /&gt;
The PostgreSQL [http://www.postgresql.org/community/lists mailing lists] are archived at [http://archives.postgresql.org archives.postgresql.org]. This site is intended to provide an accurate representation of the activity on the lists, and as such '''will not''' be modified except to remove offensive, pornographic, defamatory or otherwise potentially illegal messages.&lt;br /&gt;
&lt;br /&gt;
== Why won't you remove my post? ==&lt;br /&gt;
&lt;br /&gt;
There are a number of reasons why we will not remove of modify messages in the archives:&lt;br /&gt;
&lt;br /&gt;
* We want the archives to accurately represent the history of our public mailing lists.&lt;br /&gt;
* Due to the way the archives are stored and occasionally regenerated from archived mailbox files modifying a message is extremely difficult, time consuming and error prone.&lt;br /&gt;
* Removing a message breaks the numbering system used to access subsequent messages which will break any links on websites or other list messages.&lt;br /&gt;
* Messages posted to our mailing lists are archived by other organisations outside of our control both directly, and via our Usenet gateway. Removing a message from our archives is only the tip of the iceberg.&lt;br /&gt;
* We have limited volunteer resources to run the project (and no non-volunteer resources) and would prefer to use those resources to produce a great DBMS than rewrite history.&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Category:PostgreSQL_8.4</id>
		<title>Category:PostgreSQL 8.4</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Category:PostgreSQL_8.4"/>
				<updated>2009-03-28T11:45:26Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;add filler text to quell permission warnings when not logged in&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All things related to PG 8.4&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_8.4_Open_Items</id>
		<title>PostgreSQL 8.4 Open Items</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_8.4_Open_Items"/>
				<updated>2009-03-27T19:20:32Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Pre-existing Bugs */  start_backup checkpointing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
This is a list of tasks that need to finish before 8.4 is complete.  Current version at http://wiki.postgresql.org/wiki/PostgreSQL_8.4_Open_Items&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-11/msg01883.php Change behavior of statement-level triggers for inheritance cases?]&lt;br /&gt;
** gsmet says: no patch written yet and it's probably something we'll need to backpatch so I don't think is a beta blocker&lt;br /&gt;
** rhaas says: TODO&lt;br /&gt;
* [http://archives.postgresql.org/message-id/87eiynlhbt.fsf@oxford.xeocode.com finishing posix_fadvise patch]&lt;br /&gt;
** gsmet says: no patch yet and no consensus on the solution yet: should be bumped to 8.5&lt;br /&gt;
** rhaas says: I'm not convinced the original design was wrong, but there's probably no time to rehash it now.&lt;br /&gt;
* [http://archives.postgresql.org/message-id/1232124740.31669.58.camel@ebony.2ndQuadrant GetCurrentVirtualXIDs() (is this patch safe?)]&lt;br /&gt;
** gsmet says: should be bumped to 8.5 - submitted far too late and no real answer to tgl's objection at the moment.&lt;br /&gt;
* [http://archives.postgresql.org/message-id/b42b73150902100857l3377bf8geafccb6392f6d129@mail.gmail.com PQinitSSL broken in some use cases]&lt;br /&gt;
** gsmet says: not a beta blocker IMHO but would be nice to fix it&lt;br /&gt;
** mha says: isn't this a beta blocker because it would add a function to the shared libraries, thus requiring a version number bump?&lt;br /&gt;
** tgl says: in the past we have not considered that adding a function requires a soname bump.  But in general feature additions should not happen after beta starts.  So either this blocks beta or it goes to 8.5.&lt;br /&gt;
** rhaas says: mmconcure was one of the instigators of this IIRC and he's OK with postpoing to 8.5&lt;br /&gt;
* [http://archives.postgresql.org/message-id/13073.1235929216@sss.pgh.pa.us change cardinality() for multi-dim arrays?]&lt;br /&gt;
** gsmet says: not a beta blocker IMHO but it's a must fix for 8.4&lt;br /&gt;
** tgl says: well, we either fix it or decide it's okay as is.  But we have to make a decision now; once 8.4 ships we'll be stuck with the behavior.&lt;br /&gt;
** rhaas says: since it's only a compatibility function, the right answer is arguable; I don't see much reason to second-guess Peter's decision&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49B45460.6040108@endpoint.com postgresql.conf: patch to have ParseConfigFile report all parsing errors, then bail]&lt;br /&gt;
** gsmet says: might be a good idea to commit it before beta. People are going to fine tune their 8.4 installation at the start of the beta phase and it seems like a good opportunity to exercise this code&lt;br /&gt;
** rhaas says: new feature, bump to 8.5.  tgl agreed on -hackers.&lt;br /&gt;
* [http://archives.postgresql.org/message-id/Pine.LNX.4.64.0903161857200.31919@sn.sai.msu.ru small but useful patches for text search]&lt;br /&gt;
** gsmet says: no strong opinion on these ones. They were submitted far too late but they are small, useful and not likely to have any side effect elsewhere.&lt;br /&gt;
** rhaas says: new feature, bump to 8.5&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49B0A914.8070006@sun.com Additional DTrace Probes]&lt;br /&gt;
** gsmet says: not a beta blocker. Not sure we want to commit them though. The patch is pretty small. These probes were originally submitted in july 2008 as part of a biggest patch and discarded from the patch due to comments. They were fixed in march 2009.&lt;br /&gt;
** rhaas says: tgl points out that this has not been reviewed yet, either.  i think we should bump to 8.5.&lt;br /&gt;
* [http://archives.postgresql.org/message-id/24639.1237315756@sss.pgh.pa.us what to do about expensive args to DTrace probes?]&lt;br /&gt;
** gsmet says: IMHO, if we plan to build more binaries with DTrace enabled by default (tgl thought about enabling them in the RH/Fedora RPM packages), it should be fixed before the beta. Otherwise, it doesn't sound like a beta blocker.&lt;br /&gt;
** tgl says: both the DTrace and systemtap experts say that manual protection of an expensive probe with an if (foo_ENABLED()) test is the preferred way.  I'm not thrilled with that but should probably defer to their judgment.&lt;br /&gt;
* [http://archives.postgresql.org/message-id/3f0b79eb0903242329j12865d55s348f5c873a956e71@mail.gmail.com pg_standby trigger behavior is dangerous]&lt;br /&gt;
** gsmet says: not a beta blocker but should be fixed in 8.4 and perhaps backpatched.&lt;br /&gt;
** rhaas says: backpatching sounds like a bad idea to me, but I could see fixing it for 8.4 if we can get it done RSN.&lt;br /&gt;
* [http://archives.postgresql.org/message-id/485579F9.4020307@dunslane.net typedefs for pg_indent]&lt;br /&gt;
** tgl says: this isn't a beta blocker, though we'd like to have it done before we do the pg_indent run for 8.4.&lt;br /&gt;
&lt;br /&gt;
== psql \d issues ==&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49A51740.9050804@gmail.com psql \d commands and information_schema]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49A5D354.7000609@dalibo.info Have \d show child tables that inherit from the specified parent]&lt;br /&gt;
** gsmet says: submitted in February and wanted behavior still discussed. Definitely 8.5 material.&lt;br /&gt;
* [http://archives.postgresql.org/message-id/603c8f070901211210x1433b95di4dd356ebb69d4444@mail.gmail.com The whole user/system behavioral issue ...]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/19562.1230691104@sss.pgh.pa.us change psql's \df output for window functions?]&lt;br /&gt;
** gsmet says: cosmetic issue, not a beta blocker&lt;br /&gt;
&lt;br /&gt;
== 8.4 Bugs ==&lt;br /&gt;
* [http://archives.postgresql.org/message-id/12431.1236965004@sss.pgh.pa.us posix_fadvise doesn't work on Solaris?]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20643.1232666867@sss.pgh.pa.us pgsql: Explicitly bind gettext to the correct encoding on Windows.]&lt;br /&gt;
** gsmet says: AFAICS waiting for Magnus' feedback&lt;br /&gt;
* [http://archives.postgresql.org/message-id/9706.1238023904@sss.pgh.pa.us some issues in new GIN code]&lt;br /&gt;
&lt;br /&gt;
== Pre-existing Bugs ==&lt;br /&gt;
These issues also affect existing branches, so strictly speaking they are not blockers for putting out an 8.4 beta.&lt;br /&gt;
* [http://archives.postgresql.org/message-id/8763hwl56e.fsf@news-spur.riddles.org.uk GiST picksplit (maybe GIN too?) can fail]&lt;br /&gt;
* [http://archives.postgresql.org//pgsql-hackers/2009-03/msg00704.php OK to use built-in getopt_long (not getopt) on Solaris?]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20080929162628.1a05852b@jd-laptop pg_start_backup() takes too long]&lt;br /&gt;
** tgl says: maybe a documentation update is sufficient to resolve this?&lt;br /&gt;
** mrenner says: For now documentation or logging should be sufficient, should be revisited in 8.5 though for larger-than-standard checkpoint_intervals &amp;amp; completion targets&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4887.1228700773@sss.pgh.pa.us Polymorphic types vs. domains]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4965C992.9020408@gmx.net Python 3.0 does not work with PL/Python]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20090306191404.GK3901@alvh.no-ip.org Perl/libxml incompatibility]&lt;br /&gt;
** Possible patch [http://archives.postgresql.org//pgsql-hackers/2009-03/msg00854.php here], but it desperately needs testing&lt;br /&gt;
* [http://archives.postgresql.org/message-id/1233209252.18692.24.camel@dragflick possible bug in cover density ranking?]&lt;br /&gt;
* [http://archives.postgresql.org//pgsql-bugs/2009-03/msg00117.php BUG #4721: bad side-effects of limiting number of clauses that predtest will consider]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/9ea8622b0902072142u76c86c30q8b433182e8cb0800@mail.gmail.com BUG #4622: xpath only work in utf-8 server encoding]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/17021.1234474178@sss.pgh.pa.us contrib/intarray opclass definition needs updating]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/200903050848.n258mVgm046178@wwwmaster.postgresql.org BUG #4694: uppercase path problem on Windows]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49C0BDC5.4010002@hagander.net Path separator consistency on Windows]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/200902142251.n1EMpsFU006888@wwwmaster.postgresql.org BUG #4655: Spelling mistake in windows installer]&lt;br /&gt;
** tgl says: this is something for the one-click installer, not core Postgres.&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* {{messageLink|491862F7.1060501@enterprisedb.com|Should we have a LOCALE option in CREATE DATABASE?}}&lt;br /&gt;
* {{messageLink|20090213100104.201D.52131E4D@oss.ntt.co.jp|Should we reject toast.fillfactor in reloptions?}} Because toast tables are never updated.&lt;br /&gt;
* {{messageLink|Pine.BSO.4.64.0902201611540.28757@leary.csoft.net|Consider reverting preventing regular users from base type creation}}&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4936884B.6050205@enterprisedb.com document visibility map], [http://archives.postgresql.org/message-id/4978C34D.3050208@enterprisedb.com proposed manual change]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20090218155841.7EFD37559ED@cvs.postgresql.org document removal of log_restartpoints, and the rest of the recovery infra patch]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/49C532B7.5030608@amd.co.at Documentation Update: WAL and Checkpoints]&lt;br /&gt;
&lt;br /&gt;
[[Category:  PostgreSQL 8.4]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/PostgreSQL_8.4_Open_Items</id>
		<title>PostgreSQL 8.4 Open Items</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/PostgreSQL_8.4_Open_Items"/>
				<updated>2009-03-13T17:39:14Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
This is a list of tasks that need to finish before 8.4 is complete.  Current version at http://wiki.postgresql.org/wiki/PostgreSQL_8.4_Open_Items&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* [http://archives.postgresql.org/pgsql-hackers/2008-11/msg01883.php Change behavior of statement-level triggers for inheritance cases?]&lt;br /&gt;
* reject xpath() when data is not a well-formed document?&lt;br /&gt;
&lt;br /&gt;
== Bugs ==&lt;br /&gt;
* [http://archives.postgresql.org/message-id/48F3BFCC.8030107@dunslane.net problems with Windows global namespace]&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* {{messageLink|491862F7.1060501@enterprisedb.com|Should we have a LOCALE option in CREATE DATABASE?}}&lt;br /&gt;
* {{messageLink|20090213100104.201D.52131E4D@oss.ntt.co.jp|Should we reject toast.fillfactor in reloptions?}} Because toast tables are never updated.&lt;br /&gt;
* {{messageLink|Pine.BSO.4.64.0902201611540.28757@leary.csoft.net|Consider reverting preventing regular users from base type creation}}&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://archives.postgresql.org/message-id/4936884B.6050205@enterprisedb.com document visibility map], [http://archives.postgresql.org/message-id/4978C34D.3050208@enterprisedb.com proposed manual change]&lt;br /&gt;
* [http://archives.postgresql.org/message-id/20090218155841.7EFD37559ED@cvs.postgresql.org document removal of log_restartpoints, and the rest of the recovery infra patch]&lt;br /&gt;
* charset.sgml still claims you need initdb to change LC_COLLATE/LC_CTYPE.&lt;br /&gt;
[[Category:  PostgreSQL 8.4]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/WhatsNew84</id>
		<title>WhatsNew84</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/WhatsNew84"/>
				<updated>2009-03-13T17:38:32Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is designed as a resource for people writing articles, presentations, brochures, or other advocacy related materials, to give them an overview of some of the new features coming in PostgreSQL 8.4.  The format of the entries is:&lt;br /&gt;
&lt;br /&gt;
* Feature&lt;br /&gt;
** What does it do and/or what does it change.&lt;br /&gt;
** Who should care, who will benefit the most.&lt;br /&gt;
&lt;br /&gt;
Furthermore, the items have been split into 4 sections:&lt;br /&gt;
* Performance, for performance-related features.&lt;br /&gt;
* Admin, for features mostly likely to help DBA's&lt;br /&gt;
* Developer, for features likely to help people developing applications for PostgreSQL.&lt;br /&gt;
* 3rd Party, for features that are not included with the core server, but which are new in the 8.4 cycle. &lt;br /&gt;
&lt;br /&gt;
For more information, see the [http://momjian.us/main/writings/pgsql/sgml/release-8-4.html 8.4 Release Notes]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
*Hash Methods for DISTINCT/UNION/INTERSECT/EXCEPTION queries&lt;br /&gt;
** Previously, operations like distinct would require Postgres to sort and then eliminate data to achieve the distinct results. Now PostgreSQL can use hash based methods (similar to group by) to achieve these results. This should make many of these queries faster without needing any changes. &lt;br /&gt;
*Cursor_tuple_fraction GUC&lt;br /&gt;
** Tell the planner what fraction of a cursors results you expect to return for a given cursor query. This allows the planner to use plans that are more optimal based on estimated percentage of rows you expect to return. &lt;br /&gt;
*Visibility maps&lt;br /&gt;
*parallel pg_restore &lt;br /&gt;
&lt;br /&gt;
== Admin ==&lt;br /&gt;
*New Free-Space-Map (fsm) implementation&lt;br /&gt;
*Database Level LC_Collate/LC_Type&lt;br /&gt;
*PgBench with timed execution&lt;br /&gt;
*Column storage type display in psql&lt;br /&gt;
*Improved sequence display in psql&lt;br /&gt;
*Better control of \timing in psql&lt;br /&gt;
*ALTER SEQUENCE RESTART command &lt;br /&gt;
*TRUNCATE TABLE RESTART IDENTITY&lt;br /&gt;
*Track usage statistics for functions&lt;br /&gt;
*Improved handling of long lines and tab characters in psql &lt;br /&gt;
*pg_conf_load_time() function&lt;br /&gt;
*display enum values in enum type display for psql&lt;br /&gt;
*add table size display in psql&lt;br /&gt;
*EXPLAIN VERBOSE column level output&lt;br /&gt;
*add display of referencing tables to \d output in psql&lt;br /&gt;
*add tablespace and database size information to \l in psql&lt;br /&gt;
*improved tab completion support for tables in multiple schemas &lt;br /&gt;
*report all queries involved in a deadlock error&lt;br /&gt;
*pg_settings now shows available options for guc with defined set &lt;br /&gt;
*auto-explain contrib module&lt;br /&gt;
** this contrib module allows the dumping of explain plans for slow queries into the log. this allows for better troubleshooting, as explain plans for queries can very widely for different query executions. &lt;br /&gt;
*remove system objects from \dX commands in psql&lt;br /&gt;
*pg_stat_statments contrib module&lt;br /&gt;
*column level privilege support&lt;br /&gt;
*improved SSL certificate handling&lt;br /&gt;
*add columns to views&lt;br /&gt;
** allow you to add columns to a view (at the end), without having to recompile the view / dependencies. still can't modify / remove columns though. &lt;br /&gt;
*multi-column GIN indexes&lt;br /&gt;
*\ef in psql&lt;br /&gt;
** \ef &amp;lt;functioname&amp;gt; will bring up a function definition in your editor, so you can edit functions on the server. &lt;br /&gt;
*pgstat temp file&lt;br /&gt;
** the pgstat file tracks usage statistics in postgresql. currently it can lead to very high i/o on the fs, which can be hard to track down. 8.4 reduced usage of file, but also made the file relocatable, so you can put it on ramdrive or similar. &lt;br /&gt;
*pg_hba.conf name=value syntax&lt;br /&gt;
*pg_hba.conf usermaps &lt;br /&gt;
&lt;br /&gt;
== Developers ==&lt;br /&gt;
*Common Table Expression (aka CTE, WITH queries)&lt;br /&gt;
*Case Insensitive Text module&lt;br /&gt;
*RETURNS TABLE for plpgsql functions&lt;br /&gt;
*Variable Argument Functions for plpgsql&lt;br /&gt;
*Partial Match support for Full Text Search&lt;br /&gt;
*CASE control structure support in plpgsql &lt;br /&gt;
*Support HINT, DETAIL, and SQLSTATE in RAISE command for plpgsql&lt;br /&gt;
*Time based generate_series() functions&lt;br /&gt;
*RETURN QUERY EXECUTE support in plpgsql&lt;br /&gt;
*generate_subscripts() function&lt;br /&gt;
** Generate subscripts allows for easier array traversal. You used to be able to do this with generate_series and array_upper and array_lower, but this new version should be easier to use and faster as well. &lt;br /&gt;
*EXECUTE USING for plpgsql&lt;br /&gt;
*Support for statement level triggers for TRUNCATE command&lt;br /&gt;
*quote_nullable()&lt;br /&gt;
*allow limit based on subquery&lt;br /&gt;
*make column alias keyword &amp;quot;as&amp;quot; optional (per sql spec)&lt;br /&gt;
*allow srf functions to be called in select clause for plpgsql&lt;br /&gt;
*suppress_redundent_updates() trigger &lt;br /&gt;
*array_aggregate() function&lt;br /&gt;
*unnest() function&lt;br /&gt;
*add TABLE sql 2008 spec command&lt;br /&gt;
*default values for functions&lt;br /&gt;
*sql2008 window functions&lt;br /&gt;
*sql standard interval handling&lt;br /&gt;
&lt;br /&gt;
== 3rd Party ==&lt;br /&gt;
&lt;br /&gt;
== Put off to 8.5 ==&lt;br /&gt;
&lt;br /&gt;
There is already an active &amp;quot;queue&amp;quot; of items that are being deferred for 8.4, in addition to the [[Todo:Contents|ToDo Lists]].&lt;br /&gt;
&lt;br /&gt;
[[Category:  PostgreSQL 8.4]]&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/User:Robe</id>
		<title>User:Robe</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/User:Robe"/>
				<updated>2009-03-08T12:26:41Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;&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,'--',$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,'--',$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 = '%t postgres[%p]: [%l-1] '&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;
,'--',$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;
== For 8.5 ==&lt;br /&gt;
&lt;br /&gt;
* Fix Status Quo of VACUUM Full&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;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Talk:Londiste_Tutorial_(Skytools_2)</id>
		<title>Talk:Londiste Tutorial (Skytools 2)</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Talk:Londiste_Tutorial_(Skytools_2)"/>
				<updated>2009-03-04T15:25:29Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;New page: Thanks, this is highly appreciated. I also have some docs on slony and WAL shipping which I'll contribute soon. - ~~~~&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thanks, this is highly appreciated. I also have some docs on slony and WAL shipping which I'll contribute soon. - [[User:Robe|Robe]] 15:25, 4 March 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling</id>
		<title>Replication, Clustering, and Connection Pooling</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling"/>
				<updated>2009-01-31T18:08:43Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Replication */ clarified londiste/skytools&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
There are many approaches available to scale PostgreSQL beyond running on a single server.  An outline of the terminology and basic technologies involved is at [http://www.postgresql.org/docs/current/interactive/high-availability.html High Availability and Load Balancing].  There is a [http://momjian.us/main/writings/pgsql/replication.pdf presentation] covering some of these solutions.&lt;br /&gt;
&lt;br /&gt;
There is no one-size fits all replication software.  You have to understand your requirements and how various approaches fit into that.  For example, here are two extremes in the replication problem space:&lt;br /&gt;
&lt;br /&gt;
* You have a few servers connected to a local network you want to always keep current for failover and load-balancing purposes.  Here you would be considering solutions that are synchronous, eager, and therefore conflict-free.&lt;br /&gt;
* Your users take a local copy of the database with them on laptops when they leave the office, make changes while they are away, and need to merge those with the main database when they return.  Here you'd want an asynchronous, lazy replication approach, and will be forced to consider how to handle conflicts in cases where the same record has been modified both on the master server and on a local copy.&lt;br /&gt;
&lt;br /&gt;
These are both database replication problems, but the best way to solve them is very different.  And as you can see from these examples, replication has a lot of specific terminology that you'll have to understand to figure out what class of solution makes sense for your requirements.  A great source for this background is in the&lt;br /&gt;
[http://www.postgres-r.org/documentation/terms Postgres-R Terms and Definitions for Database Replication].  The main theoretical topic it doesn't mention is how to resolve conflict resolution in lazy replication cases like the laptop situation, which involves voting and similar schemes.&lt;br /&gt;
&lt;br /&gt;
==Features in the Core of PostgreSQL==&lt;br /&gt;
The PostgreSQL core team considered replication and clustering technology outside the scope of the main project's focus but this changed in Spring 2008, see the [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00913.php Core Teams statement].&lt;br /&gt;
&lt;br /&gt;
*[[Warm Standby]]/Log Shipping is a HA solution which 'replicates' a database cluster to an archive or a warm (can be brought up quickly, but not available for querying) standby server.  Overhead is very low and it's easy to set up.  This is the simplest and best solution if all you care about is continuous backup and short failover times.&lt;br /&gt;
&lt;br /&gt;
*There's an ongoing project to integrate hot standby capabilites (read only queries on slave) into PostgreSQL...if/when complete, this would provide a replication mechanism similar to, but significantly better than mysql binary log replication, and would provide an excellent complement to slony. See [[Hot Standby]].&lt;br /&gt;
&lt;br /&gt;
==Comparison matrix==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;font-size: 85%; border: gray solid 1px; border-collapse: collapse; text-align: center; width: 100%; table-layout: fixed;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec&amp;quot;&lt;br /&gt;
! Program&lt;br /&gt;
! License&lt;br /&gt;
! Maturity&lt;br /&gt;
! Replication Method&lt;br /&gt;
! Sync&lt;br /&gt;
! Connection Pooling&lt;br /&gt;
! Load Balancing&lt;br /&gt;
! Query Partitioning&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://www.pgcluster.org/ PGCluster]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | See version details on site&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Master&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Synchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://pgpool.projects.postgresql.org/ pgpool-I]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Stable&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Statement-Based Middleware&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Synchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://pgpool.projects.postgresql.org/pgpool-II/en/ pgpool-II]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Recent release&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Statement-Based Middleware&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Synchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://slony.info/ slony-I]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Stable&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://bucardo.org/ Bucardo]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Recent release&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Master, Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [https://developer.skype.com/SkypeGarage/DbProjects/SkyTools Londiste]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Recent release&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://www.commandprompt.com/products/mammothreplicator/ Mammoth]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Stable&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Replication==&lt;br /&gt;
&lt;br /&gt;
Aside from Warm Standby, mentioned above...&lt;br /&gt;
&lt;br /&gt;
*Slony-I: Seems good, single master only, master is a single point of failure, no good failover system for electing a new master or having a failed master rejoin the cluster. Slave databases are mostly for safety or for parallelizing queries for performance. Suffers from O(N^2) communications (N = cluster size).  with reasonable sysadmin you can implement failover system yourself.  regarding communications, you can cascade the replication to reduce load on the master.  If you were implementing a large replication cluster, this would probably be a good idea.  Slony is powerful, trigger based, and highly configurable.&lt;br /&gt;
&lt;br /&gt;
* PGCluster:  PGCluster (which, incidentally, is not the same as PGCluster-II, a shared-disk solution), which does synchronous multimaster replication.  Two single-points failure spots, load balancer and the data replicator.  The project has historically looked a bit dead, but they just released a new version and moved to a Trac-based web site at http://www.pgcluster.org/  and http://pgfoundry.org/projects/pgcluster is up to date (at least downloads page)  One major downside to PGCluster is that it uses a modified version of PostgreSQL, and it usually lags a few releases behind.&lt;br /&gt;
&lt;br /&gt;
* http://pgpool.projects.postgresql.org/ pgpool 1/2 is a reasonable solution.  it's statement level replication, which has some downsides, but is good for certain things.  pgpool 2 has a neat distributed table mechanism which is interesting.  You might want to be looking here if you have extremely high ratios of read to write but need to service a huge transaction volume.  Supports load-balancing and replication by implementing a proxy that duplicates all updates to all slaves. It can partition data by doing this, and it can semi-intelligently route queries to the appropriate servers.&lt;br /&gt;
&lt;br /&gt;
* [http://www.commandprompt.com/products/mammothreplicator/ Mammoth Replicator], commercial.&lt;br /&gt;
&lt;br /&gt;
* [http://bucardo.org/ Bucardo]: Trigger-based, asynchronous, multi-master or master-slave.&lt;br /&gt;
&lt;br /&gt;
* Cybertec, an Austrian company, offers a commercial packaging of PGCluster. They simply call it PostgreSQL Multimaster-Replication, see http://www.cybertec.at.&lt;br /&gt;
&lt;br /&gt;
* Londiste, a part of Skytools (https://developer.skype.com/SkypeGarage/DbProjects/SkyTools) which is a collection of replication tools from the Skype people. Purports to be simpler to use than Slony.&lt;br /&gt;
&lt;br /&gt;
* [http://www.continuent.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=212&amp;amp;Itemid=169 Continuent uni/cluster], commercial and the related Sequoia (jdbc, formerly known as c-jdbc)&lt;br /&gt;
&lt;br /&gt;
* [http://www.postgres-r.org Postgres-R] is still in development. It features eager and thus conflict-free, but async multi-master replication.&lt;br /&gt;
&lt;br /&gt;
* DRBD (http://www.drbd.org/), a device driver that replicates disk blocks to other nodes. This works for failover only, not for scaling reads. Easy migration of devices if combined with an NFS export.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Daffodil Replicator&amp;quot; - GPL - http://sourceforge.net/projects/daffodilreplica/ &lt;br /&gt;
&lt;br /&gt;
===Inactive projects===&lt;br /&gt;
* [http://www.slony2.org/ Slony-II]&lt;br /&gt;
* PGReplication&lt;br /&gt;
&lt;br /&gt;
==Clustering==&lt;br /&gt;
&lt;br /&gt;
* [http://www.greenplum.com/index.php?page=greenplum-database Greenplum Database] (formerly Bizgres MPP), commercial. Not so much a replication solution as a way to parallelize queries, and targeted at the data warehousing crowd. Similar to ExtenDB, but tightly integrated with PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
*[http://www.enterprisedb.com/products/gridsql.do GridSQL for EnterpriseDB Advanced Server] (formerly ExtenDB) &lt;br /&gt;
&lt;br /&gt;
*sequoia (jdbc, formerly known as c-jdbc)&lt;br /&gt;
&lt;br /&gt;
==Connection Pooling and Acceleration==&lt;br /&gt;
&lt;br /&gt;
Connection pooling programs let you reduce database-related overhead when it's the sheer number of physical connections dragging performance down.  This is particularly important on Windows, where system limitations prevent large number of connections; see &amp;quot;I cannot run with more than about 125 connections at once&amp;quot; in the [http://www.postgresql.org/docs/faqs.FAQ_windows.html Windows FAQ].  It's also vital for web applications where the number of connections can get very large.&lt;br /&gt;
&lt;br /&gt;
Some programs that implement connection pooling are:&lt;br /&gt;
* [https://developer.skype.com/SkypeGarage/DbProjects/PgBouncer PgBouncer]&lt;br /&gt;
* [http://pgpool.projects.postgresql.org/ pgpool]&lt;br /&gt;
* [http://kaiv.wordpress.com/2007/07/27/postgresql-cluster-partitioning-with-plproxy-part-i/ plproxy]&lt;br /&gt;
&lt;br /&gt;
Some people also or alternately use [http://www.danga.com/memcached/ memcached] in various ways to reduce the work the database handles directly by caching popular data.&lt;br /&gt;
&lt;br /&gt;
==Credits==&lt;br /&gt;
&lt;br /&gt;
Sources for the initial information on this page include:&lt;br /&gt;
*[http://archives.postgresql.org/pgsql-performance/2007-06/msg00264.php replication thread]&lt;br /&gt;
*[http://archives.postgresql.org/pgsql-general/2007-08/msg00085.php pgpool2 vs sequoia]&lt;br /&gt;
*[http://archives.postgresql.org/pgsql-hackers/2006-10/msg00810.php Postgresql Caching]&lt;br /&gt;
&lt;br /&gt;
A existing page covering this topic in German is at http://burger-ag.de/postgresql_replikation.whtml  It translates pretty well through [http://babelfish.altavista.com/ Babelfish].&lt;br /&gt;
&lt;br /&gt;
Sources for more information located but not yet integrated into here:&lt;br /&gt;
* [http://bristlecone.continuent.org/uploads/bristlecone/HomePage/PG_East-Scale-Out-Benchmarks_FINAL2.pdf Portable Scale-Out Benchmarks for PostgreSQL] by Robert Hodges&lt;br /&gt;
* [http://www.fastware.com.au/docs/PostgreSQL_HighAvailability.pdf High Availability and PostgreSQL] by Gavin Sherry&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling</id>
		<title>Replication, Clustering, and Connection Pooling</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling"/>
				<updated>2009-01-31T18:03:48Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Features in the Core of PostgreSQL */ updated other text in paragraph to reflect core teams changed stance on integrated replication solutions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
There are many approaches available to scale PostgreSQL beyond running on a single server.  An outline of the terminology and basic technologies involved is at [http://www.postgresql.org/docs/current/interactive/high-availability.html High Availability and Load Balancing].  There is a [http://momjian.us/main/writings/pgsql/replication.pdf presentation] covering some of these solutions.&lt;br /&gt;
&lt;br /&gt;
There is no one-size fits all replication software.  You have to understand your requirements and how various approaches fit into that.  For example, here are two extremes in the replication problem space:&lt;br /&gt;
&lt;br /&gt;
* You have a few servers connected to a local network you want to always keep current for failover and load-balancing purposes.  Here you would be considering solutions that are synchronous, eager, and therefore conflict-free.&lt;br /&gt;
* Your users take a local copy of the database with them on laptops when they leave the office, make changes while they are away, and need to merge those with the main database when they return.  Here you'd want an asynchronous, lazy replication approach, and will be forced to consider how to handle conflicts in cases where the same record has been modified both on the master server and on a local copy.&lt;br /&gt;
&lt;br /&gt;
These are both database replication problems, but the best way to solve them is very different.  And as you can see from these examples, replication has a lot of specific terminology that you'll have to understand to figure out what class of solution makes sense for your requirements.  A great source for this background is in the&lt;br /&gt;
[http://www.postgres-r.org/documentation/terms Postgres-R Terms and Definitions for Database Replication].  The main theoretical topic it doesn't mention is how to resolve conflict resolution in lazy replication cases like the laptop situation, which involves voting and similar schemes.&lt;br /&gt;
&lt;br /&gt;
==Features in the Core of PostgreSQL==&lt;br /&gt;
The PostgreSQL core team considered replication and clustering technology outside the scope of the main project's focus but this changed in Spring 2008, see the [http://archives.postgresql.org/pgsql-hackers/2008-05/msg00913.php Core Teams statement].&lt;br /&gt;
&lt;br /&gt;
*[[Warm Standby]]/Log Shipping is a HA solution which 'replicates' a database cluster to an archive or a warm (can be brought up quickly, but not available for querying) standby server.  Overhead is very low and it's easy to set up.  This is the simplest and best solution if all you care about is continuous backup and short failover times.&lt;br /&gt;
&lt;br /&gt;
*There's an ongoing project to integrate hot standby capabilites (read only queries on slave) into PostgreSQL...if/when complete, this would provide a replication mechanism similar to, but significantly better than mysql binary log replication, and would provide an excellent complement to slony. See [[Hot Standby]].&lt;br /&gt;
&lt;br /&gt;
==Comparison matrix==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;font-size: 85%; border: gray solid 1px; border-collapse: collapse; text-align: center; width: 100%; table-layout: fixed;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec&amp;quot;&lt;br /&gt;
! Program&lt;br /&gt;
! License&lt;br /&gt;
! Maturity&lt;br /&gt;
! Replication Method&lt;br /&gt;
! Sync&lt;br /&gt;
! Connection Pooling&lt;br /&gt;
! Load Balancing&lt;br /&gt;
! Query Partitioning&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://www.pgcluster.org/ PGCluster]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | See version details on site&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Master&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Synchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://pgpool.projects.postgresql.org/ pgpool-I]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Stable&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Statement-Based Middleware&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Synchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://pgpool.projects.postgresql.org/pgpool-II/en/ pgpool-II]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Recent release&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Statement-Based Middleware&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Synchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://slony.info/ slony-I]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Stable&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://bucardo.org/ Bucardo]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Recent release&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Master, Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [https://developer.skype.com/SkypeGarage/DbProjects/SkyTools Londiste]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Recent release&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://www.commandprompt.com/products/mammothreplicator/ Mammoth]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Stable&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Replication==&lt;br /&gt;
&lt;br /&gt;
Aside from Warm Standby, mentioned above...&lt;br /&gt;
&lt;br /&gt;
*Slony-I: Seems good, single master only, master is a single point of failure, no good failover system for electing a new master or having a failed master rejoin the cluster. Slave databases are mostly for safety or for parallelizing queries for performance. Suffers from O(N^2) communications (N = cluster size).  with reasonable sysadmin you can implement failover system yourself.  regarding communications, you can cascade the replication to reduce load on the master.  If you were implementing a large replication cluster, this would probably be a good idea.  Slony is powerful, trigger based, and highly configurable.&lt;br /&gt;
&lt;br /&gt;
* PGCluster:  PGCluster (which, incidentally, is not the same as PGCluster-II, a shared-disk solution), which does synchronous multimaster replication.  Two single-points failure spots, load balancer and the data replicator.  The project has historically looked a bit dead, but they just released a new version and moved to a Trac-based web site at http://www.pgcluster.org/  and http://pgfoundry.org/projects/pgcluster is up to date (at least downloads page)  One major downside to PGCluster is that it uses a modified version of PostgreSQL, and it usually lags a few releases behind.&lt;br /&gt;
&lt;br /&gt;
* http://pgpool.projects.postgresql.org/ pgpool 1/2 is a reasonable solution.  it's statement level replication, which has some downsides, but is good for certain things.  pgpool 2 has a neat distributed table mechanism which is interesting.  You might want to be looking here if you have extremely high ratios of read to write but need to service a huge transaction volume.  Supports load-balancing and replication by implementing a proxy that duplicates all updates to all slaves. It can partition data by doing this, and it can semi-intelligently route queries to the appropriate servers.&lt;br /&gt;
&lt;br /&gt;
* [http://www.commandprompt.com/products/mammothreplicator/ Mammoth Replicator], commercial.&lt;br /&gt;
&lt;br /&gt;
* [http://bucardo.org/ Bucardo]: Trigger-based, asynchronous, multi-master or master-slave.&lt;br /&gt;
&lt;br /&gt;
* Cybertec, an Austrian company, offers a commercial packaging of PGCluster. They simply call it PostgreSQL Multimaster-Replication, see http://www.cybertec.at.&lt;br /&gt;
&lt;br /&gt;
* Skytools (https://developer.skype.com/SkypeGarage/DbProjects/SkyTools), a collection of replication tools from the Skype people. Purports to be simpler to use than Slony.&lt;br /&gt;
&lt;br /&gt;
* [http://www.continuent.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=212&amp;amp;Itemid=169 Continuent uni/cluster], commercial and the related Sequoia (jdbc, formerly known as c-jdbc)&lt;br /&gt;
&lt;br /&gt;
* [http://www.postgres-r.org Postgres-R] is still in development. It features eager and thus conflict-free, but async multi-master replication.&lt;br /&gt;
&lt;br /&gt;
* DRBD (http://www.drbd.org/), a device driver that replicates disk blocks to other nodes. This works for failover only, not for scaling reads. Easy migration of devices if combined with an NFS export.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Daffodil Replicator&amp;quot; - GPL - http://sourceforge.net/projects/daffodilreplica/ &lt;br /&gt;
&lt;br /&gt;
===Inactive projects===&lt;br /&gt;
* [http://www.slony2.org/ Slony-II]&lt;br /&gt;
* PGReplication&lt;br /&gt;
&lt;br /&gt;
==Clustering==&lt;br /&gt;
&lt;br /&gt;
* [http://www.greenplum.com/index.php?page=greenplum-database Greenplum Database] (formerly Bizgres MPP), commercial. Not so much a replication solution as a way to parallelize queries, and targeted at the data warehousing crowd. Similar to ExtenDB, but tightly integrated with PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
*[http://www.enterprisedb.com/products/gridsql.do GridSQL for EnterpriseDB Advanced Server] (formerly ExtenDB) &lt;br /&gt;
&lt;br /&gt;
*sequoia (jdbc, formerly known as c-jdbc)&lt;br /&gt;
&lt;br /&gt;
==Connection Pooling and Acceleration==&lt;br /&gt;
&lt;br /&gt;
Connection pooling programs let you reduce database-related overhead when it's the sheer number of physical connections dragging performance down.  This is particularly important on Windows, where system limitations prevent large number of connections; see &amp;quot;I cannot run with more than about 125 connections at once&amp;quot; in the [http://www.postgresql.org/docs/faqs.FAQ_windows.html Windows FAQ].  It's also vital for web applications where the number of connections can get very large.&lt;br /&gt;
&lt;br /&gt;
Some programs that implement connection pooling are:&lt;br /&gt;
* [https://developer.skype.com/SkypeGarage/DbProjects/PgBouncer PgBouncer]&lt;br /&gt;
* [http://pgpool.projects.postgresql.org/ pgpool]&lt;br /&gt;
* [http://kaiv.wordpress.com/2007/07/27/postgresql-cluster-partitioning-with-plproxy-part-i/ plproxy]&lt;br /&gt;
&lt;br /&gt;
Some people also or alternately use [http://www.danga.com/memcached/ memcached] in various ways to reduce the work the database handles directly by caching popular data.&lt;br /&gt;
&lt;br /&gt;
==Credits==&lt;br /&gt;
&lt;br /&gt;
Sources for the initial information on this page include:&lt;br /&gt;
*[http://archives.postgresql.org/pgsql-performance/2007-06/msg00264.php replication thread]&lt;br /&gt;
*[http://archives.postgresql.org/pgsql-general/2007-08/msg00085.php pgpool2 vs sequoia]&lt;br /&gt;
*[http://archives.postgresql.org/pgsql-hackers/2006-10/msg00810.php Postgresql Caching]&lt;br /&gt;
&lt;br /&gt;
A existing page covering this topic in German is at http://burger-ag.de/postgresql_replikation.whtml  It translates pretty well through [http://babelfish.altavista.com/ Babelfish].&lt;br /&gt;
&lt;br /&gt;
Sources for more information located but not yet integrated into here:&lt;br /&gt;
* [http://bristlecone.continuent.org/uploads/bristlecone/HomePage/PG_East-Scale-Out-Benchmarks_FINAL2.pdf Portable Scale-Out Benchmarks for PostgreSQL] by Robert Hodges&lt;br /&gt;
* [http://www.fastware.com.au/docs/PostgreSQL_HighAvailability.pdf High Availability and PostgreSQL] by Gavin Sherry&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling</id>
		<title>Replication, Clustering, and Connection Pooling</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling"/>
				<updated>2009-01-31T17:55:24Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;/* Features in the Core of PostgreSQL */ update Hot Standby comments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
There are many approaches available to scale PostgreSQL beyond running on a single server.  An outline of the terminology and basic technologies involved is at [http://www.postgresql.org/docs/current/interactive/high-availability.html High Availability and Load Balancing].  There is a [http://momjian.us/main/writings/pgsql/replication.pdf presentation] covering some of these solutions.&lt;br /&gt;
&lt;br /&gt;
There is no one-size fits all replication software.  You have to understand your requirements and how various approaches fit into that.  For example, here are two extremes in the replication problem space:&lt;br /&gt;
&lt;br /&gt;
* You have a few servers connected to a local network you want to always keep current for failover and load-balancing purposes.  Here you would be considering solutions that are synchronous, eager, and therefore conflict-free.&lt;br /&gt;
* Your users take a local copy of the database with them on laptops when they leave the office, make changes while they are away, and need to merge those with the main database when they return.  Here you'd want an asynchronous, lazy replication approach, and will be forced to consider how to handle conflicts in cases where the same record has been modified both on the master server and on a local copy.&lt;br /&gt;
&lt;br /&gt;
These are both database replication problems, but the best way to solve them is very different.  And as you can see from these examples, replication has a lot of specific terminology that you'll have to understand to figure out what class of solution makes sense for your requirements.  A great source for this background is in the&lt;br /&gt;
[http://www.postgres-r.org/documentation/terms Postgres-R Terms and Definitions for Database Replication].  The main theoretical topic it doesn't mention is how to resolve conflict resolution in lazy replication cases like the laptop situation, which involves voting and similar schemes.&lt;br /&gt;
&lt;br /&gt;
==Features in the Core of PostgreSQL==&lt;br /&gt;
The PostgreSQL core team considers replication and clustering technology outside the scope of the main project's focus. Jan Wieck works almost exclusively on Slony, so there is much high level attention in this area. While some features to help support this area are available, actually implementing a full solution is considered best implemented by a layer of software built on top of the core, rather than including it in there directly.&lt;br /&gt;
&lt;br /&gt;
*[[Warm Standby]]/Log Shipping is a HA solution which 'replicates' a database cluster to an archive or a warm (can be brought up quickly, but not available for querying) standby server.  Overhead is very low and it's easy to set up.  This is the simplest and best solution if all you care about is continuous backup and short failover times.&lt;br /&gt;
&lt;br /&gt;
*There's an ongoing project to integrate hot standby capabilites (read only queries on slave) into PostgreSQL...if/when complete, this would provide a replication mechanism similar to, but significantly better than mysql binary log replication, and would provide an excellent complement to slony. See [[Hot Standby]].&lt;br /&gt;
&lt;br /&gt;
==Comparison matrix==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;font-size: 85%; border: gray solid 1px; border-collapse: collapse; text-align: center; width: 100%; table-layout: fixed;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec&amp;quot;&lt;br /&gt;
! Program&lt;br /&gt;
! License&lt;br /&gt;
! Maturity&lt;br /&gt;
! Replication Method&lt;br /&gt;
! Sync&lt;br /&gt;
! Connection Pooling&lt;br /&gt;
! Load Balancing&lt;br /&gt;
! Query Partitioning&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://www.pgcluster.org/ PGCluster]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | See version details on site&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Master&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Synchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://pgpool.projects.postgresql.org/ pgpool-I]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Stable&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Statement-Based Middleware&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Synchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://pgpool.projects.postgresql.org/pgpool-II/en/ pgpool-II]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Recent release&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Statement-Based Middleware&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Synchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
| bgcolor=&amp;quot;#ddffdd&amp;quot; | Yes&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://slony.info/ slony-I]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Stable&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://bucardo.org/ Bucardo]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Recent release&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Master, Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [https://developer.skype.com/SkypeGarage/DbProjects/SkyTools Londiste]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Recent release&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;text-align:block;&amp;quot; bgcolor=&amp;quot;#ececec&amp;quot; | [http://www.commandprompt.com/products/mammothreplicator/ Mammoth]&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | BSD&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Stable&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Master-Slave&lt;br /&gt;
| bgcolor=&amp;quot;#ffffaa&amp;quot; | Asynchronous&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
| bgcolor=&amp;quot;#ffaaaa&amp;quot; | No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Replication==&lt;br /&gt;
&lt;br /&gt;
Aside from Warm Standby, mentioned above...&lt;br /&gt;
&lt;br /&gt;
*Slony-I: Seems good, single master only, master is a single point of failure, no good failover system for electing a new master or having a failed master rejoin the cluster. Slave databases are mostly for safety or for parallelizing queries for performance. Suffers from O(N^2) communications (N = cluster size).  with reasonable sysadmin you can implement failover system yourself.  regarding communications, you can cascade the replication to reduce load on the master.  If you were implementing a large replication cluster, this would probably be a good idea.  Slony is powerful, trigger based, and highly configurable.&lt;br /&gt;
&lt;br /&gt;
* PGCluster:  PGCluster (which, incidentally, is not the same as PGCluster-II, a shared-disk solution), which does synchronous multimaster replication.  Two single-points failure spots, load balancer and the data replicator.  The project has historically looked a bit dead, but they just released a new version and moved to a Trac-based web site at http://www.pgcluster.org/  and http://pgfoundry.org/projects/pgcluster is up to date (at least downloads page)  One major downside to PGCluster is that it uses a modified version of PostgreSQL, and it usually lags a few releases behind.&lt;br /&gt;
&lt;br /&gt;
* http://pgpool.projects.postgresql.org/ pgpool 1/2 is a reasonable solution.  it's statement level replication, which has some downsides, but is good for certain things.  pgpool 2 has a neat distributed table mechanism which is interesting.  You might want to be looking here if you have extremely high ratios of read to write but need to service a huge transaction volume.  Supports load-balancing and replication by implementing a proxy that duplicates all updates to all slaves. It can partition data by doing this, and it can semi-intelligently route queries to the appropriate servers.&lt;br /&gt;
&lt;br /&gt;
* [http://www.commandprompt.com/products/mammothreplicator/ Mammoth Replicator], commercial.&lt;br /&gt;
&lt;br /&gt;
* [http://bucardo.org/ Bucardo]: Trigger-based, asynchronous, multi-master or master-slave.&lt;br /&gt;
&lt;br /&gt;
* Cybertec, an Austrian company, offers a commercial packaging of PGCluster. They simply call it PostgreSQL Multimaster-Replication, see http://www.cybertec.at.&lt;br /&gt;
&lt;br /&gt;
* Skytools (https://developer.skype.com/SkypeGarage/DbProjects/SkyTools), a collection of replication tools from the Skype people. Purports to be simpler to use than Slony.&lt;br /&gt;
&lt;br /&gt;
* [http://www.continuent.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=212&amp;amp;Itemid=169 Continuent uni/cluster], commercial and the related Sequoia (jdbc, formerly known as c-jdbc)&lt;br /&gt;
&lt;br /&gt;
* [http://www.postgres-r.org Postgres-R] is still in development. It features eager and thus conflict-free, but async multi-master replication.&lt;br /&gt;
&lt;br /&gt;
* DRBD (http://www.drbd.org/), a device driver that replicates disk blocks to other nodes. This works for failover only, not for scaling reads. Easy migration of devices if combined with an NFS export.&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Daffodil Replicator&amp;quot; - GPL - http://sourceforge.net/projects/daffodilreplica/ &lt;br /&gt;
&lt;br /&gt;
===Inactive projects===&lt;br /&gt;
* [http://www.slony2.org/ Slony-II]&lt;br /&gt;
* PGReplication&lt;br /&gt;
&lt;br /&gt;
==Clustering==&lt;br /&gt;
&lt;br /&gt;
* [http://www.greenplum.com/index.php?page=greenplum-database Greenplum Database] (formerly Bizgres MPP), commercial. Not so much a replication solution as a way to parallelize queries, and targeted at the data warehousing crowd. Similar to ExtenDB, but tightly integrated with PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
*[http://www.enterprisedb.com/products/gridsql.do GridSQL for EnterpriseDB Advanced Server] (formerly ExtenDB) &lt;br /&gt;
&lt;br /&gt;
*sequoia (jdbc, formerly known as c-jdbc)&lt;br /&gt;
&lt;br /&gt;
==Connection Pooling and Acceleration==&lt;br /&gt;
&lt;br /&gt;
Connection pooling programs let you reduce database-related overhead when it's the sheer number of physical connections dragging performance down.  This is particularly important on Windows, where system limitations prevent large number of connections; see &amp;quot;I cannot run with more than about 125 connections at once&amp;quot; in the [http://www.postgresql.org/docs/faqs.FAQ_windows.html Windows FAQ].  It's also vital for web applications where the number of connections can get very large.&lt;br /&gt;
&lt;br /&gt;
Some programs that implement connection pooling are:&lt;br /&gt;
* [https://developer.skype.com/SkypeGarage/DbProjects/PgBouncer PgBouncer]&lt;br /&gt;
* [http://pgpool.projects.postgresql.org/ pgpool]&lt;br /&gt;
* [http://kaiv.wordpress.com/2007/07/27/postgresql-cluster-partitioning-with-plproxy-part-i/ plproxy]&lt;br /&gt;
&lt;br /&gt;
Some people also or alternately use [http://www.danga.com/memcached/ memcached] in various ways to reduce the work the database handles directly by caching popular data.&lt;br /&gt;
&lt;br /&gt;
==Credits==&lt;br /&gt;
&lt;br /&gt;
Sources for the initial information on this page include:&lt;br /&gt;
*[http://archives.postgresql.org/pgsql-performance/2007-06/msg00264.php replication thread]&lt;br /&gt;
*[http://archives.postgresql.org/pgsql-general/2007-08/msg00085.php pgpool2 vs sequoia]&lt;br /&gt;
*[http://archives.postgresql.org/pgsql-hackers/2006-10/msg00810.php Postgresql Caching]&lt;br /&gt;
&lt;br /&gt;
A existing page covering this topic in German is at http://burger-ag.de/postgresql_replikation.whtml  It translates pretty well through [http://babelfish.altavista.com/ Babelfish].&lt;br /&gt;
&lt;br /&gt;
Sources for more information located but not yet integrated into here:&lt;br /&gt;
* [http://bristlecone.continuent.org/uploads/bristlecone/HomePage/PG_East-Scale-Out-Benchmarks_FINAL2.pdf Portable Scale-Out Benchmarks for PostgreSQL] by Robert Hodges&lt;br /&gt;
* [http://www.fastware.com.au/docs/PostgreSQL_HighAvailability.pdf High Availability and PostgreSQL] by Gavin Sherry&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/IRC2RWNames</id>
		<title>IRC2RWNames</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/IRC2RWNames"/>
				<updated>2008-10-10T15:33:08Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;added myself&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== List of IRC nicks with their respective real world names ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Nickname || Real Name&lt;br /&gt;
|-&lt;br /&gt;
|ads || Andreas Scherbaum&lt;br /&gt;
|-&lt;br /&gt;
|agliodbs, aglio2 (freenode), jberkus (oftc) || Josh Berkus&lt;br /&gt;
|-&lt;br /&gt;
|ahammond || Andrew Hammond&lt;br /&gt;
|-&lt;br /&gt;
|alvherre || Alvaro Herrera&lt;br /&gt;
|-&lt;br /&gt;
|RhodiumToad (formerly AndrewSN) || Andrew Gierth&lt;br /&gt;
|-&lt;br /&gt;
|aurynn || Aurynn Shaw&lt;br /&gt;
|-&lt;br /&gt;
|BlueAidan/BlueAidan_work || David Blewett&lt;br /&gt;
|-&lt;br /&gt;
|bmomjian || Bruce Momjian&lt;br /&gt;
|-&lt;br /&gt;
|cbbrowne || Christopher Browne&lt;br /&gt;
|-&lt;br /&gt;
|crab || Abhijit Menon-Sen&lt;br /&gt;
|-&lt;br /&gt;
|Crad || Gavin M. Roy&lt;br /&gt;
|- &lt;br /&gt;
|daamien ||  Damien Clochard&lt;br /&gt;
|-&lt;br /&gt;
|DarcyB || Darcy Buskermolen&lt;br /&gt;
|-&lt;br /&gt;
|davidfetter || David Fetter&lt;br /&gt;
|-&lt;br /&gt;
|dcramer || Dave Cramer&lt;br /&gt;
|-&lt;br /&gt;
|DeciBull, TheCougar || Jim C. Nasby&lt;br /&gt;
|-&lt;br /&gt;
|dennisb || Dennis Bj&amp;amp;ouml;rklund&lt;br /&gt;
|-&lt;br /&gt;
|devrimgunduz || Devrim G&amp;amp;uuml;nd&amp;amp;uuml;z&lt;br /&gt;
|-&lt;br /&gt;
|dim || Dimitri Fontaine&lt;br /&gt;
|-&lt;br /&gt;
|direvus || Brendan Jurd&lt;br /&gt;
|-&lt;br /&gt;
|dvl || Dan Langille&lt;br /&gt;
|-&lt;br /&gt;
|f3ew || Devdas Vasu Bhagat&lt;br /&gt;
|-&lt;br /&gt;
|feivel || Michael Meskes&lt;br /&gt;
|-&lt;br /&gt;
|elein || Elein Mustain&lt;br /&gt;
|-&lt;br /&gt;
|gleu || Guillaume Lelarge&lt;br /&gt;
|-&lt;br /&gt;
|grzm || Michael Glaesemann&lt;br /&gt;
|-&lt;br /&gt;
|gsmet || Guillaume Smet&lt;br /&gt;
|-&lt;br /&gt;
|G_SabinoMullane || Greg Sabino Mullane&lt;br /&gt;
|-&lt;br /&gt;
|HarrisonF || Harrison Fisk&lt;br /&gt;
|-&lt;br /&gt;
|indigo || Phil Frost&lt;br /&gt;
|-&lt;br /&gt;
|JanniCash || Jan Wieck&lt;br /&gt;
|-&lt;br /&gt;
|jdavis, jdavis_ || Jeff Davis&lt;br /&gt;
|-&lt;br /&gt;
|jurka || Kris Jurka&lt;br /&gt;
|-&lt;br /&gt;
|justatheory || David Wheeler&lt;br /&gt;
|-&lt;br /&gt;
|jpa || Jean-Paul Argudo&lt;br /&gt;
|-&lt;br /&gt;
|klando || Cédric Villemain&lt;br /&gt;
|-&lt;br /&gt;
|larryrtx || Larry Rosenman&lt;br /&gt;
|-&lt;br /&gt;
|linuxpoet, postgresman || Joshua D. Drake&lt;br /&gt;
|-&lt;br /&gt;
|lluad || Steve Atkins&lt;br /&gt;
|-&lt;br /&gt;
|lsmith || Lukas Smith&lt;br /&gt;
|-&lt;br /&gt;
|magnush || Magnus Hagander&lt;br /&gt;
|-&lt;br /&gt;
|markwkm || Mark Wong&lt;br /&gt;
|-&lt;br /&gt;
|mastermind || [[user:mastermind | Stefan Kaltenbrunner]]&lt;br /&gt;
|-&lt;br /&gt;
|merlinm || Merlin Moncure&lt;br /&gt;
|-&lt;br /&gt;
|miracee || Susanne Ebrecht&lt;br /&gt;
|-&lt;br /&gt;
|MojoWork, StuckMojo || Jon Erdman&lt;br /&gt;
|-&lt;br /&gt;
|Moosbert || Peter Eisentraut&lt;br /&gt;
|-&lt;br /&gt;
|neilc || Neil Conway&lt;br /&gt;
|-&lt;br /&gt;
|oicu || Andrew Dunstan&lt;br /&gt;
|-&lt;br /&gt;
|okbobcz || Pavel Stehule&lt;br /&gt;
|-&lt;br /&gt;
|pgSnake || Dave Page&lt;br /&gt;
|-&lt;br /&gt;
|PJMODOS || Petr Jel&amp;amp;iacute;nek&lt;br /&gt;
|-&lt;br /&gt;
|postwait || Theo Schlossnagle&lt;br /&gt;
|-&lt;br /&gt;
|psoo || Bernd Helmle&lt;br /&gt;
|-&lt;br /&gt;
|pyarra || Philip Yarra&lt;br /&gt;
|-&lt;br /&gt;
|Robe || [[user:Robe | Michael Renner]]&lt;br /&gt;
|-&lt;br /&gt;
|rotellaro || Federico Campoli&lt;br /&gt;
|-&lt;br /&gt;
|rtfm_please || [[IRCBotSyntax]]&lt;br /&gt;
|-&lt;br /&gt;
|SAS || Stéphane Schildknecht&lt;br /&gt;
|-&lt;br /&gt;
|scrappy || Marc G. Fournier&lt;br /&gt;
|-&lt;br /&gt;
|selenamarie || Selena Deckelmann&lt;br /&gt;
|-&lt;br /&gt;
|Snow-Man || Stephen Frost&lt;br /&gt;
|-&lt;br /&gt;
|swm || Gavin Sherry&lt;br /&gt;
|-&lt;br /&gt;
|vy || Volkan YAZICI&lt;br /&gt;
|-&lt;br /&gt;
|xzilla, xzi11a || Robert Treat&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Robe</name></author>	</entry>

	<entry>
		<id>http://wiki.postgresql.org/wiki/User:Robe</id>
		<title>User:Robe</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/User:Robe"/>
				<updated>2008-10-09T10:49:11Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;&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,'--',$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,'--',$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 = '%t postgres[%p]: [%l-1] '&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;
,'--',$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>http://wiki.postgresql.org/wiki/User:Robe</id>
		<title>User:Robe</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/User:Robe"/>
				<updated>2008-10-08T22:25:46Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;this ain't dokuwiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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,'--',$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,'--',$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 = '%t postgres[%p]: [%l-1] '&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;
,'--',$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>http://wiki.postgresql.org/wiki/User:Robe</id>
		<title>User:Robe</title>
		<link rel="alternate" type="text/html" href="http://wiki.postgresql.org/wiki/User:Robe"/>
				<updated>2008-10-08T22:20:05Z</updated>
		
		<summary type="html">&lt;p&gt;Robe:&amp;#32;New page: == Logging ==  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.  The main adva...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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,'--',$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,'--',$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 = '%t postgres[%p]: [%l-1] '&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;
,'--',$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>

	</feed>