mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
Rename "pg_clog" directory to "pg_xact".
Names containing the letters "log" sometimes confuse users into believing that only non-critical data is present. It is hoped this renaming will discourage ill-considered removals of transaction status data. Michael Paquier Discussion: http://postgr.es/m/CA+Tgmoa9xFQyjRZupbdEFuwUerFTvC6HjZq1ud6GYragGDFFgA@mail.gmail.com
This commit is contained in:
parent
bd9028b824
commit
88e66d193f
@ -382,10 +382,10 @@ tar -cf backup.tar /usr/local/pgsql/data
|
|||||||
directories. This will <emphasis>not</> work because the
|
directories. This will <emphasis>not</> work because the
|
||||||
information contained in these files is not usable without
|
information contained in these files is not usable without
|
||||||
the commit log files,
|
the commit log files,
|
||||||
<filename>pg_clog/*</filename>, which contain the commit status of
|
<filename>pg_xact/*</filename>, which contain the commit status of
|
||||||
all transactions. A table file is only usable with this
|
all transactions. A table file is only usable with this
|
||||||
information. Of course it is also impossible to restore only a
|
information. Of course it is also impossible to restore only a
|
||||||
table and the associated <filename>pg_clog</filename> data
|
table and the associated <filename>pg_xact</filename> data
|
||||||
because that would render all other tables in the database
|
because that would render all other tables in the database
|
||||||
cluster useless. So file system backups only work for complete
|
cluster useless. So file system backups only work for complete
|
||||||
backup and restoration of an entire database cluster.
|
backup and restoration of an entire database cluster.
|
||||||
|
@ -1893,7 +1893,7 @@
|
|||||||
All transaction IDs before this one have been replaced with a permanent
|
All transaction IDs before this one have been replaced with a permanent
|
||||||
(<quote>frozen</>) transaction ID in this table. This is used to track
|
(<quote>frozen</>) transaction ID in this table. This is used to track
|
||||||
whether the table needs to be vacuumed in order to prevent transaction
|
whether the table needs to be vacuumed in order to prevent transaction
|
||||||
ID wraparound or to allow <literal>pg_clog</> to be shrunk. Zero
|
ID wraparound or to allow <literal>pg_xact</> to be shrunk. Zero
|
||||||
(<symbol>InvalidTransactionId</symbol>) if the relation is not a table.
|
(<symbol>InvalidTransactionId</symbol>) if the relation is not a table.
|
||||||
</entry>
|
</entry>
|
||||||
</row>
|
</row>
|
||||||
@ -2570,7 +2570,7 @@
|
|||||||
All transaction IDs before this one have been replaced with a permanent
|
All transaction IDs before this one have been replaced with a permanent
|
||||||
(<quote>frozen</>) transaction ID in this database. This is used to
|
(<quote>frozen</>) transaction ID in this database. This is used to
|
||||||
track whether the database needs to be vacuumed in order to prevent
|
track whether the database needs to be vacuumed in order to prevent
|
||||||
transaction ID wraparound or to allow <literal>pg_clog</> to be shrunk.
|
transaction ID wraparound or to allow <literal>pg_xact</> to be shrunk.
|
||||||
It is the minimum of the per-table
|
It is the minimum of the per-table
|
||||||
<structname>pg_class</>.<structfield>relfrozenxid</> values.
|
<structname>pg_class</>.<structfield>relfrozenxid</> values.
|
||||||
</entry>
|
</entry>
|
||||||
|
@ -6004,7 +6004,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
|
|||||||
|
|
||||||
<para>
|
<para>
|
||||||
Vacuum also allows removal of old files from the
|
Vacuum also allows removal of old files from the
|
||||||
<filename>pg_clog</> subdirectory, which is why the default
|
<filename>pg_xact</> subdirectory, which is why the default
|
||||||
is a relatively low 200 million transactions.
|
is a relatively low 200 million transactions.
|
||||||
This parameter can only be set at server start, but the setting
|
This parameter can only be set at server start, but the setting
|
||||||
can be reduced for individual tables by
|
can be reduced for individual tables by
|
||||||
|
@ -15616,7 +15616,7 @@ SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n);
|
|||||||
postmaster.pid | 9
|
postmaster.pid | 9
|
||||||
pg_ident.conf | 10
|
pg_ident.conf | 10
|
||||||
global | 11
|
global | 11
|
||||||
pg_clog | 12
|
pg_xact | 12
|
||||||
pg_snapshots | 13
|
pg_snapshots | 13
|
||||||
pg_multixact | 14
|
pg_multixact | 14
|
||||||
PG_VERSION | 15
|
PG_VERSION | 15
|
||||||
|
@ -527,18 +527,18 @@
|
|||||||
<para>
|
<para>
|
||||||
The sole disadvantage of increasing <varname>autovacuum_freeze_max_age</>
|
The sole disadvantage of increasing <varname>autovacuum_freeze_max_age</>
|
||||||
(and <varname>vacuum_freeze_table_age</> along with it)
|
(and <varname>vacuum_freeze_table_age</> along with it)
|
||||||
is that the <filename>pg_clog</> subdirectory of the database cluster
|
is that the <filename>pg_xact</> subdirectory of the database cluster
|
||||||
will take more space, because it must store the commit status of all
|
will take more space, because it must store the commit status of all
|
||||||
transactions back to the <varname>autovacuum_freeze_max_age</> horizon.
|
transactions back to the <varname>autovacuum_freeze_max_age</> horizon.
|
||||||
The commit status uses two bits per transaction, so if
|
The commit status uses two bits per transaction, so if
|
||||||
<varname>autovacuum_freeze_max_age</> is set to its maximum allowed
|
<varname>autovacuum_freeze_max_age</> is set to its maximum allowed
|
||||||
value of two billion, <filename>pg_clog</> can be expected to
|
value of two billion, <filename>pg_xact</> can be expected to
|
||||||
grow to about half a gigabyte. If this is trivial compared to your
|
grow to about half a gigabyte. If this is trivial compared to your
|
||||||
total database size, setting <varname>autovacuum_freeze_max_age</> to
|
total database size, setting <varname>autovacuum_freeze_max_age</> to
|
||||||
its maximum allowed value is recommended. Otherwise, set it depending
|
its maximum allowed value is recommended. Otherwise, set it depending
|
||||||
on what you are willing to allow for <filename>pg_clog</> storage.
|
on what you are willing to allow for <filename>pg_xact</> storage.
|
||||||
(The default, 200 million transactions, translates to about 50MB of
|
(The default, 200 million transactions, translates to about 50MB of
|
||||||
<filename>pg_clog</> storage.)
|
<filename>pg_xact</> storage.)
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
@ -256,12 +256,12 @@ PostgreSQL documentation
|
|||||||
|
|
||||||
<para>
|
<para>
|
||||||
A safe value can be determined by looking for the numerically largest
|
A safe value can be determined by looking for the numerically largest
|
||||||
file name in the directory <filename>pg_clog</> under the data directory,
|
file name in the directory <filename>pg_xact</> under the data directory,
|
||||||
adding one,
|
adding one,
|
||||||
and then multiplying by 1048576 (0x100000). Note that the file names are in
|
and then multiplying by 1048576 (0x100000). Note that the file names are in
|
||||||
hexadecimal. It is usually easiest to specify the option value in
|
hexadecimal. It is usually easiest to specify the option value in
|
||||||
hexadecimal too. For example, if <filename>0011</> is the largest entry
|
hexadecimal too. For example, if <filename>0011</> is the largest entry
|
||||||
in <filename>pg_clog</>, <literal>-x 0x1200000</> will work (five
|
in <filename>pg_xact</>, <literal>-x 0x1200000</> will work (five
|
||||||
trailing zeroes provide the proper multiplier).
|
trailing zeroes provide the proper multiplier).
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
@ -229,7 +229,7 @@ PostgreSQL documentation
|
|||||||
</step>
|
</step>
|
||||||
<step>
|
<step>
|
||||||
<para>
|
<para>
|
||||||
Copy all other files such as <filename>pg_clog</filename> and
|
Copy all other files such as <filename>pg_xact</filename> and
|
||||||
configuration files from the source cluster to the target cluster
|
configuration files from the source cluster to the target cluster
|
||||||
(everything except the relation files).
|
(everything except the relation files).
|
||||||
</para>
|
</para>
|
||||||
|
@ -77,11 +77,6 @@ Item
|
|||||||
<entry>Subdirectory containing transaction commit timestamp data</entry>
|
<entry>Subdirectory containing transaction commit timestamp data</entry>
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
<row>
|
|
||||||
<entry><filename>pg_clog</></entry>
|
|
||||||
<entry>Subdirectory containing transaction commit status data</entry>
|
|
||||||
</row>
|
|
||||||
|
|
||||||
<row>
|
<row>
|
||||||
<entry><filename>pg_dynshmem</></entry>
|
<entry><filename>pg_dynshmem</></entry>
|
||||||
<entry>Subdirectory containing files used by the dynamic shared memory
|
<entry>Subdirectory containing files used by the dynamic shared memory
|
||||||
@ -151,6 +146,11 @@ Item
|
|||||||
<entry>Subdirectory containing WAL (Write Ahead Log) files</entry>
|
<entry>Subdirectory containing WAL (Write Ahead Log) files</entry>
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
|
<row>
|
||||||
|
<entry><filename>pg_xact</></entry>
|
||||||
|
<entry>Subdirectory containing transaction commit status data</entry>
|
||||||
|
</row>
|
||||||
|
|
||||||
<row>
|
<row>
|
||||||
<entry><filename>postgresql.auto.conf</></entry>
|
<entry><filename>postgresql.auto.conf</></entry>
|
||||||
<entry>A file used for storing configuration parameters that are set by
|
<entry>A file used for storing configuration parameters that are set by
|
||||||
|
@ -201,7 +201,7 @@
|
|||||||
</listitem>
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
Internal data structures such as <filename>pg_clog</filename>, <filename>pg_subtrans</filename>, <filename>pg_multixact</filename>,
|
Internal data structures such as <filename>pg_xact</filename>, <filename>pg_subtrans</filename>, <filename>pg_multixact</filename>,
|
||||||
<filename>pg_serial</filename>, <filename>pg_notify</filename>, <filename>pg_stat</filename>, <filename>pg_snapshots</filename> are not directly
|
<filename>pg_serial</filename>, <filename>pg_notify</filename>, <filename>pg_stat</filename>, <filename>pg_snapshots</filename> are not directly
|
||||||
checksummed, nor are pages protected by full page writes. However, where
|
checksummed, nor are pages protected by full page writes. However, where
|
||||||
such data structures are persistent, WAL records are written that allow
|
such data structures are persistent, WAL records are written that allow
|
||||||
|
@ -6790,8 +6790,8 @@ heap_prepare_freeze_tuple(HeapTupleHeader tuple, TransactionId cutoff_xid,
|
|||||||
* Note: it might seem we could make the changes without exclusive lock, since
|
* Note: it might seem we could make the changes without exclusive lock, since
|
||||||
* TransactionId read/write is assumed atomic anyway. However there is a race
|
* TransactionId read/write is assumed atomic anyway. However there is a race
|
||||||
* condition: someone who just fetched an old XID that we overwrite here could
|
* condition: someone who just fetched an old XID that we overwrite here could
|
||||||
* conceivably not finish checking the XID against pg_clog before we finish
|
* conceivably not finish checking the XID against pg_xact before we finish
|
||||||
* the VACUUM and perhaps truncate off the part of pg_clog he needs. Getting
|
* the VACUUM and perhaps truncate off the part of pg_xact he needs. Getting
|
||||||
* exclusive lock ensures no other backend is in process of checking the
|
* exclusive lock ensures no other backend is in process of checking the
|
||||||
* tuple status. Also, getting exclusive lock makes it safe to adjust the
|
* tuple status. Also, getting exclusive lock makes it safe to adjust the
|
||||||
* infomask bits.
|
* infomask bits.
|
||||||
|
@ -331,17 +331,17 @@ of the xid fields is atomic, so assuming it for xmin as well is no extra
|
|||||||
risk.
|
risk.
|
||||||
|
|
||||||
|
|
||||||
pg_clog and pg_subtrans
|
pg_xact and pg_subtrans
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
pg_clog and pg_subtrans are permanent (on-disk) storage of transaction related
|
pg_xact and pg_subtrans are permanent (on-disk) storage of transaction related
|
||||||
information. There is a limited number of pages of each kept in memory, so
|
information. There is a limited number of pages of each kept in memory, so
|
||||||
in many cases there is no need to actually read from disk. However, if
|
in many cases there is no need to actually read from disk. However, if
|
||||||
there's a long running transaction or a backend sitting idle with an open
|
there's a long running transaction or a backend sitting idle with an open
|
||||||
transaction, it may be necessary to be able to read and write this information
|
transaction, it may be necessary to be able to read and write this information
|
||||||
from disk. They also allow information to be permanent across server restarts.
|
from disk. They also allow information to be permanent across server restarts.
|
||||||
|
|
||||||
pg_clog records the commit status for each transaction that has been assigned
|
pg_xact records the commit status for each transaction that has been assigned
|
||||||
an XID. A transaction can be in progress, committed, aborted, or
|
an XID. A transaction can be in progress, committed, aborted, or
|
||||||
"sub-committed". This last state means that it's a subtransaction that's no
|
"sub-committed". This last state means that it's a subtransaction that's no
|
||||||
longer running, but its parent has not updated its state yet. It is not
|
longer running, but its parent has not updated its state yet. It is not
|
||||||
@ -381,9 +381,9 @@ each transaction we keep a "cache" of Xids that are known to be part of the
|
|||||||
transaction tree, so we can skip looking at pg_subtrans unless we know the
|
transaction tree, so we can skip looking at pg_subtrans unless we know the
|
||||||
cache has been overflowed. See storage/ipc/procarray.c for the gory details.
|
cache has been overflowed. See storage/ipc/procarray.c for the gory details.
|
||||||
|
|
||||||
slru.c is the supporting mechanism for both pg_clog and pg_subtrans. It
|
slru.c is the supporting mechanism for both pg_xact and pg_subtrans. It
|
||||||
implements the LRU policy for in-memory buffer pages. The high-level routines
|
implements the LRU policy for in-memory buffer pages. The high-level routines
|
||||||
for pg_clog are implemented in transam.c, while the low-level functions are in
|
for pg_xact are implemented in transam.c, while the low-level functions are in
|
||||||
clog.c. pg_subtrans is contained completely in subtrans.c.
|
clog.c. pg_subtrans is contained completely in subtrans.c.
|
||||||
|
|
||||||
|
|
||||||
|
@ -450,7 +450,7 @@ CLOGShmemInit(void)
|
|||||||
{
|
{
|
||||||
ClogCtl->PagePrecedes = CLOGPagePrecedes;
|
ClogCtl->PagePrecedes = CLOGPagePrecedes;
|
||||||
SimpleLruInit(ClogCtl, "clog", CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE,
|
SimpleLruInit(ClogCtl, "clog", CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE,
|
||||||
CLogControlLock, "pg_clog", LWTRANCHE_CLOG_BUFFERS);
|
CLogControlLock, "pg_xact", LWTRANCHE_CLOG_BUFFERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
* commit_ts.c
|
* commit_ts.c
|
||||||
* PostgreSQL commit timestamp manager
|
* PostgreSQL commit timestamp manager
|
||||||
*
|
*
|
||||||
* This module is a pg_clog-like system that stores the commit timestamp
|
* This module is a pg_xact-like system that stores the commit timestamp
|
||||||
* for each transaction.
|
* for each transaction.
|
||||||
*
|
*
|
||||||
* XLOG interactions: this module generates an XLOG record whenever a new
|
* XLOG interactions: this module generates an XLOG record whenever a new
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
* multixact.c
|
* multixact.c
|
||||||
* PostgreSQL multi-transaction-log manager
|
* PostgreSQL multi-transaction-log manager
|
||||||
*
|
*
|
||||||
* The pg_multixact manager is a pg_clog-like manager that stores an array of
|
* The pg_multixact manager is a pg_xact-like manager that stores an array of
|
||||||
* MultiXactMember for each MultiXactId. It is a fundamental part of the
|
* MultiXactMember for each MultiXactId. It is a fundamental part of the
|
||||||
* shared-row-lock implementation. Each MultiXactMember is comprised of a
|
* shared-row-lock implementation. Each MultiXactMember is comprised of a
|
||||||
* TransactionId and a set of flag bits. The name is a bit historical:
|
* TransactionId and a set of flag bits. The name is a bit historical:
|
||||||
|
@ -3,15 +3,14 @@
|
|||||||
* subtrans.c
|
* subtrans.c
|
||||||
* PostgreSQL subtransaction-log manager
|
* PostgreSQL subtransaction-log manager
|
||||||
*
|
*
|
||||||
* The pg_subtrans manager is a pg_clog-like manager that stores the parent
|
* The pg_subtrans manager is a pg_xact-like manager that stores the parent
|
||||||
* transaction Id for each transaction. It is a fundamental part of the
|
* transaction Id for each transaction. It is a fundamental part of the
|
||||||
* nested transactions implementation. A main transaction has a parent
|
* nested transactions implementation. A main transaction has a parent
|
||||||
* of InvalidTransactionId, and each subtransaction has its immediate parent.
|
* of InvalidTransactionId, and each subtransaction has its immediate parent.
|
||||||
* The tree can easily be walked from child to parent, but not in the
|
* The tree can easily be walked from child to parent, but not in the
|
||||||
* opposite direction.
|
* opposite direction.
|
||||||
*
|
*
|
||||||
* This code is based on clog.c, but the robustness requirements
|
* are completely different from pg_xact, because we only need to remember
|
||||||
* are completely different from pg_clog, because we only need to remember
|
|
||||||
* pg_subtrans information for currently-open transactions. Thus, there is
|
* pg_subtrans information for currently-open transactions. Thus, there is
|
||||||
* no need to preserve data over a crash and restart.
|
* no need to preserve data over a crash and restart.
|
||||||
*
|
*
|
||||||
|
@ -224,7 +224,7 @@ TransactionIdDidAbort(TransactionId transactionId)
|
|||||||
* True iff transaction associated with the identifier is currently
|
* True iff transaction associated with the identifier is currently
|
||||||
* known to have either committed or aborted.
|
* known to have either committed or aborted.
|
||||||
*
|
*
|
||||||
* This does NOT look into pg_clog but merely probes our local cache
|
* This does NOT look into pg_xact but merely probes our local cache
|
||||||
* (and so it's not named TransactionIdDidComplete, which would be the
|
* (and so it's not named TransactionIdDidComplete, which would be the
|
||||||
* appropriate name for a function that worked that way). The intended
|
* appropriate name for a function that worked that way). The intended
|
||||||
* use is just to short-circuit TransactionIdIsInProgress calls when doing
|
* use is just to short-circuit TransactionIdIsInProgress calls when doing
|
||||||
|
@ -1379,7 +1379,7 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
|
|||||||
/*
|
/*
|
||||||
* The order of operations here is critical: make the XLOG entry for
|
* The order of operations here is critical: make the XLOG entry for
|
||||||
* commit or abort, then mark the transaction committed or aborted in
|
* commit or abort, then mark the transaction committed or aborted in
|
||||||
* pg_clog, then remove its PGPROC from the global ProcArray (which means
|
* pg_xact, then remove its PGPROC from the global ProcArray (which means
|
||||||
* TransactionIdIsInProgress will stop saying the prepared xact is in
|
* TransactionIdIsInProgress will stop saying the prepared xact is in
|
||||||
* progress), then run the post-commit or post-abort callbacks. The
|
* progress), then run the post-commit or post-abort callbacks. The
|
||||||
* callbacks will release the locks the transaction held.
|
* callbacks will release the locks the transaction held.
|
||||||
@ -2093,7 +2093,7 @@ RecordTransactionCommitPrepared(TransactionId xid,
|
|||||||
/* Flush XLOG to disk */
|
/* Flush XLOG to disk */
|
||||||
XLogFlush(recptr);
|
XLogFlush(recptr);
|
||||||
|
|
||||||
/* Mark the transaction committed in pg_clog */
|
/* Mark the transaction committed in pg_xact */
|
||||||
TransactionIdCommitTree(xid, nchildren, children);
|
TransactionIdCommitTree(xid, nchildren, children);
|
||||||
|
|
||||||
/* Checkpoint can proceed now */
|
/* Checkpoint can proceed now */
|
||||||
|
@ -1208,8 +1208,8 @@ RecordTransactionCommit(void)
|
|||||||
/*
|
/*
|
||||||
* Mark ourselves as within our "commit critical section". This
|
* Mark ourselves as within our "commit critical section". This
|
||||||
* forces any concurrent checkpoint to wait until we've updated
|
* forces any concurrent checkpoint to wait until we've updated
|
||||||
* pg_clog. Without this, it is possible for the checkpoint to set
|
* pg_xact. Without this, it is possible for the checkpoint to set
|
||||||
* REDO after the XLOG record but fail to flush the pg_clog update to
|
* REDO after the XLOG record but fail to flush the pg_xact update to
|
||||||
* disk, leading to loss of the transaction commit if the system
|
* disk, leading to loss of the transaction commit if the system
|
||||||
* crashes a little later.
|
* crashes a little later.
|
||||||
*
|
*
|
||||||
@ -2035,7 +2035,7 @@ CommitTransaction(void)
|
|||||||
if (!is_parallel_worker)
|
if (!is_parallel_worker)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We need to mark our XIDs as committed in pg_clog. This is where we
|
* We need to mark our XIDs as committed in pg_xact. This is where we
|
||||||
* durably commit.
|
* durably commit.
|
||||||
*/
|
*/
|
||||||
latestXid = RecordTransactionCommit();
|
latestXid = RecordTransactionCommit();
|
||||||
@ -2545,7 +2545,7 @@ AbortTransaction(void)
|
|||||||
AtAbort_Twophase();
|
AtAbort_Twophase();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Advertise the fact that we aborted in pg_clog (assuming that we got as
|
* Advertise the fact that we aborted in pg_xact (assuming that we got as
|
||||||
* far as assigning an XID to advertise). But if we're inside a parallel
|
* far as assigning an XID to advertise). But if we're inside a parallel
|
||||||
* worker, skip this; the user backend must be the one to write the abort
|
* worker, skip this; the user backend must be the one to write the abort
|
||||||
* record.
|
* record.
|
||||||
@ -4631,7 +4631,7 @@ AbortSubTransaction(void)
|
|||||||
s->parent->subTransactionId);
|
s->parent->subTransactionId);
|
||||||
AtSubAbort_Notify();
|
AtSubAbort_Notify();
|
||||||
|
|
||||||
/* Advertise the fact that we aborted in pg_clog. */
|
/* Advertise the fact that we aborted in pg_xact. */
|
||||||
(void) RecordTransactionAbort(true);
|
(void) RecordTransactionAbort(true);
|
||||||
|
|
||||||
/* Post-abort cleanup */
|
/* Post-abort cleanup */
|
||||||
@ -5375,7 +5375,7 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
|
|||||||
if (standbyState == STANDBY_DISABLED)
|
if (standbyState == STANDBY_DISABLED)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Mark the transaction committed in pg_clog.
|
* Mark the transaction committed in pg_xact.
|
||||||
*/
|
*/
|
||||||
TransactionIdCommitTree(xid, parsed->nsubxacts, parsed->subxacts);
|
TransactionIdCommitTree(xid, parsed->nsubxacts, parsed->subxacts);
|
||||||
}
|
}
|
||||||
@ -5393,7 +5393,7 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
|
|||||||
RecordKnownAssignedTransactionIds(max_xid);
|
RecordKnownAssignedTransactionIds(max_xid);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mark the transaction committed in pg_clog. We use async commit
|
* Mark the transaction committed in pg_xact. We use async commit
|
||||||
* protocol during recovery to provide information on database
|
* protocol during recovery to provide information on database
|
||||||
* consistency for when users try to set hint bits. It is important
|
* consistency for when users try to set hint bits. It is important
|
||||||
* that we do not set hint bits until the minRecoveryPoint is past
|
* that we do not set hint bits until the minRecoveryPoint is past
|
||||||
@ -5530,7 +5530,7 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
|
|||||||
|
|
||||||
if (standbyState == STANDBY_DISABLED)
|
if (standbyState == STANDBY_DISABLED)
|
||||||
{
|
{
|
||||||
/* Mark the transaction aborted in pg_clog, no need for async stuff */
|
/* Mark the transaction aborted in pg_xact, no need for async stuff */
|
||||||
TransactionIdAbortTree(xid, parsed->nsubxacts, parsed->subxacts);
|
TransactionIdAbortTree(xid, parsed->nsubxacts, parsed->subxacts);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -5546,7 +5546,7 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
|
|||||||
*/
|
*/
|
||||||
RecordKnownAssignedTransactionIds(max_xid);
|
RecordKnownAssignedTransactionIds(max_xid);
|
||||||
|
|
||||||
/* Mark the transaction aborted in pg_clog, no need for async stuff */
|
/* Mark the transaction aborted in pg_xact, no need for async stuff */
|
||||||
TransactionIdAbortTree(xid, parsed->nsubxacts, parsed->subxacts);
|
TransactionIdAbortTree(xid, parsed->nsubxacts, parsed->subxacts);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -8710,7 +8710,7 @@ CreateCheckPoint(int flags)
|
|||||||
* that are currently in commit critical sections. If an xact inserted
|
* that are currently in commit critical sections. If an xact inserted
|
||||||
* its commit record into XLOG just before the REDO point, then a crash
|
* its commit record into XLOG just before the REDO point, then a crash
|
||||||
* restart from the REDO point would not replay that record, which means
|
* restart from the REDO point would not replay that record, which means
|
||||||
* that our flushing had better include the xact's update of pg_clog. So
|
* that our flushing had better include the xact's update of pg_xact. So
|
||||||
* we wait till he's out of his commit critical section before proceeding.
|
* we wait till he's out of his commit critical section before proceeding.
|
||||||
* See notes in RecordTransactionCommit().
|
* See notes in RecordTransactionCommit().
|
||||||
*
|
*
|
||||||
|
@ -357,7 +357,7 @@ vacuum(int options, RangeVar *relation, Oid relid, VacuumParams *params,
|
|||||||
if ((options & VACOPT_VACUUM) && !IsAutoVacuumWorkerProcess())
|
if ((options & VACOPT_VACUUM) && !IsAutoVacuumWorkerProcess())
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Update pg_database.datfrozenxid, and truncate pg_clog if possible.
|
* Update pg_database.datfrozenxid, and truncate pg_xact if possible.
|
||||||
* (autovacuum.c does this for itself.)
|
* (autovacuum.c does this for itself.)
|
||||||
*/
|
*/
|
||||||
vac_update_datfrozenxid();
|
vac_update_datfrozenxid();
|
||||||
@ -910,7 +910,7 @@ vac_update_relstats(Relation relation,
|
|||||||
* pg_class.relminmxid values.
|
* pg_class.relminmxid values.
|
||||||
*
|
*
|
||||||
* If we are able to advance either pg_database value, also try to
|
* If we are able to advance either pg_database value, also try to
|
||||||
* truncate pg_clog and pg_multixact.
|
* truncate pg_xact and pg_multixact.
|
||||||
*
|
*
|
||||||
* We violate transaction semantics here by overwriting the database's
|
* We violate transaction semantics here by overwriting the database's
|
||||||
* existing pg_database tuple with the new values. This is reasonably
|
* existing pg_database tuple with the new values. This is reasonably
|
||||||
@ -1056,7 +1056,7 @@ vac_update_datfrozenxid(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* If we were able to advance datfrozenxid or datminmxid, see if we can
|
* If we were able to advance datfrozenxid or datminmxid, see if we can
|
||||||
* truncate pg_clog and/or pg_multixact. Also do it if the shared
|
* truncate pg_xact and/or pg_multixact. Also do it if the shared
|
||||||
* XID-wrap-limit info is stale, since this action will update that too.
|
* XID-wrap-limit info is stale, since this action will update that too.
|
||||||
*/
|
*/
|
||||||
if (dirty || ForceTransactionIdLimitUpdate())
|
if (dirty || ForceTransactionIdLimitUpdate())
|
||||||
@ -1069,7 +1069,7 @@ vac_update_datfrozenxid(void)
|
|||||||
* vac_truncate_clog() -- attempt to truncate the commit log
|
* vac_truncate_clog() -- attempt to truncate the commit log
|
||||||
*
|
*
|
||||||
* Scan pg_database to determine the system-wide oldest datfrozenxid,
|
* Scan pg_database to determine the system-wide oldest datfrozenxid,
|
||||||
* and use it to truncate the transaction commit log (pg_clog).
|
* and use it to truncate the transaction commit log (pg_xact).
|
||||||
* Also update the XID wrap limit info maintained by varsup.c.
|
* Also update the XID wrap limit info maintained by varsup.c.
|
||||||
* Likewise for datminmxid.
|
* Likewise for datminmxid.
|
||||||
*
|
*
|
||||||
@ -1116,7 +1116,7 @@ vac_truncate_clog(TransactionId frozenXID,
|
|||||||
* of the interlock against copying a DB containing an active backend.
|
* of the interlock against copying a DB containing an active backend.
|
||||||
* Hence the new entry will not reduce the minimum. Also, if two VACUUMs
|
* Hence the new entry will not reduce the minimum. Also, if two VACUUMs
|
||||||
* concurrently modify the datfrozenxid's of different databases, the
|
* concurrently modify the datfrozenxid's of different databases, the
|
||||||
* worst possible outcome is that pg_clog is not truncated as aggressively
|
* worst possible outcome is that pg_xact is not truncated as aggressively
|
||||||
* as it could be.
|
* as it could be.
|
||||||
*/
|
*/
|
||||||
relation = heap_open(DatabaseRelationId, AccessShareLock);
|
relation = heap_open(DatabaseRelationId, AccessShareLock);
|
||||||
|
@ -2472,7 +2472,7 @@ deleted:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update pg_database.datfrozenxid, and truncate pg_clog if possible. We
|
* Update pg_database.datfrozenxid, and truncate pg_xact if possible. We
|
||||||
* only need to do this once, not after each table.
|
* only need to do this once, not after each table.
|
||||||
*
|
*
|
||||||
* Even if we didn't vacuum anything, it may still be important to do
|
* Even if we didn't vacuum anything, it may still be important to do
|
||||||
|
@ -63,7 +63,7 @@ at about the same time would OR the same bits into the field, so there
|
|||||||
is little or no risk of conflicting update; what's more, if there did
|
is little or no risk of conflicting update; what's more, if there did
|
||||||
manage to be a conflict it would merely mean that one bit-update would
|
manage to be a conflict it would merely mean that one bit-update would
|
||||||
be lost and need to be done again later. These four bits are only hints
|
be lost and need to be done again later. These four bits are only hints
|
||||||
(they cache the results of transaction status lookups in pg_clog), so no
|
(they cache the results of transaction status lookups in pg_xact), so no
|
||||||
great harm is done if they get reset to zero by conflicting updates.
|
great harm is done if they get reset to zero by conflicting updates.
|
||||||
Note, however, that a tuple is frozen by setting both HEAP_XMIN_INVALID
|
Note, however, that a tuple is frozen by setting both HEAP_XMIN_INVALID
|
||||||
and HEAP_XMIN_COMMITTED; this is a critical update and accordingly requires
|
and HEAP_XMIN_COMMITTED; this is a critical update and accordingly requires
|
||||||
|
@ -381,7 +381,7 @@ ProcArrayRemove(PGPROC *proc, TransactionId latestXid)
|
|||||||
* ProcArrayEndTransaction -- mark a transaction as no longer running
|
* ProcArrayEndTransaction -- mark a transaction as no longer running
|
||||||
*
|
*
|
||||||
* This is used interchangeably for commit and abort cases. The transaction
|
* This is used interchangeably for commit and abort cases. The transaction
|
||||||
* commit/abort must already be reported to WAL and pg_clog.
|
* commit/abort must already be reported to WAL and pg_xact.
|
||||||
*
|
*
|
||||||
* proc is currently always MyProc, but we pass it explicitly for flexibility.
|
* proc is currently always MyProc, but we pass it explicitly for flexibility.
|
||||||
* latestXid is the latest Xid among the transaction's main XID and
|
* latestXid is the latest Xid among the transaction's main XID and
|
||||||
@ -1174,7 +1174,7 @@ TransactionIdIsInProgress(TransactionId xid)
|
|||||||
* At this point, we know it's either a subtransaction of one of the Xids
|
* At this point, we know it's either a subtransaction of one of the Xids
|
||||||
* in xids[], or it's not running. If it's an already-failed
|
* in xids[], or it's not running. If it's an already-failed
|
||||||
* subtransaction, we want to say "not running" even though its parent may
|
* subtransaction, we want to say "not running" even though its parent may
|
||||||
* still be running. So first, check pg_clog to see if it's been aborted.
|
* still be running. So first, check pg_xact to see if it's been aborted.
|
||||||
*/
|
*/
|
||||||
xc_slow_answer_inc();
|
xc_slow_answer_inc();
|
||||||
|
|
||||||
|
@ -13,9 +13,9 @@
|
|||||||
* NOTE: When using a non-MVCC snapshot, we must check
|
* NOTE: When using a non-MVCC snapshot, we must check
|
||||||
* TransactionIdIsInProgress (which looks in the PGXACT array)
|
* TransactionIdIsInProgress (which looks in the PGXACT array)
|
||||||
* before TransactionIdDidCommit/TransactionIdDidAbort (which look in
|
* before TransactionIdDidCommit/TransactionIdDidAbort (which look in
|
||||||
* pg_clog). Otherwise we have a race condition: we might decide that a
|
* pg_xact). Otherwise we have a race condition: we might decide that a
|
||||||
* just-committed transaction crashed, because none of the tests succeed.
|
* just-committed transaction crashed, because none of the tests succeed.
|
||||||
* xact.c is careful to record commit/abort in pg_clog before it unsets
|
* xact.c is careful to record commit/abort in pg_xact before it unsets
|
||||||
* MyPgXact->xid in the PGXACT array. That fixes that problem, but it
|
* MyPgXact->xid in the PGXACT array. That fixes that problem, but it
|
||||||
* also means there is a window where TransactionIdIsInProgress and
|
* also means there is a window where TransactionIdIsInProgress and
|
||||||
* TransactionIdDidCommit will both return true. If we check only
|
* TransactionIdDidCommit will both return true. If we check only
|
||||||
@ -29,7 +29,7 @@
|
|||||||
*
|
*
|
||||||
* When using an MVCC snapshot, we rely on XidInMVCCSnapshot rather than
|
* When using an MVCC snapshot, we rely on XidInMVCCSnapshot rather than
|
||||||
* TransactionIdIsInProgress, but the logic is otherwise the same: do not
|
* TransactionIdIsInProgress, but the logic is otherwise the same: do not
|
||||||
* check pg_clog until after deciding that the xact is no longer in progress.
|
* check pg_xact until after deciding that the xact is no longer in progress.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Summary of visibility functions:
|
* Summary of visibility functions:
|
||||||
|
@ -197,7 +197,6 @@ static const char *backend_options = "--single -F -O -j -c search_path=pg_catalo
|
|||||||
static const char *const subdirs[] = {
|
static const char *const subdirs[] = {
|
||||||
"global",
|
"global",
|
||||||
"pg_wal/archive_status",
|
"pg_wal/archive_status",
|
||||||
"pg_clog",
|
|
||||||
"pg_commit_ts",
|
"pg_commit_ts",
|
||||||
"pg_dynshmem",
|
"pg_dynshmem",
|
||||||
"pg_notify",
|
"pg_notify",
|
||||||
@ -214,6 +213,7 @@ static const char *const subdirs[] = {
|
|||||||
"pg_tblspc",
|
"pg_tblspc",
|
||||||
"pg_stat",
|
"pg_stat",
|
||||||
"pg_stat_tmp",
|
"pg_stat_tmp",
|
||||||
|
"pg_xact",
|
||||||
"pg_logical",
|
"pg_logical",
|
||||||
"pg_logical/snapshots",
|
"pg_logical/snapshots",
|
||||||
"pg_logical/mappings"
|
"pg_logical/mappings"
|
||||||
|
@ -338,11 +338,17 @@ check_data_dir(ClusterInfo *cluster)
|
|||||||
check_single_dir(pg_data, "pg_tblspc");
|
check_single_dir(pg_data, "pg_tblspc");
|
||||||
check_single_dir(pg_data, "pg_twophase");
|
check_single_dir(pg_data, "pg_twophase");
|
||||||
|
|
||||||
/* pg_xlog has been renamed to pg_wal in post-10 cluster */
|
/* pg_xlog has been renamed to pg_wal in v10 */
|
||||||
if (GET_MAJOR_VERSION(cluster->major_version) < 1000)
|
if (GET_MAJOR_VERSION(cluster->major_version) < 1000)
|
||||||
check_single_dir(pg_data, "pg_xlog");
|
check_single_dir(pg_data, "pg_xlog");
|
||||||
else
|
else
|
||||||
check_single_dir(pg_data, "pg_wal");
|
check_single_dir(pg_data, "pg_wal");
|
||||||
|
|
||||||
|
/* pg_clog has been renamed to pg_xact in v10 */
|
||||||
|
if (GET_MAJOR_VERSION(cluster->major_version) < 1000)
|
||||||
|
check_single_dir(pg_data, "pg_clog");
|
||||||
|
else
|
||||||
|
check_single_dir(pg_data, "pg_xact");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
static void prepare_new_cluster(void);
|
static void prepare_new_cluster(void);
|
||||||
static void prepare_new_databases(void);
|
static void prepare_new_databases(void);
|
||||||
static void create_new_objects(void);
|
static void create_new_objects(void);
|
||||||
static void copy_clog_xlog_xid(void);
|
static void copy_xact_xlog_xid(void);
|
||||||
static void set_frozenxids(bool minmxid_only);
|
static void set_frozenxids(bool minmxid_only);
|
||||||
static void setup(char *argv0, bool *live_check);
|
static void setup(char *argv0, bool *live_check);
|
||||||
static void cleanup(void);
|
static void cleanup(void);
|
||||||
@ -115,7 +115,7 @@ main(int argc, char **argv)
|
|||||||
* Destructive Changes to New Cluster
|
* Destructive Changes to New Cluster
|
||||||
*/
|
*/
|
||||||
|
|
||||||
copy_clog_xlog_xid();
|
copy_xact_xlog_xid();
|
||||||
|
|
||||||
/* New now using xids of the old system */
|
/* New now using xids of the old system */
|
||||||
|
|
||||||
@ -376,17 +376,17 @@ remove_new_subdir(char *subdir, bool rmtopdir)
|
|||||||
* Copy the files from the old cluster into it
|
* Copy the files from the old cluster into it
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
copy_subdir_files(char *subdir)
|
copy_subdir_files(char *old_subdir, char *new_subdir)
|
||||||
{
|
{
|
||||||
char old_path[MAXPGPATH];
|
char old_path[MAXPGPATH];
|
||||||
char new_path[MAXPGPATH];
|
char new_path[MAXPGPATH];
|
||||||
|
|
||||||
remove_new_subdir(subdir, true);
|
remove_new_subdir(new_subdir, true);
|
||||||
|
|
||||||
snprintf(old_path, sizeof(old_path), "%s/%s", old_cluster.pgdata, subdir);
|
snprintf(old_path, sizeof(old_path), "%s/%s", old_cluster.pgdata, old_subdir);
|
||||||
snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, subdir);
|
snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, new_subdir);
|
||||||
|
|
||||||
prep_status("Copying old %s to new server", subdir);
|
prep_status("Copying old %s to new server", old_subdir);
|
||||||
|
|
||||||
exec_prog(UTILITY_LOG_FILE, NULL, true,
|
exec_prog(UTILITY_LOG_FILE, NULL, true,
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
@ -401,10 +401,16 @@ copy_subdir_files(char *subdir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
copy_clog_xlog_xid(void)
|
copy_xact_xlog_xid(void)
|
||||||
{
|
{
|
||||||
/* copy old commit logs to new data dir */
|
/*
|
||||||
copy_subdir_files("pg_clog");
|
* Copy old commit logs to new data dir. pg_clog has been renamed to
|
||||||
|
* pg_xact in post-10 clusters.
|
||||||
|
*/
|
||||||
|
copy_subdir_files(GET_MAJOR_VERSION(old_cluster.major_version) < 1000 ?
|
||||||
|
"pg_clog" : "pg_xact",
|
||||||
|
GET_MAJOR_VERSION(new_cluster.major_version) < 1000 ?
|
||||||
|
"pg_clog" : "pg_xact");
|
||||||
|
|
||||||
/* set the next transaction id and epoch of the new cluster */
|
/* set the next transaction id and epoch of the new cluster */
|
||||||
prep_status("Setting next transaction ID and epoch for new cluster");
|
prep_status("Setting next transaction ID and epoch for new cluster");
|
||||||
@ -434,8 +440,8 @@ copy_clog_xlog_xid(void)
|
|||||||
if (old_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER &&
|
if (old_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER &&
|
||||||
new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
|
new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
|
||||||
{
|
{
|
||||||
copy_subdir_files("pg_multixact/offsets");
|
copy_subdir_files("pg_multixact/offsets", "pg_multixact/offsets");
|
||||||
copy_subdir_files("pg_multixact/members");
|
copy_subdir_files("pg_multixact/members", "pg_multixact/members");
|
||||||
|
|
||||||
prep_status("Setting next multixact ID and offset for new cluster");
|
prep_status("Setting next multixact ID and offset for new cluster");
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ typedef struct SlruSharedData
|
|||||||
/*
|
/*
|
||||||
* Optional array of WAL flush LSNs associated with entries in the SLRU
|
* Optional array of WAL flush LSNs associated with entries in the SLRU
|
||||||
* pages. If not zero/NULL, we must flush WAL before writing pages (true
|
* pages. If not zero/NULL, we must flush WAL before writing pages (true
|
||||||
* for pg_clog, false for multixact, pg_subtrans, pg_notify). group_lsn[]
|
* for pg_xact, false for multixact, pg_subtrans, pg_notify). group_lsn[]
|
||||||
* has lsn_groups_per_page entries per buffer slot, each containing the
|
* has lsn_groups_per_page entries per buffer slot, each containing the
|
||||||
* highest LSN known for a contiguous group of SLRU entries on that slot's
|
* highest LSN known for a contiguous group of SLRU entries on that slot's
|
||||||
* page.
|
* page.
|
||||||
@ -119,7 +119,7 @@ typedef struct SlruCtlData
|
|||||||
SlruShared shared;
|
SlruShared shared;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This flag tells whether to fsync writes (true for pg_clog and multixact
|
* This flag tells whether to fsync writes (true for pg_xact and multixact
|
||||||
* stuff, false for pg_subtrans and pg_notify).
|
* stuff, false for pg_subtrans and pg_notify).
|
||||||
*/
|
*/
|
||||||
bool do_fsync;
|
bool do_fsync;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user