summaryrefslogtreecommitdiffstats
path: root/src/bin/pg_upgrade
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_upgrade')
-rw-r--r--src/bin/pg_upgrade/.gitignore9
-rw-r--r--src/bin/pg_upgrade/IMPLEMENTATION98
-rw-r--r--src/bin/pg_upgrade/Makefile65
-rw-r--r--src/bin/pg_upgrade/TESTING89
-rw-r--r--src/bin/pg_upgrade/check.c1486
-rw-r--r--src/bin/pg_upgrade/controldata.c724
-rw-r--r--src/bin/pg_upgrade/dump.c69
-rw-r--r--src/bin/pg_upgrade/exec.c452
-rw-r--r--src/bin/pg_upgrade/file.c376
-rw-r--r--src/bin/pg_upgrade/function.c271
-rw-r--r--src/bin/pg_upgrade/info.c649
-rw-r--r--src/bin/pg_upgrade/nls.mk12
-rw-r--r--src/bin/pg_upgrade/option.c536
-rw-r--r--src/bin/pg_upgrade/parallel.c347
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.c712
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.h465
-rw-r--r--src/bin/pg_upgrade/po/cs.po1804
-rw-r--r--src/bin/pg_upgrade/po/de.po1927
-rw-r--r--src/bin/pg_upgrade/po/es.po1934
-rw-r--r--src/bin/pg_upgrade/po/fr.po2029
-rw-r--r--src/bin/pg_upgrade/po/ja.po1923
-rw-r--r--src/bin/pg_upgrade/po/ko.po1889
-rw-r--r--src/bin/pg_upgrade/po/ru.po2169
-rw-r--r--src/bin/pg_upgrade/po/sv.po1925
-rw-r--r--src/bin/pg_upgrade/po/tr.po1666
-rw-r--r--src/bin/pg_upgrade/po/uk.po1721
-rw-r--r--src/bin/pg_upgrade/po/zh_CN.po1850
-rw-r--r--src/bin/pg_upgrade/relfilenode.c271
-rw-r--r--src/bin/pg_upgrade/server.c387
-rw-r--r--src/bin/pg_upgrade/tablespace.c119
-rw-r--r--src/bin/pg_upgrade/test.sh282
-rw-r--r--src/bin/pg_upgrade/upgrade_adapt.sql91
-rw-r--r--src/bin/pg_upgrade/util.c243
-rw-r--r--src/bin/pg_upgrade/version.c548
34 files changed, 29138 insertions, 0 deletions
diff --git a/src/bin/pg_upgrade/.gitignore b/src/bin/pg_upgrade/.gitignore
new file mode 100644
index 0000000..2d3bfea
--- /dev/null
+++ b/src/bin/pg_upgrade/.gitignore
@@ -0,0 +1,9 @@
+/pg_upgrade
+# Generated by test suite
+/pg_upgrade_internal.log
+/delete_old_cluster.sh
+/delete_old_cluster.bat
+/reindex_hash.sql
+/loadable_libraries.txt
+/log/
+/tmp_check/
diff --git a/src/bin/pg_upgrade/IMPLEMENTATION b/src/bin/pg_upgrade/IMPLEMENTATION
new file mode 100644
index 0000000..69fcd70
--- /dev/null
+++ b/src/bin/pg_upgrade/IMPLEMENTATION
@@ -0,0 +1,98 @@
+------------------------------------------------------------------------------
+PG_UPGRADE: IN-PLACE UPGRADES FOR POSTGRESQL
+------------------------------------------------------------------------------
+
+Upgrading a PostgreSQL database from one major release to another can be
+an expensive process. For minor upgrades, you can simply install new
+executables and forget about upgrading existing data. But for major
+upgrades, you have to export all of your data using pg_dump, install the
+new release, run initdb to create a new cluster, and then import your
+old data. If you have a lot of data, that can take a considerable amount
+of time. If you have too much data, you may have to buy more storage
+since you need enough room to hold the original data plus the exported
+data. pg_upgrade can reduce the amount of time and disk space required
+for many upgrades.
+
+The URL http://momjian.us/main/writings/pgsql/pg_upgrade.pdf contains a
+presentation about pg_upgrade internals that mirrors the text
+description below.
+
+------------------------------------------------------------------------------
+WHAT IT DOES
+------------------------------------------------------------------------------
+
+pg_upgrade is a tool that performs an in-place upgrade of existing
+data. Some upgrades change the on-disk representation of data;
+pg_upgrade cannot help in those upgrades. However, many upgrades do
+not change the on-disk representation of a user-defined table. In those
+cases, pg_upgrade can move existing user-defined tables from the old
+database cluster into the new cluster.
+
+There are two factors that determine whether an in-place upgrade is
+practical.
+
+Every table in a cluster shares the same on-disk representation of the
+table headers and trailers and the on-disk representation of tuple
+headers. If this changes between the old version of PostgreSQL and the
+new version, pg_upgrade cannot move existing tables to the new cluster;
+you will have to pg_dump the old data and then import that data into the
+new cluster.
+
+Second, all data types should have the same binary representation
+between the two major PostgreSQL versions.
+
+------------------------------------------------------------------------------
+HOW IT WORKS
+------------------------------------------------------------------------------
+
+To use pg_upgrade during an upgrade, start by installing a fresh
+cluster using the newest version in a new directory. When you've
+finished installation, the new cluster will contain the new executables
+and the usual template0, template1, and postgres, but no user-defined
+tables. At this point, you can shut down the old and new postmasters and
+invoke pg_upgrade.
+
+When pg_upgrade starts, it ensures that all required executables are
+present and contain the expected version numbers. The verification
+process also checks the old and new $PGDATA directories to ensure that
+the expected files and subdirectories are in place. If the verification
+process succeeds, pg_upgrade starts the old postmaster and runs
+pg_dumpall --schema-only to capture the metadata contained in the old
+cluster. The script produced by pg_dumpall will be used in a later step
+to recreate all user-defined objects in the new cluster.
+
+Note that the script produced by pg_dumpall will only recreate
+user-defined objects, not system-defined objects. The new cluster will
+contain the system-defined objects created by the latest version of
+PostgreSQL.
+
+Once pg_upgrade has extracted the metadata from the old cluster, it
+performs a number of bookkeeping tasks required to 'sync up' the new
+cluster with the existing data.
+
+First, pg_upgrade copies the commit status information and 'next
+transaction ID' from the old cluster to the new cluster. This step
+ensures that the proper tuples are visible from the new cluster.
+Remember, pg_upgrade does not export/import the content of user-defined
+tables so the transaction IDs in the new cluster must match the
+transaction IDs in the old data. pg_upgrade also copies the starting
+address for write-ahead logs from the old cluster to the new cluster.
+
+Now pg_upgrade begins reconstructing the metadata obtained from the old
+cluster using the first part of the pg_dumpall output.
+
+Next, pg_upgrade executes the remainder of the script produced earlier
+by pg_dumpall --- this script effectively creates the complete
+user-defined metadata from the old cluster to the new cluster. It
+preserves the relfilenode numbers so TOAST and other references
+to relfilenodes in user data is preserved. (See binary-upgrade usage
+in pg_dump).
+
+Finally, pg_upgrade links or copies each user-defined table and its
+supporting indexes and toast tables from the old cluster to the new
+cluster.
+
+An important feature of the pg_upgrade design is that it leaves the
+original cluster intact --- if a problem occurs during the upgrade, you
+can still run the previous version, after renaming the tablespaces back
+to the original names.
diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile
new file mode 100644
index 0000000..44d06be
--- /dev/null
+++ b/src/bin/pg_upgrade/Makefile
@@ -0,0 +1,65 @@
+# src/bin/pg_upgrade/Makefile
+
+PGFILEDESC = "pg_upgrade - an in-place binary upgrade utility"
+PGAPPICON = win32
+
+subdir = src/bin/pg_upgrade
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ check.o \
+ controldata.o \
+ dump.o \
+ exec.o \
+ file.o \
+ function.o \
+ info.o \
+ option.o \
+ parallel.o \
+ pg_upgrade.o \
+ relfilenode.o \
+ server.o \
+ tablespace.o \
+ util.o \
+ version.o
+
+override CPPFLAGS := -DDLSUFFIX=\"$(DLSUFFIX)\" -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+all: pg_upgrade
+
+pg_upgrade: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_upgrade$(X) '$(DESTDIR)$(bindir)/pg_upgrade$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_upgrade$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_upgrade$(X) $(OBJS)
+ rm -rf delete_old_cluster.sh log/ tmp_check/ \
+ loadable_libraries.txt reindex_hash.sql \
+ pg_upgrade_dump_globals.sql \
+ pg_upgrade_dump_*.custom pg_upgrade_*.log
+
+# When $(MAKE) is present, make automatically infers that this is a
+# recursive make. which is not actually what we want here, as that
+# e.g. prevents output synchronization from working (as make thinks
+# that the subsidiary make knows how to deal with that itself, but
+# we're invoking a shell script that doesn't know). Referencing
+# $(MAKE) indirectly avoids that behaviour.
+# See https://www.gnu.org/software/make/manual/html_node/MAKE-Variable.html#MAKE-Variable
+NOTSUBMAKEMAKE=$(MAKE)
+
+check: test.sh all temp-install
+ MAKE=$(NOTSUBMAKEMAKE) $(with_temp_install) bindir=$(abs_top_builddir)/tmp_install/$(bindir) EXTRA_REGRESS_OPTS="$(EXTRA_REGRESS_OPTS)" $(SHELL) $<
+
+# installcheck is not supported because there's no meaningful way to test
+# pg_upgrade against a single already-running server
diff --git a/src/bin/pg_upgrade/TESTING b/src/bin/pg_upgrade/TESTING
new file mode 100644
index 0000000..e69874b
--- /dev/null
+++ b/src/bin/pg_upgrade/TESTING
@@ -0,0 +1,89 @@
+THE SHORT VERSION
+-----------------
+
+On non-Windows machines, you can execute the testing process
+described below by running
+ make check
+in this directory. This will run the shell script test.sh, performing
+an upgrade from the version in this source tree to a new instance of
+the same version.
+
+To test an upgrade from a different version, you must have a built
+source tree for the old version as well as this version, and you
+must have done "make install" for both versions. Then do:
+
+export oldsrc=...somewhere/postgresql (old version's source tree)
+export oldbindir=...otherversion/bin (old version's installed bin dir)
+export bindir=...thisversion/bin (this version's installed bin dir)
+export libdir=...thisversion/lib (this version's installed lib dir)
+sh test.sh
+
+In this case, you will have to manually eyeball the resulting dump
+diff for version-specific differences, as explained below.
+
+
+DETAILS
+-------
+
+The most effective way to test pg_upgrade, aside from testing on user
+data, is by upgrading the PostgreSQL regression database.
+
+This testing process first requires the creation of a valid regression
+database dump. Such files contain most database features and are
+specific to each major version of Postgres.
+
+Here are the steps needed to create a regression database dump file:
+
+1) Create and populate the regression database in the old cluster.
+ This database can be created by running 'make installcheck' from
+ src/test/regress.
+
+2) Use pg_dump to dump out the regression database. Use the new
+ cluster's pg_dump on the old database to minimize whitespace
+ differences in the diff.
+
+3) Adjust the regression database dump file
+
+ a) Perform the load/dump twice
+ This fixes problems with the ordering of COPY columns for
+ inherited tables.
+
+ b) Change CREATE FUNCTION shared object paths to use '$libdir'
+ The old and new cluster will have different shared object paths.
+
+ c) Fix any wrapping format differences
+ Commands like CREATE TRIGGER and ALTER TABLE sometimes have
+ differences.
+
+ d) For pre-9.0, change CREATE OR REPLACE LANGUAGE to CREATE LANGUAGE
+
+ e) For pre-9.0, remove 'regex_flavor'
+
+ f) For pre-9.0, adjust extra_float_digits
+ Postgres 9.0 pg_dump uses extra_float_digits=-2 for pre-9.0
+ databases, and extra_float_digits=-3 for >= 9.0 databases.
+ It is necessary to modify 9.0 pg_dump to always use -3, and
+ modify the pre-9.0 old server to accept extra_float_digits=-3.
+
+Once the dump is created, it can be repeatedly loaded into the old
+database, upgraded, and dumped out of the new database, and then
+compared to the original version. To test the dump file, perform these
+steps:
+
+1) Create the old and new clusters in different directories.
+
+2) Copy the regression shared object files into the appropriate /lib
+ directory for old and new clusters.
+
+3) Create the regression database in the old server.
+
+4) Load the dump file created above into the regression database;
+ check for errors while loading.
+
+5) Upgrade the old database to the new major version, as outlined in
+ the pg_upgrade manual section.
+
+6) Use pg_dump to dump out the regression database in the new cluster.
+
+7) Diff the regression database dump file with the regression dump
+ file loaded into the old server.
diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c
new file mode 100644
index 0000000..54e3eb3
--- /dev/null
+++ b/src/bin/pg_upgrade/check.c
@@ -0,0 +1,1486 @@
+/*
+ * check.c
+ *
+ * server checks and output routines
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/check.c
+ */
+
+#include "postgres_fe.h"
+
+#include "catalog/pg_authid_d.h"
+#include "fe_utils/string_utils.h"
+#include "mb/pg_wchar.h"
+#include "pg_upgrade.h"
+
+static void check_new_cluster_is_empty(void);
+static void check_databases_are_compatible(void);
+static void check_locale_and_encoding(DbInfo *olddb, DbInfo *newdb);
+static bool equivalent_locale(int category, const char *loca, const char *locb);
+static void check_is_install_user(ClusterInfo *cluster);
+static void check_proper_datallowconn(ClusterInfo *cluster);
+static void check_for_prepared_transactions(ClusterInfo *cluster);
+static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
+static void check_for_user_defined_postfix_ops(ClusterInfo *cluster);
+static void check_for_incompatible_polymorphics(ClusterInfo *cluster);
+static void check_for_tables_with_oids(ClusterInfo *cluster);
+static void check_for_composite_data_type_usage(ClusterInfo *cluster);
+static void check_for_reg_data_type_usage(ClusterInfo *cluster);
+static void check_for_jsonb_9_4_usage(ClusterInfo *cluster);
+static void check_for_pg_role_prefix(ClusterInfo *cluster);
+static void check_for_new_tablespace_dir(ClusterInfo *new_cluster);
+static void check_for_user_defined_encoding_conversions(ClusterInfo *cluster);
+static char *get_canonical_locale_name(int category, const char *locale);
+
+
+/*
+ * fix_path_separator
+ * For non-Windows, just return the argument.
+ * For Windows convert any forward slash to a backslash
+ * such as is suitable for arguments to builtin commands
+ * like RMDIR and DEL.
+ */
+static char *
+fix_path_separator(char *path)
+{
+#ifdef WIN32
+
+ char *result;
+ char *c;
+
+ result = pg_strdup(path);
+
+ for (c = result; *c != '\0'; c++)
+ if (*c == '/')
+ *c = '\\';
+
+ return result;
+#else
+
+ return path;
+#endif
+}
+
+void
+output_check_banner(bool live_check)
+{
+ if (user_opts.check && live_check)
+ {
+ pg_log(PG_REPORT,
+ "Performing Consistency Checks on Old Live Server\n"
+ "------------------------------------------------\n");
+ }
+ else
+ {
+ pg_log(PG_REPORT,
+ "Performing Consistency Checks\n"
+ "-----------------------------\n");
+ }
+}
+
+
+void
+check_and_dump_old_cluster(bool live_check)
+{
+ /* -- OLD -- */
+
+ if (!live_check)
+ start_postmaster(&old_cluster, true);
+
+ /* Extract a list of databases and tables from the old cluster */
+ get_db_and_rel_infos(&old_cluster);
+
+ init_tablespaces();
+
+ get_loadable_libraries();
+
+
+ /*
+ * Check for various failure cases
+ */
+ check_is_install_user(&old_cluster);
+ check_proper_datallowconn(&old_cluster);
+ check_for_prepared_transactions(&old_cluster);
+ check_for_composite_data_type_usage(&old_cluster);
+ check_for_reg_data_type_usage(&old_cluster);
+ check_for_isn_and_int8_passing_mismatch(&old_cluster);
+
+ /*
+ * PG 14 changed the function signature of encoding conversion functions.
+ * Conversions from older versions cannot be upgraded automatically
+ * because the user-defined functions used by the encoding conversions
+ * need to be changed to match the new signature.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_user_defined_encoding_conversions(&old_cluster);
+
+ /*
+ * Pre-PG 14 allowed user defined postfix operators, which are not
+ * supported anymore. Verify there are none, iff applicable.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_user_defined_postfix_ops(&old_cluster);
+
+ /*
+ * PG 14 changed polymorphic functions from anyarray to
+ * anycompatiblearray.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_incompatible_polymorphics(&old_cluster);
+
+ /*
+ * Pre-PG 12 allowed tables to be declared WITH OIDS, which is not
+ * supported anymore. Verify there are none, iff applicable.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ check_for_tables_with_oids(&old_cluster);
+
+ /*
+ * PG 12 changed the 'sql_identifier' type storage to be based on name,
+ * not varchar, which breaks on-disk format for existing data. So we need
+ * to prevent upgrade when used in user objects (tables, indexes, ...).
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ old_11_check_for_sql_identifier_data_type_usage(&old_cluster);
+
+ /*
+ * Pre-PG 10 allowed tables with 'unknown' type columns and non WAL logged
+ * hash indexes
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906)
+ {
+ old_9_6_check_for_unknown_data_type_usage(&old_cluster);
+ if (user_opts.check)
+ old_9_6_invalidate_hash_indexes(&old_cluster, true);
+ }
+
+ /* 9.5 and below should not have roles starting with pg_ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 905)
+ check_for_pg_role_prefix(&old_cluster);
+
+ if (GET_MAJOR_VERSION(old_cluster.major_version) == 904 &&
+ old_cluster.controldata.cat_ver < JSONB_FORMAT_CHANGE_CAT_VER)
+ check_for_jsonb_9_4_usage(&old_cluster);
+
+ /* Pre-PG 9.4 had a different 'line' data type internal format */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 903)
+ old_9_3_check_for_line_data_type_usage(&old_cluster);
+
+ /* Pre-PG 9.0 had no large object permissions */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 804)
+ new_9_0_populate_pg_largeobject_metadata(&old_cluster, true);
+
+ /*
+ * While not a check option, we do this now because this is the only time
+ * the old server is running.
+ */
+ if (!user_opts.check)
+ generate_old_dump();
+
+ if (!live_check)
+ stop_postmaster(false);
+}
+
+
+void
+check_new_cluster(void)
+{
+ get_db_and_rel_infos(&new_cluster);
+
+ check_new_cluster_is_empty();
+ check_databases_are_compatible();
+
+ check_loadable_libraries();
+
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ check_file_clone();
+ break;
+ case TRANSFER_MODE_COPY:
+ break;
+ case TRANSFER_MODE_LINK:
+ check_hard_link();
+ break;
+ }
+
+ check_is_install_user(&new_cluster);
+
+ check_for_prepared_transactions(&new_cluster);
+
+ check_for_new_tablespace_dir(&new_cluster);
+}
+
+
+void
+report_clusters_compatible(void)
+{
+ if (user_opts.check)
+ {
+ pg_log(PG_REPORT, "\n*Clusters are compatible*\n");
+ /* stops new cluster */
+ stop_postmaster(false);
+ exit(0);
+ }
+
+ pg_log(PG_REPORT, "\n"
+ "If pg_upgrade fails after this point, you must re-initdb the\n"
+ "new cluster before continuing.\n");
+}
+
+
+void
+issue_warnings_and_set_wal_level(void)
+{
+ /*
+ * We unconditionally start/stop the new server because pg_resetwal -o set
+ * wal_level to 'minimum'. If the user is upgrading standby servers using
+ * the rsync instructions, they will need pg_upgrade to write its final
+ * WAL record showing wal_level as 'replica'.
+ */
+ start_postmaster(&new_cluster, true);
+
+ /* Create dummy large object permissions for old < PG 9.0? */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 804)
+ new_9_0_populate_pg_largeobject_metadata(&new_cluster, false);
+
+ /* Reindex hash indexes for old < 10.0 */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906)
+ old_9_6_invalidate_hash_indexes(&new_cluster, false);
+
+ report_extension_updates(&new_cluster);
+
+ stop_postmaster(false);
+}
+
+
+void
+output_completion_banner(char *deletion_script_file_name)
+{
+ PQExpBufferData user_specification;
+
+ initPQExpBuffer(&user_specification);
+ if (os_info.user_specified)
+ {
+ appendPQExpBufferStr(&user_specification, "-U ");
+ appendShellString(&user_specification, os_info.user);
+ appendPQExpBufferChar(&user_specification, ' ');
+ }
+
+ pg_log(PG_REPORT,
+ "Optimizer statistics are not transferred by pg_upgrade.\n"
+ "Once you start the new server, consider running:\n"
+ " %s/vacuumdb %s--all --analyze-in-stages\n\n", new_cluster.bindir, user_specification.data);
+
+ if (deletion_script_file_name)
+ pg_log(PG_REPORT,
+ "Running this script will delete the old cluster's data files:\n"
+ " %s\n",
+ deletion_script_file_name);
+ else
+ pg_log(PG_REPORT,
+ "Could not create a script to delete the old cluster's data files\n"
+ "because user-defined tablespaces or the new cluster's data directory\n"
+ "exist in the old cluster directory. The old cluster's contents must\n"
+ "be deleted manually.\n");
+
+ termPQExpBuffer(&user_specification);
+}
+
+
+void
+check_cluster_versions(void)
+{
+ prep_status("Checking cluster versions");
+
+ /* cluster versions should already have been obtained */
+ Assert(old_cluster.major_version != 0);
+ Assert(new_cluster.major_version != 0);
+
+ /*
+ * We allow upgrades from/to the same major version for alpha/beta
+ * upgrades
+ */
+
+ if (GET_MAJOR_VERSION(old_cluster.major_version) < 804)
+ pg_fatal("This utility can only upgrade from PostgreSQL version 8.4 and later.\n");
+
+ /* Only current PG version is supported as a target */
+ if (GET_MAJOR_VERSION(new_cluster.major_version) != GET_MAJOR_VERSION(PG_VERSION_NUM))
+ pg_fatal("This utility can only upgrade to PostgreSQL version %s.\n",
+ PG_MAJORVERSION);
+
+ /*
+ * We can't allow downgrading because we use the target pg_dump, and
+ * pg_dump cannot operate on newer database versions, only current and
+ * older versions.
+ */
+ if (old_cluster.major_version > new_cluster.major_version)
+ pg_fatal("This utility cannot be used to downgrade to older major PostgreSQL versions.\n");
+
+ /* Ensure binaries match the designated data directories */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) !=
+ GET_MAJOR_VERSION(old_cluster.bin_version))
+ pg_fatal("Old cluster data and binary directories are from different major versions.\n");
+ if (GET_MAJOR_VERSION(new_cluster.major_version) !=
+ GET_MAJOR_VERSION(new_cluster.bin_version))
+ pg_fatal("New cluster data and binary directories are from different major versions.\n");
+
+ check_ok();
+}
+
+
+void
+check_cluster_compatibility(bool live_check)
+{
+ /* get/check pg_control data of servers */
+ get_control_data(&old_cluster, live_check);
+ get_control_data(&new_cluster, false);
+ check_control_data(&old_cluster.controldata, &new_cluster.controldata);
+
+ /* We read the real port number for PG >= 9.1 */
+ if (live_check && GET_MAJOR_VERSION(old_cluster.major_version) <= 900 &&
+ old_cluster.port == DEF_PGUPORT)
+ pg_fatal("When checking a pre-PG 9.1 live old server, "
+ "you must specify the old server's port number.\n");
+
+ if (live_check && old_cluster.port == new_cluster.port)
+ pg_fatal("When checking a live server, "
+ "the old and new port numbers must be different.\n");
+}
+
+
+/*
+ * check_locale_and_encoding()
+ *
+ * Check that locale and encoding of a database in the old and new clusters
+ * are compatible.
+ */
+static void
+check_locale_and_encoding(DbInfo *olddb, DbInfo *newdb)
+{
+ if (olddb->db_encoding != newdb->db_encoding)
+ pg_fatal("encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n",
+ olddb->db_name,
+ pg_encoding_to_char(olddb->db_encoding),
+ pg_encoding_to_char(newdb->db_encoding));
+ if (!equivalent_locale(LC_COLLATE, olddb->db_collate, newdb->db_collate))
+ pg_fatal("lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n",
+ olddb->db_name, olddb->db_collate, newdb->db_collate);
+ if (!equivalent_locale(LC_CTYPE, olddb->db_ctype, newdb->db_ctype))
+ pg_fatal("lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n",
+ olddb->db_name, olddb->db_ctype, newdb->db_ctype);
+}
+
+/*
+ * equivalent_locale()
+ *
+ * Best effort locale-name comparison. Return false if we are not 100% sure
+ * the locales are equivalent.
+ *
+ * Note: The encoding parts of the names are ignored. This function is
+ * currently used to compare locale names stored in pg_database, and
+ * pg_database contains a separate encoding field. That's compared directly
+ * in check_locale_and_encoding().
+ */
+static bool
+equivalent_locale(int category, const char *loca, const char *locb)
+{
+ const char *chara;
+ const char *charb;
+ char *canona;
+ char *canonb;
+ int lena;
+ int lenb;
+
+ /*
+ * If the names are equal, the locales are equivalent. Checking this first
+ * avoids calling setlocale() in the common case that the names are equal.
+ * That's a good thing, if setlocale() is buggy, for example.
+ */
+ if (pg_strcasecmp(loca, locb) == 0)
+ return true;
+
+ /*
+ * Not identical. Canonicalize both names, remove the encoding parts, and
+ * try again.
+ */
+ canona = get_canonical_locale_name(category, loca);
+ chara = strrchr(canona, '.');
+ lena = chara ? (chara - canona) : strlen(canona);
+
+ canonb = get_canonical_locale_name(category, locb);
+ charb = strrchr(canonb, '.');
+ lenb = charb ? (charb - canonb) : strlen(canonb);
+
+ if (lena == lenb && pg_strncasecmp(canona, canonb, lena) == 0)
+ {
+ pg_free(canona);
+ pg_free(canonb);
+ return true;
+ }
+
+ pg_free(canona);
+ pg_free(canonb);
+ return false;
+}
+
+
+static void
+check_new_cluster_is_empty(void)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < new_cluster.dbarr.ndbs; dbnum++)
+ {
+ int relnum;
+ RelInfoArr *rel_arr = &new_cluster.dbarr.dbs[dbnum].rel_arr;
+
+ for (relnum = 0; relnum < rel_arr->nrels;
+ relnum++)
+ {
+ /* pg_largeobject and its index should be skipped */
+ if (strcmp(rel_arr->rels[relnum].nspname, "pg_catalog") != 0)
+ pg_fatal("New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n",
+ new_cluster.dbarr.dbs[dbnum].db_name,
+ rel_arr->rels[relnum].nspname,
+ rel_arr->rels[relnum].relname);
+ }
+ }
+}
+
+/*
+ * Check that every database that already exists in the new cluster is
+ * compatible with the corresponding database in the old one.
+ */
+static void
+check_databases_are_compatible(void)
+{
+ int newdbnum;
+ int olddbnum;
+ DbInfo *newdbinfo;
+ DbInfo *olddbinfo;
+
+ for (newdbnum = 0; newdbnum < new_cluster.dbarr.ndbs; newdbnum++)
+ {
+ newdbinfo = &new_cluster.dbarr.dbs[newdbnum];
+
+ /* Find the corresponding database in the old cluster */
+ for (olddbnum = 0; olddbnum < old_cluster.dbarr.ndbs; olddbnum++)
+ {
+ olddbinfo = &old_cluster.dbarr.dbs[olddbnum];
+ if (strcmp(newdbinfo->db_name, olddbinfo->db_name) == 0)
+ {
+ check_locale_and_encoding(olddbinfo, newdbinfo);
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * A previous run of pg_upgrade might have failed and the new cluster
+ * directory recreated, but they might have forgotten to remove
+ * the new cluster's tablespace directories. Therefore, check that
+ * new cluster tablespace directories do not already exist. If
+ * they do, it would cause an error while restoring global objects.
+ * This allows the failure to be detected at check time, rather than
+ * during schema restore.
+ *
+ * Note, v8.4 has no tablespace_suffix, which is fine so long as the
+ * version being upgraded *to* has a suffix, since it's not allowed
+ * to pg_upgrade from a version to the same version if tablespaces are
+ * in use.
+ */
+static void
+check_for_new_tablespace_dir(ClusterInfo *new_cluster)
+{
+ int tblnum;
+ char new_tablespace_dir[MAXPGPATH];
+
+ prep_status("Checking for new cluster tablespace directories");
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ struct stat statbuf;
+
+ snprintf(new_tablespace_dir, MAXPGPATH, "%s%s",
+ os_info.old_tablespaces[tblnum],
+ new_cluster->tablespace_suffix);
+
+ if (stat(new_tablespace_dir, &statbuf) == 0 || errno != ENOENT)
+ pg_fatal("new cluster tablespace directory already exists: \"%s\"\n",
+ new_tablespace_dir);
+ }
+
+ check_ok();
+}
+
+/*
+ * create_script_for_old_cluster_deletion()
+ *
+ * This is particularly useful for tablespace deletion.
+ */
+void
+create_script_for_old_cluster_deletion(char **deletion_script_file_name)
+{
+ FILE *script = NULL;
+ int tblnum;
+ char old_cluster_pgdata[MAXPGPATH],
+ new_cluster_pgdata[MAXPGPATH];
+
+ *deletion_script_file_name = psprintf("%sdelete_old_cluster.%s",
+ SCRIPT_PREFIX, SCRIPT_EXT);
+
+ strlcpy(old_cluster_pgdata, old_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(old_cluster_pgdata);
+
+ strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(new_cluster_pgdata);
+
+ /* Some people put the new data directory inside the old one. */
+ if (path_is_prefix_of_path(old_cluster_pgdata, new_cluster_pgdata))
+ {
+ pg_log(PG_WARNING,
+ "\nWARNING: new data directory should not be inside the old data directory, e.g. %s\n", old_cluster_pgdata);
+
+ /* Unlink file in case it is left over from a previous run. */
+ unlink(*deletion_script_file_name);
+ pg_free(*deletion_script_file_name);
+ *deletion_script_file_name = NULL;
+ return;
+ }
+
+ /*
+ * Some users (oddly) create tablespaces inside the cluster data
+ * directory. We can't create a proper old cluster delete script in that
+ * case.
+ */
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ char old_tablespace_dir[MAXPGPATH];
+
+ strlcpy(old_tablespace_dir, os_info.old_tablespaces[tblnum], MAXPGPATH);
+ canonicalize_path(old_tablespace_dir);
+ if (path_is_prefix_of_path(old_cluster_pgdata, old_tablespace_dir))
+ {
+ /* reproduce warning from CREATE TABLESPACE that is in the log */
+ pg_log(PG_WARNING,
+ "\nWARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n", old_tablespace_dir);
+
+ /* Unlink file in case it is left over from a previous run. */
+ unlink(*deletion_script_file_name);
+ pg_free(*deletion_script_file_name);
+ *deletion_script_file_name = NULL;
+ return;
+ }
+ }
+
+ prep_status("Creating script to delete old cluster");
+
+ if ((script = fopen_priv(*deletion_script_file_name, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ *deletion_script_file_name, strerror(errno));
+
+#ifndef WIN32
+ /* add shebang header */
+ fprintf(script, "#!/bin/sh\n\n");
+#endif
+
+ /* delete old cluster's default tablespace */
+ fprintf(script, RMDIR_CMD " %c%s%c\n", PATH_QUOTE,
+ fix_path_separator(old_cluster.pgdata), PATH_QUOTE);
+
+ /* delete old cluster's alternate tablespaces */
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ /*
+ * Do the old cluster's per-database directories share a directory
+ * with a new version-specific tablespace?
+ */
+ if (strlen(old_cluster.tablespace_suffix) == 0)
+ {
+ /* delete per-database directories */
+ int dbnum;
+
+ fprintf(script, "\n");
+ /* remove PG_VERSION? */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 804)
+ fprintf(script, RM_CMD " %s%cPG_VERSION\n",
+ fix_path_separator(os_info.old_tablespaces[tblnum]),
+ PATH_SEPARATOR);
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ fprintf(script, RMDIR_CMD " %c%s%c%u%c\n", PATH_QUOTE,
+ fix_path_separator(os_info.old_tablespaces[tblnum]),
+ PATH_SEPARATOR, old_cluster.dbarr.dbs[dbnum].db_oid,
+ PATH_QUOTE);
+ }
+ else
+ {
+ char *suffix_path = pg_strdup(old_cluster.tablespace_suffix);
+
+ /*
+ * Simply delete the tablespace directory, which might be ".old"
+ * or a version-specific subdirectory.
+ */
+ fprintf(script, RMDIR_CMD " %c%s%s%c\n", PATH_QUOTE,
+ fix_path_separator(os_info.old_tablespaces[tblnum]),
+ fix_path_separator(suffix_path), PATH_QUOTE);
+ pfree(suffix_path);
+ }
+ }
+
+ fclose(script);
+
+#ifndef WIN32
+ if (chmod(*deletion_script_file_name, S_IRWXU) != 0)
+ pg_fatal("could not add execute permission to file \"%s\": %s\n",
+ *deletion_script_file_name, strerror(errno));
+#endif
+
+ check_ok();
+}
+
+
+/*
+ * check_is_install_user()
+ *
+ * Check we are the install user, and that the new cluster
+ * has no other users.
+ */
+static void
+check_is_install_user(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+
+ prep_status("Checking database user is the install user");
+
+ /* Can't use pg_authid because only superusers can view it. */
+ res = executeQueryOrDie(conn,
+ "SELECT rolsuper, oid "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname = current_user "
+ "AND rolname !~ '^pg_'");
+
+ /*
+ * We only allow the install user in the new cluster (see comment below)
+ * and we preserve pg_authid.oid, so this must be the install user in the
+ * old cluster too.
+ */
+ if (PQntuples(res) != 1 ||
+ atooid(PQgetvalue(res, 0, 1)) != BOOTSTRAP_SUPERUSERID)
+ pg_fatal("database user \"%s\" is not the install user\n",
+ os_info.user);
+
+ PQclear(res);
+
+ res = executeQueryOrDie(conn,
+ "SELECT COUNT(*) "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname !~ '^pg_'");
+
+ if (PQntuples(res) != 1)
+ pg_fatal("could not determine the number of users\n");
+
+ /*
+ * We only allow the install user in the new cluster because other defined
+ * users might match users defined in the old cluster and generate an
+ * error during pg_dump restore.
+ */
+ if (cluster == &new_cluster && atooid(PQgetvalue(res, 0, 0)) != 1)
+ pg_fatal("Only the install user can be defined in the new cluster.\n");
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ check_ok();
+}
+
+
+static void
+check_proper_datallowconn(ClusterInfo *cluster)
+{
+ int dbnum;
+ PGconn *conn_template1;
+ PGresult *dbres;
+ int ntups;
+ int i_datname;
+ int i_datallowconn;
+
+ prep_status("Checking database connection settings");
+
+ conn_template1 = connectToServer(cluster, "template1");
+
+ /* get database names */
+ dbres = executeQueryOrDie(conn_template1,
+ "SELECT datname, datallowconn "
+ "FROM pg_catalog.pg_database");
+
+ i_datname = PQfnumber(dbres, "datname");
+ i_datallowconn = PQfnumber(dbres, "datallowconn");
+
+ ntups = PQntuples(dbres);
+ for (dbnum = 0; dbnum < ntups; dbnum++)
+ {
+ char *datname = PQgetvalue(dbres, dbnum, i_datname);
+ char *datallowconn = PQgetvalue(dbres, dbnum, i_datallowconn);
+
+ if (strcmp(datname, "template0") == 0)
+ {
+ /* avoid restore failure when pg_dumpall tries to create template0 */
+ if (strcmp(datallowconn, "t") == 0)
+ pg_fatal("template0 must not allow connections, "
+ "i.e. its pg_database.datallowconn must be false\n");
+ }
+ else
+ {
+ /*
+ * avoid datallowconn == false databases from being skipped on
+ * restore
+ */
+ if (strcmp(datallowconn, "f") == 0)
+ pg_fatal("All non-template0 databases must allow connections, "
+ "i.e. their pg_database.datallowconn must be true\n");
+ }
+ }
+
+ PQclear(dbres);
+
+ PQfinish(conn_template1);
+
+ check_ok();
+}
+
+
+/*
+ * check_for_prepared_transactions()
+ *
+ * Make sure there are no prepared transactions because the storage format
+ * might have changed.
+ */
+static void
+check_for_prepared_transactions(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+
+ prep_status("Checking for prepared transactions");
+
+ res = executeQueryOrDie(conn,
+ "SELECT * "
+ "FROM pg_catalog.pg_prepared_xacts");
+
+ if (PQntuples(res) != 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster contains prepared transactions\n");
+ else
+ pg_fatal("The target cluster contains prepared transactions\n");
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ check_ok();
+}
+
+
+/*
+ * check_for_isn_and_int8_passing_mismatch()
+ *
+ * contrib/isn relies on data type int8, and in 8.4 int8 can now be passed
+ * by value. The schema dumps the CREATE TYPE PASSEDBYVALUE setting so
+ * it must match for the old and new servers.
+ */
+static void
+check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for contrib/isn with bigint-passing mismatch");
+
+ if (old_cluster.controldata.float8_pass_by_value ==
+ new_cluster.controldata.float8_pass_by_value)
+ {
+ /* no mismatch */
+ check_ok();
+ return;
+ }
+
+ snprintf(output_path, sizeof(output_path),
+ "contrib_isn_and_int8_pass_by_value.txt");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_proname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* Find any functions coming from contrib/isn */
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, p.proname "
+ "FROM pg_catalog.pg_proc p, "
+ " pg_catalog.pg_namespace n "
+ "WHERE p.pronamespace = n.oid AND "
+ " p.probin = '$libdir/isn'");
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_proname = PQfnumber(res, "proname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_proname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains \"contrib/isn\" functions which rely on the\n"
+ "bigint data type. Your old and new clusters pass bigint values\n"
+ "differently so this cluster cannot currently be upgraded. You can\n"
+ "manually dump databases in the old cluster that use \"contrib/isn\"\n"
+ "facilities, drop them, perform the upgrade, and then restore them. A\n"
+ "list of the problem functions is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * Verify that no user defined postfix operators exist.
+ */
+static void
+check_for_user_defined_postfix_ops(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for user-defined postfix operators");
+
+ snprintf(output_path, sizeof(output_path),
+ "postfix_ops.txt");
+
+ /* Find any user defined postfix operators */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_oproid,
+ i_oprnsp,
+ i_oprname,
+ i_typnsp,
+ i_typname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ "SELECT o.oid AS oproid, "
+ " n.nspname AS oprnsp, "
+ " o.oprname, "
+ " tn.nspname AS typnsp, "
+ " t.typname "
+ "FROM pg_catalog.pg_operator o, "
+ " pg_catalog.pg_namespace n, "
+ " pg_catalog.pg_type t, "
+ " pg_catalog.pg_namespace tn "
+ "WHERE o.oprnamespace = n.oid AND "
+ " o.oprleft = t.oid AND "
+ " t.typnamespace = tn.oid AND "
+ " o.oprright = 0 AND "
+ " o.oid >= 16384");
+ ntups = PQntuples(res);
+ i_oproid = PQfnumber(res, "oproid");
+ i_oprnsp = PQfnumber(res, "oprnsp");
+ i_oprname = PQfnumber(res, "oprname");
+ i_typnsp = PQfnumber(res, "typnsp");
+ i_typname = PQfnumber(res, "typname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " (oid=%s) %s.%s (%s.%s, NONE)\n",
+ PQgetvalue(res, rowno, i_oproid),
+ PQgetvalue(res, rowno, i_oprnsp),
+ PQgetvalue(res, rowno, i_oprname),
+ PQgetvalue(res, rowno, i_typnsp),
+ PQgetvalue(res, rowno, i_typname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains user-defined postfix operators, which are not\n"
+ "supported anymore. Consider dropping the postfix operators and replacing\n"
+ "them with prefix operators or function calls.\n"
+ "A list of user-defined postfix operators is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_incompatible_polymorphics()
+ *
+ * Make sure nothing is using old polymorphic functions with
+ * anyarray/anyelement rather than the new anycompatible variants.
+ */
+static void
+check_for_incompatible_polymorphics(ClusterInfo *cluster)
+{
+ PGresult *res;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+ PQExpBufferData old_polymorphics;
+
+ prep_status("Checking for incompatible polymorphic functions");
+
+ snprintf(output_path, sizeof(output_path),
+ "incompatible_polymorphics.txt");
+
+ /* The set of problematic functions varies a bit in different versions */
+ initPQExpBuffer(&old_polymorphics);
+
+ appendPQExpBufferStr(&old_polymorphics,
+ "'array_append(anyarray,anyelement)'"
+ ", 'array_cat(anyarray,anyarray)'"
+ ", 'array_prepend(anyelement,anyarray)'");
+
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 903)
+ appendPQExpBufferStr(&old_polymorphics,
+ ", 'array_remove(anyarray,anyelement)'"
+ ", 'array_replace(anyarray,anyelement,anyelement)'");
+
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 905)
+ appendPQExpBufferStr(&old_polymorphics,
+ ", 'array_position(anyarray,anyelement)'"
+ ", 'array_position(anyarray,anyelement,integer)'"
+ ", 'array_positions(anyarray,anyelement)'"
+ ", 'width_bucket(anyelement,anyarray)'");
+
+ for (int dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ bool db_used = false;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+ int ntups;
+ int i_objkind,
+ i_objname;
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ /* Aggregate transition functions */
+ "SELECT 'aggregate' AS objkind, p.oid::regprocedure::text AS objname "
+ "FROM pg_proc AS p "
+ "JOIN pg_aggregate AS a ON a.aggfnoid=p.oid "
+ "JOIN pg_proc AS transfn ON transfn.oid=a.aggtransfn "
+ "WHERE p.oid >= 16384 "
+ "AND a.aggtransfn = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[]) "
+
+ /* Aggregate final functions */
+ "UNION ALL "
+ "SELECT 'aggregate' AS objkind, p.oid::regprocedure::text AS objname "
+ "FROM pg_proc AS p "
+ "JOIN pg_aggregate AS a ON a.aggfnoid=p.oid "
+ "JOIN pg_proc AS finalfn ON finalfn.oid=a.aggfinalfn "
+ "WHERE p.oid >= 16384 "
+ "AND a.aggfinalfn = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[]) "
+
+ /* Operators */
+ "UNION ALL "
+ "SELECT 'operator' AS objkind, op.oid::regoperator::text AS objname "
+ "FROM pg_operator AS op "
+ "WHERE op.oid >= 16384 "
+ "AND oprcode = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND oprleft = ANY(ARRAY['anyarray', 'anyelement']::regtype[]);",
+ old_polymorphics.data,
+ old_polymorphics.data,
+ old_polymorphics.data);
+
+ ntups = PQntuples(res);
+
+ i_objkind = PQfnumber(res, "objkind");
+ i_objname = PQfnumber(res, "objname");
+
+ for (int rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+
+ fprintf(script, " %s: %s\n",
+ PQgetvalue(res, rowno, i_objkind),
+ PQgetvalue(res, rowno, i_objname));
+ }
+
+ PQclear(res);
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains user-defined objects that refer to internal\n"
+ "polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+ "These user-defined objects must be dropped before upgrading and restored\n"
+ "afterwards, changing them to refer to the new corresponding functions with\n"
+ "arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+ "A list of the problematic objects is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+
+ termPQExpBuffer(&old_polymorphics);
+}
+
+/*
+ * Verify that no tables are declared WITH OIDS.
+ */
+static void
+check_for_tables_with_oids(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for tables WITH OIDS");
+
+ snprintf(output_path, sizeof(output_path),
+ "tables_with_oids.txt");
+
+ /* Find any tables declared WITH OIDS */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, c.relname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_namespace n "
+ "WHERE c.relnamespace = n.oid AND "
+ " c.relhasoids AND"
+ " n.nspname NOT IN ('pg_catalog')");
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_relname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains tables declared WITH OIDS, which is not\n"
+ "supported anymore. Consider removing the oid column using\n"
+ " ALTER TABLE ... SET WITHOUT OIDS;\n"
+ "A list of tables with the problem is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_composite_data_type_usage()
+ * Check for system-defined composite types used in user tables.
+ *
+ * The OIDs of rowtypes of system catalogs and information_schema views
+ * can change across major versions; unlike user-defined types, we have
+ * no mechanism for forcing them to be the same in the new cluster.
+ * Hence, if any user table uses one, that's problematic for pg_upgrade.
+ */
+static void
+check_for_composite_data_type_usage(ClusterInfo *cluster)
+{
+ bool found;
+ Oid firstUserOid;
+ char output_path[MAXPGPATH];
+ char *base_query;
+
+ prep_status("Checking for system-defined composite types in user tables");
+
+ snprintf(output_path, sizeof(output_path), "tables_using_composite.txt");
+
+ /*
+ * Look for composite types that were made during initdb *or* belong to
+ * information_schema; that's important in case information_schema was
+ * dropped and reloaded.
+ *
+ * The cutoff OID here should match the source cluster's value of
+ * FirstNormalObjectId. We hardcode it rather than using that C #define
+ * because, if that #define is ever changed, our own version's value is
+ * NOT what to use. Eventually we may need a test on the source cluster's
+ * version to select the correct value.
+ */
+ firstUserOid = 16384;
+
+ base_query = psprintf("SELECT t.oid FROM pg_catalog.pg_type t "
+ "LEFT JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid "
+ " WHERE typtype = 'c' AND (t.oid < %u OR nspname = 'information_schema')",
+ firstUserOid);
+
+ found = check_for_data_types_usage(cluster, base_query, output_path);
+
+ free(base_query);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains system-defined composite type(s) in user tables.\n"
+ "These type OIDs are not stable across PostgreSQL versions,\n"
+ "so this cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_reg_data_type_usage()
+ * pg_upgrade only preserves these system values:
+ * pg_class.oid
+ * pg_type.oid
+ * pg_enum.oid
+ *
+ * Many of the reg* data types reference system catalog info that is
+ * not preserved, and hence these data types cannot be used in user
+ * tables upgraded by pg_upgrade.
+ */
+static void
+check_for_reg_data_type_usage(ClusterInfo *cluster)
+{
+ bool found;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for reg* data types in user tables");
+
+ snprintf(output_path, sizeof(output_path), "tables_using_reg.txt");
+
+ /*
+ * Note: older servers will not have all of these reg* types, so we have
+ * to write the query like this rather than depending on casts to regtype.
+ */
+ found = check_for_data_types_usage(cluster,
+ "SELECT oid FROM pg_catalog.pg_type t "
+ "WHERE t.typnamespace = "
+ " (SELECT oid FROM pg_catalog.pg_namespace "
+ " WHERE nspname = 'pg_catalog') "
+ " AND t.typname IN ( "
+ /* pg_class.oid is preserved, so 'regclass' is OK */
+ " 'regcollation', "
+ " 'regconfig', "
+ " 'regdictionary', "
+ " 'regnamespace', "
+ " 'regoper', "
+ " 'regoperator', "
+ " 'regproc', "
+ " 'regprocedure' "
+ /* pg_authid.oid is preserved, so 'regrole' is OK */
+ /* pg_type.oid is (mostly) preserved, so 'regtype' is OK */
+ " )",
+ output_path);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains one of the reg* data types in user tables.\n"
+ "These data types reference system OIDs that are not preserved by\n"
+ "pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_jsonb_9_4_usage()
+ *
+ * JSONB changed its storage format during 9.4 beta, so check for it.
+ */
+static void
+check_for_jsonb_9_4_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for incompatible \"jsonb\" data type");
+
+ snprintf(output_path, sizeof(output_path), "tables_using_jsonb.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.jsonb", output_path))
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains the \"jsonb\" data type in user tables.\n"
+ "The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_pg_role_prefix()
+ *
+ * Versions older than 9.6 should not have any pg_* roles
+ */
+static void
+check_for_pg_role_prefix(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+
+ prep_status("Checking for roles starting with \"pg_\"");
+
+ res = executeQueryOrDie(conn,
+ "SELECT * "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname ~ '^pg_'");
+
+ if (PQntuples(res) != 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster contains roles starting with \"pg_\"\n");
+ else
+ pg_fatal("The target cluster contains roles starting with \"pg_\"\n");
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ check_ok();
+}
+
+/*
+ * Verify that no user-defined encoding conversions exist.
+ */
+static void
+check_for_user_defined_encoding_conversions(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for user-defined encoding conversions");
+
+ snprintf(output_path, sizeof(output_path),
+ "encoding_conversions.txt");
+
+ /* Find any user defined encoding conversions */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_conoid,
+ i_conname,
+ i_nspname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ "SELECT c.oid as conoid, c.conname, n.nspname "
+ "FROM pg_catalog.pg_conversion c, "
+ " pg_catalog.pg_namespace n "
+ "WHERE c.connamespace = n.oid AND "
+ " c.oid >= 16384");
+ ntups = PQntuples(res);
+ i_conoid = PQfnumber(res, "conoid");
+ i_conname = PQfnumber(res, "conname");
+ i_nspname = PQfnumber(res, "nspname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " (oid=%s) %s.%s\n",
+ PQgetvalue(res, rowno, i_conoid),
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_conname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains user-defined encoding conversions.\n"
+ "The conversion function parameters changed in PostgreSQL version 14\n"
+ "so this cluster cannot currently be upgraded. You can remove the\n"
+ "encoding conversions in the old cluster and restart the upgrade.\n"
+ "A list of user-defined encoding conversions is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * get_canonical_locale_name
+ *
+ * Send the locale name to the system, and hope we get back a canonical
+ * version. This should match the backend's check_locale() function.
+ */
+static char *
+get_canonical_locale_name(int category, const char *locale)
+{
+ char *save;
+ char *res;
+
+ /* get the current setting, so we can restore it. */
+ save = setlocale(category, NULL);
+ if (!save)
+ pg_fatal("failed to get the current locale\n");
+
+ /* 'save' may be pointing at a modifiable scratch variable, so copy it. */
+ save = pg_strdup(save);
+
+ /* set the locale with setlocale, to see if it accepts it. */
+ res = setlocale(category, locale);
+
+ if (!res)
+ pg_fatal("failed to get system locale name for \"%s\"\n", locale);
+
+ res = pg_strdup(res);
+
+ /* restore old value. */
+ if (!setlocale(category, save))
+ pg_fatal("failed to restore old locale \"%s\"\n", save);
+
+ pg_free(save);
+
+ return res;
+}
diff --git a/src/bin/pg_upgrade/controldata.c b/src/bin/pg_upgrade/controldata.c
new file mode 100644
index 0000000..a4b6375
--- /dev/null
+++ b/src/bin/pg_upgrade/controldata.c
@@ -0,0 +1,724 @@
+/*
+ * controldata.c
+ *
+ * controldata functions
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/controldata.c
+ */
+
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "pg_upgrade.h"
+
+/*
+ * get_control_data()
+ *
+ * gets pg_control information in "ctrl". Assumes that bindir and
+ * datadir are valid absolute paths to postgresql bin and pgdata
+ * directories respectively *and* pg_resetwal is version compatible
+ * with datadir. The main purpose of this function is to get pg_control
+ * data in a version independent manner.
+ *
+ * The approach taken here is to invoke pg_resetwal with -n option
+ * and then pipe its output. With little string parsing we get the
+ * pg_control data. pg_resetwal cannot be run while the server is running
+ * so we use pg_controldata; pg_controldata doesn't provide all the fields
+ * we need to actually perform the upgrade, but it provides enough for
+ * check mode. We do not implement pg_resetwal -n because it is hard to
+ * return valid xid data for a running server.
+ */
+void
+get_control_data(ClusterInfo *cluster, bool live_check)
+{
+ char cmd[MAXPGPATH];
+ char bufin[MAX_STRING];
+ FILE *output;
+ char *p;
+ bool got_tli = false;
+ bool got_log_id = false;
+ bool got_log_seg = false;
+ bool got_xid = false;
+ bool got_oid = false;
+ bool got_multi = false;
+ bool got_oldestmulti = false;
+ bool got_oldestxid = false;
+ bool got_mxoff = false;
+ bool got_nextxlogfile = false;
+ bool got_float8_pass_by_value = false;
+ bool got_align = false;
+ bool got_blocksz = false;
+ bool got_largesz = false;
+ bool got_walsz = false;
+ bool got_walseg = false;
+ bool got_ident = false;
+ bool got_index = false;
+ bool got_toast = false;
+ bool got_large_object = false;
+ bool got_date_is_int = false;
+ bool got_data_checksum_version = false;
+ bool got_cluster_state = false;
+ char *lc_collate = NULL;
+ char *lc_ctype = NULL;
+ char *lc_monetary = NULL;
+ char *lc_numeric = NULL;
+ char *lc_time = NULL;
+ char *lang = NULL;
+ char *language = NULL;
+ char *lc_all = NULL;
+ char *lc_messages = NULL;
+ uint32 tli = 0;
+ uint32 logid = 0;
+ uint32 segno = 0;
+ char *resetwal_bin;
+
+
+ /*
+ * Because we test the pg_resetwal output as strings, it has to be in
+ * English. Copied from pg_regress.c.
+ */
+ if (getenv("LC_COLLATE"))
+ lc_collate = pg_strdup(getenv("LC_COLLATE"));
+ if (getenv("LC_CTYPE"))
+ lc_ctype = pg_strdup(getenv("LC_CTYPE"));
+ if (getenv("LC_MONETARY"))
+ lc_monetary = pg_strdup(getenv("LC_MONETARY"));
+ if (getenv("LC_NUMERIC"))
+ lc_numeric = pg_strdup(getenv("LC_NUMERIC"));
+ if (getenv("LC_TIME"))
+ lc_time = pg_strdup(getenv("LC_TIME"));
+ if (getenv("LANG"))
+ lang = pg_strdup(getenv("LANG"));
+ if (getenv("LANGUAGE"))
+ language = pg_strdup(getenv("LANGUAGE"));
+ if (getenv("LC_ALL"))
+ lc_all = pg_strdup(getenv("LC_ALL"));
+ if (getenv("LC_MESSAGES"))
+ lc_messages = pg_strdup(getenv("LC_MESSAGES"));
+
+ unsetenv("LC_COLLATE");
+ unsetenv("LC_CTYPE");
+ unsetenv("LC_MONETARY");
+ unsetenv("LC_NUMERIC");
+ unsetenv("LC_TIME");
+#ifndef WIN32
+ unsetenv("LANG");
+#else
+ /* On Windows the default locale may not be English, so force it */
+ setenv("LANG", "en", 1);
+#endif
+ unsetenv("LANGUAGE");
+ unsetenv("LC_ALL");
+ setenv("LC_MESSAGES", "C", 1);
+
+ /*
+ * Check for clean shutdown
+ */
+ if (!live_check || cluster == &new_cluster)
+ {
+ /* only pg_controldata outputs the cluster state */
+ snprintf(cmd, sizeof(cmd), "\"%s/pg_controldata\" \"%s\"",
+ cluster->bindir, cluster->pgdata);
+ fflush(stdout);
+ fflush(stderr);
+
+ if ((output = popen(cmd, "r")) == NULL)
+ pg_fatal("could not get control data using %s: %s\n",
+ cmd, strerror(errno));
+
+ /* we have the result of cmd in "output". so parse it line by line now */
+ while (fgets(bufin, sizeof(bufin), output))
+ {
+ if ((p = strstr(bufin, "Database cluster state:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: database cluster state problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+
+ /*
+ * We checked earlier for a postmaster lock file, and if we
+ * found one, we tried to start/stop the server to replay the
+ * WAL. However, pg_ctl -m immediate doesn't leave a lock
+ * file, but does require WAL replay, so we check here that
+ * the server was shut down cleanly, from the controldata
+ * perspective.
+ */
+ /* remove leading spaces */
+ while (*p == ' ')
+ p++;
+ if (strcmp(p, "shut down in recovery\n") == 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n");
+ else
+ pg_fatal("The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n");
+ }
+ else if (strcmp(p, "shut down\n") != 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster was not shut down cleanly.\n");
+ else
+ pg_fatal("The target cluster was not shut down cleanly.\n");
+ }
+ got_cluster_state = true;
+ }
+ }
+
+ pclose(output);
+
+ if (!got_cluster_state)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster lacks cluster state information:\n");
+ else
+ pg_fatal("The target cluster lacks cluster state information:\n");
+ }
+ }
+
+ /* pg_resetxlog has been renamed to pg_resetwal in version 10 */
+ if (GET_MAJOR_VERSION(cluster->bin_version) <= 906)
+ resetwal_bin = "pg_resetxlog\" -n";
+ else
+ resetwal_bin = "pg_resetwal\" -n";
+ snprintf(cmd, sizeof(cmd), "\"%s/%s \"%s\"",
+ cluster->bindir,
+ live_check ? "pg_controldata\"" : resetwal_bin,
+ cluster->pgdata);
+ fflush(stdout);
+ fflush(stderr);
+
+ if ((output = popen(cmd, "r")) == NULL)
+ pg_fatal("could not get control data using %s: %s\n",
+ cmd, strerror(errno));
+
+ /* Only in <= 9.2 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
+ {
+ cluster->controldata.data_checksum_version = 0;
+ got_data_checksum_version = true;
+ }
+
+ /* we have the result of cmd in "output". so parse it line by line now */
+ while (fgets(bufin, sizeof(bufin), output))
+ {
+ pg_log(PG_VERBOSE, "%s", bufin);
+
+ if ((p = strstr(bufin, "pg_control version number:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: pg_resetwal problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.ctrl_ver = str2uint(p);
+ }
+ else if ((p = strstr(bufin, "Catalog version number:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.cat_ver = str2uint(p);
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's TimeLineID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ tli = str2uint(p);
+ got_tli = true;
+ }
+ else if ((p = strstr(bufin, "First log file ID after reset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ logid = str2uint(p);
+ got_log_id = true;
+ }
+ else if ((p = strstr(bufin, "First log file segment after reset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ segno = str2uint(p);
+ got_log_seg = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtepoch = str2uint(p);
+
+ /*
+ * Delimiter changed from '/' to ':' in 9.6. We don't test for
+ * the catalog version of the change because the catalog version
+ * is pulled from pg_controldata too, and it isn't worth adding an
+ * order dependency for this --- we just check the string.
+ */
+ if (strchr(p, '/') != NULL)
+ p = strchr(p, '/');
+ else if (GET_MAJOR_VERSION(cluster->major_version) >= 906)
+ p = strchr(p, ':');
+ else
+ p = NULL;
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove '/' or ':' char */
+ cluster->controldata.chkpnt_nxtxid = str2uint(p);
+ got_xid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtoid = str2uint(p);
+ got_oid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextMultiXactId:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtmulti = str2uint(p);
+ got_multi = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's oldestXID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_oldstxid = str2uint(p);
+ got_oldestxid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's oldestMultiXid:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_oldstMulti = str2uint(p);
+ got_oldestmulti = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextMultiOffset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtmxoff = str2uint(p);
+ got_mxoff = true;
+ }
+ else if ((p = strstr(bufin, "First log segment after reset:")) != NULL)
+ {
+ /* Skip the colon and any whitespace after it */
+ p = strchr(p, ':');
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+ p = strpbrk(p, "01234567890ABCDEF");
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ /* Make sure it looks like a valid WAL file name */
+ if (strspn(p, "0123456789ABCDEF") != 24)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ strlcpy(cluster->controldata.nextxlogfile, p, 25);
+ got_nextxlogfile = true;
+ }
+ else if ((p = strstr(bufin, "Float8 argument passing:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ /* used later for contrib check */
+ cluster->controldata.float8_pass_by_value = strstr(p, "by value") != NULL;
+ got_float8_pass_by_value = true;
+ }
+ else if ((p = strstr(bufin, "Maximum data alignment:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.align = str2uint(p);
+ got_align = true;
+ }
+ else if ((p = strstr(bufin, "Database block size:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.blocksz = str2uint(p);
+ got_blocksz = true;
+ }
+ else if ((p = strstr(bufin, "Blocks per segment of large relation:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.largesz = str2uint(p);
+ got_largesz = true;
+ }
+ else if ((p = strstr(bufin, "WAL block size:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.walsz = str2uint(p);
+ got_walsz = true;
+ }
+ else if ((p = strstr(bufin, "Bytes per WAL segment:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.walseg = str2uint(p);
+ got_walseg = true;
+ }
+ else if ((p = strstr(bufin, "Maximum length of identifiers:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.ident = str2uint(p);
+ got_ident = true;
+ }
+ else if ((p = strstr(bufin, "Maximum columns in an index:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.index = str2uint(p);
+ got_index = true;
+ }
+ else if ((p = strstr(bufin, "Maximum size of a TOAST chunk:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.toast = str2uint(p);
+ got_toast = true;
+ }
+ else if ((p = strstr(bufin, "Size of a large-object chunk:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.large_object = str2uint(p);
+ got_large_object = true;
+ }
+ else if ((p = strstr(bufin, "Date/time type storage:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.date_is_int = strstr(p, "64-bit integers") != NULL;
+ got_date_is_int = true;
+ }
+ else if ((p = strstr(bufin, "checksum")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ /* used later for contrib check */
+ cluster->controldata.data_checksum_version = str2uint(p);
+ got_data_checksum_version = true;
+ }
+ }
+
+ pclose(output);
+
+ /*
+ * Restore environment variables. Note all but LANG and LC_MESSAGES were
+ * unset above.
+ */
+ if (lc_collate)
+ setenv("LC_COLLATE", lc_collate, 1);
+ if (lc_ctype)
+ setenv("LC_CTYPE", lc_ctype, 1);
+ if (lc_monetary)
+ setenv("LC_MONETARY", lc_monetary, 1);
+ if (lc_numeric)
+ setenv("LC_NUMERIC", lc_numeric, 1);
+ if (lc_time)
+ setenv("LC_TIME", lc_time, 1);
+ if (lang)
+ setenv("LANG", lang, 1);
+ else
+ unsetenv("LANG");
+ if (language)
+ setenv("LANGUAGE", language, 1);
+ if (lc_all)
+ setenv("LC_ALL", lc_all, 1);
+ if (lc_messages)
+ setenv("LC_MESSAGES", lc_messages, 1);
+ else
+ unsetenv("LC_MESSAGES");
+
+ pg_free(lc_collate);
+ pg_free(lc_ctype);
+ pg_free(lc_monetary);
+ pg_free(lc_numeric);
+ pg_free(lc_time);
+ pg_free(lang);
+ pg_free(language);
+ pg_free(lc_all);
+ pg_free(lc_messages);
+
+ /*
+ * Before 9.3, pg_resetwal reported the xlogid and segno of the first log
+ * file after reset as separate lines. Starting with 9.3, it reports the
+ * WAL file name. If the old cluster is older than 9.3, we construct the
+ * WAL file name from the xlogid and segno.
+ */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
+ {
+ if (got_tli && got_log_id && got_log_seg)
+ {
+ snprintf(cluster->controldata.nextxlogfile, 25, "%08X%08X%08X",
+ tli, logid, segno);
+ got_nextxlogfile = true;
+ }
+ }
+
+ /* verify that we got all the mandatory pg_control data */
+ if (!got_xid || !got_oid ||
+ !got_multi || !got_oldestxid ||
+ (!got_oldestmulti &&
+ cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER) ||
+ !got_mxoff || (!live_check && !got_nextxlogfile) ||
+ !got_float8_pass_by_value || !got_align || !got_blocksz ||
+ !got_largesz || !got_walsz || !got_walseg || !got_ident ||
+ !got_index || !got_toast ||
+ (!got_large_object &&
+ cluster->controldata.ctrl_ver >= LARGE_OBJECT_SIZE_PG_CONTROL_VER) ||
+ !got_date_is_int || !got_data_checksum_version)
+ {
+ if (cluster == &old_cluster)
+ pg_log(PG_REPORT,
+ "The source cluster lacks some required control information:\n");
+ else
+ pg_log(PG_REPORT,
+ "The target cluster lacks some required control information:\n");
+
+ if (!got_xid)
+ pg_log(PG_REPORT, " checkpoint next XID\n");
+
+ if (!got_oid)
+ pg_log(PG_REPORT, " latest checkpoint next OID\n");
+
+ if (!got_multi)
+ pg_log(PG_REPORT, " latest checkpoint next MultiXactId\n");
+
+ if (!got_oldestmulti &&
+ cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ pg_log(PG_REPORT, " latest checkpoint oldest MultiXactId\n");
+
+ if (!got_oldestxid)
+ pg_log(PG_REPORT, " latest checkpoint oldestXID\n");
+
+ if (!got_mxoff)
+ pg_log(PG_REPORT, " latest checkpoint next MultiXactOffset\n");
+
+ if (!live_check && !got_nextxlogfile)
+ pg_log(PG_REPORT, " first WAL segment after reset\n");
+
+ if (!got_float8_pass_by_value)
+ pg_log(PG_REPORT, " float8 argument passing method\n");
+
+ if (!got_align)
+ pg_log(PG_REPORT, " maximum alignment\n");
+
+ if (!got_blocksz)
+ pg_log(PG_REPORT, " block size\n");
+
+ if (!got_largesz)
+ pg_log(PG_REPORT, " large relation segment size\n");
+
+ if (!got_walsz)
+ pg_log(PG_REPORT, " WAL block size\n");
+
+ if (!got_walseg)
+ pg_log(PG_REPORT, " WAL segment size\n");
+
+ if (!got_ident)
+ pg_log(PG_REPORT, " maximum identifier length\n");
+
+ if (!got_index)
+ pg_log(PG_REPORT, " maximum number of indexed columns\n");
+
+ if (!got_toast)
+ pg_log(PG_REPORT, " maximum TOAST chunk size\n");
+
+ if (!got_large_object &&
+ cluster->controldata.ctrl_ver >= LARGE_OBJECT_SIZE_PG_CONTROL_VER)
+ pg_log(PG_REPORT, " large-object chunk size\n");
+
+ if (!got_date_is_int)
+ pg_log(PG_REPORT, " dates/times are integers?\n");
+
+ /* value added in Postgres 9.3 */
+ if (!got_data_checksum_version)
+ pg_log(PG_REPORT, " data checksum version\n");
+
+ pg_fatal("Cannot continue without required control information, terminating\n");
+ }
+}
+
+
+/*
+ * check_control_data()
+ *
+ * check to make sure the control data settings are compatible
+ */
+void
+check_control_data(ControlData *oldctrl,
+ ControlData *newctrl)
+{
+ if (oldctrl->align == 0 || oldctrl->align != newctrl->align)
+ pg_fatal("old and new pg_controldata alignments are invalid or do not match\n"
+ "Likely one cluster is a 32-bit install, the other 64-bit\n");
+
+ if (oldctrl->blocksz == 0 || oldctrl->blocksz != newctrl->blocksz)
+ pg_fatal("old and new pg_controldata block sizes are invalid or do not match\n");
+
+ if (oldctrl->largesz == 0 || oldctrl->largesz != newctrl->largesz)
+ pg_fatal("old and new pg_controldata maximum relation segment sizes are invalid or do not match\n");
+
+ if (oldctrl->walsz == 0 || oldctrl->walsz != newctrl->walsz)
+ pg_fatal("old and new pg_controldata WAL block sizes are invalid or do not match\n");
+
+ if (oldctrl->walseg == 0 || oldctrl->walseg != newctrl->walseg)
+ pg_fatal("old and new pg_controldata WAL segment sizes are invalid or do not match\n");
+
+ if (oldctrl->ident == 0 || oldctrl->ident != newctrl->ident)
+ pg_fatal("old and new pg_controldata maximum identifier lengths are invalid or do not match\n");
+
+ if (oldctrl->index == 0 || oldctrl->index != newctrl->index)
+ pg_fatal("old and new pg_controldata maximum indexed columns are invalid or do not match\n");
+
+ if (oldctrl->toast == 0 || oldctrl->toast != newctrl->toast)
+ pg_fatal("old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n");
+
+ /* large_object added in 9.5, so it might not exist in the old cluster */
+ if (oldctrl->large_object != 0 &&
+ oldctrl->large_object != newctrl->large_object)
+ pg_fatal("old and new pg_controldata large-object chunk sizes are invalid or do not match\n");
+
+ if (oldctrl->date_is_int != newctrl->date_is_int)
+ pg_fatal("old and new pg_controldata date/time storage types do not match\n");
+
+ /*
+ * float8_pass_by_value does not need to match, but is used in
+ * check_for_isn_and_int8_passing_mismatch().
+ */
+
+ /*
+ * We might eventually allow upgrades from checksum to no-checksum
+ * clusters.
+ */
+ if (oldctrl->data_checksum_version == 0 &&
+ newctrl->data_checksum_version != 0)
+ pg_fatal("old cluster does not use data checksums but the new one does\n");
+ else if (oldctrl->data_checksum_version != 0 &&
+ newctrl->data_checksum_version == 0)
+ pg_fatal("old cluster uses data checksums but the new one does not\n");
+ else if (oldctrl->data_checksum_version != newctrl->data_checksum_version)
+ pg_fatal("old and new cluster pg_controldata checksum versions do not match\n");
+}
+
+
+void
+disable_old_cluster(void)
+{
+ char old_path[MAXPGPATH],
+ new_path[MAXPGPATH];
+
+ /* rename pg_control so old server cannot be accidentally started */
+ prep_status("Adding \".old\" suffix to old global/pg_control");
+
+ snprintf(old_path, sizeof(old_path), "%s/global/pg_control", old_cluster.pgdata);
+ snprintf(new_path, sizeof(new_path), "%s/global/pg_control.old", old_cluster.pgdata);
+ if (pg_mv_file(old_path, new_path) != 0)
+ pg_fatal("Unable to rename %s to %s.\n", old_path, new_path);
+ check_ok();
+
+ pg_log(PG_REPORT, "\n"
+ "If you want to start the old cluster, you will need to remove\n"
+ "the \".old\" suffix from %s/global/pg_control.old.\n"
+ "Because \"link\" mode was used, the old cluster cannot be safely\n"
+ "started once the new cluster has been started.\n\n", old_cluster.pgdata);
+}
diff --git a/src/bin/pg_upgrade/dump.c b/src/bin/pg_upgrade/dump.c
new file mode 100644
index 0000000..90060d0
--- /dev/null
+++ b/src/bin/pg_upgrade/dump.c
@@ -0,0 +1,69 @@
+/*
+ * dump.c
+ *
+ * dump functions
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/dump.c
+ */
+
+#include "postgres_fe.h"
+
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+void
+generate_old_dump(void)
+{
+ int dbnum;
+
+ prep_status("Creating dump of global objects");
+
+ /* run new pg_dumpall binary for globals */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_dumpall\" %s --globals-only --quote-all-identifiers "
+ "--binary-upgrade %s -f %s",
+ new_cluster.bindir, cluster_conn_opts(&old_cluster),
+ log_opts.verbose ? "--verbose" : "",
+ GLOBALS_DUMP_FILE);
+ check_ok();
+
+ prep_status("Creating dump of database schemas\n");
+
+ /* create per-db dump files */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ PQExpBufferData connstr,
+ escaped_connstr;
+
+ initPQExpBuffer(&connstr);
+ appendPQExpBufferStr(&connstr, "dbname=");
+ appendConnStrVal(&connstr, old_db->db_name);
+ initPQExpBuffer(&escaped_connstr);
+ appendShellString(&escaped_connstr, connstr.data);
+ termPQExpBuffer(&connstr);
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ parallel_exec_prog(log_file_name, NULL,
+ "\"%s/pg_dump\" %s --schema-only --quote-all-identifiers "
+ "--binary-upgrade --format=custom %s --file=\"%s\" %s",
+ new_cluster.bindir, cluster_conn_opts(&old_cluster),
+ log_opts.verbose ? "--verbose" : "",
+ sql_file_name, escaped_connstr.data);
+
+ termPQExpBuffer(&escaped_connstr);
+ }
+
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+
+ end_progress_output();
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/exec.c b/src/bin/pg_upgrade/exec.c
new file mode 100644
index 0000000..19cc06e
--- /dev/null
+++ b/src/bin/pg_upgrade/exec.c
@@ -0,0 +1,452 @@
+/*
+ * exec.c
+ *
+ * execution functions
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/exec.c
+ */
+
+#include "postgres_fe.h"
+
+#include <fcntl.h>
+
+#include "common/string.h"
+#include "pg_upgrade.h"
+
+static void check_data_dir(ClusterInfo *cluster);
+static void check_bin_dir(ClusterInfo *cluster, bool check_versions);
+static void get_bin_version(ClusterInfo *cluster);
+static void check_exec(const char *dir, const char *program, bool check_version);
+
+#ifdef WIN32
+static int win32_check_directory_write_permissions(void);
+#endif
+
+
+/*
+ * get_bin_version
+ *
+ * Fetch major version of binaries for cluster.
+ */
+static void
+get_bin_version(ClusterInfo *cluster)
+{
+ char cmd[MAXPGPATH],
+ cmd_output[MAX_STRING];
+ FILE *output;
+ int v1 = 0,
+ v2 = 0;
+
+ snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir);
+
+ if ((output = popen(cmd, "r")) == NULL ||
+ fgets(cmd_output, sizeof(cmd_output), output) == NULL)
+ pg_fatal("could not get pg_ctl version data using %s: %s\n",
+ cmd, strerror(errno));
+
+ pclose(output);
+
+ if (sscanf(cmd_output, "%*s %*s %d.%d", &v1, &v2) < 1)
+ pg_fatal("could not get pg_ctl version output from %s\n", cmd);
+
+ if (v1 < 10)
+ {
+ /* old style, e.g. 9.6.1 */
+ cluster->bin_version = v1 * 10000 + v2 * 100;
+ }
+ else
+ {
+ /* new style, e.g. 10.1 */
+ cluster->bin_version = v1 * 10000;
+ }
+}
+
+
+/*
+ * exec_prog()
+ * Execute an external program with stdout/stderr redirected, and report
+ * errors
+ *
+ * Formats a command from the given argument list, logs it to the log file,
+ * and attempts to execute that command. If the command executes
+ * successfully, exec_prog() returns true.
+ *
+ * If the command fails, an error message is optionally written to the specified
+ * log_file, and the program optionally exits.
+ *
+ * The code requires it be called first from the primary thread on Windows.
+ */
+bool
+exec_prog(const char *log_file, const char *opt_log_file,
+ bool report_error, bool exit_on_error, const char *fmt,...)
+{
+ int result = 0;
+ int written;
+
+#define MAXCMDLEN (2 * MAXPGPATH)
+ char cmd[MAXCMDLEN];
+ FILE *log;
+ va_list ap;
+
+#ifdef WIN32
+ static DWORD mainThreadId = 0;
+
+ /* We assume we are called from the primary thread first */
+ if (mainThreadId == 0)
+ mainThreadId = GetCurrentThreadId();
+#endif
+
+ written = 0;
+ va_start(ap, fmt);
+ written += vsnprintf(cmd + written, MAXCMDLEN - written, fmt, ap);
+ va_end(ap);
+ if (written >= MAXCMDLEN)
+ pg_fatal("command too long\n");
+ written += snprintf(cmd + written, MAXCMDLEN - written,
+ " >> \"%s\" 2>&1", log_file);
+ if (written >= MAXCMDLEN)
+ pg_fatal("command too long\n");
+
+ pg_log(PG_VERBOSE, "%s\n", cmd);
+
+#ifdef WIN32
+
+ /*
+ * For some reason, Windows issues a file-in-use error if we write data to
+ * the log file from a non-primary thread just before we create a
+ * subprocess that also writes to the same log file. One fix is to sleep
+ * for 100ms. A cleaner fix is to write to the log file _after_ the
+ * subprocess has completed, so we do this only when writing from a
+ * non-primary thread. fflush(), running system() twice, and pre-creating
+ * the file do not see to help.
+ */
+ if (mainThreadId != GetCurrentThreadId())
+ result = system(cmd);
+#endif
+
+ log = fopen(log_file, "a");
+
+#ifdef WIN32
+ {
+ /*
+ * "pg_ctl -w stop" might have reported that the server has stopped
+ * because the postmaster.pid file has been removed, but "pg_ctl -w
+ * start" might still be in the process of closing and might still be
+ * holding its stdout and -l log file descriptors open. Therefore,
+ * try to open the log file a few more times.
+ */
+ int iter;
+
+ for (iter = 0; iter < 4 && log == NULL; iter++)
+ {
+ pg_usleep(1000000); /* 1 sec */
+ log = fopen(log_file, "a");
+ }
+ }
+#endif
+
+ if (log == NULL)
+ pg_fatal("could not open log file \"%s\": %m\n", log_file);
+
+#ifdef WIN32
+ /* Are we printing "command:" before its output? */
+ if (mainThreadId == GetCurrentThreadId())
+ fprintf(log, "\n\n");
+#endif
+ fprintf(log, "command: %s\n", cmd);
+#ifdef WIN32
+ /* Are we printing "command:" after its output? */
+ if (mainThreadId != GetCurrentThreadId())
+ fprintf(log, "\n\n");
+#endif
+
+ /*
+ * In Windows, we must close the log file at this point so the file is not
+ * open while the command is running, or we get a share violation.
+ */
+ fclose(log);
+
+#ifdef WIN32
+ /* see comment above */
+ if (mainThreadId == GetCurrentThreadId())
+#endif
+ result = system(cmd);
+
+ if (result != 0 && report_error)
+ {
+ /* we might be in on a progress status line, so go to the next line */
+ report_status(PG_REPORT, "\n*failure*");
+ fflush(stdout);
+
+ pg_log(PG_VERBOSE, "There were problems executing \"%s\"\n", cmd);
+ if (opt_log_file)
+ pg_log(exit_on_error ? PG_FATAL : PG_REPORT,
+ "Consult the last few lines of \"%s\" or \"%s\" for\n"
+ "the probable cause of the failure.\n",
+ log_file, opt_log_file);
+ else
+ pg_log(exit_on_error ? PG_FATAL : PG_REPORT,
+ "Consult the last few lines of \"%s\" for\n"
+ "the probable cause of the failure.\n",
+ log_file);
+ }
+
+#ifndef WIN32
+
+ /*
+ * We can't do this on Windows because it will keep the "pg_ctl start"
+ * output filename open until the server stops, so we do the \n\n above on
+ * that platform. We use a unique filename for "pg_ctl start" that is
+ * never reused while the server is running, so it works fine. We could
+ * log these commands to a third file, but that just adds complexity.
+ */
+ if ((log = fopen(log_file, "a")) == NULL)
+ pg_fatal("could not write to log file \"%s\": %m\n", log_file);
+ fprintf(log, "\n\n");
+ fclose(log);
+#endif
+
+ return result == 0;
+}
+
+
+/*
+ * pid_lock_file_exists()
+ *
+ * Checks whether the postmaster.pid file exists.
+ */
+bool
+pid_lock_file_exists(const char *datadir)
+{
+ char path[MAXPGPATH];
+ int fd;
+
+ snprintf(path, sizeof(path), "%s/postmaster.pid", datadir);
+
+ if ((fd = open(path, O_RDONLY, 0)) < 0)
+ {
+ /* ENOTDIR means we will throw a more useful error later */
+ if (errno != ENOENT && errno != ENOTDIR)
+ pg_fatal("could not open file \"%s\" for reading: %s\n",
+ path, strerror(errno));
+
+ return false;
+ }
+
+ close(fd);
+ return true;
+}
+
+
+/*
+ * verify_directories()
+ *
+ * does all the hectic work of verifying directories and executables
+ * of old and new server.
+ *
+ * NOTE: May update the values of all parameters
+ */
+void
+verify_directories(void)
+{
+#ifndef WIN32
+ if (access(".", R_OK | W_OK | X_OK) != 0)
+#else
+ if (win32_check_directory_write_permissions() != 0)
+#endif
+ pg_fatal("You must have read and write access in the current directory.\n");
+
+ check_bin_dir(&old_cluster, false);
+ check_data_dir(&old_cluster);
+ check_bin_dir(&new_cluster, true);
+ check_data_dir(&new_cluster);
+}
+
+
+#ifdef WIN32
+/*
+ * win32_check_directory_write_permissions()
+ *
+ * access() on WIN32 can't check directory permissions, so we have to
+ * optionally create, then delete a file to check.
+ * http://msdn.microsoft.com/en-us/library/1w06ktdy%28v=vs.80%29.aspx
+ */
+static int
+win32_check_directory_write_permissions(void)
+{
+ int fd;
+
+ /*
+ * We open a file we would normally create anyway. We do this even in
+ * 'check' mode, which isn't ideal, but this is the best we can do.
+ */
+ if ((fd = open(GLOBALS_DUMP_FILE, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0)
+ return -1;
+ close(fd);
+
+ return unlink(GLOBALS_DUMP_FILE);
+}
+#endif
+
+
+/*
+ * check_single_dir()
+ *
+ * Check for the presence of a single directory in PGDATA, and fail if
+ * is it missing or not accessible.
+ */
+static void
+check_single_dir(const char *pg_data, const char *subdir)
+{
+ struct stat statBuf;
+ char subDirName[MAXPGPATH];
+
+ snprintf(subDirName, sizeof(subDirName), "%s%s%s", pg_data,
+ /* Win32 can't stat() a directory with a trailing slash. */
+ *subdir ? "/" : "",
+ subdir);
+
+ if (stat(subDirName, &statBuf) != 0)
+ report_status(PG_FATAL, "check for \"%s\" failed: %s\n",
+ subDirName, strerror(errno));
+ else if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL, "\"%s\" is not a directory\n",
+ subDirName);
+}
+
+
+/*
+ * check_data_dir()
+ *
+ * This function validates the given cluster directory - we search for a
+ * small set of subdirectories that we expect to find in a valid $PGDATA
+ * directory. If any of the subdirectories are missing (or secured against
+ * us) we display an error message and exit()
+ *
+ */
+static void
+check_data_dir(ClusterInfo *cluster)
+{
+ const char *pg_data = cluster->pgdata;
+
+ /* get the cluster version */
+ cluster->major_version = get_major_server_version(cluster);
+
+ check_single_dir(pg_data, "");
+ check_single_dir(pg_data, "base");
+ check_single_dir(pg_data, "global");
+ check_single_dir(pg_data, "pg_multixact");
+ check_single_dir(pg_data, "pg_subtrans");
+ check_single_dir(pg_data, "pg_tblspc");
+ check_single_dir(pg_data, "pg_twophase");
+
+ /* pg_xlog has been renamed to pg_wal in v10 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 906)
+ check_single_dir(pg_data, "pg_xlog");
+ else
+ check_single_dir(pg_data, "pg_wal");
+
+ /* pg_clog has been renamed to pg_xact in v10 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 906)
+ check_single_dir(pg_data, "pg_clog");
+ else
+ check_single_dir(pg_data, "pg_xact");
+}
+
+
+/*
+ * check_bin_dir()
+ *
+ * This function searches for the executables that we expect to find
+ * in the binaries directory. If we find that a required executable
+ * is missing (or secured against us), we display an error message and
+ * exit().
+ *
+ * If check_versions is true, then the versions of the binaries are checked
+ * against the version of this pg_upgrade. This is for checking the target
+ * bindir.
+ */
+static void
+check_bin_dir(ClusterInfo *cluster, bool check_versions)
+{
+ struct stat statBuf;
+
+ /* check bindir */
+ if (stat(cluster->bindir, &statBuf) != 0)
+ report_status(PG_FATAL, "check for \"%s\" failed: %s\n",
+ cluster->bindir, strerror(errno));
+ else if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL, "\"%s\" is not a directory\n",
+ cluster->bindir);
+
+ check_exec(cluster->bindir, "postgres", check_versions);
+ check_exec(cluster->bindir, "pg_controldata", check_versions);
+ check_exec(cluster->bindir, "pg_ctl", check_versions);
+
+ /*
+ * Fetch the binary version after checking for the existence of pg_ctl.
+ * This way we report a useful error if the pg_ctl binary used for version
+ * fetching is missing/broken.
+ */
+ get_bin_version(cluster);
+
+ /* pg_resetxlog has been renamed to pg_resetwal in version 10 */
+ if (GET_MAJOR_VERSION(cluster->bin_version) <= 906)
+ check_exec(cluster->bindir, "pg_resetxlog", check_versions);
+ else
+ check_exec(cluster->bindir, "pg_resetwal", check_versions);
+
+ if (cluster == &new_cluster)
+ {
+ /*
+ * These binaries are only needed for the target version. pg_dump and
+ * pg_dumpall are used to dump the old cluster, but must be of the
+ * target version.
+ */
+ check_exec(cluster->bindir, "initdb", check_versions);
+ check_exec(cluster->bindir, "pg_dump", check_versions);
+ check_exec(cluster->bindir, "pg_dumpall", check_versions);
+ check_exec(cluster->bindir, "pg_restore", check_versions);
+ check_exec(cluster->bindir, "psql", check_versions);
+ check_exec(cluster->bindir, "vacuumdb", check_versions);
+ }
+}
+
+static void
+check_exec(const char *dir, const char *program, bool check_version)
+{
+ char path[MAXPGPATH];
+ char line[MAXPGPATH];
+ char cmd[MAXPGPATH];
+ char versionstr[128];
+ int ret;
+
+ snprintf(path, sizeof(path), "%s/%s", dir, program);
+
+ ret = validate_exec(path);
+
+ if (ret == -1)
+ pg_fatal("check for \"%s\" failed: not a regular file\n",
+ path);
+ else if (ret == -2)
+ pg_fatal("check for \"%s\" failed: cannot execute (permission denied)\n",
+ path);
+
+ snprintf(cmd, sizeof(cmd), "\"%s\" -V", path);
+
+ if (!pipe_read_line(cmd, line, sizeof(line)))
+ pg_fatal("check for \"%s\" failed: cannot execute\n",
+ path);
+
+ if (check_version)
+ {
+ pg_strip_crlf(line);
+
+ snprintf(versionstr, sizeof(versionstr), "%s (PostgreSQL) " PG_VERSION, program);
+
+ if (strcmp(line, versionstr) != 0)
+ pg_fatal("check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n",
+ path, line, versionstr);
+ }
+}
diff --git a/src/bin/pg_upgrade/file.c b/src/bin/pg_upgrade/file.c
new file mode 100644
index 0000000..142f690
--- /dev/null
+++ b/src/bin/pg_upgrade/file.c
@@ -0,0 +1,376 @@
+/*
+ * file.c
+ *
+ * file system operations
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/file.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#ifdef HAVE_COPYFILE_H
+#include <copyfile.h>
+#endif
+#ifdef __linux__
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+#endif
+
+#include "access/visibilitymapdefs.h"
+#include "common/file_perm.h"
+#include "pg_upgrade.h"
+#include "storage/bufpage.h"
+#include "storage/checksum.h"
+#include "storage/checksum_impl.h"
+
+
+/*
+ * cloneFile()
+ *
+ * Clones/reflinks a relation file from src to dst.
+ *
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+cloneFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+#if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
+ if (copyfile(src, dst, NULL, COPYFILE_CLONE_FORCE) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
+ schemaName, relName, src, dst, strerror(errno));
+#elif defined(__linux__) && defined(FICLONE)
+ int src_fd;
+ int dest_fd;
+
+ if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n",
+ schemaName, relName, src, strerror(errno));
+
+ if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n",
+ schemaName, relName, dst, strerror(errno));
+
+ if (ioctl(dest_fd, FICLONE, src_fd) < 0)
+ {
+ int save_errno = errno;
+
+ unlink(dst);
+ pg_fatal("error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
+ schemaName, relName, src, dst, strerror(save_errno));
+ }
+
+ close(src_fd);
+ close(dest_fd);
+#endif
+}
+
+
+/*
+ * copyFile()
+ *
+ * Copies a relation file from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+copyFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+#ifndef WIN32
+ int src_fd;
+ int dest_fd;
+ char *buffer;
+
+ if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %s\n",
+ schemaName, relName, src, strerror(errno));
+
+ if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %s\n",
+ schemaName, relName, dst, strerror(errno));
+
+ /* copy in fairly large chunks for best efficiency */
+#define COPY_BUF_SIZE (50 * BLCKSZ)
+
+ buffer = (char *) pg_malloc(COPY_BUF_SIZE);
+
+ /* perform data copying i.e read src source, write to destination */
+ while (true)
+ {
+ ssize_t nbytes = read(src_fd, buffer, COPY_BUF_SIZE);
+
+ if (nbytes < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %s\n",
+ schemaName, relName, src, strerror(errno));
+
+ if (nbytes == 0)
+ break;
+
+ errno = 0;
+ if (write(dest_fd, buffer, nbytes) != nbytes)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %s\n",
+ schemaName, relName, dst, strerror(errno));
+ }
+ }
+
+ pg_free(buffer);
+ close(src_fd);
+ close(dest_fd);
+
+#else /* WIN32 */
+
+ if (CopyFile(src, dst, true) == 0)
+ {
+ _dosmaperr(GetLastError());
+ pg_fatal("error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
+ schemaName, relName, src, dst, strerror(errno));
+ }
+
+#endif /* WIN32 */
+}
+
+
+/*
+ * linkFile()
+ *
+ * Hard-links a relation file from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+linkFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+ if (link(src, dst) < 0)
+ pg_fatal("error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
+ schemaName, relName, src, dst, strerror(errno));
+}
+
+
+/*
+ * rewriteVisibilityMap()
+ *
+ * Transform a visibility map file, copying from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ *
+ * In versions of PostgreSQL prior to catversion 201603011, PostgreSQL's
+ * visibility map included one bit per heap page; it now includes two.
+ * When upgrading a cluster from before that time to a current PostgreSQL
+ * version, we could refuse to copy visibility maps from the old cluster
+ * to the new cluster; the next VACUUM would recreate them, but at the
+ * price of scanning the entire table. So, instead, we rewrite the old
+ * visibility maps in the new format. That way, the all-visible bits
+ * remain set for the pages for which they were set previously. The
+ * all-frozen bits are never set by this conversion; we leave that to VACUUM.
+ */
+void
+rewriteVisibilityMap(const char *fromfile, const char *tofile,
+ const char *schemaName, const char *relName)
+{
+ int src_fd;
+ int dst_fd;
+ PGAlignedBlock buffer;
+ PGAlignedBlock new_vmbuf;
+ ssize_t totalBytesRead = 0;
+ ssize_t src_filesize;
+ int rewriteVmBytesPerPage;
+ BlockNumber new_blkno = 0;
+ struct stat statbuf;
+
+ /* Compute number of old-format bytes per new page */
+ rewriteVmBytesPerPage = (BLCKSZ - SizeOfPageHeaderData) / 2;
+
+ if ((src_fd = open(fromfile, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %s\n",
+ schemaName, relName, fromfile, strerror(errno));
+
+ if (fstat(src_fd, &statbuf) != 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n",
+ schemaName, relName, fromfile, strerror(errno));
+
+ if ((dst_fd = open(tofile, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %s\n",
+ schemaName, relName, tofile, strerror(errno));
+
+ /* Save old file size */
+ src_filesize = statbuf.st_size;
+
+ /*
+ * Turn each visibility map page into 2 pages one by one. Each new page
+ * has the same page header as the old one. If the last section of the
+ * last page is empty, we skip it, mostly to avoid turning one-page
+ * visibility maps for small relations into two pages needlessly.
+ */
+ while (totalBytesRead < src_filesize)
+ {
+ ssize_t bytesRead;
+ char *old_cur;
+ char *old_break;
+ char *old_blkend;
+ PageHeaderData pageheader;
+ bool old_lastblk;
+
+ if ((bytesRead = read(src_fd, buffer.data, BLCKSZ)) != BLCKSZ)
+ {
+ if (bytesRead < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %s\n",
+ schemaName, relName, fromfile, strerror(errno));
+ else
+ pg_fatal("error while copying relation \"%s.%s\": partial page found in file \"%s\"\n",
+ schemaName, relName, fromfile);
+ }
+
+ totalBytesRead += BLCKSZ;
+ old_lastblk = (totalBytesRead == src_filesize);
+
+ /* Save the page header data */
+ memcpy(&pageheader, buffer.data, SizeOfPageHeaderData);
+
+ /*
+ * These old_* variables point to old visibility map page. old_cur
+ * points to current position on old page. old_blkend points to end of
+ * old block. old_break is the end+1 position on the old page for the
+ * data that will be transferred to the current new page.
+ */
+ old_cur = buffer.data + SizeOfPageHeaderData;
+ old_blkend = buffer.data + bytesRead;
+ old_break = old_cur + rewriteVmBytesPerPage;
+
+ while (old_break <= old_blkend)
+ {
+ char *new_cur;
+ bool empty = true;
+ bool old_lastpart;
+
+ /* First, copy old page header to new page */
+ memcpy(new_vmbuf.data, &pageheader, SizeOfPageHeaderData);
+
+ /* Rewriting the last part of the last old page? */
+ old_lastpart = old_lastblk && (old_break == old_blkend);
+
+ new_cur = new_vmbuf.data + SizeOfPageHeaderData;
+
+ /* Process old page bytes one by one, and turn it into new page. */
+ while (old_cur < old_break)
+ {
+ uint8 byte = *(uint8 *) old_cur;
+ uint16 new_vmbits = 0;
+ int i;
+
+ /* Generate new format bits while keeping old information */
+ for (i = 0; i < BITS_PER_BYTE; i++)
+ {
+ if (byte & (1 << i))
+ {
+ empty = false;
+ new_vmbits |=
+ VISIBILITYMAP_ALL_VISIBLE << (BITS_PER_HEAPBLOCK * i);
+ }
+ }
+
+ /* Copy new visibility map bytes to new-format page */
+ new_cur[0] = (char) (new_vmbits & 0xFF);
+ new_cur[1] = (char) (new_vmbits >> 8);
+
+ old_cur++;
+ new_cur += BITS_PER_HEAPBLOCK;
+ }
+
+ /* If the last part of the last page is empty, skip writing it */
+ if (old_lastpart && empty)
+ break;
+
+ /* Set new checksum for visibility map page, if enabled */
+ if (new_cluster.controldata.data_checksum_version != 0)
+ ((PageHeader) new_vmbuf.data)->pd_checksum =
+ pg_checksum_page(new_vmbuf.data, new_blkno);
+
+ errno = 0;
+ if (write(dst_fd, new_vmbuf.data, BLCKSZ) != BLCKSZ)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %s\n",
+ schemaName, relName, tofile, strerror(errno));
+ }
+
+ /* Advance for next new page */
+ old_break += rewriteVmBytesPerPage;
+ new_blkno++;
+ }
+ }
+
+ /* Clean up */
+ close(dst_fd);
+ close(src_fd);
+}
+
+void
+check_file_clone(void)
+{
+ char existing_file[MAXPGPATH];
+ char new_link_file[MAXPGPATH];
+
+ snprintf(existing_file, sizeof(existing_file), "%s/PG_VERSION", old_cluster.pgdata);
+ snprintf(new_link_file, sizeof(new_link_file), "%s/PG_VERSION.clonetest", new_cluster.pgdata);
+ unlink(new_link_file); /* might fail */
+
+#if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
+ if (copyfile(existing_file, new_link_file, NULL, COPYFILE_CLONE_FORCE) < 0)
+ pg_fatal("could not clone file between old and new data directories: %s\n",
+ strerror(errno));
+#elif defined(__linux__) && defined(FICLONE)
+ {
+ int src_fd;
+ int dest_fd;
+
+ if ((src_fd = open(existing_file, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("could not open file \"%s\": %s\n",
+ existing_file, strerror(errno));
+
+ if ((dest_fd = open(new_link_file, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("could not create file \"%s\": %s\n",
+ new_link_file, strerror(errno));
+
+ if (ioctl(dest_fd, FICLONE, src_fd) < 0)
+ pg_fatal("could not clone file between old and new data directories: %s\n",
+ strerror(errno));
+
+ close(src_fd);
+ close(dest_fd);
+ }
+#else
+ pg_fatal("file cloning not supported on this platform\n");
+#endif
+
+ unlink(new_link_file);
+}
+
+void
+check_hard_link(void)
+{
+ char existing_file[MAXPGPATH];
+ char new_link_file[MAXPGPATH];
+
+ snprintf(existing_file, sizeof(existing_file), "%s/PG_VERSION", old_cluster.pgdata);
+ snprintf(new_link_file, sizeof(new_link_file), "%s/PG_VERSION.linktest", new_cluster.pgdata);
+ unlink(new_link_file); /* might fail */
+
+ if (link(existing_file, new_link_file) < 0)
+ pg_fatal("could not create hard link between old and new data directories: %s\n"
+ "In link mode the old and new data directories must be on the same file system.\n",
+ strerror(errno));
+
+ unlink(new_link_file);
+}
diff --git a/src/bin/pg_upgrade/function.c b/src/bin/pg_upgrade/function.c
new file mode 100644
index 0000000..4952de1
--- /dev/null
+++ b/src/bin/pg_upgrade/function.c
@@ -0,0 +1,271 @@
+/*
+ * function.c
+ *
+ * server-side function support
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/function.c
+ */
+
+#include "postgres_fe.h"
+
+#include "access/transam.h"
+#include "catalog/pg_language_d.h"
+#include "pg_upgrade.h"
+
+/*
+ * qsort comparator for pointers to library names
+ *
+ * We sort first by name length, then alphabetically for names of the
+ * same length, then database array index. This is to ensure that, eg,
+ * "hstore_plpython" sorts after both "hstore" and "plpython"; otherwise
+ * transform modules will probably fail their LOAD tests. (The backend
+ * ought to cope with that consideration, but it doesn't yet, and even
+ * when it does it'll still be a good idea to have a predictable order of
+ * probing here.)
+ */
+static int
+library_name_compare(const void *p1, const void *p2)
+{
+ const char *str1 = ((const LibraryInfo *) p1)->name;
+ const char *str2 = ((const LibraryInfo *) p2)->name;
+ int slen1 = strlen(str1);
+ int slen2 = strlen(str2);
+ int cmp = strcmp(str1, str2);
+
+ if (slen1 != slen2)
+ return slen1 - slen2;
+ if (cmp != 0)
+ return cmp;
+ else
+ return ((const LibraryInfo *) p1)->dbnum -
+ ((const LibraryInfo *) p2)->dbnum;
+}
+
+
+/*
+ * get_loadable_libraries()
+ *
+ * Fetch the names of all old libraries containing C-language functions.
+ * We will later check that they all exist in the new installation.
+ */
+void
+get_loadable_libraries(void)
+{
+ PGresult **ress;
+ int totaltups;
+ int dbnum;
+ bool found_public_plpython_handler = false;
+
+ ress = (PGresult **) pg_malloc(old_cluster.dbarr.ndbs * sizeof(PGresult *));
+ totaltups = 0;
+
+ /* Fetch all library names, removing duplicates within each DB */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ DbInfo *active_db = &old_cluster.dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(&old_cluster, active_db->db_name);
+
+ /*
+ * Fetch all libraries containing non-built-in C functions in this DB.
+ */
+ ress[dbnum] = executeQueryOrDie(conn,
+ "SELECT DISTINCT probin "
+ "FROM pg_catalog.pg_proc "
+ "WHERE prolang = %u AND "
+ "probin IS NOT NULL AND "
+ "oid >= %u;",
+ ClanguageId,
+ FirstNormalObjectId);
+ totaltups += PQntuples(ress[dbnum]);
+
+ /*
+ * Systems that install plpython before 8.1 have
+ * plpython_call_handler() defined in the "public" schema, causing
+ * pg_dump to dump it. However that function still references
+ * "plpython" (no "2"), so it throws an error on restore. This code
+ * checks for the problem function, reports affected databases to the
+ * user and explains how to remove them. 8.1 git commit:
+ * e0dedd0559f005d60c69c9772163e69c204bac69
+ * http://archives.postgresql.org/pgsql-hackers/2012-03/msg01101.php
+ * http://archives.postgresql.org/pgsql-bugs/2012-05/msg00206.php
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 900)
+ {
+ PGresult *res;
+
+ res = executeQueryOrDie(conn,
+ "SELECT 1 "
+ "FROM pg_catalog.pg_proc p "
+ " JOIN pg_catalog.pg_namespace n "
+ " ON pronamespace = n.oid "
+ "WHERE proname = 'plpython_call_handler' AND "
+ "nspname = 'public' AND "
+ "prolang = %u AND "
+ "probin = '$libdir/plpython' AND "
+ "p.oid >= %u;",
+ ClanguageId,
+ FirstNormalObjectId);
+ if (PQntuples(res) > 0)
+ {
+ if (!found_public_plpython_handler)
+ {
+ pg_log(PG_WARNING,
+ "\nThe old cluster has a \"plpython_call_handler\" function defined\n"
+ "in the \"public\" schema which is a duplicate of the one defined\n"
+ "in the \"pg_catalog\" schema. You can confirm this by executing\n"
+ "in psql:\n"
+ "\n"
+ " \\df *.plpython_call_handler\n"
+ "\n"
+ "The \"public\" schema version of this function was created by a\n"
+ "pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+ "to complete because it references a now-obsolete \"plpython\"\n"
+ "shared object file. You can remove the \"public\" schema version\n"
+ "of this function by running the following command:\n"
+ "\n"
+ " DROP FUNCTION public.plpython_call_handler()\n"
+ "\n"
+ "in each affected database:\n"
+ "\n");
+ }
+ pg_log(PG_WARNING, " %s\n", active_db->db_name);
+ found_public_plpython_handler = true;
+ }
+ PQclear(res);
+ }
+
+ PQfinish(conn);
+ }
+
+ if (found_public_plpython_handler)
+ pg_fatal("Remove the problem functions from the old cluster to continue.\n");
+
+ os_info.libraries = (LibraryInfo *) pg_malloc(totaltups * sizeof(LibraryInfo));
+ totaltups = 0;
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ PGresult *res = ress[dbnum];
+ int ntups;
+ int rowno;
+
+ ntups = PQntuples(res);
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ char *lib = PQgetvalue(res, rowno, 0);
+
+ os_info.libraries[totaltups].name = pg_strdup(lib);
+ os_info.libraries[totaltups].dbnum = dbnum;
+
+ totaltups++;
+ }
+ PQclear(res);
+ }
+
+ pg_free(ress);
+
+ os_info.num_libraries = totaltups;
+}
+
+
+/*
+ * check_loadable_libraries()
+ *
+ * Check that the new cluster contains all required libraries.
+ * We do this by actually trying to LOAD each one, thereby testing
+ * compatibility as well as presence.
+ */
+void
+check_loadable_libraries(void)
+{
+ PGconn *conn = connectToServer(&new_cluster, "template1");
+ int libnum;
+ int was_load_failure = false;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for presence of required libraries");
+
+ snprintf(output_path, sizeof(output_path), "loadable_libraries.txt");
+
+ /*
+ * Now we want to sort the library names into order. This avoids multiple
+ * probes of the same library, and ensures that libraries are probed in a
+ * consistent order, which is important for reproducible behavior if one
+ * library depends on another.
+ */
+ qsort((void *) os_info.libraries, os_info.num_libraries,
+ sizeof(LibraryInfo), library_name_compare);
+
+ for (libnum = 0; libnum < os_info.num_libraries; libnum++)
+ {
+ char *lib = os_info.libraries[libnum].name;
+ int llen = strlen(lib);
+ char cmd[7 + 2 * MAXPGPATH + 1];
+ PGresult *res;
+
+ /* Did the library name change? Probe it. */
+ if (libnum == 0 || strcmp(lib, os_info.libraries[libnum - 1].name) != 0)
+ {
+ /*
+ * In Postgres 9.0, Python 3 support was added, and to do that, a
+ * plpython2u language was created with library name plpython2.so
+ * as a symbolic link to plpython.so. In Postgres 9.1, only the
+ * plpython2.so library was created, and both plpythonu and
+ * plpython2u point to it. For this reason, any reference to
+ * library name "plpython" in an old PG <= 9.1 cluster must look
+ * for "plpython2" in the new cluster.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 900 &&
+ strcmp(lib, "$libdir/plpython") == 0)
+ {
+ lib = "$libdir/plpython2";
+ llen = strlen(lib);
+ }
+
+ strcpy(cmd, "LOAD '");
+ PQescapeStringConn(conn, cmd + strlen(cmd), lib, llen, NULL);
+ strcat(cmd, "'");
+
+ res = PQexec(conn, cmd);
+
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ found = true;
+ was_load_failure = true;
+
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ fprintf(script, _("could not load library \"%s\": %s"),
+ lib,
+ PQerrorMessage(conn));
+ }
+ else
+ was_load_failure = false;
+
+ PQclear(res);
+ }
+
+ if (was_load_failure)
+ fprintf(script, _("In database: %s\n"),
+ old_cluster.dbarr.dbs[os_info.libraries[libnum].dbnum].db_name);
+ }
+
+ PQfinish(conn);
+
+ if (found)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation references loadable libraries that are missing from the\n"
+ "new installation. You can add these libraries to the new installation,\n"
+ "or remove the functions using them from the old installation. A list of\n"
+ "problem libraries is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/info.c b/src/bin/pg_upgrade/info.c
new file mode 100644
index 0000000..5d9a26c
--- /dev/null
+++ b/src/bin/pg_upgrade/info.c
@@ -0,0 +1,649 @@
+/*
+ * info.c
+ *
+ * information support functions
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/info.c
+ */
+
+#include "postgres_fe.h"
+
+#include "access/transam.h"
+#include "catalog/pg_class_d.h"
+#include "pg_upgrade.h"
+
+static void create_rel_filename_map(const char *old_data, const char *new_data,
+ const DbInfo *old_db, const DbInfo *new_db,
+ const RelInfo *old_rel, const RelInfo *new_rel,
+ FileNameMap *map);
+static void report_unmatched_relation(const RelInfo *rel, const DbInfo *db,
+ bool is_new_db);
+static void free_db_and_rel_infos(DbInfoArr *db_arr);
+static void get_db_infos(ClusterInfo *cluster);
+static void get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo);
+static void free_rel_infos(RelInfoArr *rel_arr);
+static void print_db_infos(DbInfoArr *dbinfo);
+static void print_rel_infos(RelInfoArr *rel_arr);
+
+
+/*
+ * gen_db_file_maps()
+ *
+ * generates a database mapping from "old_db" to "new_db".
+ *
+ * Returns a malloc'ed array of mappings. The length of the array
+ * is returned into *nmaps.
+ */
+FileNameMap *
+gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
+ int *nmaps,
+ const char *old_pgdata, const char *new_pgdata)
+{
+ FileNameMap *maps;
+ int old_relnum,
+ new_relnum;
+ int num_maps = 0;
+ bool all_matched = true;
+
+ /* There will certainly not be more mappings than there are old rels */
+ maps = (FileNameMap *) pg_malloc(sizeof(FileNameMap) *
+ old_db->rel_arr.nrels);
+
+ /*
+ * Each of the RelInfo arrays should be sorted by OID. Scan through them
+ * and match them up. If we fail to match everything, we'll abort, but
+ * first print as much info as we can about mismatches.
+ */
+ old_relnum = new_relnum = 0;
+ while (old_relnum < old_db->rel_arr.nrels ||
+ new_relnum < new_db->rel_arr.nrels)
+ {
+ RelInfo *old_rel = (old_relnum < old_db->rel_arr.nrels) ?
+ &old_db->rel_arr.rels[old_relnum] : NULL;
+ RelInfo *new_rel = (new_relnum < new_db->rel_arr.nrels) ?
+ &new_db->rel_arr.rels[new_relnum] : NULL;
+
+ /* handle running off one array before the other */
+ if (!new_rel)
+ {
+ /*
+ * old_rel is unmatched. This should never happen, because we
+ * force new rels to have TOAST tables if the old one did.
+ */
+ report_unmatched_relation(old_rel, old_db, false);
+ all_matched = false;
+ old_relnum++;
+ continue;
+ }
+ if (!old_rel)
+ {
+ /*
+ * new_rel is unmatched. This shouldn't really happen either, but
+ * if it's a TOAST table, we can ignore it and continue
+ * processing, assuming that the new server made a TOAST table
+ * that wasn't needed.
+ */
+ if (strcmp(new_rel->nspname, "pg_toast") != 0)
+ {
+ report_unmatched_relation(new_rel, new_db, true);
+ all_matched = false;
+ }
+ new_relnum++;
+ continue;
+ }
+
+ /* check for mismatched OID */
+ if (old_rel->reloid < new_rel->reloid)
+ {
+ /* old_rel is unmatched, see comment above */
+ report_unmatched_relation(old_rel, old_db, false);
+ all_matched = false;
+ old_relnum++;
+ continue;
+ }
+ else if (old_rel->reloid > new_rel->reloid)
+ {
+ /* new_rel is unmatched, see comment above */
+ if (strcmp(new_rel->nspname, "pg_toast") != 0)
+ {
+ report_unmatched_relation(new_rel, new_db, true);
+ all_matched = false;
+ }
+ new_relnum++;
+ continue;
+ }
+
+ /*
+ * Verify that rels of same OID have same name. The namespace name
+ * should always match, but the relname might not match for TOAST
+ * tables (and, therefore, their indexes).
+ *
+ * TOAST table names initially match the heap pg_class oid, but
+ * pre-9.0 they can change during certain commands such as CLUSTER, so
+ * don't insist on a match if old cluster is < 9.0.
+ */
+ if (strcmp(old_rel->nspname, new_rel->nspname) != 0 ||
+ (strcmp(old_rel->relname, new_rel->relname) != 0 &&
+ (GET_MAJOR_VERSION(old_cluster.major_version) >= 900 ||
+ strcmp(old_rel->nspname, "pg_toast") != 0)))
+ {
+ pg_log(PG_WARNING, "Relation names for OID %u in database \"%s\" do not match: "
+ "old name \"%s.%s\", new name \"%s.%s\"\n",
+ old_rel->reloid, old_db->db_name,
+ old_rel->nspname, old_rel->relname,
+ new_rel->nspname, new_rel->relname);
+ all_matched = false;
+ old_relnum++;
+ new_relnum++;
+ continue;
+ }
+
+ /* OK, create a mapping entry */
+ create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
+ old_rel, new_rel, maps + num_maps);
+ num_maps++;
+ old_relnum++;
+ new_relnum++;
+ }
+
+ if (!all_matched)
+ pg_fatal("Failed to match up old and new tables in database \"%s\"\n",
+ old_db->db_name);
+
+ *nmaps = num_maps;
+ return maps;
+}
+
+
+/*
+ * create_rel_filename_map()
+ *
+ * fills a file node map structure and returns it in "map".
+ */
+static void
+create_rel_filename_map(const char *old_data, const char *new_data,
+ const DbInfo *old_db, const DbInfo *new_db,
+ const RelInfo *old_rel, const RelInfo *new_rel,
+ FileNameMap *map)
+{
+ /* In case old/new tablespaces don't match, do them separately. */
+ if (strlen(old_rel->tablespace) == 0)
+ {
+ /*
+ * relation belongs to the default tablespace, hence relfiles should
+ * exist in the data directories.
+ */
+ map->old_tablespace = old_data;
+ map->old_tablespace_suffix = "/base";
+ }
+ else
+ {
+ /* relation belongs to a tablespace, so use the tablespace location */
+ map->old_tablespace = old_rel->tablespace;
+ map->old_tablespace_suffix = old_cluster.tablespace_suffix;
+ }
+
+ /* Do the same for new tablespaces */
+ if (strlen(new_rel->tablespace) == 0)
+ {
+ map->new_tablespace = new_data;
+ map->new_tablespace_suffix = "/base";
+ }
+ else
+ {
+ map->new_tablespace = new_rel->tablespace;
+ map->new_tablespace_suffix = new_cluster.tablespace_suffix;
+ }
+
+ map->old_db_oid = old_db->db_oid;
+ map->new_db_oid = new_db->db_oid;
+
+ /*
+ * old_relfilenode might differ from pg_class.oid (and hence
+ * new_relfilenode) because of CLUSTER, REINDEX, or VACUUM FULL.
+ */
+ map->old_relfilenode = old_rel->relfilenode;
+
+ /* new_relfilenode will match old and new pg_class.oid */
+ map->new_relfilenode = new_rel->relfilenode;
+
+ /* used only for logging and error reporting, old/new are identical */
+ map->nspname = old_rel->nspname;
+ map->relname = old_rel->relname;
+}
+
+
+/*
+ * Complain about a relation we couldn't match to the other database,
+ * identifying it as best we can.
+ */
+static void
+report_unmatched_relation(const RelInfo *rel, const DbInfo *db, bool is_new_db)
+{
+ Oid reloid = rel->reloid; /* we might change rel below */
+ char reldesc[1000];
+ int i;
+
+ snprintf(reldesc, sizeof(reldesc), "\"%s.%s\"",
+ rel->nspname, rel->relname);
+ if (rel->indtable)
+ {
+ for (i = 0; i < db->rel_arr.nrels; i++)
+ {
+ const RelInfo *hrel = &db->rel_arr.rels[i];
+
+ if (hrel->reloid == rel->indtable)
+ {
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is an index on \"%s.%s\""),
+ hrel->nspname, hrel->relname);
+ /* Shift attention to index's table for toast check */
+ rel = hrel;
+ break;
+ }
+ }
+ if (i >= db->rel_arr.nrels)
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is an index on OID %u"), rel->indtable);
+ }
+ if (rel->toastheap)
+ {
+ for (i = 0; i < db->rel_arr.nrels; i++)
+ {
+ const RelInfo *brel = &db->rel_arr.rels[i];
+
+ if (brel->reloid == rel->toastheap)
+ {
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is the TOAST table for \"%s.%s\""),
+ brel->nspname, brel->relname);
+ break;
+ }
+ }
+ if (i >= db->rel_arr.nrels)
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is the TOAST table for OID %u"), rel->toastheap);
+ }
+
+ if (is_new_db)
+ pg_log(PG_WARNING, "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n",
+ reloid, db->db_name, reldesc);
+ else
+ pg_log(PG_WARNING, "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n",
+ reloid, db->db_name, reldesc);
+}
+
+
+void
+print_maps(FileNameMap *maps, int n_maps, const char *db_name)
+{
+ if (log_opts.verbose)
+ {
+ int mapnum;
+
+ pg_log(PG_VERBOSE, "mappings for database \"%s\":\n", db_name);
+
+ for (mapnum = 0; mapnum < n_maps; mapnum++)
+ pg_log(PG_VERBOSE, "%s.%s: %u to %u\n",
+ maps[mapnum].nspname, maps[mapnum].relname,
+ maps[mapnum].old_relfilenode,
+ maps[mapnum].new_relfilenode);
+
+ pg_log(PG_VERBOSE, "\n\n");
+ }
+}
+
+
+/*
+ * get_db_and_rel_infos()
+ *
+ * higher level routine to generate dbinfos for the database running
+ * on the given "port". Assumes that server is already running.
+ */
+void
+get_db_and_rel_infos(ClusterInfo *cluster)
+{
+ int dbnum;
+
+ if (cluster->dbarr.dbs != NULL)
+ free_db_and_rel_infos(&cluster->dbarr);
+
+ get_db_infos(cluster);
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ get_rel_infos(cluster, &cluster->dbarr.dbs[dbnum]);
+
+ if (cluster == &old_cluster)
+ pg_log(PG_VERBOSE, "\nsource databases:\n");
+ else
+ pg_log(PG_VERBOSE, "\ntarget databases:\n");
+
+ if (log_opts.verbose)
+ print_db_infos(&cluster->dbarr);
+}
+
+
+/*
+ * get_db_infos()
+ *
+ * Scans pg_database system catalog and populates all user
+ * databases.
+ */
+static void
+get_db_infos(ClusterInfo *cluster)
+{
+ PGconn *conn = connectToServer(cluster, "template1");
+ PGresult *res;
+ int ntups;
+ int tupnum;
+ DbInfo *dbinfos;
+ int i_datname,
+ i_oid,
+ i_encoding,
+ i_datcollate,
+ i_datctype,
+ i_spclocation;
+ char query[QUERY_ALLOC];
+
+ snprintf(query, sizeof(query),
+ "SELECT d.oid, d.datname, d.encoding, d.datcollate, d.datctype, "
+ "%s AS spclocation "
+ "FROM pg_catalog.pg_database d "
+ " LEFT OUTER JOIN pg_catalog.pg_tablespace t "
+ " ON d.dattablespace = t.oid "
+ "WHERE d.datallowconn = true "
+ /* we don't preserve pg_database.oid so we sort by name */
+ "ORDER BY 2",
+ /* 9.2 removed the spclocation column */
+ (GET_MAJOR_VERSION(cluster->major_version) <= 901) ?
+ "t.spclocation" : "pg_catalog.pg_tablespace_location(t.oid)");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ i_oid = PQfnumber(res, "oid");
+ i_datname = PQfnumber(res, "datname");
+ i_encoding = PQfnumber(res, "encoding");
+ i_datcollate = PQfnumber(res, "datcollate");
+ i_datctype = PQfnumber(res, "datctype");
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ ntups = PQntuples(res);
+ dbinfos = (DbInfo *) pg_malloc(sizeof(DbInfo) * ntups);
+
+ for (tupnum = 0; tupnum < ntups; tupnum++)
+ {
+ dbinfos[tupnum].db_oid = atooid(PQgetvalue(res, tupnum, i_oid));
+ dbinfos[tupnum].db_name = pg_strdup(PQgetvalue(res, tupnum, i_datname));
+ dbinfos[tupnum].db_encoding = atoi(PQgetvalue(res, tupnum, i_encoding));
+ dbinfos[tupnum].db_collate = pg_strdup(PQgetvalue(res, tupnum, i_datcollate));
+ dbinfos[tupnum].db_ctype = pg_strdup(PQgetvalue(res, tupnum, i_datctype));
+ snprintf(dbinfos[tupnum].db_tablespace, sizeof(dbinfos[tupnum].db_tablespace), "%s",
+ PQgetvalue(res, tupnum, i_spclocation));
+ }
+ PQclear(res);
+
+ PQfinish(conn);
+
+ cluster->dbarr.dbs = dbinfos;
+ cluster->dbarr.ndbs = ntups;
+}
+
+
+/*
+ * get_rel_infos()
+ *
+ * gets the relinfos for all the user tables and indexes of the database
+ * referred to by "dbinfo".
+ *
+ * Note: the resulting RelInfo array is assumed to be sorted by OID.
+ * This allows later processing to match up old and new databases efficiently.
+ */
+static void
+get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
+{
+ PGconn *conn = connectToServer(cluster,
+ dbinfo->db_name);
+ PGresult *res;
+ RelInfo *relinfos;
+ int ntups;
+ int relnum;
+ int num_rels = 0;
+ char *nspname = NULL;
+ char *relname = NULL;
+ char *tablespace = NULL;
+ int i_spclocation,
+ i_nspname,
+ i_relname,
+ i_reloid,
+ i_indtable,
+ i_toastheap,
+ i_relfilenode,
+ i_reltablespace;
+ char query[QUERY_ALLOC];
+ char *last_namespace = NULL,
+ *last_tablespace = NULL;
+
+ query[0] = '\0'; /* initialize query string to empty */
+
+ /*
+ * Create a CTE that collects OIDs of regular user tables, including
+ * matviews and sequences, but excluding toast tables and indexes. We
+ * assume that relations with OIDs >= FirstNormalObjectId belong to the
+ * user. (That's probably redundant with the namespace-name exclusions,
+ * but let's be safe.)
+ *
+ * pg_largeobject contains user data that does not appear in pg_dump
+ * output, so we have to copy that system table. It's easiest to do that
+ * by treating it as a user table.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "WITH regular_heap (reloid, indtable, toastheap) AS ( "
+ " SELECT c.oid, 0::oid, 0::oid "
+ " FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n "
+ " ON c.relnamespace = n.oid "
+ " WHERE relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ") AND "
+ /* exclude possible orphaned temp tables */
+ " ((n.nspname !~ '^pg_temp_' AND "
+ " n.nspname !~ '^pg_toast_temp_' AND "
+ " n.nspname NOT IN ('pg_catalog', 'information_schema', "
+ " 'binary_upgrade', 'pg_toast') AND "
+ " c.oid >= %u::pg_catalog.oid) OR "
+ " (n.nspname = 'pg_catalog' AND "
+ " relname IN ('pg_largeobject') ))), ",
+ FirstNormalObjectId);
+
+ /*
+ * Add a CTE that collects OIDs of toast tables belonging to the tables
+ * selected by the regular_heap CTE. (We have to do this separately
+ * because the namespace-name rules above don't work for toast tables.)
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ " toast_heap (reloid, indtable, toastheap) AS ( "
+ " SELECT c.reltoastrelid, 0::oid, c.oid "
+ " FROM regular_heap JOIN pg_catalog.pg_class c "
+ " ON regular_heap.reloid = c.oid "
+ " WHERE c.reltoastrelid != 0), ");
+
+ /*
+ * Add a CTE that collects OIDs of all valid indexes on the previously
+ * selected tables. We can ignore invalid indexes since pg_dump does.
+ * Testing indisready is necessary in 9.2, and harmless in earlier/later
+ * versions.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ " all_index (reloid, indtable, toastheap) AS ( "
+ " SELECT indexrelid, indrelid, 0::oid "
+ " FROM pg_catalog.pg_index "
+ " WHERE indisvalid AND indisready "
+ " AND indrelid IN "
+ " (SELECT reloid FROM regular_heap "
+ " UNION ALL "
+ " SELECT reloid FROM toast_heap)) ");
+
+ /*
+ * And now we can write the query that retrieves the data we want for each
+ * heap and index relation. Make sure result is sorted by OID.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "SELECT all_rels.*, n.nspname, c.relname, "
+ " c.relfilenode, c.reltablespace, %s "
+ "FROM (SELECT * FROM regular_heap "
+ " UNION ALL "
+ " SELECT * FROM toast_heap "
+ " UNION ALL "
+ " SELECT * FROM all_index) all_rels "
+ " JOIN pg_catalog.pg_class c "
+ " ON all_rels.reloid = c.oid "
+ " JOIN pg_catalog.pg_namespace n "
+ " ON c.relnamespace = n.oid "
+ " LEFT OUTER JOIN pg_catalog.pg_tablespace t "
+ " ON c.reltablespace = t.oid "
+ "ORDER BY 1;",
+ /* 9.2 removed the pg_tablespace.spclocation column */
+ (GET_MAJOR_VERSION(cluster->major_version) >= 902) ?
+ "pg_catalog.pg_tablespace_location(t.oid) AS spclocation" :
+ "t.spclocation");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ ntups = PQntuples(res);
+
+ relinfos = (RelInfo *) pg_malloc(sizeof(RelInfo) * ntups);
+
+ i_reloid = PQfnumber(res, "reloid");
+ i_indtable = PQfnumber(res, "indtable");
+ i_toastheap = PQfnumber(res, "toastheap");
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ i_relfilenode = PQfnumber(res, "relfilenode");
+ i_reltablespace = PQfnumber(res, "reltablespace");
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ for (relnum = 0; relnum < ntups; relnum++)
+ {
+ RelInfo *curr = &relinfos[num_rels++];
+
+ curr->reloid = atooid(PQgetvalue(res, relnum, i_reloid));
+ curr->indtable = atooid(PQgetvalue(res, relnum, i_indtable));
+ curr->toastheap = atooid(PQgetvalue(res, relnum, i_toastheap));
+
+ nspname = PQgetvalue(res, relnum, i_nspname);
+ curr->nsp_alloc = false;
+
+ /*
+ * Many of the namespace and tablespace strings are identical, so we
+ * try to reuse the allocated string pointers where possible to reduce
+ * memory consumption.
+ */
+ /* Can we reuse the previous string allocation? */
+ if (last_namespace && strcmp(nspname, last_namespace) == 0)
+ curr->nspname = last_namespace;
+ else
+ {
+ last_namespace = curr->nspname = pg_strdup(nspname);
+ curr->nsp_alloc = true;
+ }
+
+ relname = PQgetvalue(res, relnum, i_relname);
+ curr->relname = pg_strdup(relname);
+
+ curr->relfilenode = atooid(PQgetvalue(res, relnum, i_relfilenode));
+ curr->tblsp_alloc = false;
+
+ /* Is the tablespace oid non-default? */
+ if (atooid(PQgetvalue(res, relnum, i_reltablespace)) != 0)
+ {
+ /*
+ * The tablespace location might be "", meaning the cluster
+ * default location, i.e. pg_default or pg_global.
+ */
+ tablespace = PQgetvalue(res, relnum, i_spclocation);
+
+ /* Can we reuse the previous string allocation? */
+ if (last_tablespace && strcmp(tablespace, last_tablespace) == 0)
+ curr->tablespace = last_tablespace;
+ else
+ {
+ last_tablespace = curr->tablespace = pg_strdup(tablespace);
+ curr->tblsp_alloc = true;
+ }
+ }
+ else
+ /* A zero reltablespace oid indicates the database tablespace. */
+ curr->tablespace = dbinfo->db_tablespace;
+ }
+ PQclear(res);
+
+ PQfinish(conn);
+
+ dbinfo->rel_arr.rels = relinfos;
+ dbinfo->rel_arr.nrels = num_rels;
+}
+
+
+static void
+free_db_and_rel_infos(DbInfoArr *db_arr)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
+ {
+ free_rel_infos(&db_arr->dbs[dbnum].rel_arr);
+ pg_free(db_arr->dbs[dbnum].db_name);
+ }
+ pg_free(db_arr->dbs);
+ db_arr->dbs = NULL;
+ db_arr->ndbs = 0;
+}
+
+
+static void
+free_rel_infos(RelInfoArr *rel_arr)
+{
+ int relnum;
+
+ for (relnum = 0; relnum < rel_arr->nrels; relnum++)
+ {
+ if (rel_arr->rels[relnum].nsp_alloc)
+ pg_free(rel_arr->rels[relnum].nspname);
+ pg_free(rel_arr->rels[relnum].relname);
+ if (rel_arr->rels[relnum].tblsp_alloc)
+ pg_free(rel_arr->rels[relnum].tablespace);
+ }
+ pg_free(rel_arr->rels);
+ rel_arr->nrels = 0;
+}
+
+
+static void
+print_db_infos(DbInfoArr *db_arr)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
+ {
+ pg_log(PG_VERBOSE, "Database: %s\n", db_arr->dbs[dbnum].db_name);
+ print_rel_infos(&db_arr->dbs[dbnum].rel_arr);
+ pg_log(PG_VERBOSE, "\n\n");
+ }
+}
+
+
+static void
+print_rel_infos(RelInfoArr *rel_arr)
+{
+ int relnum;
+
+ for (relnum = 0; relnum < rel_arr->nrels; relnum++)
+ pg_log(PG_VERBOSE, "relname: %s.%s: reloid: %u reltblspace: %s\n",
+ rel_arr->rels[relnum].nspname,
+ rel_arr->rels[relnum].relname,
+ rel_arr->rels[relnum].reloid,
+ rel_arr->rels[relnum].tablespace);
+}
diff --git a/src/bin/pg_upgrade/nls.mk b/src/bin/pg_upgrade/nls.mk
new file mode 100644
index 0000000..06308bd
--- /dev/null
+++ b/src/bin/pg_upgrade/nls.mk
@@ -0,0 +1,12 @@
+# src/bin/pg_upgrade/nls.mk
+CATALOG_NAME = pg_upgrade
+AVAIL_LANGUAGES = cs de es fr ja ko ru sv tr uk zh_CN
+GETTEXT_FILES = check.c controldata.c dump.c exec.c file.c function.c \
+ info.c option.c parallel.c pg_upgrade.c relfilenode.c \
+ server.c tablespace.c util.c version.c
+GETTEXT_TRIGGERS = pg_fatal pg_log:2 prep_status report_status:2
+GETTEXT_FLAGS = \
+ pg_fatal:1:c-format \
+ pg_log:2:c-format \
+ prep_status:1:c-format \
+ report_status:2:c-format
diff --git a/src/bin/pg_upgrade/option.c b/src/bin/pg_upgrade/option.c
new file mode 100644
index 0000000..64bbda5
--- /dev/null
+++ b/src/bin/pg_upgrade/option.c
@@ -0,0 +1,536 @@
+/*
+ * option.c
+ *
+ * options functions
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/option.c
+ */
+
+#include "postgres_fe.h"
+
+#include <time.h>
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#include "common/string.h"
+#include "getopt_long.h"
+#include "pg_upgrade.h"
+#include "utils/pidfile.h"
+
+static void usage(void);
+static void check_required_directory(char **dirpath,
+ const char *envVarName, bool useCwd,
+ const char *cmdLineOption, const char *description,
+ bool missingOk);
+#define FIX_DEFAULT_READ_ONLY "-c default_transaction_read_only=false"
+
+
+UserOpts user_opts;
+
+
+/*
+ * parseCommandLine()
+ *
+ * Parses the command line (argc, argv[]) and loads structures
+ */
+void
+parseCommandLine(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"old-datadir", required_argument, NULL, 'd'},
+ {"new-datadir", required_argument, NULL, 'D'},
+ {"old-bindir", required_argument, NULL, 'b'},
+ {"new-bindir", required_argument, NULL, 'B'},
+ {"old-options", required_argument, NULL, 'o'},
+ {"new-options", required_argument, NULL, 'O'},
+ {"old-port", required_argument, NULL, 'p'},
+ {"new-port", required_argument, NULL, 'P'},
+
+ {"username", required_argument, NULL, 'U'},
+ {"check", no_argument, NULL, 'c'},
+ {"link", no_argument, NULL, 'k'},
+ {"retain", no_argument, NULL, 'r'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"socketdir", required_argument, NULL, 's'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"clone", no_argument, NULL, 1},
+
+ {NULL, 0, NULL, 0}
+ };
+ int option; /* Command line option */
+ int optindex = 0; /* used by getopt_long */
+ int os_user_effective_id;
+ FILE *fp;
+ char **filename;
+ time_t run_time = time(NULL);
+
+ user_opts.transfer_mode = TRANSFER_MODE_COPY;
+
+ os_info.progname = get_progname(argv[0]);
+
+ /* Process libpq env. variables; load values here for usage() output */
+ old_cluster.port = getenv("PGPORTOLD") ? atoi(getenv("PGPORTOLD")) : DEF_PGUPORT;
+ new_cluster.port = getenv("PGPORTNEW") ? atoi(getenv("PGPORTNEW")) : DEF_PGUPORT;
+
+ os_user_effective_id = get_user_info(&os_info.user);
+ /* we override just the database user name; we got the OS id above */
+ if (getenv("PGUSER"))
+ {
+ pg_free(os_info.user);
+ /* must save value, getenv()'s pointer is not stable */
+ os_info.user = pg_strdup(getenv("PGUSER"));
+ }
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_upgrade (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ /* Allow help and version to be run as root, so do the test here. */
+ if (os_user_effective_id == 0)
+ pg_fatal("%s: cannot be run as root\n", os_info.progname);
+
+ while ((option = getopt_long(argc, argv, "d:D:b:B:cj:ko:O:p:P:rs:U:v",
+ long_options, &optindex)) != -1)
+ {
+ switch (option)
+ {
+ case 'b':
+ old_cluster.bindir = pg_strdup(optarg);
+ break;
+
+ case 'B':
+ new_cluster.bindir = pg_strdup(optarg);
+ break;
+
+ case 'c':
+ user_opts.check = true;
+ break;
+
+ case 'd':
+ old_cluster.pgdata = pg_strdup(optarg);
+ break;
+
+ case 'D':
+ new_cluster.pgdata = pg_strdup(optarg);
+ break;
+
+ case 'j':
+ user_opts.jobs = atoi(optarg);
+ break;
+
+ case 'k':
+ user_opts.transfer_mode = TRANSFER_MODE_LINK;
+ break;
+
+ case 'o':
+ /* append option? */
+ if (!old_cluster.pgopts)
+ old_cluster.pgopts = pg_strdup(optarg);
+ else
+ {
+ char *old_pgopts = old_cluster.pgopts;
+
+ old_cluster.pgopts = psprintf("%s %s", old_pgopts, optarg);
+ free(old_pgopts);
+ }
+ break;
+
+ case 'O':
+ /* append option? */
+ if (!new_cluster.pgopts)
+ new_cluster.pgopts = pg_strdup(optarg);
+ else
+ {
+ char *new_pgopts = new_cluster.pgopts;
+
+ new_cluster.pgopts = psprintf("%s %s", new_pgopts, optarg);
+ free(new_pgopts);
+ }
+ break;
+
+ /*
+ * Someday, the port number option could be removed and passed
+ * using -o/-O, but that requires postmaster -C to be
+ * supported on all old/new versions (added in PG 9.2).
+ */
+ case 'p':
+ if ((old_cluster.port = atoi(optarg)) <= 0)
+ pg_fatal("invalid old port number\n");
+ break;
+
+ case 'P':
+ if ((new_cluster.port = atoi(optarg)) <= 0)
+ pg_fatal("invalid new port number\n");
+ break;
+
+ case 'r':
+ log_opts.retain = true;
+ break;
+
+ case 's':
+ user_opts.socketdir = pg_strdup(optarg);
+ break;
+
+ case 'U':
+ pg_free(os_info.user);
+ os_info.user = pg_strdup(optarg);
+ os_info.user_specified = true;
+
+ /*
+ * Push the user name into the environment so pre-9.1
+ * pg_ctl/libpq uses it.
+ */
+ setenv("PGUSER", os_info.user, 1);
+ break;
+
+ case 'v':
+ log_opts.verbose = true;
+ break;
+
+ case 1:
+ user_opts.transfer_mode = TRANSFER_MODE_CLONE;
+ break;
+
+ default:
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ os_info.progname);
+ exit(1);
+ }
+ }
+
+ if (optind < argc)
+ pg_fatal("too many command-line arguments (first is \"%s\")\n", argv[optind]);
+
+ if ((log_opts.internal = fopen_priv(INTERNAL_LOG_FILE, "a")) == NULL)
+ pg_fatal("could not open log file \"%s\": %m\n", INTERNAL_LOG_FILE);
+
+ if (log_opts.verbose)
+ pg_log(PG_REPORT, "Running in verbose mode\n");
+
+ /* label start of upgrade in logfiles */
+ for (filename = output_files; *filename != NULL; filename++)
+ {
+ if ((fp = fopen_priv(*filename, "a")) == NULL)
+ pg_fatal("could not write to log file \"%s\": %m\n", *filename);
+
+ /* Start with newline because we might be appending to a file. */
+ fprintf(fp, "\n"
+ "-----------------------------------------------------------------\n"
+ " pg_upgrade run on %s"
+ "-----------------------------------------------------------------\n\n",
+ ctime(&run_time));
+ fclose(fp);
+ }
+
+ /* Turn off read-only mode; add prefix to PGOPTIONS? */
+ if (getenv("PGOPTIONS"))
+ {
+ char *pgoptions = psprintf("%s %s", FIX_DEFAULT_READ_ONLY,
+ getenv("PGOPTIONS"));
+
+ setenv("PGOPTIONS", pgoptions, 1);
+ pfree(pgoptions);
+ }
+ else
+ setenv("PGOPTIONS", FIX_DEFAULT_READ_ONLY, 1);
+
+ /* Get values from env if not already set */
+ check_required_directory(&old_cluster.bindir, "PGBINOLD", false,
+ "-b", _("old cluster binaries reside"), false);
+ check_required_directory(&new_cluster.bindir, "PGBINNEW", false,
+ "-B", _("new cluster binaries reside"), true);
+ check_required_directory(&old_cluster.pgdata, "PGDATAOLD", false,
+ "-d", _("old cluster data resides"), false);
+ check_required_directory(&new_cluster.pgdata, "PGDATANEW", false,
+ "-D", _("new cluster data resides"), false);
+ check_required_directory(&user_opts.socketdir, "PGSOCKETDIR", true,
+ "-s", _("sockets will be created"), false);
+
+#ifdef WIN32
+
+ /*
+ * On Windows, initdb --sync-only will fail with a "Permission denied"
+ * error on file pg_upgrade_utility.log if pg_upgrade is run inside the
+ * new cluster directory, so we do a check here.
+ */
+ {
+ char cwd[MAXPGPATH],
+ new_cluster_pgdata[MAXPGPATH];
+
+ strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(new_cluster_pgdata);
+
+ if (!getcwd(cwd, MAXPGPATH))
+ pg_fatal("could not determine current directory\n");
+ canonicalize_path(cwd);
+ if (path_is_prefix_of_path(new_cluster_pgdata, cwd))
+ pg_fatal("cannot run pg_upgrade from inside the new cluster data directory on Windows\n");
+ }
+#endif
+}
+
+
+static void
+usage(void)
+{
+ printf(_("pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n\n"));
+ printf(_("Usage:\n"));
+ printf(_(" pg_upgrade [OPTION]...\n\n"));
+ printf(_("Options:\n"));
+ printf(_(" -b, --old-bindir=BINDIR old cluster executable directory\n"));
+ printf(_(" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+ " same directory as pg_upgrade)\n"));
+ printf(_(" -c, --check check clusters only, don't change any data\n"));
+ printf(_(" -d, --old-datadir=DATADIR old cluster data directory\n"));
+ printf(_(" -D, --new-datadir=DATADIR new cluster data directory\n"));
+ printf(_(" -j, --jobs=NUM number of simultaneous processes or threads to use\n"));
+ printf(_(" -k, --link link instead of copying files to new cluster\n"));
+ printf(_(" -o, --old-options=OPTIONS old cluster options to pass to the server\n"));
+ printf(_(" -O, --new-options=OPTIONS new cluster options to pass to the server\n"));
+ printf(_(" -p, --old-port=PORT old cluster port number (default %d)\n"), old_cluster.port);
+ printf(_(" -P, --new-port=PORT new cluster port number (default %d)\n"), new_cluster.port);
+ printf(_(" -r, --retain retain SQL and log files after success\n"));
+ printf(_(" -s, --socketdir=DIR socket directory to use (default current dir.)\n"));
+ printf(_(" -U, --username=NAME cluster superuser (default \"%s\")\n"), os_info.user);
+ printf(_(" -v, --verbose enable verbose internal logging\n"));
+ printf(_(" -V, --version display version information, then exit\n"));
+ printf(_(" --clone clone instead of copying files to new cluster\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\n"
+ "Before running pg_upgrade you must:\n"
+ " create a new database cluster (using the new version of initdb)\n"
+ " shutdown the postmaster servicing the old cluster\n"
+ " shutdown the postmaster servicing the new cluster\n"));
+ printf(_("\n"
+ "When you run pg_upgrade, you must provide the following information:\n"
+ " the data directory for the old cluster (-d DATADIR)\n"
+ " the data directory for the new cluster (-D DATADIR)\n"
+ " the \"bin\" directory for the old version (-b BINDIR)\n"
+ " the \"bin\" directory for the new version (-B BINDIR)\n"));
+ printf(_("\n"
+ "For example:\n"
+ " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+ "or\n"));
+#ifndef WIN32
+ printf(_(" $ export PGDATAOLD=oldCluster/data\n"
+ " $ export PGDATANEW=newCluster/data\n"
+ " $ export PGBINOLD=oldCluster/bin\n"
+ " $ export PGBINNEW=newCluster/bin\n"
+ " $ pg_upgrade\n"));
+#else
+ printf(_(" C:\\> set PGDATAOLD=oldCluster/data\n"
+ " C:\\> set PGDATANEW=newCluster/data\n"
+ " C:\\> set PGBINOLD=oldCluster/bin\n"
+ " C:\\> set PGBINNEW=newCluster/bin\n"
+ " C:\\> pg_upgrade\n"));
+#endif
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+/*
+ * check_required_directory()
+ *
+ * Checks a directory option.
+ * dirpath - the directory name supplied on the command line, or NULL
+ * envVarName - the name of an environment variable to get if dirpath is NULL
+ * useCwd - true if OK to default to CWD
+ * cmdLineOption - the command line option for this directory
+ * description - a description of this directory option
+ * missingOk - true if OK that both dirpath and envVarName are not existing
+ *
+ * We use the last two arguments to construct a meaningful error message if the
+ * user hasn't provided the required directory name.
+ */
+static void
+check_required_directory(char **dirpath, const char *envVarName, bool useCwd,
+ const char *cmdLineOption, const char *description,
+ bool missingOk)
+{
+ if (*dirpath == NULL || strlen(*dirpath) == 0)
+ {
+ const char *envVar;
+
+ if ((envVar = getenv(envVarName)) && strlen(envVar))
+ *dirpath = pg_strdup(envVar);
+ else if (useCwd)
+ {
+ char cwd[MAXPGPATH];
+
+ if (!getcwd(cwd, MAXPGPATH))
+ pg_fatal("could not determine current directory\n");
+ *dirpath = pg_strdup(cwd);
+ }
+ else if (missingOk)
+ return;
+ else
+ pg_fatal("You must identify the directory where the %s.\n"
+ "Please use the %s command-line option or the %s environment variable.\n",
+ description, cmdLineOption, envVarName);
+ }
+
+ /*
+ * Clean up the path, in particular trimming any trailing path separators,
+ * because we construct paths by appending to this path.
+ */
+ canonicalize_path(*dirpath);
+}
+
+/*
+ * adjust_data_dir
+ *
+ * If a configuration-only directory was specified, find the real data dir
+ * by querying the running server. This has limited checking because we
+ * can't check for a running server because we can't find postmaster.pid.
+ *
+ * On entry, cluster->pgdata has been set from command line or env variable,
+ * but cluster->pgconfig isn't set. We fill both variables with corrected
+ * values.
+ */
+void
+adjust_data_dir(ClusterInfo *cluster)
+{
+ char filename[MAXPGPATH];
+ char cmd[MAXPGPATH],
+ cmd_output[MAX_STRING];
+ FILE *fp,
+ *output;
+
+ /* Initially assume config dir and data dir are the same */
+ cluster->pgconfig = pg_strdup(cluster->pgdata);
+
+ /* If there is no postgresql.conf, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/postgresql.conf", cluster->pgconfig);
+ if ((fp = fopen(filename, "r")) == NULL)
+ return;
+ fclose(fp);
+
+ /* If PG_VERSION exists, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/PG_VERSION", cluster->pgconfig);
+ if ((fp = fopen(filename, "r")) != NULL)
+ {
+ fclose(fp);
+ return;
+ }
+
+ /* Must be a configuration directory, so find the real data directory. */
+
+ if (cluster == &old_cluster)
+ prep_status("Finding the real data directory for the source cluster");
+ else
+ prep_status("Finding the real data directory for the target cluster");
+
+ /*
+ * We don't have a data directory yet, so we can't check the PG version,
+ * so this might fail --- only works for PG 9.2+. If this fails,
+ * pg_upgrade will fail anyway because the data files will not be found.
+ */
+ snprintf(cmd, sizeof(cmd), "\"%s/postgres\" -D \"%s\" -C data_directory",
+ cluster->bindir, cluster->pgconfig);
+
+ if ((output = popen(cmd, "r")) == NULL ||
+ fgets(cmd_output, sizeof(cmd_output), output) == NULL)
+ pg_fatal("could not get data directory using %s: %s\n",
+ cmd, strerror(errno));
+
+ pclose(output);
+
+ /* strip trailing newline and carriage return */
+ (void) pg_strip_crlf(cmd_output);
+
+ cluster->pgdata = pg_strdup(cmd_output);
+
+ check_ok();
+}
+
+
+/*
+ * get_sock_dir
+ *
+ * Identify the socket directory to use for this cluster. If we're doing
+ * a live check (old cluster only), we need to find out where the postmaster
+ * is listening. Otherwise, we're going to put the socket into the current
+ * directory.
+ */
+void
+get_sock_dir(ClusterInfo *cluster, bool live_check)
+{
+#if defined(HAVE_UNIX_SOCKETS) && !defined(WIN32)
+
+ /*
+ * sockdir and port were added to postmaster.pid in PG 9.1. Pre-9.1 cannot
+ * process pg_ctl -w for sockets in non-default locations.
+ */
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 901)
+ {
+ if (!live_check)
+ cluster->sockdir = user_opts.socketdir;
+ else
+ {
+ /*
+ * If we are doing a live check, we will use the old cluster's
+ * Unix domain socket directory so we can connect to the live
+ * server.
+ */
+ unsigned short orig_port = cluster->port;
+ char filename[MAXPGPATH],
+ line[MAXPGPATH];
+ FILE *fp;
+ int lineno;
+
+ snprintf(filename, sizeof(filename), "%s/postmaster.pid",
+ cluster->pgdata);
+ if ((fp = fopen(filename, "r")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ filename, strerror(errno));
+
+ for (lineno = 1;
+ lineno <= Max(LOCK_FILE_LINE_PORT, LOCK_FILE_LINE_SOCKET_DIR);
+ lineno++)
+ {
+ if (fgets(line, sizeof(line), fp) == NULL)
+ pg_fatal("could not read line %d from file \"%s\": %s\n",
+ lineno, filename, strerror(errno));
+
+ /* potentially overwrite user-supplied value */
+ if (lineno == LOCK_FILE_LINE_PORT)
+ sscanf(line, "%hu", &old_cluster.port);
+ if (lineno == LOCK_FILE_LINE_SOCKET_DIR)
+ {
+ /* strip trailing newline and carriage return */
+ cluster->sockdir = pg_strdup(line);
+ (void) pg_strip_crlf(cluster->sockdir);
+ }
+ }
+ fclose(fp);
+
+ /* warn of port number correction */
+ if (orig_port != DEF_PGUPORT && old_cluster.port != orig_port)
+ pg_log(PG_WARNING, "user-supplied old port number %hu corrected to %hu\n",
+ orig_port, cluster->port);
+ }
+ }
+ else
+
+ /*
+ * Can't get sockdir and pg_ctl -w can't use a non-default, use
+ * default
+ */
+ cluster->sockdir = NULL;
+#else /* !HAVE_UNIX_SOCKETS || WIN32 */
+ cluster->sockdir = NULL;
+#endif
+}
diff --git a/src/bin/pg_upgrade/parallel.c b/src/bin/pg_upgrade/parallel.c
new file mode 100644
index 0000000..ee7364d
--- /dev/null
+++ b/src/bin/pg_upgrade/parallel.c
@@ -0,0 +1,347 @@
+/*
+ * parallel.c
+ *
+ * multi-process support
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/parallel.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/wait.h>
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#include "pg_upgrade.h"
+
+static int parallel_jobs;
+
+#ifdef WIN32
+/*
+ * Array holding all active threads. There can't be any gaps/zeros so
+ * it can be passed to WaitForMultipleObjects(). We use two arrays
+ * so the thread_handles array can be passed to WaitForMultipleObjects().
+ */
+HANDLE *thread_handles;
+
+typedef struct
+{
+ char *log_file;
+ char *opt_log_file;
+ char *cmd;
+} exec_thread_arg;
+
+typedef struct
+{
+ DbInfoArr *old_db_arr;
+ DbInfoArr *new_db_arr;
+ char *old_pgdata;
+ char *new_pgdata;
+ char *old_tablespace;
+} transfer_thread_arg;
+
+exec_thread_arg **exec_thread_args;
+transfer_thread_arg **transfer_thread_args;
+
+/* track current thread_args struct so reap_child() can be used for all cases */
+void **cur_thread_args;
+
+DWORD win32_exec_prog(exec_thread_arg *args);
+DWORD win32_transfer_all_new_dbs(transfer_thread_arg *args);
+#endif
+
+/*
+ * parallel_exec_prog
+ *
+ * This has the same API as exec_prog, except it does parallel execution,
+ * and therefore must throw errors and doesn't return an error status.
+ */
+void
+parallel_exec_prog(const char *log_file, const char *opt_log_file,
+ const char *fmt,...)
+{
+ va_list args;
+ char cmd[MAX_STRING];
+
+#ifndef WIN32
+ pid_t child;
+#else
+ HANDLE child;
+ exec_thread_arg *new_arg;
+#endif
+
+ va_start(args, fmt);
+ vsnprintf(cmd, sizeof(cmd), fmt, args);
+ va_end(args);
+
+ if (user_opts.jobs <= 1)
+ /* exit_on_error must be true to allow jobs */
+ exec_prog(log_file, opt_log_file, true, true, "%s", cmd);
+ else
+ {
+ /* parallel */
+#ifdef WIN32
+ if (thread_handles == NULL)
+ thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
+
+ if (exec_thread_args == NULL)
+ {
+ int i;
+
+ exec_thread_args = pg_malloc(user_opts.jobs * sizeof(exec_thread_arg *));
+
+ /*
+ * For safety and performance, we keep the args allocated during
+ * the entire life of the process, and we don't free the args in a
+ * thread different from the one that allocated it.
+ */
+ for (i = 0; i < user_opts.jobs; i++)
+ exec_thread_args[i] = pg_malloc0(sizeof(exec_thread_arg));
+ }
+
+ cur_thread_args = (void **) exec_thread_args;
+#endif
+ /* harvest any dead children */
+ while (reap_child(false) == true)
+ ;
+
+ /* must we wait for a dead child? */
+ if (parallel_jobs >= user_opts.jobs)
+ reap_child(true);
+
+ /* set this before we start the job */
+ parallel_jobs++;
+
+ /* Ensure stdio state is quiesced before forking */
+ fflush(NULL);
+
+#ifndef WIN32
+ child = fork();
+ if (child == 0)
+ /* use _exit to skip atexit() functions */
+ _exit(!exec_prog(log_file, opt_log_file, true, true, "%s", cmd));
+ else if (child < 0)
+ /* fork failed */
+ pg_fatal("could not create worker process: %s\n", strerror(errno));
+#else
+ /* empty array element are always at the end */
+ new_arg = exec_thread_args[parallel_jobs - 1];
+
+ /* Can only pass one pointer into the function, so use a struct */
+ if (new_arg->log_file)
+ pg_free(new_arg->log_file);
+ new_arg->log_file = pg_strdup(log_file);
+ if (new_arg->opt_log_file)
+ pg_free(new_arg->opt_log_file);
+ new_arg->opt_log_file = opt_log_file ? pg_strdup(opt_log_file) : NULL;
+ if (new_arg->cmd)
+ pg_free(new_arg->cmd);
+ new_arg->cmd = pg_strdup(cmd);
+
+ child = (HANDLE) _beginthreadex(NULL, 0, (void *) win32_exec_prog,
+ new_arg, 0, NULL);
+ if (child == 0)
+ pg_fatal("could not create worker thread: %s\n", strerror(errno));
+
+ thread_handles[parallel_jobs - 1] = child;
+#endif
+ }
+}
+
+
+#ifdef WIN32
+DWORD
+win32_exec_prog(exec_thread_arg *args)
+{
+ int ret;
+
+ ret = !exec_prog(args->log_file, args->opt_log_file, true, true, "%s", args->cmd);
+
+ /* terminates thread */
+ return ret;
+}
+#endif
+
+
+/*
+ * parallel_transfer_all_new_dbs
+ *
+ * This has the same API as transfer_all_new_dbs, except it does parallel execution
+ * by transferring multiple tablespaces in parallel
+ */
+void
+parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata,
+ char *old_tablespace)
+{
+#ifndef WIN32
+ pid_t child;
+#else
+ HANDLE child;
+ transfer_thread_arg *new_arg;
+#endif
+
+ if (user_opts.jobs <= 1)
+ transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata, new_pgdata, NULL);
+ else
+ {
+ /* parallel */
+#ifdef WIN32
+ if (thread_handles == NULL)
+ thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
+
+ if (transfer_thread_args == NULL)
+ {
+ int i;
+
+ transfer_thread_args = pg_malloc(user_opts.jobs * sizeof(transfer_thread_arg *));
+
+ /*
+ * For safety and performance, we keep the args allocated during
+ * the entire life of the process, and we don't free the args in a
+ * thread different from the one that allocated it.
+ */
+ for (i = 0; i < user_opts.jobs; i++)
+ transfer_thread_args[i] = pg_malloc0(sizeof(transfer_thread_arg));
+ }
+
+ cur_thread_args = (void **) transfer_thread_args;
+#endif
+ /* harvest any dead children */
+ while (reap_child(false) == true)
+ ;
+
+ /* must we wait for a dead child? */
+ if (parallel_jobs >= user_opts.jobs)
+ reap_child(true);
+
+ /* set this before we start the job */
+ parallel_jobs++;
+
+ /* Ensure stdio state is quiesced before forking */
+ fflush(NULL);
+
+#ifndef WIN32
+ child = fork();
+ if (child == 0)
+ {
+ transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata, new_pgdata,
+ old_tablespace);
+ /* if we take another exit path, it will be non-zero */
+ /* use _exit to skip atexit() functions */
+ _exit(0);
+ }
+ else if (child < 0)
+ /* fork failed */
+ pg_fatal("could not create worker process: %s\n", strerror(errno));
+#else
+ /* empty array element are always at the end */
+ new_arg = transfer_thread_args[parallel_jobs - 1];
+
+ /* Can only pass one pointer into the function, so use a struct */
+ new_arg->old_db_arr = old_db_arr;
+ new_arg->new_db_arr = new_db_arr;
+ if (new_arg->old_pgdata)
+ pg_free(new_arg->old_pgdata);
+ new_arg->old_pgdata = pg_strdup(old_pgdata);
+ if (new_arg->new_pgdata)
+ pg_free(new_arg->new_pgdata);
+ new_arg->new_pgdata = pg_strdup(new_pgdata);
+ if (new_arg->old_tablespace)
+ pg_free(new_arg->old_tablespace);
+ new_arg->old_tablespace = old_tablespace ? pg_strdup(old_tablespace) : NULL;
+
+ child = (HANDLE) _beginthreadex(NULL, 0, (void *) win32_transfer_all_new_dbs,
+ new_arg, 0, NULL);
+ if (child == 0)
+ pg_fatal("could not create worker thread: %s\n", strerror(errno));
+
+ thread_handles[parallel_jobs - 1] = child;
+#endif
+ }
+}
+
+
+#ifdef WIN32
+DWORD
+win32_transfer_all_new_dbs(transfer_thread_arg *args)
+{
+ transfer_all_new_dbs(args->old_db_arr, args->new_db_arr, args->old_pgdata,
+ args->new_pgdata, args->old_tablespace);
+
+ /* terminates thread */
+ return 0;
+}
+#endif
+
+
+/*
+ * collect status from a completed worker child
+ */
+bool
+reap_child(bool wait_for_child)
+{
+#ifndef WIN32
+ int work_status;
+ pid_t child;
+#else
+ int thread_num;
+ DWORD res;
+#endif
+
+ if (user_opts.jobs <= 1 || parallel_jobs == 0)
+ return false;
+
+#ifndef WIN32
+ child = waitpid(-1, &work_status, wait_for_child ? 0 : WNOHANG);
+ if (child == (pid_t) -1)
+ pg_fatal("%s() failed: %s\n", "waitpid", strerror(errno));
+ if (child == 0)
+ return false; /* no children, or no dead children */
+ if (work_status != 0)
+ pg_fatal("child process exited abnormally: status %d\n", work_status);
+#else
+ /* wait for one to finish */
+ thread_num = WaitForMultipleObjects(parallel_jobs, thread_handles,
+ false, wait_for_child ? INFINITE : 0);
+
+ if (thread_num == WAIT_TIMEOUT || thread_num == WAIT_FAILED)
+ return false;
+
+ /* compute thread index in active_threads */
+ thread_num -= WAIT_OBJECT_0;
+
+ /* get the result */
+ GetExitCodeThread(thread_handles[thread_num], &res);
+ if (res != 0)
+ pg_fatal("child worker exited abnormally: %s\n", strerror(errno));
+
+ /* dispose of handle to stop leaks */
+ CloseHandle(thread_handles[thread_num]);
+
+ /* Move last slot into dead child's position */
+ if (thread_num != parallel_jobs - 1)
+ {
+ void *tmp_args;
+
+ thread_handles[thread_num] = thread_handles[parallel_jobs - 1];
+
+ /*
+ * Move last active thread arg struct into the now-dead slot, and the
+ * now-dead slot to the end for reuse by the next thread. Though the
+ * thread struct is in use by another thread, we can safely swap the
+ * struct pointers within the array.
+ */
+ tmp_args = cur_thread_args[thread_num];
+ cur_thread_args[thread_num] = cur_thread_args[parallel_jobs - 1];
+ cur_thread_args[parallel_jobs - 1] = tmp_args;
+ }
+#endif
+
+ /* do this after job has been removed */
+ parallel_jobs--;
+
+ return true;
+}
diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c
new file mode 100644
index 0000000..3628bd7
--- /dev/null
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -0,0 +1,712 @@
+/*
+ * pg_upgrade.c
+ *
+ * main source file
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/pg_upgrade.c
+ */
+
+/*
+ * To simplify the upgrade process, we force certain system values to be
+ * identical between old and new clusters:
+ *
+ * We control all assignments of pg_class.oid (and relfilenode) so toast
+ * oids are the same between old and new clusters. This is important
+ * because toast oids are stored as toast pointers in user tables.
+ *
+ * While pg_class.oid and pg_class.relfilenode are initially the same
+ * in a cluster, they can diverge due to CLUSTER, REINDEX, or VACUUM
+ * FULL. In the new cluster, pg_class.oid and pg_class.relfilenode will
+ * be the same and will match the old pg_class.oid value. Because of
+ * this, old/new pg_class.relfilenode values will not match if CLUSTER,
+ * REINDEX, or VACUUM FULL have been performed in the old cluster.
+ *
+ * We control all assignments of pg_type.oid because these oids are stored
+ * in user composite type values.
+ *
+ * We control all assignments of pg_enum.oid because these oids are stored
+ * in user tables as enum values.
+ *
+ * We control all assignments of pg_authid.oid for historical reasons (the
+ * oids used to be stored in pg_largeobject_metadata, which is now copied via
+ * SQL commands), that might change at some point in the future.
+ */
+
+
+
+#include "postgres_fe.h"
+
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
+#include "catalog/pg_class_d.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "common/restricted_token.h"
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+static void prepare_new_cluster(void);
+static void prepare_new_globals(void);
+static void create_new_objects(void);
+static void copy_xact_xlog_xid(void);
+static void set_frozenxids(bool minmxid_only);
+static void setup(char *argv0, bool *live_check);
+static void cleanup(void);
+
+ClusterInfo old_cluster,
+ new_cluster;
+OSInfo os_info;
+
+char *output_files[] = {
+ SERVER_LOG_FILE,
+#ifdef WIN32
+ /* unique file for pg_ctl start */
+ SERVER_START_LOG_FILE,
+#endif
+ UTILITY_LOG_FILE,
+ INTERNAL_LOG_FILE,
+ NULL
+};
+
+
+int
+main(int argc, char **argv)
+{
+ char *deletion_script_file_name = NULL;
+ bool live_check = false;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_upgrade"));
+
+ /* Set default restrictive mask until new cluster permissions are read */
+ umask(PG_MODE_MASK_OWNER);
+
+ parseCommandLine(argc, argv);
+
+ get_restricted_token();
+
+ adjust_data_dir(&old_cluster);
+ adjust_data_dir(&new_cluster);
+
+ setup(argv[0], &live_check);
+
+ output_check_banner(live_check);
+
+ check_cluster_versions();
+
+ get_sock_dir(&old_cluster, live_check);
+ get_sock_dir(&new_cluster, false);
+
+ check_cluster_compatibility(live_check);
+
+ /* Set mask based on PGDATA permissions */
+ if (!GetDataDirectoryCreatePerm(new_cluster.pgdata))
+ pg_fatal("could not read permissions of directory \"%s\": %s\n",
+ new_cluster.pgdata, strerror(errno));
+
+ umask(pg_mode_mask);
+
+ check_and_dump_old_cluster(live_check);
+
+
+ /* -- NEW -- */
+ start_postmaster(&new_cluster, true);
+
+ check_new_cluster();
+ report_clusters_compatible();
+
+ pg_log(PG_REPORT,
+ "\n"
+ "Performing Upgrade\n"
+ "------------------\n");
+
+ prepare_new_cluster();
+
+ stop_postmaster(false);
+
+ /*
+ * Destructive Changes to New Cluster
+ */
+
+ copy_xact_xlog_xid();
+
+ /* New now using xids of the old system */
+
+ /* -- NEW -- */
+ start_postmaster(&new_cluster, true);
+
+ prepare_new_globals();
+
+ create_new_objects();
+
+ stop_postmaster(false);
+
+ /*
+ * Most failures happen in create_new_objects(), which has completed at
+ * this point. We do this here because it is just before linking, which
+ * will link the old and new cluster data files, preventing the old
+ * cluster from being safely started once the new cluster is started.
+ */
+ if (user_opts.transfer_mode == TRANSFER_MODE_LINK)
+ disable_old_cluster();
+
+ transfer_all_new_tablespaces(&old_cluster.dbarr, &new_cluster.dbarr,
+ old_cluster.pgdata, new_cluster.pgdata);
+
+ /*
+ * Assuming OIDs are only used in system tables, there is no need to
+ * restore the OID counter because we have not transferred any OIDs from
+ * the old system, but we do it anyway just in case. We do it late here
+ * because there is no need to have the schema load use new oids.
+ */
+ prep_status("Setting next OID for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -o %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtoid,
+ new_cluster.pgdata);
+ check_ok();
+
+ prep_status("Sync data directory to disk");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/initdb\" --sync-only \"%s\"", new_cluster.bindir,
+ new_cluster.pgdata);
+ check_ok();
+
+ create_script_for_old_cluster_deletion(&deletion_script_file_name);
+
+ issue_warnings_and_set_wal_level();
+
+ pg_log(PG_REPORT,
+ "\n"
+ "Upgrade Complete\n"
+ "----------------\n");
+
+ output_completion_banner(deletion_script_file_name);
+
+ pg_free(deletion_script_file_name);
+
+ cleanup();
+
+ return 0;
+}
+
+
+static void
+setup(char *argv0, bool *live_check)
+{
+ /*
+ * make sure the user has a clean environment, otherwise, we may confuse
+ * libpq when we connect to one (or both) of the servers.
+ */
+ check_pghost_envvar();
+
+ /*
+ * In case the user hasn't specified the directory for the new binaries
+ * with -B, default to using the path of the currently executed pg_upgrade
+ * binary.
+ */
+ if (!new_cluster.bindir)
+ {
+ char exec_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, exec_path) < 0)
+ pg_fatal("%s: could not find own program executable\n", argv0);
+ /* Trim off program name and keep just path */
+ *last_dir_separator(exec_path) = '\0';
+ canonicalize_path(exec_path);
+ new_cluster.bindir = pg_strdup(exec_path);
+ }
+
+ verify_directories();
+
+ /* no postmasters should be running, except for a live check */
+ if (pid_lock_file_exists(old_cluster.pgdata))
+ {
+ /*
+ * If we have a postmaster.pid file, try to start the server. If it
+ * starts, the pid file was stale, so stop the server. If it doesn't
+ * start, assume the server is running. If the pid file is left over
+ * from a server crash, this also allows any committed transactions
+ * stored in the WAL to be replayed so they are not lost, because WAL
+ * files are not transferred from old to new servers. We later check
+ * for a clean shutdown.
+ */
+ if (start_postmaster(&old_cluster, false))
+ stop_postmaster(false);
+ else
+ {
+ if (!user_opts.check)
+ pg_fatal("There seems to be a postmaster servicing the old cluster.\n"
+ "Please shutdown that postmaster and try again.\n");
+ else
+ *live_check = true;
+ }
+ }
+
+ /* same goes for the new postmaster */
+ if (pid_lock_file_exists(new_cluster.pgdata))
+ {
+ if (start_postmaster(&new_cluster, false))
+ stop_postmaster(false);
+ else
+ pg_fatal("There seems to be a postmaster servicing the new cluster.\n"
+ "Please shutdown that postmaster and try again.\n");
+ }
+}
+
+
+static void
+prepare_new_cluster(void)
+{
+ /*
+ * It would make more sense to freeze after loading the schema, but that
+ * would cause us to lose the frozenxids restored by the load. We use
+ * --analyze so autovacuum doesn't update statistics later
+ */
+ prep_status("Analyzing all rows in the new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/vacuumdb\" %s --all --analyze %s",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.verbose ? "--verbose" : "");
+ check_ok();
+
+ /*
+ * We do freeze after analyze so pg_statistic is also frozen. template0 is
+ * not frozen here, but data rows were frozen by initdb, and we set its
+ * datfrozenxid, relfrozenxids, and relminmxid later to match the new xid
+ * counter later.
+ */
+ prep_status("Freezing all rows in the new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/vacuumdb\" %s --all --freeze %s",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.verbose ? "--verbose" : "");
+ check_ok();
+}
+
+
+static void
+prepare_new_globals(void)
+{
+ /*
+ * Before we restore anything, set frozenxids of initdb-created tables.
+ */
+ set_frozenxids(false);
+
+ /*
+ * Now restore global objects (roles and tablespaces).
+ */
+ prep_status("Restoring global objects in the new cluster");
+
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/psql\" " EXEC_PSQL_ARGS " %s -f \"%s\"",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ GLOBALS_DUMP_FILE);
+ check_ok();
+}
+
+
+static void
+create_new_objects(void)
+{
+ int dbnum;
+
+ prep_status("Restoring database schemas in the new cluster\n");
+
+ /*
+ * We cannot process the template1 database concurrently with others,
+ * because when it's transiently dropped, connection attempts would fail.
+ * So handle it in a separate non-parallelized pass.
+ */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ const char *create_opts;
+
+ /* Process only template1 in this pass */
+ if (strcmp(old_db->db_name, "template1") != 0)
+ continue;
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ /*
+ * template1 database will already exist in the target installation,
+ * so tell pg_restore to drop and recreate it; otherwise we would fail
+ * to propagate its database-level properties.
+ */
+ create_opts = "--clean --create";
+
+ exec_prog(log_file_name,
+ NULL,
+ true,
+ true,
+ "\"%s/pg_restore\" %s %s --exit-on-error --verbose "
+ "--dbname postgres \"%s\"",
+ new_cluster.bindir,
+ cluster_conn_opts(&new_cluster),
+ create_opts,
+ sql_file_name);
+
+ break; /* done once we've processed template1 */
+ }
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ const char *create_opts;
+
+ /* Skip template1 in this pass */
+ if (strcmp(old_db->db_name, "template1") == 0)
+ continue;
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ /*
+ * postgres database will already exist in the target installation, so
+ * tell pg_restore to drop and recreate it; otherwise we would fail to
+ * propagate its database-level properties.
+ */
+ if (strcmp(old_db->db_name, "postgres") == 0)
+ create_opts = "--clean --create";
+ else
+ create_opts = "--create";
+
+ parallel_exec_prog(log_file_name,
+ NULL,
+ "\"%s/pg_restore\" %s %s --exit-on-error --verbose "
+ "--dbname template1 \"%s\"",
+ new_cluster.bindir,
+ cluster_conn_opts(&new_cluster),
+ create_opts,
+ sql_file_name);
+ }
+
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+
+ end_progress_output();
+ check_ok();
+
+ /*
+ * We don't have minmxids for databases or relations in pre-9.3 clusters,
+ * so set those after we have restored the schema.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 902)
+ set_frozenxids(true);
+
+ /* update new_cluster info now that we have objects in the databases */
+ get_db_and_rel_infos(&new_cluster);
+}
+
+/*
+ * Delete the given subdirectory contents from the new cluster
+ */
+static void
+remove_new_subdir(const char *subdir, bool rmtopdir)
+{
+ char new_path[MAXPGPATH];
+
+ prep_status("Deleting files from new %s", subdir);
+
+ snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, subdir);
+ if (!rmtree(new_path, rmtopdir))
+ pg_fatal("could not delete directory \"%s\"\n", new_path);
+
+ check_ok();
+}
+
+/*
+ * Copy the files from the old cluster into it
+ */
+static void
+copy_subdir_files(const char *old_subdir, const char *new_subdir)
+{
+ char old_path[MAXPGPATH];
+ char new_path[MAXPGPATH];
+
+ remove_new_subdir(new_subdir, true);
+
+ snprintf(old_path, sizeof(old_path), "%s/%s", old_cluster.pgdata, old_subdir);
+ snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, new_subdir);
+
+ prep_status("Copying old %s to new server", old_subdir);
+
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+#ifndef WIN32
+ "cp -Rf \"%s\" \"%s\"",
+#else
+ /* flags: everything, no confirm, quiet, overwrite read-only */
+ "xcopy /e /y /q /r \"%s\" \"%s\\\"",
+#endif
+ old_path, new_path);
+
+ check_ok();
+}
+
+static void
+copy_xact_xlog_xid(void)
+{
+ /*
+ * 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) <= 906 ?
+ "pg_clog" : "pg_xact",
+ GET_MAJOR_VERSION(new_cluster.major_version) <= 906 ?
+ "pg_clog" : "pg_xact");
+
+ prep_status("Setting oldest XID for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -u %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_oldstxid,
+ new_cluster.pgdata);
+ check_ok();
+
+ /* set the next transaction id and epoch of the new cluster */
+ prep_status("Setting next transaction ID and epoch for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -x %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtxid,
+ new_cluster.pgdata);
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -e %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtepoch,
+ new_cluster.pgdata);
+ /* must reset commit timestamp limits also */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -c %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtxid,
+ old_cluster.controldata.chkpnt_nxtxid,
+ new_cluster.pgdata);
+ check_ok();
+
+ /*
+ * If the old server is before the MULTIXACT_FORMATCHANGE_CAT_VER change
+ * (see pg_upgrade.h) and the new server is after, then we don't copy
+ * pg_multixact files, but we need to reset pg_control so that the new
+ * server doesn't attempt to read multis older than the cutoff value.
+ */
+ if (old_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER &&
+ new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ {
+ copy_subdir_files("pg_multixact/offsets", "pg_multixact/offsets");
+ copy_subdir_files("pg_multixact/members", "pg_multixact/members");
+
+ prep_status("Setting next multixact ID and offset for new cluster");
+
+ /*
+ * we preserve all files and contents, so we must preserve both "next"
+ * counters here and the oldest multi present on system.
+ */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -O %u -m %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtmxoff,
+ old_cluster.controldata.chkpnt_nxtmulti,
+ old_cluster.controldata.chkpnt_oldstMulti,
+ new_cluster.pgdata);
+ check_ok();
+ }
+ else if (new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ {
+ /*
+ * Remove offsets/0000 file created by initdb that no longer matches
+ * the new multi-xid value. "members" starts at zero so no need to
+ * remove it.
+ */
+ remove_new_subdir("pg_multixact/offsets", false);
+
+ prep_status("Setting oldest multixact ID in new cluster");
+
+ /*
+ * We don't preserve files in this case, but it's important that the
+ * oldest multi is set to the latest value used by the old system, so
+ * that multixact.c returns the empty set for multis that might be
+ * present on disk. We set next multi to the value following that; it
+ * might end up wrapped around (i.e. 0) if the old cluster had
+ * next=MaxMultiXactId, but multixact.c can cope with that just fine.
+ */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -m %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtmulti + 1,
+ old_cluster.controldata.chkpnt_nxtmulti,
+ new_cluster.pgdata);
+ check_ok();
+ }
+
+ /* now reset the wal archives in the new cluster */
+ prep_status("Resetting WAL archives");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ /* use timeline 1 to match controldata and no WAL history file */
+ "\"%s/pg_resetwal\" -l 00000001%s \"%s\"", new_cluster.bindir,
+ old_cluster.controldata.nextxlogfile + 8,
+ new_cluster.pgdata);
+ check_ok();
+}
+
+
+/*
+ * set_frozenxids()
+ *
+ * This is called on the new cluster before we restore anything, with
+ * minmxid_only = false. Its purpose is to ensure that all initdb-created
+ * vacuumable tables have relfrozenxid/relminmxid matching the old cluster's
+ * xid/mxid counters. We also initialize the datfrozenxid/datminmxid of the
+ * built-in databases to match.
+ *
+ * As we create user tables later, their relfrozenxid/relminmxid fields will
+ * be restored properly by the binary-upgrade restore script. Likewise for
+ * user-database datfrozenxid/datminmxid. However, if we're upgrading from a
+ * pre-9.3 database, which does not store per-table or per-DB minmxid, then
+ * the relminmxid/datminmxid values filled in by the restore script will just
+ * be zeroes.
+ *
+ * Hence, with a pre-9.3 source database, a second call occurs after
+ * everything is restored, with minmxid_only = true. This pass will
+ * initialize all tables and databases, both those made by initdb and user
+ * objects, with the desired minmxid value. frozenxid values are left alone.
+ */
+static void
+set_frozenxids(bool minmxid_only)
+{
+ int dbnum;
+ PGconn *conn,
+ *conn_template1;
+ PGresult *dbres;
+ int ntups;
+ int i_datname;
+ int i_datallowconn;
+
+ if (!minmxid_only)
+ prep_status("Setting frozenxid and minmxid counters in new cluster");
+ else
+ prep_status("Setting minmxid counter in new cluster");
+
+ conn_template1 = connectToServer(&new_cluster, "template1");
+
+ if (!minmxid_only)
+ /* set pg_database.datfrozenxid */
+ PQclear(executeQueryOrDie(conn_template1,
+ "UPDATE pg_catalog.pg_database "
+ "SET datfrozenxid = '%u'",
+ old_cluster.controldata.chkpnt_nxtxid));
+
+ /* set pg_database.datminmxid */
+ PQclear(executeQueryOrDie(conn_template1,
+ "UPDATE pg_catalog.pg_database "
+ "SET datminmxid = '%u'",
+ old_cluster.controldata.chkpnt_nxtmulti));
+
+ /* get database names */
+ dbres = executeQueryOrDie(conn_template1,
+ "SELECT datname, datallowconn "
+ "FROM pg_catalog.pg_database");
+
+ i_datname = PQfnumber(dbres, "datname");
+ i_datallowconn = PQfnumber(dbres, "datallowconn");
+
+ ntups = PQntuples(dbres);
+ for (dbnum = 0; dbnum < ntups; dbnum++)
+ {
+ char *datname = PQgetvalue(dbres, dbnum, i_datname);
+ char *datallowconn = PQgetvalue(dbres, dbnum, i_datallowconn);
+
+ /*
+ * We must update databases where datallowconn = false, e.g.
+ * template0, because autovacuum increments their datfrozenxids,
+ * relfrozenxids, and relminmxid even if autovacuum is turned off, and
+ * even though all the data rows are already frozen. To enable this,
+ * we temporarily change datallowconn.
+ */
+ if (strcmp(datallowconn, "f") == 0)
+ PQclear(executeQueryOrDie(conn_template1,
+ "ALTER DATABASE %s ALLOW_CONNECTIONS = true",
+ quote_identifier(datname)));
+
+ conn = connectToServer(&new_cluster, datname);
+
+ if (!minmxid_only)
+ /* set pg_class.relfrozenxid */
+ PQclear(executeQueryOrDie(conn,
+ "UPDATE pg_catalog.pg_class "
+ "SET relfrozenxid = '%u' "
+ /* only heap, materialized view, and TOAST are vacuumed */
+ "WHERE relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_TOASTVALUE) ")",
+ old_cluster.controldata.chkpnt_nxtxid));
+
+ /* set pg_class.relminmxid */
+ PQclear(executeQueryOrDie(conn,
+ "UPDATE pg_catalog.pg_class "
+ "SET relminmxid = '%u' "
+ /* only heap, materialized view, and TOAST are vacuumed */
+ "WHERE relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_TOASTVALUE) ")",
+ old_cluster.controldata.chkpnt_nxtmulti));
+ PQfinish(conn);
+
+ /* Reset datallowconn flag */
+ if (strcmp(datallowconn, "f") == 0)
+ PQclear(executeQueryOrDie(conn_template1,
+ "ALTER DATABASE %s ALLOW_CONNECTIONS = false",
+ quote_identifier(datname)));
+ }
+
+ PQclear(dbres);
+
+ PQfinish(conn_template1);
+
+ check_ok();
+}
+
+
+static void
+cleanup(void)
+{
+ fclose(log_opts.internal);
+
+ /* Remove dump and log files? */
+ if (!log_opts.retain)
+ {
+ int dbnum;
+ char **filename;
+
+ for (filename = output_files; *filename != NULL; filename++)
+ unlink(*filename);
+
+ /* remove dump files */
+ unlink(GLOBALS_DUMP_FILE);
+
+ if (old_cluster.dbarr.dbs)
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ unlink(sql_file_name);
+
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+ unlink(log_file_name);
+ }
+ }
+}
diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h
new file mode 100644
index 0000000..e5b1083
--- /dev/null
+++ b/src/bin/pg_upgrade/pg_upgrade.h
@@ -0,0 +1,465 @@
+/*
+ * pg_upgrade.h
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/pg_upgrade.h
+ */
+
+#include <unistd.h>
+#include <assert.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+
+#include "libpq-fe.h"
+
+/* Use port in the private/dynamic port number range */
+#define DEF_PGUPORT 50432
+
+#define MAX_STRING 1024
+#define QUERY_ALLOC 8192
+
+#define MESSAGE_WIDTH 60
+
+#define GET_MAJOR_VERSION(v) ((v) / 100)
+
+/* contains both global db information and CREATE DATABASE commands */
+#define GLOBALS_DUMP_FILE "pg_upgrade_dump_globals.sql"
+#define DB_DUMP_FILE_MASK "pg_upgrade_dump_%u.custom"
+
+#define DB_DUMP_LOG_FILE_MASK "pg_upgrade_dump_%u.log"
+#define SERVER_LOG_FILE "pg_upgrade_server.log"
+#define UTILITY_LOG_FILE "pg_upgrade_utility.log"
+#define INTERNAL_LOG_FILE "pg_upgrade_internal.log"
+
+extern char *output_files[];
+
+/*
+ * WIN32 files do not accept writes from multiple processes
+ *
+ * On Win32, we can't send both pg_upgrade output and command output to the
+ * same file because we get the error: "The process cannot access the file
+ * because it is being used by another process." so send the pg_ctl
+ * command-line output to a new file, rather than into the server log file.
+ * Ideally we could use UTILITY_LOG_FILE for this, but some Windows platforms
+ * keep the pg_ctl output file open by the running postmaster, even after
+ * pg_ctl exits.
+ *
+ * We could use the Windows pgwin32_open() flags to allow shared file
+ * writes but is unclear how all other tools would use those flags, so
+ * we just avoid it and log a little differently on Windows; we adjust
+ * the error message appropriately.
+ */
+#ifndef WIN32
+#define SERVER_START_LOG_FILE SERVER_LOG_FILE
+#define SERVER_STOP_LOG_FILE SERVER_LOG_FILE
+#else
+#define SERVER_START_LOG_FILE "pg_upgrade_server_start.log"
+/*
+ * "pg_ctl start" keeps SERVER_START_LOG_FILE and SERVER_LOG_FILE open
+ * while the server is running, so we use UTILITY_LOG_FILE for "pg_ctl
+ * stop".
+ */
+#define SERVER_STOP_LOG_FILE UTILITY_LOG_FILE
+#endif
+
+
+#ifndef WIN32
+#define pg_mv_file rename
+#define PATH_SEPARATOR '/'
+#define PATH_QUOTE '\''
+#define RM_CMD "rm -f"
+#define RMDIR_CMD "rm -rf"
+#define SCRIPT_PREFIX "./"
+#define SCRIPT_EXT "sh"
+#define ECHO_QUOTE "'"
+#define ECHO_BLANK ""
+#else
+#define pg_mv_file pgrename
+#define PATH_SEPARATOR '\\'
+#define PATH_QUOTE '"'
+#define RM_CMD "DEL /q"
+#define RMDIR_CMD "RMDIR /s/q"
+#define SCRIPT_PREFIX ""
+#define SCRIPT_EXT "bat"
+#define EXE_EXT ".exe"
+#define ECHO_QUOTE ""
+#define ECHO_BLANK "."
+#endif
+
+
+/*
+ * postmaster/postgres -b (binary_upgrade) flag added during PG 9.1
+ * development
+ */
+#define BINARY_UPGRADE_SERVER_FLAG_CAT_VER 201104251
+
+/*
+ * Visibility map changed with this 9.2 commit,
+ * 8f9fe6edce358f7904e0db119416b4d1080a83aa; pick later catalog version.
+ */
+#define VISIBILITY_MAP_CRASHSAFE_CAT_VER 201107031
+
+/*
+ * The format of visibility map is changed with this 9.6 commit,
+ */
+#define VISIBILITY_MAP_FROZEN_BIT_CAT_VER 201603011
+
+/*
+ * pg_multixact format changed in 9.3 commit 0ac5ad5134f2769ccbaefec73844f85,
+ * ("Improve concurrency of foreign key locking") which also updated catalog
+ * version to this value. pg_upgrade behavior depends on whether old and new
+ * server versions are both newer than this, or only the new one is.
+ */
+#define MULTIXACT_FORMATCHANGE_CAT_VER 201301231
+
+/*
+ * large object chunk size added to pg_controldata,
+ * commit 5f93c37805e7485488480916b4585e098d3cc883
+ */
+#define LARGE_OBJECT_SIZE_PG_CONTROL_VER 942
+
+/*
+ * change in JSONB format during 9.4 beta
+ */
+#define JSONB_FORMAT_CHANGE_CAT_VER 201409291
+
+
+/*
+ * Each relation is represented by a relinfo structure.
+ */
+typedef struct
+{
+ /* Can't use NAMEDATALEN; not guaranteed to be same on client */
+ char *nspname; /* namespace name */
+ char *relname; /* relation name */
+ Oid reloid; /* relation OID */
+ Oid relfilenode; /* relation file node */
+ Oid indtable; /* if index, OID of its table, else 0 */
+ Oid toastheap; /* if toast table, OID of base table, else 0 */
+ char *tablespace; /* tablespace path; "" for cluster default */
+ bool nsp_alloc; /* should nspname be freed? */
+ bool tblsp_alloc; /* should tablespace be freed? */
+} RelInfo;
+
+typedef struct
+{
+ RelInfo *rels;
+ int nrels;
+} RelInfoArr;
+
+/*
+ * The following structure represents a relation mapping.
+ */
+typedef struct
+{
+ const char *old_tablespace;
+ const char *new_tablespace;
+ const char *old_tablespace_suffix;
+ const char *new_tablespace_suffix;
+ Oid old_db_oid;
+ Oid new_db_oid;
+
+ /*
+ * old/new relfilenodes might differ for pg_largeobject(_metadata) indexes
+ * due to VACUUM FULL or REINDEX. Other relfilenodes are preserved.
+ */
+ Oid old_relfilenode;
+ Oid new_relfilenode;
+ /* the rest are used only for logging and error reporting */
+ char *nspname; /* namespaces */
+ char *relname;
+} FileNameMap;
+
+/*
+ * Structure to store database information
+ */
+typedef struct
+{
+ Oid db_oid; /* oid of the database */
+ char *db_name; /* database name */
+ char db_tablespace[MAXPGPATH]; /* database default tablespace
+ * path */
+ char *db_collate;
+ char *db_ctype;
+ int db_encoding;
+ RelInfoArr rel_arr; /* array of all user relinfos */
+} DbInfo;
+
+typedef struct
+{
+ DbInfo *dbs; /* array of db infos */
+ int ndbs; /* number of db infos */
+} DbInfoArr;
+
+/*
+ * The following structure is used to hold pg_control information.
+ * Rather than using the backend's control structure we use our own
+ * structure to avoid pg_control version issues between releases.
+ */
+typedef struct
+{
+ uint32 ctrl_ver;
+ uint32 cat_ver;
+ char nextxlogfile[25];
+ uint32 chkpnt_nxtxid;
+ uint32 chkpnt_nxtepoch;
+ uint32 chkpnt_nxtoid;
+ uint32 chkpnt_nxtmulti;
+ uint32 chkpnt_nxtmxoff;
+ uint32 chkpnt_oldstMulti;
+ uint32 chkpnt_oldstxid;
+ uint32 align;
+ uint32 blocksz;
+ uint32 largesz;
+ uint32 walsz;
+ uint32 walseg;
+ uint32 ident;
+ uint32 index;
+ uint32 toast;
+ uint32 large_object;
+ bool date_is_int;
+ bool float8_pass_by_value;
+ bool data_checksum_version;
+} ControlData;
+
+/*
+ * Enumeration to denote transfer modes
+ */
+typedef enum
+{
+ TRANSFER_MODE_CLONE,
+ TRANSFER_MODE_COPY,
+ TRANSFER_MODE_LINK
+} transferMode;
+
+/*
+ * Enumeration to denote pg_log modes
+ */
+typedef enum
+{
+ PG_VERBOSE,
+ PG_STATUS,
+ PG_REPORT,
+ PG_WARNING,
+ PG_FATAL
+} eLogType;
+
+
+typedef long pgpid_t;
+
+
+/*
+ * cluster
+ *
+ * information about each cluster
+ */
+typedef struct
+{
+ ControlData controldata; /* pg_control information */
+ DbInfoArr dbarr; /* dbinfos array */
+ char *pgdata; /* pathname for cluster's $PGDATA directory */
+ char *pgconfig; /* pathname for cluster's config file
+ * directory */
+ char *bindir; /* pathname for cluster's executable directory */
+ char *pgopts; /* options to pass to the server, like pg_ctl
+ * -o */
+ char *sockdir; /* directory for Unix Domain socket, if any */
+ unsigned short port; /* port number where postmaster is waiting */
+ uint32 major_version; /* PG_VERSION of cluster */
+ char major_version_str[64]; /* string PG_VERSION of cluster */
+ uint32 bin_version; /* version returned from pg_ctl */
+ const char *tablespace_suffix; /* directory specification */
+} ClusterInfo;
+
+
+/*
+ * LogOpts
+*/
+typedef struct
+{
+ FILE *internal; /* internal log FILE */
+ bool verbose; /* true -> be verbose in messages */
+ bool retain; /* retain log files on success */
+} LogOpts;
+
+
+/*
+ * UserOpts
+*/
+typedef struct
+{
+ bool check; /* true -> ask user for permission to make
+ * changes */
+ transferMode transfer_mode; /* copy files or link them? */
+ int jobs; /* number of processes/threads to use */
+ char *socketdir; /* directory to use for Unix sockets */
+} UserOpts;
+
+typedef struct
+{
+ char *name;
+ int dbnum;
+} LibraryInfo;
+
+/*
+ * OSInfo
+ */
+typedef struct
+{
+ const char *progname; /* complete pathname for this program */
+ char *user; /* username for clusters */
+ bool user_specified; /* user specified on command-line */
+ char **old_tablespaces; /* tablespaces */
+ int num_old_tablespaces;
+ LibraryInfo *libraries; /* loadable libraries */
+ int num_libraries;
+ ClusterInfo *running_cluster;
+} OSInfo;
+
+
+/*
+ * Global variables
+ */
+extern LogOpts log_opts;
+extern UserOpts user_opts;
+extern ClusterInfo old_cluster,
+ new_cluster;
+extern OSInfo os_info;
+
+
+/* check.c */
+
+void output_check_banner(bool live_check);
+void check_and_dump_old_cluster(bool live_check);
+void check_new_cluster(void);
+void report_clusters_compatible(void);
+void issue_warnings_and_set_wal_level(void);
+void output_completion_banner(char *deletion_script_file_name);
+void check_cluster_versions(void);
+void check_cluster_compatibility(bool live_check);
+void create_script_for_old_cluster_deletion(char **deletion_script_file_name);
+
+
+/* controldata.c */
+
+void get_control_data(ClusterInfo *cluster, bool live_check);
+void check_control_data(ControlData *oldctrl, ControlData *newctrl);
+void disable_old_cluster(void);
+
+
+/* dump.c */
+
+void generate_old_dump(void);
+
+
+/* exec.c */
+
+#define EXEC_PSQL_ARGS "--echo-queries --set ON_ERROR_STOP=on --no-psqlrc --dbname=template1"
+
+bool exec_prog(const char *log_file, const char *opt_log_file,
+ bool report_error, bool exit_on_error, const char *fmt,...) pg_attribute_printf(5, 6);
+void verify_directories(void);
+bool pid_lock_file_exists(const char *datadir);
+
+
+/* file.c */
+
+void cloneFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void copyFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void linkFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void rewriteVisibilityMap(const char *fromfile, const char *tofile,
+ const char *schemaName, const char *relName);
+void check_file_clone(void);
+void check_hard_link(void);
+
+/* fopen_priv() is no longer different from fopen() */
+#define fopen_priv(path, mode) fopen(path, mode)
+
+/* function.c */
+
+void get_loadable_libraries(void);
+void check_loadable_libraries(void);
+
+/* info.c */
+
+FileNameMap *gen_db_file_maps(DbInfo *old_db,
+ DbInfo *new_db, int *nmaps, const char *old_pgdata,
+ const char *new_pgdata);
+void get_db_and_rel_infos(ClusterInfo *cluster);
+void print_maps(FileNameMap *maps, int n,
+ const char *db_name);
+
+/* option.c */
+
+void parseCommandLine(int argc, char *argv[]);
+void adjust_data_dir(ClusterInfo *cluster);
+void get_sock_dir(ClusterInfo *cluster, bool live_check);
+
+/* relfilenode.c */
+
+void transfer_all_new_tablespaces(DbInfoArr *old_db_arr,
+ DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata);
+void transfer_all_new_dbs(DbInfoArr *old_db_arr,
+ DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata,
+ char *old_tablespace);
+
+/* tablespace.c */
+
+void init_tablespaces(void);
+
+
+/* server.c */
+
+PGconn *connectToServer(ClusterInfo *cluster, const char *db_name);
+PGresult *executeQueryOrDie(PGconn *conn, const char *fmt,...) pg_attribute_printf(2, 3);
+
+char *cluster_conn_opts(ClusterInfo *cluster);
+
+bool start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error);
+void stop_postmaster(bool in_atexit);
+uint32 get_major_server_version(ClusterInfo *cluster);
+void check_pghost_envvar(void);
+
+
+/* util.c */
+
+char *quote_identifier(const char *s);
+int get_user_info(char **user_name_p);
+void check_ok(void);
+void report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
+void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
+void pg_fatal(const char *fmt,...) pg_attribute_printf(1, 2) pg_attribute_noreturn();
+void end_progress_output(void);
+void prep_status(const char *fmt,...) pg_attribute_printf(1, 2);
+void check_ok(void);
+unsigned int str2uint(const char *str);
+
+
+/* version.c */
+
+bool check_for_data_types_usage(ClusterInfo *cluster,
+ const char *base_query,
+ const char *output_path);
+bool check_for_data_type_usage(ClusterInfo *cluster,
+ const char *type_name,
+ const char *output_path);
+void new_9_0_populate_pg_largeobject_metadata(ClusterInfo *cluster,
+ bool check_mode);
+void old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster);
+void old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster);
+void old_9_6_invalidate_hash_indexes(ClusterInfo *cluster,
+ bool check_mode);
+
+void old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster);
+void report_extension_updates(ClusterInfo *cluster);
+
+/* parallel.c */
+void parallel_exec_prog(const char *log_file, const char *opt_log_file,
+ const char *fmt,...) pg_attribute_printf(3, 4);
+void parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata,
+ char *old_tablespace);
+bool reap_child(bool wait_for_child);
diff --git a/src/bin/pg_upgrade/po/cs.po b/src/bin/pg_upgrade/po/cs.po
new file mode 100644
index 0000000..06698c5
--- /dev/null
+++ b/src/bin/pg_upgrade/po/cs.po
@@ -0,0 +1,1804 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:15+0000\n"
+"PO-Revision-Date: 2021-09-16 09:14+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: check.c:67
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Provádím Kontrolu Konzistence na Starém Live Serveru\n"
+"----------------------------------------------------\n"
+
+#: check.c:73
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Provádím Kontrolu Konzistence\n"
+"-----------------------------\n"
+
+#: check.c:193
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Clustery jsou kompatibilní*\n"
+
+#: check.c:199
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Pokud pg_upgrade selže po tomto místě, musíte reinicializovat\n"
+"(initdb) nový cluster než budete pokračovat.\n"
+
+#: check.c:233
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade so,\n"
+"once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Statistiky optimalizéru nejsou zachovány při pg_upgrade,\n"
+"takže po nastartování nového serveru zvažte spuštění:\n"
+" %s\n"
+"\n"
+
+#: check.c:239
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Spuštění tohoto skriptu smaže datové soubory starého clusteru:\n"
+" %s\n"
+
+#: check.c:244
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Nelze vytvořit skript pro smazání datových souborů starého cluster\n"
+"protože uživatelem definované tablespaces nebo datový adresář nového\n"
+"clusteru jsou v adresáři starého clusteru. Obsah starého clusteru musí\n"
+"být smazán manuálně.\n"
+
+#: check.c:254
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Kontroluji verze clusterů"
+
+#: check.c:266
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Tato utilita může upgradovat pouze z PostgreSQL verze 8.4 a novějších.\n"
+
+#: check.c:270
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Tato utilita může upgradovat pouze na PostgreSQL verze %s.\n"
+
+#: check.c:279
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Tato utilita nemůže být použita pro downgrade na starší major PostgreSQL verze.\n"
+
+#: check.c:284
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Data a binární adresáře starého clusteru jsou z jiných major verzí.\n"
+
+#: check.c:287
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Data a binární adresáře nového clusteru jsou z různých minárních verzí.\n"
+
+#: check.c:304
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "Při kontrole pre-PG 9.1 živého starého serveru, musíte zadat číslo portu starého serveru.\n"
+
+#: check.c:308
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Při kontrole živého serveru, staré a nové číslo portu musí být různá.\n"
+
+#: check.c:323
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "kódování databáze \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:328
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_collate hodnoty pro databázi \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:331
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_ctype hodnoty pro databázi \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:404
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Databáze \"%s\" na novém clusteru není prázdná: nalezena relace \"%s.%s\"\n"
+
+#: check.c:453
+#, c-format
+msgid "Creating script to analyze new cluster"
+msgstr "Vytvářím skript pro analyze nového clusteru"
+
+#: check.c:467 check.c:626 check.c:890 check.c:969 check.c:1079 check.c:1170
+#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:199
+#: version.c:341
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "nelze otevřít soubor \"%s\": %s\n"
+
+#: check.c:515 check.c:682
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "nelze přidat právo na spuštění pro soubor \"%s\": %s\n"
+
+#: check.c:545
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Kontroluji tablespace adresáře v novém clusteru"
+
+#: check.c:556
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "tablespace adresář v novém clusteru již existuje \"%s\"\n"
+
+#: check.c:589
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"VAROVÁNÍ: nový datový adresář by neměl být ve starém datovém adresáři, e.g. %s\n"
+
+#: check.c:613
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"VAROVÁNÍ: umístění uživatelem definovaných tablespaces by neměly být v datovém adresáři, e.g. %s\n"
+
+#: check.c:623
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Vytvářím skript pro smazání starého clusteru"
+
+#: check.c:702
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Kontroluji že databázový uživatel je použit pro instalaci"
+
+#: check.c:718
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "databázový uživatel \"%s\" nebyl použit pro instalaci\n"
+
+#: check.c:729
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "nelže určit počet uživatelů\n"
+
+#: check.c:737
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Pouze instalační uživatel může být definován pro nový cluster.\n"
+
+#: check.c:757
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Kontroluji nastavení databázového spojení"
+
+#: check.c:779
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 nesmí povolovat spojení, i.e. příslušná hodnota pg_database.datallowconn musí být false\n"
+
+#: check.c:789
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "Všechny non-template0 databáze musí povolovat spojení, i.e. jejich pg_database.datallowconn musí být true\n"
+
+#: check.c:814
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Kontroluji prepared transakce"
+
+#: check.c:823
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Zdrojový cluster obsahuje prepared transakce\n"
+
+#: check.c:825
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Cílový cluster obsahuje prepared transakce\n"
+
+#: check.c:851
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Kontroluji contrib/isn s bigint-passing rozdílem"
+
+#: check.c:912 check.c:991 check.c:1102 check.c:1193 function.c:262
+#: version.c:245 version.c:282 version.c:425
+#, c-format
+msgid "fatal\n"
+msgstr "fatal\n"
+
+#: check.c:913
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"contrib/isn\" funkce které spoléhají na\n"
+"bigint datový typ. Váš starý a nový cluster předávají bigint hodnoty\n"
+"rozdílně takže tento cluster aktuálně nelze upgradovat. Můžete manuálně\n"
+"upgradovat databáze které používají \"contrib/isn\" prostředky a odstranit\n"
+"\"contrib/isn\" ze starého clusteru a znovu spustit upgrade. Seznam\n"
+"problematických funkcí je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:937
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Kontrola tabulek s WITH OIDS"
+
+#: check.c:992
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje tabulky deklarované s WITH OIDS, což již nadále není podporováno.\n"
+"Zvažte odstranění oid sloupce pomocí\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Seznam tabulek s tímto problémem je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1022
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Kontroluji reg* datové typy v uživatelských tabulkách"
+
+#: check.c:1103
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the\n"
+"problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje některý z reg* datových typů v uživatelských\n"
+"tabulkách. Tyto datové typy odkazují na systémové OID hodnoty které\n"
+"nejsou zachovány při pg_upgrade, takže tento cluster aktuálně nelze\n"
+"upgradovat. Můžete odstranit problematické tabulky a znovu spustit\n"
+"upgrade. Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1128
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Kontroluji nekompatibilní \"jsonb\" datový typ"
+
+#: check.c:1194
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can remove the problem\n"
+"tables and restart the upgrade. A list of the problem columns is\n"
+"in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"jsonb\" datový typ v uživatelských tabulkách.\n"
+"Interní formát \"jsonb\" se změnil v 9.4 beta takže tento cluster aktuálně nelze\n"
+"upgradovat. Můžete odstranit problematické tabulky a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1216
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Kontroluji existenci rolí začínajících na \"pg_\""
+
+#: check.c:1226
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Zdrojový cluster obsahuje role začínající na \"pg_\"\n"
+
+#: check.c:1228
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Cílový cluster obsahuje role začínající na \"pg_\"\n"
+
+#: check.c:1254
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "selhalo získání aktuální hodnoty locale\n"
+
+#: check.c:1263
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "selhalo získání jména systémové locale pro \"%s\"\n"
+
+#: check.c:1269
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "selhala obnova staré locale \"%s\"\n"
+
+#: controldata.c:127 controldata.c:195
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "nelze získat control data pomocí %s: %s\n"
+
+#: controldata.c:138
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: problém se stavem databázového clusteru\n"
+
+#: controldata.c:156
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Zdrojový cluster byl vypnut v recovery módu. Pro upgrade použijte \"rsync\" jak je uvedeno v dokumentaci nebo ho vypněte jako primary.\n"
+
+#: controldata.c:158
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Cílový cluster byl vypnut v recovery módu. Pro upgrade použijte \"rsync\" jak je uvedeno v dokumentaci nebo ho vypněte jako primary.\n"
+
+#: controldata.c:163
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Zdrojový cluster nebyl zastaven čistě.\n"
+
+#: controldata.c:165
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Cílový cluster nebyl zastaven čistě.\n"
+
+#: controldata.c:176
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Zdrojový cluster postrádá některé nutné informace o stavu:\n"
+
+#: controldata.c:178
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Cílový cluster postrádá některé nutné informace o stavu:\n"
+
+#: controldata.c:208 dump.c:49 pg_upgrade.c:339 pg_upgrade.c:375
+#: relfilenode.c:243 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:215
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal problem\n"
+
+#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257
+#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309
+#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345
+#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382
+#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426
+#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470
+#: controldata.c:481
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: controldata retrieval problem\n"
+
+#: controldata.c:546
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Zdrojový cluster postrádá některé nutné control informace:\n"
+
+#: controldata.c:549
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Cílový cluster postrádá některé nutné control informace:\n"
+
+#: controldata.c:552
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " další XID checkpointu\n"
+
+#: controldata.c:555
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " další OID posledního checkpointu\n"
+
+#: controldata.c:558
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " další MultiXactId posledního checkpointu\n"
+
+#: controldata.c:562
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " nejstarší MultiXactId posledního checkpointu\n"
+
+#: controldata.c:565
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " MultiXactOffset posledního checkpointu\n"
+
+#: controldata.c:568
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " první WAL segment po resets\n"
+
+#: controldata.c:571
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " metoda předávání float8 argumentů\n"
+
+#: controldata.c:574
+#, c-format
+msgid " maximum alignment\n"
+msgstr " maximální alignment\n"
+
+#: controldata.c:577
+#, c-format
+msgid " block size\n"
+msgstr " velikost bloku\n"
+
+#: controldata.c:580
+#, c-format
+msgid " large relation segment size\n"
+msgstr " velikost segmentu velkých relací\n"
+
+#: controldata.c:583
+#, c-format
+msgid " WAL block size\n"
+msgstr " velikost WAL bloku\n"
+
+#: controldata.c:586
+#, c-format
+msgid " WAL segment size\n"
+msgstr " velikost WAL segmentu\n"
+
+#: controldata.c:589
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " maximální délka identifikátoru\n"
+
+#: controldata.c:592
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " maximální počet indexovaných sloupců\n"
+
+#: controldata.c:595
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " maximální velikost TOAST chunku\n"
+
+#: controldata.c:599
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " velikost large-object chunku\n"
+
+#: controldata.c:602
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " datum/čas jsou integery?\n"
+
+#: controldata.c:606
+#, c-format
+msgid " data checksum version\n"
+msgstr " verze datových kontrolních součtů\n"
+
+#: controldata.c:608
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Nelze pokračovat bez kontrolních informací, končím\n"
+
+#: controldata.c:623
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"stará a nová hodnota pg_controldata alignmentu jsou neplatné nebo se neshodují\n"
+"Pravděpodobně jeden z clusterů je 32-bitový a druhý je 64-bitový\n"
+
+#: controldata.c:627
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikosti bloku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:630
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální velikosti segmentu relace jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:633
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikost WAL bloku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:636
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikost WAL segmentu jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:639
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální délky identifikátoru jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:642
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximálního počtu indexovaných sloupců jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:645
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální velikosti TOAST chunku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:650
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikosti large-object chunku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:653
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "stará a nová hodnota pg_controldata typu pro datum/čas jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:666
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "starý cluster nepoužívá data chechsums ale nový ano\n"
+
+#: controldata.c:669
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "starý cluster používá data chechsums ale nový nikoliv\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "verze kontrolních součtů na starém a novém clusteru se neshodují\n"
+
+#: controldata.c:682
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Přidávám \".old\" příponu ke starému global/pg_control souboru"
+
+#: controldata.c:687
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Nelze přejmenovat %s na %s.\n"
+
+#: controldata.c:690
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Pokud budete chtít nastartovat starý cluster, budete muset odstranit\n"
+"příponu \".old\" z %s/global/pg_control.old.\n"
+"Protože byl použit \"link\" mód, starý cluster nemůže být bezpečně\n"
+"spuštěn jakmile bude nastartován nový cluster.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Vytvářím dump globálních objektů"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Vytvářím dump databázových schémat\n"
+
+#: exec.c:44
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "nelze získat verzi pg_ctl pomocí %s: %s\n"
+
+#: exec.c:50
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "nelze získat výstup s pg_ctl verzí z %s\n"
+
+#: exec.c:104 exec.c:108
+#, c-format
+msgid "command too long\n"
+msgstr "příkaz je příliš dlouhý\n"
+
+#: exec.c:110 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:149 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "nelze otevřít logovací soubor \"%s\": %m\n"
+
+#: exec.c:178
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*failure*"
+
+#: exec.c:181
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Došlo k problémům při spuštění \"%s\"\n"
+
+#: exec.c:184
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Pro pravděpodobnou příčinu selhání prozkoumejte posledních pár\n"
+"řádek z \"%s\" nebo \"%s\".\n"
+
+#: exec.c:189
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Pro pravděpodobnou příčinu selhání prozkoumejte posledních pár\n"
+"řádek z \"%s\".\n"
+
+#: exec.c:204 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "nelze zapsat do log souboru \"%s\": %m\n"
+
+#: exec.c:230
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "nelze otevřít soubor \"%s\" pro čtení: %s\n"
+
+#: exec.c:257
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Musíte mít práva na čtení a zápis v aktuálním adresáři.\n"
+
+#: exec.c:310 exec.c:372 exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "kontrola pro \"%s\" selhala: %s\n"
+
+#: exec.c:313 exec.c:375
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" není adresář\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "check for \"%s\" failed: not a regular file\n"
+
+#: exec.c:451
+#, c-format
+msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+msgstr "kontrola \"%s\" selhala: nelze číst soubor (přístup odepřen)\n"
+
+#: exec.c:459
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "kontrola \"%s\" selhala: nelze spustit soubor (přístup odepřen)\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při klonování relace \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "chyba při klonování relace \"%s.%s\": nelze otevřít soubor \"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "chyba při klonování relace \"%s.%s\": nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze otevřít soubor \"%s\": %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze číst ze souboru \"%s\": %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze zapsat do souboru \"%s\": %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při vytváření odkazů pro relaci \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze získat informace o souboru \"%s\": %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "chyba při kopírování relace \"%s.%s\": částečně zapsaná stránka nalezena v souboru \"%s\"\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "nelze klonovat soubory mezi starým a novým datovým adresářem: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "klonování souborů na této platformě není podporováno\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"nelze vytvořit hard link mezi starým a novým datovým adresářem: %s\n"
+"V link módu musí být starý a nový datový adresář na stejném souborovém systému.\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"Starý cluster má \"plpython_call_handler\" funkci definovanou\n"
+"v \"public\" schématu což je duplicitní s tou definovanou v \"pg_catalog\"\n"
+"schématu. Ověřit to můžete spuštěním tohoto v psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"Veze z \"public\" schématu byla vytvořena instalací plpython před 8.1,\n"
+"a musí být odstraněna aby pg_upgrade mohlo fungovat protože\n"
+"odkazuje na nyní zastaralý \"plpython\" sdílený objekt. Verzi z \"public\"\n"
+"schématu můžete odstranit spuštěním následujícího příkazu:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"v každé postižené databázi:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Pro pokračování ze starého clusteru odstraňte problematické funkce.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Kontroluji dostupnost potřebných knihoven"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "nelze načíst knihovnu \"%s\": %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "Databáze: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace odkazuje na knihovny které chybí v nové instalaci. Můtete\n"
+"je buď přidat do nové instalace, nebo odstranit funkce které je vyžadují ze\n"
+"staré instalace. Seznam problematických knihoven je v souboru:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Názvy relace pro OID %u v databázi \"%s\" neodpovídají: staré jméno \"%s.%s\", nové jméno \"%s.%s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Chyba při párování starých a nových tabulek v databázi \"%s\"\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " což je index na \"%s.%s\""
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " což je index na OID %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " což je TOAST tabulka pro \"%s.%s\""
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " což je TOAST tabulka pro OID %u"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "Ve starém clusteru nebyl nalezen odpovídající záznam pro novou relaci s OID %u v databázi \"%s\": %s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "V novém clusteru nebyl nalezen odpovídající záznam pro relaci s OID %u v databázi \"%s\": %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "mapování pro databázi \"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u na %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"zdrojové databáze:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"cílové databáze:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "Databáze: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: nelze spouštět jako root\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "neplatné staré číslo portu\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "neplatné nové číslo portu\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Běží v módu s detailním (verbose) logováním.\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "binárky starého clusteru jsou umístěny"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "binárky nového clusteru jsou umístěny"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "data starého clusteru jsou umístěna"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "data nového clusteru jsou umístěna"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "sockety budou vytvořeny"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "nelze určit aktuální adresář\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "na Windows nelze spouštět pg_upgrade z datového adresáře nového clusteru\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade upgraduje PostgreSQL cluster na jinou major verzi.\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [VOLBA]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "Přepínače:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR adresář se spustitelnými soubory starého clusteru\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR adresář se spustitelnými soubory nového clusteru\n"
+" (výchozí hodnota je stejný adresář jako pg_upgrade)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check pouze kontroluje clustery, nemění žádná data\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR datový adresář starého clusteru\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR datový adresář nového clusteru\n"
+
+#: option.c:298
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM počet paralelních procesů nebo threadů\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link vytváří odkazy namísto kopírování souborů do nového clusteru\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=VOLBY volby pro starý cluster které se mají předat serveru\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=VOLBY volby pro nový cluster které se mají předat serveru\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT číslo portu pro starý cluster (implicitně %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT číslo portu pro nový cluster (implicitně %d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain v případě úspěchu zachovat SQL a log soubory\n"
+
+#: option.c:305
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR adresář pro sockety (implicitně současný adresář)\n"
+"\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=JMÉNO superuživatel pro cluster (implicitně \"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose zapné podrobné interní logování\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version zobrazí informaci o verzi, poté skončí\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone klonuje namísto kopírování souborů do nového clusteru\n"
+"\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help zobrazí tuto nápovědu, poté skončí\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Před spuštěním pg_upgrade musíte:\n"
+" vytvořit nový databázový cluster (pomocí nové verze initdb)\n"
+" zastavit postmaster proces běžící nad starým clusterem\n"
+" zastavit postmaster proces běžízí nad novým clusterem\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Při spuštění pg_upgrade musíte zadat následující informace:\n"
+" datový adresář pro starý cluster (-d DATADIR)\n"
+" datový adresář pro nový cluster (-D DATADIR)\n"
+" \"bin\" adresář pro starou verzi (-b BINDIR)\n"
+" \"bin\" adresář pro novou verzi (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Například:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"nebo\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Musíte zadat adresář kde %s.\n"
+"Použijte prosím volbu %s na příkazové řádce nebo proměnnou prostředí %s.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Vyhledávám skutečný datový adresář pro zdrojový cluster"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Vyhledávám skutečný datový adresář pro cílový cluster"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "nelze získat datový adresář pomocí %s: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "nelze načíst řádek %d ze souboru \"%s\": %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "uživatelem-zadané číslo starého portu %hu opraveno na %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "nelze vytvořit worker proces: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "nelze vytvořit worker thread: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "waitpid() failed: %s\n"
+msgstr "volání waitpid() selhalo: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "podřízený proces abnormálně skončil: status %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "podřízený proces neočekávaně skončil: %s\n"
+
+#: pg_upgrade.c:108
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "nelze zjistit přístupová práva adresáře \"%s\": %s\n"
+
+#: pg_upgrade.c:123
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Provádím Upgrade\n"
+"----------------\n"
+
+#: pg_upgrade.c:166
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Nastavuji další OID pro nový cluster"
+
+#: pg_upgrade.c:173
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronizuji datový adresář na disk"
+
+#: pg_upgrade.c:185
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Upgrade Dokončen\n"
+"----------------\n"
+
+#: pg_upgrade.c:220
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nelze najít vlastní spustitelný soubor\n"
+
+#: pg_upgrade.c:246
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Zdá se že postmaster nad starým clusterem stále běží.\n"
+"Prosím zastavte příslušný postmaster proces a zkuste to znovu.\n"
+
+#: pg_upgrade.c:259
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Zdá se že postmaster nad novým clusterem stále běží.\n"
+"Prosím zastavte příslušný postmaster proces a zkuste to znovu.\n"
+
+#: pg_upgrade.c:273
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyzuji všechny řádky v novém clusteru"
+
+#: pg_upgrade.c:286
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Provádím freeze na všech řádcích v novém clusteru"
+
+#: pg_upgrade.c:306
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Obnovuji globální objekty v novém clusteru"
+
+#: pg_upgrade.c:321
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Obnovuji databázová schémata v novém clusteru\n"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Mažu soubory z nového %s"
+
+#: pg_upgrade.c:429
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "nelze smazat adresář \"%s\"\n"
+
+#: pg_upgrade.c:448
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopíruji starý %s do nového serveru"
+
+#: pg_upgrade.c:475
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Nastavuij následující transaction ID a epochu pro nový cluster"
+
+#: pg_upgrade.c:505
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Nastavuji následující multixact ID a offset pro nový cluster"
+
+#: pg_upgrade.c:529
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Nastavuji nejstarší multixact ID v novém clusteru"
+
+#: pg_upgrade.c:549
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Resetuji WAL archivy"
+
+#: pg_upgrade.c:592
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Nastavuji frozenxid a minmxid v novém clusteru"
+
+#: pg_upgrade.c:594
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Nastavuji minmxid v novém clustreru"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "Klonuji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Kopíruji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Linkuji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "stará databáze \"%s\" nenalezena v novém clusteru\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při kontrole existence souboru \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "přepisuji \"%s\" na \"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "klonuji \"%s\" do \"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "kopíruji \"%s\" do \"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "linkuji \"%s\" na \"%s\"\n"
+
+#: server.c:33
+#, c-format
+msgid "connection to database failed: %s"
+msgstr "spojení do databáze selhalo: %s"
+
+#: server.c:39 server.c:141 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Chyba, končím\n"
+
+#: server.c:131
+#, c-format
+msgid "executing: %s\n"
+msgstr "spouštím: %s\n"
+
+#: server.c:137
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL příkaz selhal\n"
+"%s\n"
+"%s"
+
+#: server.c:167
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "nelze otevřít soubor s verzí: \"%s\": %m\n"
+
+#: server.c:171
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "neplatný formát řetězce s verzí \"%s\"\n"
+
+#: server.c:297
+#, c-format
+msgid ""
+"\n"
+"connection to database failed: %s"
+msgstr ""
+"\n"
+"spojení na databázi selhalo: %s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"nelze se připojit ke zdrojovému postmaster procesu příkazem:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"nelze se připojit k cílovému postmaster procesu příkazem:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl selhal při pokusu nastartovat zdrojový server, nebo selhal pokus o spojení\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl selhal při pokusu nastartovat cílový server, nebo selhal pokus o spojení\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq proměnná prostředí %s má hodnotu odkazující na nelokální server: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Při použití tablespaces nelze provádět upgrade na/ze stejné verze\n"
+"systémových katalogů.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "adresář pro tablespace \"%s\" neexistuje\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "nelze přistoupit k tablespace adresáři \"%s\": %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "cesta k tabespace \"%s\" není adresář\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "Kontrola velkých objektů"
+
+#: version.c:77 version.c:384
+#, c-format
+msgid "warning"
+msgstr "varování"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje velké objekty. Nová databáze má další tabulku\n"
+"s právy k velkým objektům. Po upgrade vám bude poskytnut příkaz pro\n"
+"naplnění tabulky pg_largeobject_metadata s výchozími právy.\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje velké objekty. Nová databáze má další tabulku\n"
+"s právy k velkým objektům, takže pro všechny velké objekty musí být\n"
+"definována výchozí práva. Soubor\n"
+" %s\n"
+"po spuštění z psql pod superuživatelským účtem tato výchozí práva nastaví.\n"
+"\n"
+
+#: version.c:239
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Kontrola nekompatibilního \"line\" datového typu"
+
+#: version.c:246
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables. This\n"
+"data type changed its internal and input/output format between your old\n"
+"and new clusters so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje datový typ \"line\" v uživatelských tabulkách. Tento\n"
+"datový typ změnil interní a vstupní/výstupní formát mezi vaším starým a novým\n"
+"clusterem takže tento cluster nemůže být aktuálně upgradován. Můžete odstranit\n"
+"problematické tabulky a znovu spustit upgrade. Seznam problematických sloupců\n"
+"je v souboru:\n"
+" %s\n"
+"\n"
+
+#: version.c:276
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Kontrola pro neplatné \"unknown\" uživatelské sloupce"
+
+#: version.c:283
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables. This\n"
+"data type is no longer allowed in tables, so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"unknown\" datový typ v uživatelských tabulkách. Tento\n"
+"datový typ není v uživatelských tabulkách nadále povolen, takže tento cluster nelze\n"
+"aktuálně upgradovat. Můžete problematické tabulky odstranit a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: version.c:306
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Kontrola hash indexů"
+
+#: version.c:386
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje hash indexy. Tyto indexy mají rozdílný interní\n"
+"formát mezi vaším starým a novým clusterem, takže musí být reindexovány\n"
+"příkazem REINDEX. Po skončení upgrade vám budou poskytnuty instrukce\n"
+"jak REINDEX provést.\n"
+"\n"
+
+#: version.c:392
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje hash indexy. Tyto indexy mají rozdílný interní\n"
+"formát mezi vaším starým a novým clusterem, takže musí být reindexovány\n"
+"příkazem REINDEX. Soubor\n"
+" %s\n"
+"po spuštění z psql pod superuživatelským účtem znovu vytvoří všechny\n"
+"neplatné indexy; dokud k tomu nedojde tyto indexy nebudou používány.\n"
+"\n"
+
+#: version.c:418
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Kontrola pro neplatné \"sql_identifier\" uživatelské sloupce"
+
+#: version.c:426
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables\n"
+"and/or indexes. The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can remove the problem tables or\n"
+"change the data type to \"name\" and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"sql_identifier\" datový typ v uživatelských tabulkách\n"
+"a/nebo indexech. Formát uložení na disku pro tento datový typ se změnil, takže\n"
+"tento cluster nelze aktuálně upgradovat. Můžete problematické tabulky\n"
+"odstranit nebo datový typ změnit na \"name\" a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "nelze naparsovat PG_VERSION soubor z %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Statistiky optimalizéru a informace o volném místě nejsou zachovány\n"
+#~ "při pg_upgrade, takže po nastartování nového serveru zvažte spuštění:\n"
+#~ " %s\n"
+#~ "\n"
diff --git a/src/bin/pg_upgrade/po/de.po b/src/bin/pg_upgrade/po/de.po
new file mode 100644
index 0000000..c67043c
--- /dev/null
+++ b/src/bin/pg_upgrade/po/de.po
@@ -0,0 +1,1927 @@
+# German message translation file for pg_upgrade
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-19 09:02+0000\n"
+"PO-Revision-Date: 2022-05-23 19:25+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: check.c:71
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Führe Konsistenzprüfungen am alten laufenden Server durch\n"
+"---------------------------------------------------------\n"
+
+#: check.c:77
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Führe Konsistenzprüfungen durch\n"
+"-------------------------------\n"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Cluster sind kompatibel*\n"
+
+#: check.c:227
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Wenn pg_upgrade ab diesem Punkt fehlschlägt, dann müssen Sie den\n"
+"neuen Cluster neu mit initdb initialisieren, bevor fortgesetzt\n"
+"werden kann.\n"
+
+#: check.c:272
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Optimizer-Statistiken werden von pg_upgrade nicht übertragen. Wenn Sie\n"
+"den neuen Server starten, sollte Sie diesen Befehl ausführen:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:278
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Mit diesem Skript können die Dateien des alten Clusters gelöscht werden:\n"
+" %s\n"
+
+#: check.c:283
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Ein Skript zum Löschen der Dateien des alten Clusters konnte nicht\n"
+"erzeugt werden, weil benutzerdefinierte Tablespaces oder das\n"
+"Datenverzeichnis des neuen Clusters im alten Cluster-Verzeichnis\n"
+"liegen. Der Inhalt des alten Clusters muss von Hand gelöscht werden.\n"
+
+#: check.c:295
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Prüfe Cluster-Versionen"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Dieses Programm kann nur Upgrades von PostgreSQL Version 8.4 oder später durchführen.\n"
+
+#: check.c:311
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Dieses Programm kann nur Upgrades auf PostgreSQL Version %s durchführen.\n"
+
+#: check.c:320
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Dieses Programm kann keine Downgrades auf ältere Hauptversionen von PostgreSQL durchführen.\n"
+
+#: check.c:325
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Die Daten- und Programmverzeichnisse des alten Clusters stammen von verschiedenen Hauptversionen.\n"
+
+#: check.c:328
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Die Daten- und Programmverzeichnisse des neuen Clusters stammen von verschiedenen Hauptversionen.\n"
+
+#: check.c:345
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "Wenn ein laufender alter Server vor Version 9.1 geprüft wird, muss die Portnummer des alten Servers angegeben werden.\n"
+
+#: check.c:349
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Wenn ein laufender Server geprüft wird, müssen die alte und die neue Portnummer verschieden sein.\n"
+
+#: check.c:364
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "Kodierungen für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n"
+
+#: check.c:369
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_collate-Werte für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n"
+
+#: check.c:372
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_ctype-Werte für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n"
+
+#: check.c:445
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Datenbank »%s« im neuen Cluster ist nicht leer: Relation »%s.%s« gefunden\n"
+
+#: check.c:502
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Prüfe Tablespace-Verzeichnisse des neuen Clusters"
+
+#: check.c:513
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "Tablespace-Verzeichnis für neuen Cluster existiert bereits: »%s«\n"
+
+#: check.c:546
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"WARNUNG: das neue Datenverzeichnis sollte nicht im alten Datenverzeichnis liegen, z.B. %s\n"
+
+#: check.c:570
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"WARNUNG: benutzerdefinierte Tablespace-Pfade sollten nicht im Datenverzeichnis liegen, z.B. %s\n"
+
+#: check.c:580
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Erzeuge Skript zum Löschen des alten Clusters"
+
+#: check.c:583 check.c:847 check.c:945 check.c:1075 check.c:1153 check.c:1415
+#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:204
+#: version.c:376 version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "konnte Datei »%s« nicht öffnen: %s\n"
+
+#: check.c:639
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "konnte Datei »%s« nicht ausführbar machen: %s\n"
+
+#: check.c:659
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Prüfe ob der Datenbankbenutzer der Installationsbenutzer ist"
+
+#: check.c:675
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "Datenbankbenutzer »%s« ist nicht der Installationsbenutzer\n"
+
+#: check.c:686
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "konnte die Anzahl der Benutzer nicht ermitteln\n"
+
+#: check.c:694
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Nur der Installationsbenutzer darf im neuen Cluster definiert sein.\n"
+
+#: check.c:714
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Prüfe Verbindungseinstellungen der Datenbank"
+
+#: check.c:736
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 darf keine Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss falsch sein\n"
+
+#: check.c:746
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "Alle Datenbanken außer template0 müssen Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss wahr sein\n"
+
+#: check.c:771
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Prüfe auf vorbereitete Transaktionen"
+
+#: check.c:780
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Der alte Cluster enthält vorbereitete Transaktionen\n"
+
+#: check.c:782
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Der neue Cluster enthält vorbereitete Transaktionen\n"
+
+#: check.c:808
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Prüfe auf contrib/isn mit unpassender bigint-Übergabe"
+
+#: check.c:869 check.c:970 check.c:1095 check.c:1175 check.c:1232 check.c:1291
+#: check.c:1320 check.c:1438 function.c:262 version.c:278 version.c:316
+#: version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "fatal\n"
+
+#: check.c:870
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält Funktionen aus »contrib/isn«, welche den\n"
+"Datentyp bigint verwenden. Der alte und der neue Cluster übergeben\n"
+"bigint auf andere Weise und daher kann dieser Cluster gegenwärtig\n"
+"nicht aktualisiert werden. Sie können Datenbanken im alten Cluster,\n"
+"die »contrib/isn« verwenden, manuell dumpen, löschen, dann das\n"
+"Upgrade durchführen und sie dann wiederherstellen. Eine Liste\n"
+"der problematischen Funktionen ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:893
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Prüfe auf benutzerdefinierte Postfix-Operatoren"
+
+#: check.c:971
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte Postfixoperatoren, was\n"
+"nicht mehr unterstützt wird. Entfernen Sie die Postfixoperatoren und\n"
+"ersetzten Sie sie durch Präfixoperatoren oder Funktionsaufrufe. Eine\n"
+"Liste der benutzerdefinierten Postfixoperatoren ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:995
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Prüfe auf inkompatible polymorphische Funktionen"
+
+#: check.c:1096
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte Objekte, die auf interne\n"
+"polymorphische Funktionen mit Argumenten vom Typ »anyarray« und\n"
+"»anyelement« verweisen. Diese benutzerdefinierten Objekte müsen vor\n"
+"dem Upgrade gelöscht werden und danach wiederhergestellt werden,\n"
+"nachdem sie so geändert wurden, dass sie auf die entsprechenden\n"
+"Funktionen mit Argumenten vom Typ »anycompatiblearray« und\n"
+"»anycompatible« verweisen.\n"
+"Eine Liste der problematischen Objekte ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1121
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Prüfe auf Tabellen mit WITH OIDS"
+
+#: check.c:1176
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält Tabellen, die mit WITH OIDS deklariert sind,\n"
+"was nicht mehr unterstützt wird. Entfernen Sie die oid-Spalte mit\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Eine Liste der Tabellen mit dem Problem ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1204
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Prüfe auf systemdefinierte zusammengesetzte Typen in Benutzertabellen"
+
+#: check.c:1233
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält systemdefinierte zusammengesetzte Typen in\n"
+"Benutzertabellen. Die OIDs dieser Typen sind nicht über\n"
+"PostgreSQL-Versionen stabil und daher kann dieser Cluster gegenwärtig\n"
+"nicht aktualisiert werden. Sie können die Problemspalten löschen\n"
+"und das Upgrade neu starten. Eine Liste der Problemspalten ist in der\n"
+"Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1261
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Prüfe auf reg*-Datentypen in Benutzertabellen"
+
+#: check.c:1292
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält einen der reg*-Datentypen in\n"
+"Benutzertabellen. Diese Datentypen verweisen auf System-OIDs, die von\n"
+"pg_upgrade nicht erhalten werden. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualiert werden. Sie können die Problemspalten\n"
+"löschen und das Upgrade neu starten. Eine Liste der Problemspalten\n"
+"ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1314
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Prüfe auf inkompatiblen Datentyp »jsonb«"
+
+#: check.c:1321
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält den Datentyp »jsonb« in\n"
+"Benutzertabellen. Das interne Format von »jsonb« wurde während 9.4\n"
+"Beta geändert. Daher kann dieser Cluster gegenwärtig nicht\n"
+"aktualisiert werden. Sie können die Problemspalten löschen und das\n"
+"Upgrade neu starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1343
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Prüfe auf Rollen, die mit »pg_« anfangen"
+
+#: check.c:1353
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Der alte Cluster enthält Rollen, die mit »pg_« anfangen\n"
+
+#: check.c:1355
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Der neue Cluster enthält Rollen, die mit »pg_« anfangen\n"
+
+#: check.c:1376
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Prüfe auf benutzerdefinierte Kodierungsumwandlungen"
+
+#: check.c:1439
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte\n"
+"Kodierungsumwandlungen. Die Parameter von Umwandlungsfunktionen wurden\n"
+"in PostgreSQL Version 14 geändert. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualisiert werden. Sie können die\n"
+"Kodierungsumwandlungen im alten Cluster entfernen und das Upgrade neu\n"
+"starten. Eine Liste der benutzerdefinierten Kodierungsumwandlungen ist\n"
+"in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1466
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "konnte aktuelle Locale nicht ermitteln\n"
+
+#: check.c:1475
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "konnte System-Locale-Namen für »%s« nicht ermitteln\n"
+
+#: check.c:1481
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "konnte alte Locale »%s« nicht wiederherstellen\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "konnte Kontrolldaten mit %s nicht ermitteln: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: Problem mit dem Zustand des Clusters\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Der alte Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um ihn zu aktualisieren, verwenden Sie »rsync« wie in der Dokumentation beschrieben oder fahren Sie ihn im Primärmodus herunter.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Der neue Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um ihn zu aktualisieren, verwenden Sie »rsync« wie in der Dokumentation beschrieben oder fahren Sie ihn im Primärmodus herunter.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Der alte Cluster wurde nicht sauber heruntergefahren.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Der neue Cluster wurde nicht sauber heruntergefahren.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Im alten Cluster fehlen Cluster-Zustandsinformationen:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Im neuen Cluster fehlen Cluster-Zustandsinformationen:\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: Problem mit pg_resetwal\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: Problem beim Ermitteln der Kontrolldaten\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Im alten Cluster fehlen einige notwendige Kontrollinformationen:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Im neuen Cluster fehlen einige notwendige Kontrollinformationen:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " Checkpoint nächste XID\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " NextOID des letzten Checkpoints\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " NextMultiXactId des letzten Checkpoints\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " oldestMultiXid des letzten Checkpoints\n"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " oldestXID des letzten Checkpoints\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " NextMultiOffset des letzten Checkpoints\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " erstes WAL-Segment nach dem Reset\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " Übergabe von Float8-Argumenten\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " maximale Ausrichtung (Alignment)\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " Blockgröße\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " Segmentgröße für große Relationen\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL-Blockgröße\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL-Segmentgröße\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " maximale Bezeichnerlänge\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " maximale Anzahl indizierter Spalten\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " maximale TOAST-Chunk-Größe\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " Large-Object-Chunk-Größe\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " Datum/Zeit sind Ganzzahlen?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " Datenprüfsummenversion\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Kann ohne die benötigten Kontrollinformationen nicht fortsetzen, Programm wird beendet\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"altes und neues Alignment in pg_controldata ist ungültig oder stimmt nicht überein\n"
+"Wahrscheinlich ist ein Cluster eine 32-Bit-Installation und der andere 64-Bit\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "alte und neue Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "alte und neue maximale Relationssegmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "alte und neue WAL-Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "alte und neue WAL-Segmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "alte und neue maximale Bezeichnerlängen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "alte und neue Maximalzahlen indizierter Spalten von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "alte und neue maximale TOAST-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "alte und neue Large-Object-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "alte und neue Speicherung von Datums- und Zeittypen von pg_controldata ist ungültig oder stimmt nicht überein\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "der alte Cluster verwendet keine Datenprüfsummen, aber der neue verwendet sie\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "die alte Cluster verwendet Datenprüfsummen, aber der neue nicht\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "Prüfsummenversionen im alten und neuen Cluster stimmen nicht überein\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Füge Endung ».old« an altes global/pg_control an"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Konnte %s nicht in %s umbenennen.\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn Sie den alten Cluster starten wollen, müssen Sie die Endung\n"
+"».old« von %s/global/pg_control.old entfernen. Da der »link«-Modus\n"
+"verwendet wurde, kann der alte Cluster nicht gefahrlos gestartet\n"
+"werden, nachdem der neue Cluster gestartet worden ist.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Erzeuge Dump der globalen Objekte"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Erzeuge Dump der Datenbankschemas\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "konnte pg_ctl-Versionsdaten mit %s nicht ermitteln: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "konnte pg_ctl-Version nicht ermitteln von %s\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "Befehl zu lang\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "konnte Logdatei »%s« nicht öffnen: %m\n"
+
+#: exec.c:179
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*fehlgeschlagen*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Probleme beim Ausführen von »%s«\n"
+
+#: exec.c:185
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Prüfen Sie die letzten Zeilen von »%s« oder »%s« für den\n"
+"wahrscheinlichen Grund für das Scheitern.\n"
+
+#: exec.c:190
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Prüfen Sie die letzten Zeilen von »%s« für den\n"
+"wahrscheinlichen Grund für das Scheitern.\n"
+
+#: exec.c:205 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "konnte nicht in Logdatei »%s «schreiben: %m\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Sie müssen Lese- und Schreibzugriff im aktuellen Verzeichnis haben.\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "Prüfen von »%s« fehlgeschlagen: %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "»%s« ist kein Verzeichnis\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "Prüfen von »%s« fehlgeschlagen: keine reguläre Datei\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "Prüfen von »%s« fehlgeschlagen: kann nicht ausgeführt werden (keine Berechtigung)\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "Prüfen von »%s« fehlgeschlagen: kann nicht ausgeführt werden\n"
+
+#: exec.c:449
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "Prüfen von »%s« fehlgeschlagen: falsche Version: gefunden »%s«, erwartet »%s«\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "Fehler beim Klonen von Relation »%s.%s« (»%s« nach »%s«): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht lesen: %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht schreiben: %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s« (»%s« nach »%s«): %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "Fehler beim Erzeugen einer Verknüpfung für Relation »%s.%s« (»%s« nach »%s«): %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte »stat« für Datei »%s« nicht ausführen: %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: unvollständige Seite gefunden in Datei »%s«\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "konnte Datei nicht vom alten in das neue Datenverzeichnis klonen: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "konnte Datei »%s« nicht erstellen: %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "Klonen von Dateien wird auf dieser Plattform nicht unterstützt\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"konnte Hard-Link-Verknüpfung zwischen altem und neuen Datenverzeichnis nicht erzeugen: %s\n"
+"Im Link-Modus müssen das alte und das neue Datenverzeichnis im selben Dateisystem liegen.\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"Der alte Cluster hat eine Funktion »plpython_call_handler« definiert\n"
+"im Schema »public«, die eine Duplikat der im Schema »pg_catalog«\n"
+"definierten ist. Sie können das bestätigen, indem Sie dies in psql\n"
+"ausführen:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"Die Version im Schema »public« wurde von einer Installation von\n"
+"plpython vor Version 8.1 erzeugt und muss entfernt werden, damit\n"
+"pg_upgrade fortsetzen kann, weil sie auf die mittlerweile obsolete\n"
+"Shared-Object-Datei »plpython« verweist. Sie können die Version dieser\n"
+"Funktion im Schema »public« entfernen, indem Sie den Befehl\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in jeder betroffenen Datenbank ausführen:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Entfernen Sie die problematischen Funktionen aus dem alten Cluster um fortzufahren.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Prüfe das Vorhandensein benötigter Bibliotheken"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "konnte Bibliothek »%s« nicht laden: %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "In Datenbank: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation verweist auf ladbare Bibliotheken, die in der neuen\n"
+"Installation fehlen. Sie können diese Bibliotheken zur neuen\n"
+"Installation hinzufügen oder die Funktionen in der alten Installation\n"
+"entfernen. Eine Liste der problematischen Bibliotheken ist in der\n"
+"Datei:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Relationsnamen für OID %u in Datenbank »%s« stimmen nicht überein: alten Name »%s.%s«, neuer Name »%s.%s«\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Alte und neue Tabellen in Datenbank »%s« konnten nicht gepaart werden\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr ", ein Index für »%s.%s«"
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr ", ein Index für OID %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr ", eine TOAST-Tabelle für »%s.%s«"
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr ", eine TOAST-Tabelle für OID %u"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "Keine Übereinstimmung gefunden im alten Cluster für neue Relation mit OID %u in Datenbank »%s«: %s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "Keine Übereinstimmung gefunden im neuen Cluster für alte Relation mit OID %u in Datenbank »%s«: %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "Paarungen für Datenbank »%s«:\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u nach %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"Quelldatenbanken:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"Zieldatenbanken:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "Datenbank: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: kann nicht als root ausgeführt werden\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "ungültige alte Portnummer\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "ungültige neue Portnummer\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Ausführung im Verbose-Modus\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "die Programmdateien des alten Clusters liegen"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "die Programmdateien des neuen Clusters liegen"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "die Daten das alten Clusters liegen"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "die Daten des neuen Clusters liegen"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "die Sockets erzeugt werden sollen"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "konnte aktuelles Verzeichnis nicht ermitteln\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "auf Windows kann pg_upgrade nicht von innerhalb des Cluster-Datenverzeichnisses ausgeführt werden\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade aktualisiert einen PostgreSQL-Cluster auf eine neue Hauptversion.\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINVERZ Programmverzeichnis des alten Clusters\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINVERZ Programmverzeichnis des neuen Clusters\n"
+" (Standard: gleiches Verzeichnis wie pg_upgrade)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check nur Cluster prüfen, keine Daten ändern\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATENVERZ Datenverzeichnis des alten Clusters\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATENVERZ Datenverzeichnis des neuen Clusters\n"
+
+#: option.c:298
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM Anzahl paralleler Prozesse oder Threads\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link Dateien in den neuen Cluster verknüpfen statt kopieren\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONEN Serveroptionen für den alten Cluster\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONEN Serveroptionen für den neuen Cluster\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT Portnummer für den alten Cluster (Standard: %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT Portnummer für den neuen Cluster (Standard: %d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQL- und Logdateien bei Erfolg aufheben\n"
+
+#: option.c:305
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=VERZ Verzeichnis für Socket (Standard: aktuelles Verz.)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME Cluster-Superuser (Standard: »%s«)\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose »Verbose«-Modus einschalten\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone Dateien in den neuen Cluster klonen statt kopieren\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Vor dem Aufruf von pg_upgrade müssen Sie:\n"
+" den neuen Datenbankcluster anlegen (mit der neuen Version von initdb)\n"
+" den Postmaster für den alten Cluster anhalten\n"
+" den Postmaster für den neuen Cluster anhalten\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Beim Aufruf von pg_upgrade müssen die folgenden Informationen angegeben werden:\n"
+" das Datenverzeichnis des alten Clusters (-d DATENVERZ)\n"
+" das Datenverzeichnis des neuen Clusters (-D DATENVERZ)\n"
+" das »bin«-Verzeichnis der alten Version (-b BINVERZ)\n"
+" das »bin«-Verzeichnis der neuen Version (-B BINVERZ)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Zum Beispiel:\n"
+" pg_upgrade -d alterCluster/data -D neuerCluster/data -b alterCluster/bin -B neuerCluster/bin\n"
+"oder\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=alterCluster/data\n"
+" $ export PGDATANEW=neuerCluster/data\n"
+" $ export PGBINOLD=alterCluster/bin\n"
+" $ export PGBINNEW=neuerCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=alterCluster/data\n"
+" C:\\> set PGDATANEW=neuerCluster/data\n"
+" C:\\> set PGBINOLD=alterCluster/bin\n"
+" C:\\> set PGBINNEW=neuerCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Sie müssen das Verzeichnis angeben, wo %s.\n"
+"Bitte verwenden Sie die Kommandzeilenoption %s oder die Umgebungsvariable %s.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Suche das tatsächliche Datenverzeichnis des alten Clusters"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Suche das tatsächliche Datenverzeichnis des neuen Clusters"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "konnte Datenverzeichnis mit %s nicht ermitteln: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "konnte Zeile %d aus Datei »%s« nicht lesen: %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "vom Benutzer angegebene Portnummer %hu wurde auf %hu korrigiert\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "konnte Arbeitsprozess nicht erzeugen: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "konnte Arbeits-Thread nicht erzeugen: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() fehlgeschlagen: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "Kindprozess wurde abnormal beendet: Status %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "Kindprozess wurde abnormal beendet: %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Führe Upgrade durch\n"
+"-------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Setze nächste OID im neuen Cluster"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronisiere Datenverzeichnis auf Festplatte"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Upgrade abgeschlossen\n"
+"---------------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: konnte eigene Programmdatei nicht finden\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Es läuft scheinbar ein Postmaster für den alten Cluster.\n"
+"Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut.\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Es läuft scheinbar ein Postmaster für den neuen Cluster.\n"
+"Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut.\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analysiere alle Zeilen im neuen Cluster"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Friere alle Zeilen im neuen Cluster ein"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Stelle globale Objekte im neuen Cluster wieder her"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Stelle Datenbankschemas im neuen Cluster wieder her\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Lösche Dateien aus neuem %s"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "konnte Verzeichnis »%s« nicht löschen\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopiere altes %s zum neuen Server"
+
+#: pg_upgrade.c:470
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Setze älteste XID im neuen Cluster"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Setze nächste Transaktions-ID und -epoche im neuen Cluster"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Setze nächste Multixact-ID und nächstes Offset im neuen Cluster"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Setze älteste Multixact-ID im neuen Cluster"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Setze WAL-Archive zurück"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Setze frozenxid und minmxid im neuen Cluster"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Setze minmxid im neuen Cluster"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "Klone Benutzertabellendateien\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Kopiere Benutzertabellendateien\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Verknüpfe Benutzertabellendateien\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "alte Datenbank »%s« nicht im neuen Cluster gefunden\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "Fehler beim Prüfen auf Existenz der Datei für »%s.%s« (»%s« nach »%s«): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "konvertiere »%s« nach »%s«\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "klone »%s« nach »%s«\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "kopiere »%s« nach »%s«\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "verknüpfe »%s« nach »%s«\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Fehlgeschlagen, Programm wird beendet\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "führe aus: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL-Befehl fehlgeschlagen\n"
+"%s\n"
+"%s"
+
+#: server.c:168
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "konnte Versionsdatei »%s« nicht öffnen: %m\n"
+
+#: server.c:172
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "konnte Versionsdatei »%s« nicht interpretieren\n"
+
+#: server.c:298
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"konnte nicht mit dem Postmaster für den alten Cluster verbinden, gestartet mit dem Befehl:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"konnte nicht mit dem Postmaster für den neuen Cluster verbinden, gestartet mit dem Befehl:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl konnte den Quellserver nicht starten, oder Verbindung fehlgeschlagen\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl konnte den Zielserver nicht starten, oder Verbindung fehlgeschlagen\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq-Umgebungsvariable %s hat einen nicht lokalen Serverwert: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Kann nicht auf gleiche Systemkatalogversion aktualisieren, wenn\n"
+"Tablespaces verwendet werden.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "Tablespace-Verzeichnis »%s« existiert nicht\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "konnte »stat« für Tablespace-Verzeichnis »%s« nicht ausführen: %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "Tablespace-Pfad »%s« ist kein Verzeichnis\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "Prüfe auf Large Objects"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "Warnung"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Ihre Installation enthält Large Objects. Die neue Datenbank hat eine\n"
+"zusätzliche Tabelle mit den Zugriffsrechten für Large Objects. Nach\n"
+"dem Upgrade wird Ihnen ein Befehl gegeben werden, mit dem die Tabelle\n"
+"pg_largeobject_metadata mit den Standardrechten gefüllt wird.\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Ihre Installation enthält Large Objects. Die neue Datenbank hat eine\n"
+"zusätzliche Tabelle mit den Zugriffsrechten für Large Objects, sodass\n"
+"Standardrechte für alle Large Objects gesetzt werden müssen. Die Datei\n"
+" %s\n"
+"kann mit psql als Datenbank-Superuser ausgeführt werden, um die\n"
+"Standardrechte zu setzen.\n"
+"\n"
+
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Prüfe auf inkompatiblen Datentyp »line«"
+
+#: version.c:279
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält den Datentyp »line« in Benutzertabellen. Das\n"
+"interne Format und das Eingabe-/Ausgabeformat dieses Datentyps wurden\n"
+"zwischen Ihrem alten und neuen Cluster geändert und daher kann dieser\n"
+"Cluster gegenwärtig nicht aktualisiert werden. Sie können die\n"
+"Problemspalten löschen und das Upgrade neu starten. Eine Liste der\n"
+"Problemspalten ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »unknown«"
+
+#: version.c:317
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält den Datentyp »unknown« in\n"
+"Benutzertabellen. Dieser Datentyp ist nicht mehr in Tabellen erlaubt\n"
+"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n"
+"werden. Sie können die Problemspalten löschen und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Prüfe auf Hash-Indexe"
+
+#: version.c:421
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Ihre Installation enthält Hash-Indexe. Diese Indexe haben\n"
+"unterschiedliche interne Formate im alten und neuen Cluster und müssen\n"
+"daher mit dem Befehl REINDEX reindiziert werden. Nach dem Upgrade\n"
+"werden Sie Anweisungen zum REINDEX erhalten.\n"
+"\n"
+
+#: version.c:427
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Ihre Installation enthält Hash-Indexe. Diese Indexe haben\n"
+"unterschiedliche interne Formate im alten und neuen Cluster und müssen\n"
+"daher mit dem Befehl REINDEX reindiziert werden. Die Datei\n"
+" %s\n"
+"kann mit psql als Datenbank-Superuser ausgeführt werden, um alle\n"
+"ungültigen Indexe neu zu erzeugen. Bis dahin werden diese Indexe nicht\n"
+"verwendet werden.\n"
+"\n"
+
+#: version.c:453
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »sql_identifier«"
+
+#: version.c:461
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält den Datentyp »sql_identifier« in\n"
+"Benutzertabellen. Das Speicherformat dieses Datentyps wurde geändert\n"
+"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n"
+"werden. Sie können die Problemspalten löschen und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei: %s\n"
+"\n"
+
+#: version.c:485
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Prüfe auf Aktualisierungen von Erweiterungen"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "Hinweis"
+
+#: version.c:538
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"Ihre Installation enthält Erweiterungen, die mit dem Befehl ALTER\n"
+"EXTENSION aktualisiert werden sollten. Die Datei\n"
+" %s\n"
+"kann mit psql als Datenbank-Superuser ausgeführt werden, um die\n"
+"Erweiterungen zu aktualisieren.\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/es.po b/src/bin/pg_upgrade/po/es.po
new file mode 100644
index 0000000..777c599
--- /dev/null
+++ b/src/bin/pg_upgrade/po/es.po
@@ -0,0 +1,1934 @@
+# spanish message translation file for pg_upgrade
+#
+# Copyright (c) 2017-2021, PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+# Álvaro Herrera <alvherre@alvh.no-ip.org>, 2017.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-07 20:34+0000\n"
+"PO-Revision-Date: 2022-08-08 01:03+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: check.c:71
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Verificando Consistencia en Vivo en el Servidor Antiguo\n"
+"-------------------------------------------------------\n"
+
+#: check.c:77
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Verificando Consistencia\n"
+"------------------------\n"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Los clústers son compatibles*\n"
+
+#: check.c:227
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Si pg_upgrade falla a partir de este punto, deberá re-ejecutar initdb\n"
+"en el clúster nuevo antes de continuar.\n"
+
+#: check.c:272
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Las estadísticas para el optimizador no son transferidas por pg_upgrade.\n"
+"Una vez que inicie el servidor nuevo, considere ejecutar:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:278
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Ejecutando este script se borrarán los archivos de datos del servidor antiguo:\n"
+" %s\n"
+
+#: check.c:283
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"No se pudo crear un script para borrar los archivos de datos del servidor\n"
+"antiguo, porque el directorio del clúster antiguo contiene tablespaces\n"
+"o el directorio de datos del servidor nuevo. El contenido del servidor\n"
+"antiguo debe ser borrado manualmente.\n"
+
+#: check.c:295
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Verificando las versiones de los clústers"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Este programa sólo puede actualizar desde PostgreSQL versión 8.4 y posterior.\n"
+
+#: check.c:311
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Este programa sólo puede actualizar a PostgreSQL versión %s.\n"
+
+#: check.c:320
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Este programa no puede usarse para volver a versiones anteriores de PostgreSQL.\n"
+
+#: check.c:325
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr ""
+"El directorio de datos antiguo y el directorio de binarios antiguo son de\n"
+"versiones diferentes.\n"
+
+#: check.c:328
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr ""
+"El directorio de datos nuevo y el directorio de binarios nuevo son de\n"
+"versiones diferentes.\n"
+
+#: check.c:345
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "Al verificar un servidor antiguo anterior a 9.1, debe especificar el port de éste.\n"
+
+#: check.c:349
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Al verificar servidores en caliente, los números de port antiguo y nuevo deben ser diferentes.\n"
+
+#: check.c:364
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "las codificaciones de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n"
+
+#: check.c:369
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "valores lc_collate de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n"
+
+#: check.c:372
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "valores lc_ctype de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n"
+
+#: check.c:445
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "La base de datos «%s» del clúster nuevo no está vacía: se encontró la relación «%s.%s»\n"
+
+#: check.c:502
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Verificando los directorios de tablespaces para el nuevo clúster"
+
+#: check.c:513
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "directorio de tablespace para el nuevo clúster ya existe: «%s»\n"
+
+#: check.c:546
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"ADVERTENCIA: el directorio de datos nuevo no debería estar dentro del directorio antiguo,\n"
+"por ej. %s\n"
+
+#: check.c:570
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"ADVERTENCIA: las ubicaciones de tablespaces definidos por el usuario\n"
+"no deberían estar dentro del directorio de datos,\n"
+"por ej. %s\n"
+
+#: check.c:580
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Creando un script para borrar el clúster antiguo"
+
+#: check.c:583 check.c:847 check.c:945 check.c:1075 check.c:1153 check.c:1415
+#: file.c:338 function.c:240 option.c:497 version.c:54 version.c:204
+#: version.c:376 version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "no se pudo abrir el archivo «%s»: %s\n"
+
+#: check.c:639
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "no se pudo agregar permisos de ejecución al archivo «%s»: %s\n"
+
+#: check.c:659
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Verificando que el usuario de base de datos es el usuario de instalación"
+
+#: check.c:675
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "el usuario de base de datos «%s» no es el usuario de instalación\n"
+
+#: check.c:686
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "no se pudo determinar el número de usuarios\n"
+
+#: check.c:694
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Sólo el usuario de instalación puede estar definido en el nuevo clúster.\n"
+
+#: check.c:714
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Verificando los parámetros de conexión de bases de datos"
+
+#: check.c:736
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 no debe permitir conexiones, es decir su pg_database.datallowconn debe ser «false»\n"
+
+#: check.c:746
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "Todas las bases de datos no-template0 deben permitir conexiones, es decir su pg_database.datallowconn debe ser «true»\n"
+
+#: check.c:771
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Verificando transacciones preparadas"
+
+#: check.c:780
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "El clúster de origen contiene transacciones preparadas\n"
+
+#: check.c:782
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "El clúster de destino contiene transacciones preparadas\n"
+
+#: check.c:808
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Verificando contrib/isn con discordancia en mecanismo de paso de bigint"
+
+#: check.c:869 check.c:970 check.c:1095 check.c:1175 check.c:1232 check.c:1291
+#: check.c:1320 check.c:1438 function.c:262 version.c:278 version.c:316
+#: version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "fatal\n"
+
+#: check.c:870
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene funciones de «contrib/isn» que usan el tip de dato\n"
+"bigint. Sus clústers nuevo y antiguo pasar el tipo bigint de distinta forma,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede hacer un volcado (dump) de las bases de datos que usan «contrib/isn»,\n"
+"eliminarlas, hacer el upgrade, y luego restaurarlas.\n"
+"Un listado de funciones problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:893
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Verificando operadores postfix definidos por el usuario"
+
+#: check.c:971
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene operadores postfix definidos por el usuario, los\n"
+"cuales ya no están soportados. Considere eliminar los operadores postfix\n"
+"y reemplazarlos con operadores de prefijo o llamadas a funciones.\n"
+"Una lista de operadores postfix definidos por el usuario aparece en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:995
+#, c-format
+#| msgid "Checking for incompatible \"line\" data type"
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Verificando funciones polimórficas incompatibles"
+
+#: check.c:1096
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene objetos definidos por el usuario que hacen referencia\n"
+"a funciones polimórficas con argumentos de tipo «anyarray» o «anyelement».\n"
+"Estos objetos definidos por el usuario deben eliminarse antes de actualizar y\n"
+"se pueden restaurar después, cambiándolos para que hagan referencia a las nuevas\n"
+"funciones correspondientes con argumentos de tipo «anycompatiblearray» y\n"
+"«anycompatible». Una lista de los objetos problemáticos está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1121
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Verificando tablas WITH OIDS"
+
+#: check.c:1176
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene tablas declaradas WITH OIDS, que ya no está\n"
+"soportado. Considere eliminar la columna oid usando\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Una lista de tablas con este problema aparece en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1204
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Verificando tipos compuestos definidos por el sistema en tablas de usuario"
+
+#: check.c:1233
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene uno o varios tipos compuestos definidos por el sistema en\n"
+"tablas de usuario. Los OIDs de estos tipos no son estables entre diferentes\n"
+"versiones de PostgreSQL, por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1261
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Verificando tipos de datos reg* en datos de usuario"
+
+#: check.c:1292
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene uno de los tipos reg* en tablas de usuario. Estos tipos\n"
+"de dato hacen referencia a OIDs de sistema que no son preservados por pg_upgrade,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1314
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Verificando datos de usuario en tipo «jsonb» incompatible"
+
+#: check.c:1321
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene el tipo «jsonb» en tablas de usuario.\n"
+"El formato interno de «jsonb» cambió durante 9.4 beta,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1343
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Verificando roles que empiecen con «pg_»"
+
+#: check.c:1353
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "El clúster de origen contiene roles que empiezan con «pg_»\n"
+
+#: check.c:1355
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "El clúster de destino contiene roles que empiezan con «pg_»\n"
+
+#: check.c:1376
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Verificando conversiones de codificación definidas por el usuario"
+
+#: check.c:1439
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene conversiones de codificación definidas por el usuario.\n"
+"Los parámetros de la función de conversión cambiaron en PostgreSQL 14\n"
+"por lo que este clúster no puede ser actualizado. Puede eliminar\n"
+"las conversiones de codificación en el clúster antiguo y reiniciar la actualización.\n"
+"Un listado de las conversiones de codificación definidas por el usuario está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1466
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "no se pudo obtener el «locale» actual\n"
+
+#: check.c:1475
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "no se pudo obtener el nombre del «locale» para «%s»\n"
+
+#: check.c:1481
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "no se pudo restaurar el locale antiguo «%s»\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "no se pudo obtener datos de control usando %s: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: problema de estado del clúster\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "El clúster de origen fue apagado mientras estaba en modo de recuperación. Para actualizarlo, use «rsync» como está documentado, o apáguelo siendo primario.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "El clúster de destino fue apagado mientras estaba en modo de recuperación. Para actualizarlo, use «rsync» como está documentado, o apáguelo siendo primario.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "El clúster de origen no fue apagado limpiamente.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "El clúster de destino no fue apagado limpiamente.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Al clúster de origen le falta información de estado:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Al cluster de destino le falta información de estado:\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: problema en pg_resetwal\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: problema de extracción de controldata\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Al clúster de origen le falta información de control requerida:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Al clúster de destino le falta información de control requerida:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " siguiente XID del último checkpoint\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " siguiente OID del último checkpoint\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " siguiente MultiXactId del último checkpoint\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " MultiXactId más antiguo del último checkpoint\n"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " XID más antiguo del último checkpoint\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " siguiente MultiXactOffset del siguiente checkpoint\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " primer segmento de WAL después del reinicio\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " método de paso de argumentos float8\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " alineamiento máximo\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " tamaño de bloques\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " tamaño de segmento de relación grande\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " tamaño de bloque de WAL\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " tamaño de segmento de WAL\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " máximo largo de identificadores\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " máximo número de columnas indexadas\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " tamaño máximo de trozos TOAST\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " tamaño de trozos de objetos grandes\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " fechas/horas son enteros?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " versión del checksum de datos\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "No se puede continuar sin la información de control requerida. Terminando\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"Alineamientos de pg_controldata antiguo y nuevo no son válidos o no coinciden\n"
+"Seguramente un clúster es 32-bit y el otro es 64-bit\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "Los tamaños de bloque antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "El tamaño máximo de segmento de relación antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "El tamaño de bloques de WAL antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "El tamaño de segmentos de WAL antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "Los máximos largos de identificador antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "La cantidad máxima de columnas indexadas antigua y nueva no son válidos o no coinciden\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "Los máximos de trozos TOAST antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "Los tamaños de trozos de objetos grandes antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "Los tipos de almacenamiento de fecha/hora antiguo y nuevo no coinciden\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "El clúster antiguo no usa checksums de datos pero el nuevo sí\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "El clúster antiguo usa checksums de datos pero el nuevo no\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "Las versiones de checksum de datos antigua y nueva no coinciden\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Agregando el sufijo «.old» a global/pg_control"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "No se pudo renombrar %s a %s.\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Si desea iniciar el clúster antiguo, necesitará eliminar el sufijo\n"
+"«.old» de %s/global/pg_control.old.\n"
+"Puesto que se usó el modo «link», el clúster antiguo no puede usarse\n"
+"en forma segura después de que el clúster nuevo haya sido iniciado.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Creando el volcado de objetos globales"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Creando el volcado de esquemas de bases de datos\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "no se pudo obtener datos de versión de pg_ctl usando %s: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "no se pudo obtener la salida de versión de pg_ctl de %s\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "orden demasiado larga\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "no se pudo abrir el archivo de registro «%s»: %m\n"
+
+#: exec.c:179
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*falló*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Hubo problemas ejecutando «%s»\n"
+
+#: exec.c:185
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Consulte las últimas línea de «%s» o «%s» para\n"
+"saber la causa probable de la falla.\n"
+
+#: exec.c:190
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Consulte las últimas líneas de «%s» para saber\n"
+"la causa probable de la falla.\n"
+
+#: exec.c:205 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "no se pudo escribir al archivo de log «%s»\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "no se pudo abrir el archivo «%s» para lectura: %s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Debe tener privilegios de lectura y escritura en el directorio actual.\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "la comprobación de «%s» falló: %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "«%s» no es un directorio\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "La comprobación de «%s» falló: no es un archivo regular\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "La comprobación de «%s» falló: no se puede ejecutar (permiso denegado)\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "La comprobación de «%s» falló: no se puede ejecutar\n"
+
+#: exec.c:449
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "La comprobación de «%s» falló: versión incorrecta: se encontró «%s», se esperaba «%s»\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "error mientras se clonaba la relación «%s.%s» («%s» a «%s»): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo abrir el archivo «%s»: %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo escribir el archivo «%s»: %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s» («%s» a «%s»): %s\n"
+
+#: file.c:153
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "error mientras se creaba el link para la relación «%s.%s» («%s» a «%s»): %s\n"
+
+#: file.c:196
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo hacer stat a «%s»: %s\n"
+
+#: file.c:228
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: se encontró una página parcial en el archivo «%s»\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "no se pudo clonar el archivo entre los directorios viejo y nuevo: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "no se pudo crear el archivo «%s»: %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "el clonado de archivos no está soportado en esta plataforma\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"No se pudo crear un link duro entre los directorios de datos nuevo y antiguo: %s\n"
+"En modo link los directorios de dato nuevo y antiguo deben estar en el mismo sistema de archivos.\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"El clúster antiguo tiene la función «plpython_call_handler» definida\n"
+"en el esquema «public» que es un duplicado de la que está definida en\n"
+"el esquema «pg_catalog». Puede confirmar esto ejecutando lo siguiente\n"
+"en psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"La versión del esquema «public» de esta función fue creada por una\n"
+"instalación pre-8.1 de plpython, y debe eliminarse para que pg_upgrade\n"
+"pueda completar puesto que hace referencia a un archivo objeto compartido\n"
+"«plpython» ahora obsoleto.\n"
+"Puede eliminar la versión del esquema «public» de esta función ejecutando\n"
+"la siguiente orden:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"en cada base de datos afectada:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Elimine las funciones problemáticas del clúster antiguo para continuar.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Verificando la presencia de las bibliotecas requeridas"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "no se pudo cargar la biblioteca «%s»: %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "En la base de datos: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación hace referencia a bibliotecas que no están en la nueva\n"
+"instalación. Puede agregar estar bibliotecas la instalación nueva, o\n"
+"eliminar las funciones que las utilizan de la versión antigua. Un listado\n"
+"de las bibliotecas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Los nombres de relación para OID %u en la base de datos «%s» no coinciden: nombre antiguo «%s.%s», nombre nuevo «%s.%s»\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "No hubo coincidencia en las tablas nueva y antigua en la base de datos «%s»\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " que es un índice en «%s.%s»"
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " que es un índice en el OID %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " que es la tabla TOAST para «%s.%s»"
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " que es la tabla TOAST para el OID %u"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr ""
+"No se encontró equivalente en el clúster antiguo para la relación con OID %u\n"
+"en la base de datos «%s» en el clúster nuevo: %s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr ""
+"No se encontró equivalente en el clúster nuevo para la relación con OID %u\n"
+"en la base de datos «%s» en el clúster antiguo: %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "mapeos para la base de datos «%s»:\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u a %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"bases de datos de origen:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"bases de datos de destino:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "Base de datos: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: no puede ejecutarse como root\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "número de puerto antiguo no válido\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "número de puerto nuevo no válido\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Pruebe «%s --help» para mayor información.\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Ejecutando en modo verboso\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "residen los binarios del clúster antiguo"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "residen los binarios del clúster nuevo"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "residen los datos del clúster antiguo"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "residen los datos del clúster nuevo"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "se crearán los sockets"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "no se pudo identificar el directorio actual\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr ""
+"no se puede ejecutar pg_upgrade desde dentro del directorio de datos\n"
+"del clúster nuevo en Windows\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr "pg_upgrade actualiza un clúster PostgreSQL a una versión «mayor» diferente.\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPCIÓN]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR directorio de ejecutables del clúster antiguo\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR directorio de ejecutables del clúster nuevo\n"
+" (por omisión el mismo directorio que pg_upgrade)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check sólo verificar clústers, no cambiar datos\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR directorio de datos del clúster antiguo\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR directorio de datos del clúster nuevo\n"
+
+#: option.c:298
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM máximo de procesos paralelos para restaurar\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link enlazar (link) archivos en vez de copiarlos\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPCIONES opciones a pasar al servidor antiguo\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPCIONES opciones a pasar al servidor nuevo\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PUERTO número de puerto del clúster antiguo (def. %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PUERTO número de puerto del clúster nuevo (def. %d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain preservar archivos SQL y logs en caso de éxito\n"
+
+#: option.c:305
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR directorio de sockets a usar (omisión: dir. actual)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NOMBRE superusuario del clúster (def. «%s»)\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose activar registro interno verboso\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone clonar los archivos en vez de copiarlos\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Antes de ejecutar pg_upgrade, debe:\n"
+" crear el nuevo clúster de la base de datos (usando la nueva versión de initdb)\n"
+" apagar el postmaster que atiende al clúster antiguo\n"
+" apagar el postmaster que atiende al clúster nuevo\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Cuando ejecute pg_ugpade, debe proveer la siguiente información:\n"
+" el directorio de datos del clúster antiguo (-d DATADIR)\n"
+" el directorio de datos del clúster nuevo (-D DATADIR)\n"
+" el directorio «bin» para la versión antigua (-b BINDIR)\n"
+" el directorio «bin» para la versión nueva (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Por ejemplo:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"o\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=clusterAntiguo/data\n"
+" $ export PGDATANEW=clusterNuevo/data\n"
+" $ export PGBINOLD=clusterAntiguo/bin\n"
+" $ export PGBINNEW=clusterNuevo/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=clusterAntiguo/data\n"
+" C:\\> set PGDATANEW=clusterNuevo/data\n"
+" C:\\> set PGBINOLD=clusterAntiguo/bin\n"
+" C:\\> set PGBINNEW=clusterNuevo/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Debe identificar el directorio donde %s.\n"
+"Por favor use la opción %s o la variable de ambiente %s.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Buscando el directorio de datos real para el clúster de origen"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Buscando el directorio de datos real para el clúster de destino"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "no se pudo obtener el directorio de datos usando %s: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "no se pudo leer la línea %d del archivo «%s»: %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "número de port entregado por el usuario %hu corregido a %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "no se pudo crear el proceso hijo: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "no se pudo crear el thread: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() falló: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "el proceso hijo terminó anormalmente: estado %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "el thread terminó anormalmente: %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "no se pudo obtener los permisos del directorio «%s»: %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Llevando a cabo el Upgrade\n"
+"--------------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Seteando siguiente OID para el nuevo clúster"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Sincronizando directorio de datos a disco"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Actualización Completa\n"
+"----------------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: no se pudo encontrar el ejecutable propio\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Parece haber un postmaster sirviendo el clúster antiguo.\n"
+"Por favor detenga ese postmaster e inténtelo nuevamente.\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Parece haber un postmaster sirviendo el clúster nuevo.\n"
+"Por favor detenga ese postmaster e inténtelo nuevamente.\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analizando todas las filas en el clúster nuevo"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Congelando todas las filas en el nuevo clúster"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Restaurando objetos globales en el nuevo clúster"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Restaurando esquemas de bases de datos en el clúster nuevo\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Eliminando archivos del nuevo %s"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "no se pudo eliminar directorio «%s»\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Copiando el %s antiguo al nuevo servidor"
+
+#: pg_upgrade.c:470
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Estableciendo XID más antiguo para el nuevo clúster"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Seteando el ID de transacción y «época» siguientes en el nuevo clúster"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Seteando el multixact ID y offset siguientes en el nuevo clúster"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Seteando el multixact ID más antiguo en el nuevo clúster"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Reseteando los archivos de WAL"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Seteando contadores frozenxid y minmxid en el clúster nuevo"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Seteando contador minmxid en el clúster nuevo"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "Clonando archivos de relaciones de usuario\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Copiando archivos de relaciones de usuario\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Enlazando archivos de relaciones de usuario\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "la base de datos «%s» no se encontró en el clúster nuevo\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "error mientras se comprobaba la existencia del archivo «%s.%s» («%s» a «%s»); %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "reescribiendo «%s» a «%s»\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "clonando «%s» a «%s»\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "copiando «%s» a «%s»\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "enlazando «%s» a «%s»\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Falló, saliendo\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "ejecutando: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"Orden SQL falló\n"
+"%s\n"
+"%s"
+
+#: server.c:168
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "no se pudo abrir el archivo de versión «%s»: %m\n"
+
+#: server.c:172
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "no se pudo interpretar el archivo de versión «%s»\n"
+
+#: server.c:298
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"no se pudo conectar al postmaster de origen iniciado con la orden:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"no se pudo conectar al postmaster de destino iniciado con la orden:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl no pudo iniciar el servidor de origen, o la conexión falló\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl no pudo iniciar el servidor de destino, o la conexión falló\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "la variable de ambiente libpq %s tiene un valor de servidor no-local: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"No se puede actualizar desde el mismo número de versión del catálogo\n"
+"cuando se están usando tablespaces.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "el directorio de tablespace «%s» no existe\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "no se pudo hace stat al directorio de tablespace «%s»: %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "la ruta de tablespace «%s» no es un directorio\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "éxito"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "Buscando objetos grandes"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "atención"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Su instalación contiene objetos grandes. La base de datos nueva\n"
+"tiene una tabla adicional de permisos de objetos grandes. Después de\n"
+"actualizar, se le dará una instrucción para poblar la tabla\n"
+"pg_largeobject_metadata con privilegios por omisión.\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Su instalación contiene objetos grandes. La base de datos nueva tiene\n"
+"una tabla adicional de permisos de objetos grandes, por lo que deben ser\n"
+"definidos permisos por omisión para todos los objetos grandes. El archivo\n"
+" %s\n"
+"cuando se ejecute en psql con el superusuario de la base de datos\n"
+"establecerá los privilegios por omisión.\n"
+
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Verificando datos de usuario de tipo «line» incompatible"
+
+#: version.c:279
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene el tipo de dato «line» en tablas de usuario. Este\n"
+"tipo de dato cambió su formato interno y de entrada/salida entre las\n"
+"versiones de sus clústers antiguo y nuevo, por lo que este clúster no puede\n"
+"actualmente ser actualizado. Puede eliminar las columnas problemáticas y\n"
+"reiniciar la actualización. Un listado de las columnas problemáticas está\n"
+"en el archivo:\n"
+" %s\n"
+"\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Verificando columnas de usuario del tipo no válido «unknown»"
+
+#: version.c:317
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene el tipo «unknown» en tablas de usuario.\n"
+"Este tipo ya no es permitido en tablas,\n"
+"por lo que este clúster no puede ser actualizado. Puede\n"
+"eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Verificando índices hash"
+
+#: version.c:421
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Su instalación contiene índices hash. Estos índices tienen formato interno\n"
+"distinto entre su versión nueva y antigua, por lo que deben ser reindexados\n"
+"con la orden REINDEX. Después de la actualización, se le entregarán\n"
+"instrucciones de REINDEX.\n"
+"\n"
+
+#: version.c:427
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Su instalación contiene índices hash. Estos índices tienen formato interno\n"
+"distinto entre su versión nueva y antigua, por lo que deben ser reindexados\n"
+"con la orden REINDEX. El archivo\n"
+" %s\n"
+"cuando se ejecute en psql con el superusuario de la base de datos recreará\n"
+"los índices no válidos; hasta entonces, ninguno de esos índices será usado.\n"
+"\n"
+
+#: version.c:453
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Verificando columnas de usuario del tipo «sql_identifier»"
+
+#: version.c:461
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene el tipo de dato «sql_identifier» en tablas de usuario.\n"
+"El formato en disco para este tipo de dato ha cambiado, por lo que\n"
+"este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: version.c:485
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Verificando actualizaciones para extensiones"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "aviso"
+
+#: version.c:538
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"Su instalación tiene extensiones que deben ser actualizadas\n"
+"con la sentencia ALTER EXTENSION. El archivo\n"
+" %s\n"
+"cuando se ejecute en psql con el superusuario de la base de datos\n"
+"actualizará estas extensiones.\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/fr.po b/src/bin/pg_upgrade/po/fr.po
new file mode 100644
index 0000000..6561567
--- /dev/null
+++ b/src/bin/pg_upgrade/po/fr.po
@@ -0,0 +1,2029 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 12\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-18 13:32+0000\n"
+"PO-Revision-Date: 2022-07-18 17:21+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.1\n"
+
+#: check.c:71
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Exécution de tests de cohérence sur l'ancien serveur\n"
+"----------------------------------------------------\n"
+
+#: check.c:77
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Exécution de tests de cohérence\n"
+"-------------------------------\n"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Les instances sont compatibles*\n"
+
+#: check.c:227
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Si pg_upgrade échoue après cela, vous devez ré-exécuter initdb\n"
+"sur la nouvelle instance avant de continuer.\n"
+
+#: check.c:272
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Les statistiques de l'optimiseur ne sont pas transférées par pg_upgrade.\n"
+"Une fois le nouveau serveur démarré, pensez à exécuter :\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:278
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Exécuter ce script supprimera les fichiers de données de l'ancienne\n"
+"instance :\n"
+" %s\n"
+
+#: check.c:283
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"N'a pas pu créer un script pour supprimer les fichiers de données\n"
+"de l'ancienne instance parce que les tablespaces définis par l'utilisateur\n"
+"ou le répertoire de données de la nouvelle instance existent dans le répertoire\n"
+"de l'ancienne instance. Le contenu de l'ancienne instance doit être supprimé\n"
+"manuellement.\n"
+
+#: check.c:295
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Vérification des versions des instances"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Cet outil peut seulement mettre à jour les versions 8.4 et ultérieures de PostgreSQL.\n"
+
+#: check.c:311
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Cet outil peut seulement mettre à jour vers la version %s de PostgreSQL.\n"
+
+#: check.c:320
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Cet outil ne peut pas être utilisé pour mettre à jour vers des versions majeures plus anciennes de PostgreSQL.\n"
+
+#: check.c:325
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Les répertoires des données de l'ancienne instance et des binaires sont de versions majeures différentes.\n"
+
+#: check.c:328
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Les répertoires des données de la nouvelle instance et des binaires sont de versions majeures différentes.\n"
+
+#: check.c:345
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "Lors de la vérification d'un serveur antérieur à la 9.1, vous devez spécifier le numéro de port de l'ancien serveur.\n"
+
+#: check.c:349
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Lors de la vérification d'un serveur en production, l'ancien numéro de port doit être différent du nouveau.\n"
+
+#: check.c:364
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "les encodages de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#: check.c:369
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "les valeurs de lc_collate de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#: check.c:372
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "les valeurs de lc_ctype de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#: check.c:445
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "La nouvelle instance « %s » n'est pas vide : relation « %s.%s » trouvée\n"
+
+#: check.c:502
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Vérification des répertoires de tablespace de la nouvelle instance"
+
+#: check.c:513
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "le répertoire du tablespace de la nouvelle instance existe déjà : « %s »\n"
+
+#: check.c:546
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"AVERTISSEMENT : le nouveau répertoire de données ne doit pas être à l'intérieur de l'ancien répertoire de données, %s\n"
+
+#: check.c:570
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"AVERTISSEMENT : les emplacements de tablespaces utilisateurs ne doivent pas être à l'intérieur du répertoire de données, %s\n"
+
+#: check.c:580
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Création du script pour supprimer l'ancienne instance"
+
+#: check.c:583 check.c:847 check.c:945 check.c:1075 check.c:1153 check.c:1415
+#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:204
+#: version.c:376 version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#: check.c:639
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "n'a pas pu ajouter les droits d'exécution pour le fichier « %s » : %s\n"
+
+#: check.c:659
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Vérification que l'utilisateur de la base de données est l'utilisateur d'installation"
+
+#: check.c:675
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "l'utilisateur de la base de données « %s » n'est pas l'utilisateur d'installation\n"
+
+#: check.c:686
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "n'a pas pu déterminer le nombre d'utilisateurs\n"
+
+#: check.c:694
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Seul l'utilisateur d'installation peut être défini dans la nouvelle instance.\n"
+
+#: check.c:714
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Vérification des paramètres de connexion de la base de données"
+
+#: check.c:736
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 ne doit pas autoriser les connexions, ie pg_database.datallowconn doit valoir false\n"
+
+#: check.c:746
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "Toutes les bases de données, autre que template0, doivent autoriser les connexions, ie pg_database.datallowconn doit valoir true\n"
+
+#: check.c:771
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Vérification des transactions préparées"
+
+#: check.c:780
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "L'instance source contient des transactions préparées\n"
+
+#: check.c:782
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "L'instance cible contient des transactions préparées\n"
+
+#: check.c:808
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Vérification de contrib/isn avec une différence sur le passage des bigint"
+
+#: check.c:869 check.c:970 check.c:1095 check.c:1175 check.c:1232 check.c:1291
+#: check.c:1320 check.c:1438 function.c:262 version.c:278 version.c:316
+#: version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "fatal\n"
+
+#: check.c:870
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient les fonctions « contrib/isn » qui se basent sur le\n"
+"type de données bigint. Vos ancienne et nouvelle instances passent les valeurs\n"
+"bigint différemment, donc cette instance ne peut pas être mise à jour\n"
+"actuellement. Vous pouvez mettre à jour manuellement vos bases de données\n"
+"qui utilisent « contrib/isn », les supprimer de l'ancienne instance,\n"
+"relancer la mise à jour, puis les restaurer. Une liste des fonctions\n"
+"problématiques est disponible\n"
+"dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:893
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Vérification des opérateurs postfixes définis par les utilisateurs"
+
+#: check.c:971
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient des opérateurs postfixes définis par des utilisateurs,\n"
+"qui ne sont plus supportés. Supprimez les opérateurs postfixes et remplacez-les\n"
+"avec des opérateurs préfixes ou des appels de fonctions.\n"
+"Une liste des opérateurs postfixes définis par les utilisateurs se trouve dans le fichier :\n"
+" %s\n"
+
+#: check.c:995
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Vérification des fonctions polymorphiques incompatibles"
+
+#: check.c:1096
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient des objets définis par les utilisateurs qui font référence à des fonctions polymorphiques internes avec des arguments de type « anyarray » ou « anyelement ». Ces objets doivent être supprimés avant de mettre à jour, puis ils pourront être restaurés, en les changeant pour faire référence aux nouvelles fonctions correspondantes avec des arguments de type « anycompatiblearray » et « anycompatible ». Une liste des objets problématiques se trouve dans le fichier\n"
+" %s\n"
+"\n"
+
+#: check.c:1121
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Vérification des tables WITH OIDS"
+
+#: check.c:1176
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient des tables déclarées avec WITH OIDS, ce qui n'est plus supporté.\n"
+"Pensez à supprimer la colonne oid en utilisant\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Une liste des tables ayant ce problème se trouve dans le fichier :\n"
+" %s\n"
+
+#: check.c:1204
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Vérification des types composites définis par le système dans les tables utilisateurs"
+
+#: check.c:1233
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient des types composites définis par le système dans vos tables\n"
+"utilisateurs. Les OID de ces types ne sont pas stables entre différentes versions majeures\n"
+"de PostgreSQL, donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez\n"
+"supprimer les colonnes problématiques, puis relancer la mise à jour. Vous trouverez\n"
+"une liste des colonnes problématiques dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:1261
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Vérification des types de données reg* dans les tables utilisateurs"
+
+#: check.c:1292
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient un des types de données reg* dans vos tables\n"
+"utilisateurs. Ces types de données référencent des OID système qui ne sont\n"
+"pas préservés par pg_upgrade, donc cette instance ne peut pas être mise à\n"
+"jour actuellement. Vous pouvez supprimer les colonnes problématiques et relancer\n"
+"la mise à jour. Une liste des colonnes problématiques est disponible dans le\n"
+"fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:1314
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Vérification des types de données « jsonb » incompatibles"
+
+#: check.c:1321
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient un type de données « jsonb » dans vos tables utilisateurs.\n"
+"Le format interne de « jsonb » a changé lors du développement de la version 9.4 beta, donc\n"
+"cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer les\n"
+"colonnes problématiques et relancer la mise à jour. Une liste des colonnes problématiques\n"
+"est disponible dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:1343
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Vérification des rôles commençant avec « pg_ »"
+
+#: check.c:1353
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "L'instance source contient des rôles commençant avec « pg_ »\n"
+
+#: check.c:1355
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "L'instance cible contient des rôles commençant avec « pg_ »\n"
+
+#: check.c:1376
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Vérification des conversions d'encodage définies par les utilisateurs"
+
+#: check.c:1439
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient des conversions définies par un utilisateur.\n"
+"Les paramètres des fonctions de conversion ont changé dans PostgreSQL version 14\n"
+"donc cette instance ne peut pas être mise à jour actuellement. Vous devez supprimer\n"
+"les conversions d'encodage de l'ancienne instance puis relancer la mise à jour.\n"
+"Une liste des conversions d'encodage définies par l'utilisateur se trouve dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:1466
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "a échoué pour obtenir la locale courante\n"
+
+#: check.c:1475
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "a échoué pour obtenir le nom de la locale système « %s »\n"
+
+#: check.c:1481
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "a échoué pour restaurer l'ancienne locale « %s »\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr ""
+"n'a pas pu obtenir les données de contrôle en utilisant %s : %s\n"
+"\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d : problème sur l'état de l'instance de la base de données\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "L'instance source a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "L'instance cible a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "L'instance source n'a pas été arrêtée proprement.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "L'instance cible n'a pas été arrêtée proprement.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Il manque certaines informations d'état requises sur l'instance source :\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Il manque certaines informations d'état requises sur l'instance cible :\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d : problème avec pg_resetwal\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d : problème de récupération des controldata\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Il manque certaines informations de contrôle requises sur l'instance source :\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Il manque certaines informations de contrôle requises sur l'instance cible :\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " XID du prochain checkpoint\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " prochain OID du dernier checkpoint\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " prochain MultiXactId du dernier checkpoint\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " plus ancien MultiXactId du dernier checkpoint\n"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " oldestXID du dernier checkpoint\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " prochain MultiXactOffset du dernier checkpoint\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " premier segment WAL après réinitialisation\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " méthode de passage de arguments float8\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " alignement maximale\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " taille de bloc\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " taille de segment des relations\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " taille de bloc d'un WAL\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " taille d'un segment WAL\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " longueur maximum d'un identifiant\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " nombre maximum de colonnes indexées\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " taille maximale d'un morceau de TOAST\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " taille d'un morceau Large-Object\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " les dates/heures sont-ils des integers?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " version des sommes de contrôle des données\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Ne peut pas continuer sans les informations de contrôle requises, en arrêt\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"les alignements sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+"Il est probable qu'une installation soit en 32 bits et l'autre en 64 bits.\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "les tailles de bloc sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "les tailles maximales de segment de relation sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "les tailles de bloc des WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "les tailles de segment de WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "les longueurs maximales des identifiants sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "les nombres maximums de colonnes indexées sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "les tailles maximales de morceaux des TOAST sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "les tailles des morceaux de Large Objects sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "les types de stockage date/heure ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "l'ancienne instance n'utilise pas les sommes de contrôle alors que la nouvelle les utilise\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "l'ancienne instance utilise les sommes de contrôle alors que la nouvelle ne les utilise pas\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "les versions des sommes de contrôle ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Ajout du suffixe « .old » à l'ancien global/pg_control"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Incapable de renommer %s à %s.\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Si vous voulez démarrer l'ancienne instance, vous devez supprimer le suffixe « .old » du fichier %s/global/pg_control.old.\n"
+"\n"
+"Comme le mode lien était utilisé, l'ancienne instance ne peut pas être démarré proprement une fois que la nouvelle instance a été démarrée.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Création de la sauvegarde des objets globaux"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Création de la sauvegarde des schémas des bases\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "n'a pas pu obtenir la version de pg_ctl en utilisant %s : %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "n'a pas pu obtenir la version de pg_ctl à partir de %s\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "commande trop longue\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m\n"
+
+#: exec.c:179
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*échec*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Il y a eu des problèmes lors de l'exécution de « %s »\n"
+
+#: exec.c:185
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "Consultez les dernières lignes de « %s » ou « %s » pour trouver la cause probable de l'échec.\n"
+
+#: exec.c:190
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "Consultez les dernières lignes de « %s » pour trouver la cause probable de l'échec.\n"
+
+#: exec.c:205 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "n'a pas pu écrire dans le fichier de traces « %s »\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Vous devez avoir les droits de lecture et d'écriture dans le répertoire actuel.\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "échec de la vérification de « %s » : %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "« %s » n'est pas un répertoire\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "échec de la vérification de « %s » : pas un fichier régulier\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "échec de la vérification de « %s » : ne peut pas exécuter (droit refusé)\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "échec de la vérification de « %s » : ne peut pas exécuter\n"
+
+#: exec.c:449
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr ""
+"échec de la vérification de « %s » : version incorrect : « %s » trouvée, « %s » attendue\n"
+"\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "erreur lors du clonage de la relation « %s.%s » (« %s » à « %s ») : %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu lire le fichier « %s » : %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu écrire le fichier « %s » : %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » (« %s » à « %s ») : %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "erreur lors de la création du lien pour la relation « %s.%s » (« %s » à « %s ») : %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu tester le fichier « %s » : %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : page partielle trouvée dans le fichier « %s »\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "n'a pas pu cloner le fichier entre l'ancien et le nouveau répertoires : %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "n'a pas pu créer le fichier « %s » : %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "clonage de fichiers non supporté sur cette plateforme\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"n'a pas pu créer le lien physique entre l'ancien et le nouveau répertoires de données : %s\n"
+"Dans le mode lien, les ancien et nouveau répertoires de données doivent être sur le même système de fichiers.\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"L'ancienne instance comprend une fonction « plpython_call_handler »\n"
+"définie dans le schéma « public » qui est un duplicat de celle définie\n"
+"dans le schéma « pg_catalog ». Vous pouvez confirmer cela en\n"
+"exécutant dans psql :\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"La version de cette fonction dans le schéma « public » a été créée\n"
+"par une installation de plpython antérieure à la version 8.1 et doit\n"
+"être supprimée pour que pg_upgrade puisse termine parce qu'elle\n"
+"référence un fichier objet partagé « plpython » maintenant obsolète.\n"
+"Vous pouvez supprimer la version de cette fonction dans le schéma\n"
+"« public » en exécutant la commande suivante :\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"dans chaque base de données affectée :\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Supprimez les fonctions problématiques de l'ancienne instance pour continuer.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Vérification de la présence des bibliothèques requises"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "n'a pas pu charger la bibliothèque « %s » : %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "Dans la base de données : %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation référence des bibliothèques chargeables, mais manquantes sur\n"
+"la nouvelle installation. Vous pouvez ajouter ces bibliothèques à la nouvelle\n"
+"installation ou supprimer les fonctions les utilisant dans l'ancienne installation.\n"
+"Une liste des biblioth_ques problématiques est disponible dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Les noms de relation pour l'OID %u dans la base de données « %s » ne correspondent pas : ancien nom « %s.%s », nouveau nom « %s.%s »\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Échec de correspondance des anciennes et nouvelles tables dans la base de données « %s »\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " qui est un index sur \"%s.%s\""
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " qui est un index sur l'OID %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " qui est la table TOAST pour « %s.%s »"
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " qui est la table TOAST pour l'OID %u"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "Aucune correspondance trouvée dans l'ancienne instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "Aucune correspondance trouvée dans la nouvelle instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "correspondances pour la base de données « %s » :\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s : %u vers %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"bases de données sources :\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"bases de données cibles :\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "Base de données : %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname : %s.%s : reloid : %u reltblspace : %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s : ne peut pas être exécuté en tant que root\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "ancien numéro de port invalide\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "nouveau numéro de port invalide\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Exécution en mode verbeux\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "les binaires de l'ancienne instance résident"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "les binaires de la nouvelle instance résident"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "les données de l'ancienne instance résident"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "les données de la nouvelle instance résident"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "les sockets seront créés"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "n'a pas pu déterminer le répertoire courant\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "ne peut pas exécuter pg_upgrade depuis le répertoire de données de la nouvelle instance sur Windows\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade met à jour une instance PostgreSQL vers une version majeure\n"
+"différente.\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr ""
+" -b, --old-bindir=RÉP_BIN répertoire des exécutables de l'ancienne\n"
+" instance\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=RÉP_BIN répertoire des exécutables de la nouvelle\n"
+" instance (par défaut, le même répertoire que\n"
+" pg_upgrade)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr ""
+" -c, --check vérifie seulement les instances, pas de\n"
+" modifications\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=RÉP_DONNÉES répertoire des données de l'ancienne instance\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=RÉP_DONNÉES répertoire des données de la nouvelle instance\n"
+
+#: option.c:298
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr ""
+" -j, --jobs=NUM nombre de processus ou threads simultanés à\n"
+" utiliser\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr ""
+" -k, --link lie les fichiers au lieu de les copier vers la\n"
+" nouvelle instance\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr ""
+" -o, --old-options=OPTIONS options à passer au serveur de l'ancienne\n"
+" instance\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr ""
+" -O, --new-options=OPTIONS options à passer au serveur de la nouvelle\n"
+" instance\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr ""
+" -p, --old-port=PORT numéro de port de l'ancienne instance (par\n"
+" défaut %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr ""
+" -P, --new-port=PORT numéro de port de la nouvelle instance (par\n"
+" défaut %d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain conserve les fichiers SQL et de traces en cas\n"
+" de succès\n"
+
+#: option.c:305
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=RÉP_SOCKET répertoire de la socket à utiliser (par défaut\n"
+" le répertoire courant)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr ""
+" -U, --username=NOM super-utilisateur de l'instance (par défaut\n"
+" « %s »)\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose active des traces internes verbeuses\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version affiche la version, puis quitte\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone clone au lieu de copier les fichiers vers la\n"
+" nouvelle instance\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Avant d'exécuter pg_upgrade, vous devez :\n"
+" créer une nouvelle instance (en utilisant la nouvelle version d'initdb)\n"
+" arrêter le postmaster de l'ancienne instance\n"
+" arrêter le postmaster de la nouvelle instance\n"
+"\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Quand vous exécutez pg_upgrade, vous devez fournir les informations suivantes :\n"
+" le répertoire de données pour l'ancienne instance (-d RÉP_DONNÉES)\n"
+" le répertoire de données pour la nouvelle instance (-D RÉP_DONNÉES)\n"
+" le répertoire « bin » pour l'ancienne version (-b RÉP_BIN)\n"
+" le répertoire « bin » pour la nouvelle version (-B RÉP_BIN)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Par exemple :\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"ou\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Vous devez identifier le répertoire où le %s.\n"
+"Merci d'utiliser l'option en ligne de commande %s ou la variable d'environnement %s.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Recherche du vrai répertoire des données pour l'instance source"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Recherche du vrai répertoire des données pour l'instance cible"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "n'a pas pu obtenir le répertoire des données en utilisant %s : %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "n'a pas pu lire la ligne %d du fichier « %s » : %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "ancien numéro de port %hu fourni par l'utilisateur corrigé en %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "n'a pas pu créer le processus de travail : %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "n'a pas pu créer le fil de travail: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "échec de %s() : %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "le processus fils a quitté anormalement : statut %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "le processus fils a quitté anormalement : %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "n'a pas pu lire les droits du répertoire « %s » : %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Réalisation de la mise à jour\n"
+"-----------------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Configuration du prochain OID sur la nouvelle instance"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronisation du répertoire des données sur disque"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Mise à jour terminée\n"
+"--------------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s : n'a pas pu trouver l'exécutable du programme\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Il semble qu'un postmaster est démarré sur l'ancienne instance.\n"
+"Merci d'arrêter ce postmaster et d'essayer de nouveau.\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Il semble qu'un postmaster est démarré sur la nouvelle instance.\n"
+"Merci d'arrêter ce postmaster et d'essayer de nouveau.\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyse de toutes les lignes dans la nouvelle instance"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Gel de toutes les lignes dans la nouvelle instance"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Restauration des objets globaux dans la nouvelle instance"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Restauration des schémas des bases de données dans la nouvelle instance\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Suppression des fichiers à partir du nouveau %s"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "n'a pas pu supprimer le répertoire « %s »\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Copie de l'ancien %s vers le nouveau serveur"
+
+#: pg_upgrade.c:470
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Configuration du plus ancien XID sur la nouvelle instance"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Configuration du prochain identifiant de transaction et de l'epoch pour la nouvelle instance"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Configuration du prochain MultiXactId et décalage pour la nouvelle instance"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Configuration du plus ancien identifiant multixact sur la nouvelle instance"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Réinitialisation des archives WAL"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Configuration des compteurs frozenxid et minmxid dans la nouvelle instance"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Configuration du compteur minmxid dans la nouvelle instance"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "Clonage des fichiers des relations utilisateurs\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Copie des fichiers des relations utilisateurs\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Création des liens pour les fichiers des relations utilisateurs\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "ancienne base de données « %s » introuvable dans la nouvelle instance\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "erreur lors de la vérification de l'existence du fichier « %s.%s » (« %s » vers « %s ») : %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "réécriture de « %s » en « %s »\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "clonage de « %s » en « %s »\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "copie de « %s » en « %s »\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "lien de « %s » vers « %s »\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Échec, sortie\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "exécution : %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"La commande SQL a échoué\n"
+"%s\n"
+"%s"
+
+#: server.c:168
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "n'a pas pu ouvrir le fichier de version « %s » : %m\n"
+
+#: server.c:172
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "n'a pas pu analyser le fichier de version « %s »\n"
+
+#: server.c:298
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"n'a pas pu se connecter au postmaster source lancé avec la commande :\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"n'a pas pu se connecter au postmaster cible lancé avec la commande :\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl a échoué à démarrer le serveur source ou connexion échouée\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl a échoué à démarrer le serveur cible ou connexion échouée\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "la variable d'environnement libpq %s a une valeur serveur non locale : %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr "Ne peut pas mettre à jour vers ou à partir de la même version de catalogue système quand des tablespaces sont utilisés.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "le répertoire « %s » du tablespace n'existe pas\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "n'a pas pu tester le répertoire « %s » du tablespace : %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "le chemin « %s » du tablespace n'est pas un répertoire\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "Vérification des Large Objects"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "attention"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Votre installation contient des Large Objects. La nouvelle base de données a une table de droit supplémentaire sur les Large Objects.\n"
+"Après la mise à jour, vous disposerez d'une commande pour peupler la table pg_largeobject_metadata avec les droits par défaut.\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Votre installation contient des Large Objects. La nouvelle base de données\n"
+"a une table de droit supplémentaire pour les Large Objects, donc les droits\n"
+"par défaut doivent être définies pour tous les Large Objects. Le fichier\n"
+" %s\n"
+"une fois exécuté par psql avec un superutilisateur définira les droits par\n"
+"défaut.\n"
+"\n"
+
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Vérification des types de données line incompatibles"
+
+#: version.c:279
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient le type de données « line » dans vos tables utilisateurs.\n"
+"Ce type de données a changé de format interne et en entrée/sortie entre vos ancienne\n"
+"et nouvelle versions, donc cette instance ne peut pas être mise à jour\n"
+"actuellement. Vous pouvez supprimer les colonnes problématiques et relancer la mise à jour.\n"
+"Une liste des colonnes problématiques se trouve dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Vérification des colonnes utilisateurs « unknown » invalides"
+
+#: version.c:317
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient le type de données « unknown » dans vos tables\n"
+"utilisateurs. Ce type de données n'est plus autorisé dans les tables, donc\n"
+"cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n"
+"supprimer les colonnes problématiques, puis relancer la mise à jour. Vous trouverez\n"
+"une liste des colonnes problématiques dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Vérification des index hash"
+
+#: version.c:421
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Votre installation contient des index hashs. Ces index ont des formats\n"
+"internes différents entre l'ancienne et la nouvelle instance, dont ils doivent\n"
+"être recréés avec la commande REINDEX. Après la mise à jour, les instructions\n"
+"REINDEX vous seront données.\n"
+"\n"
+
+#: version.c:427
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Votre installation contient des index hashs. Ces index ont des formats\n"
+"internes différents entre l'ancienne et la nouvelle instance, donc ils doivent\n"
+"être recréés avec la commande REINDEX. Le fichier :\n"
+" %s\n"
+"une fois exécuté par psql en tant que superutilisateur va recréer tous les\n"
+"index invalides. Avant cela, aucun de ces index ne sera utilisé.\n"
+"\n"
+
+#: version.c:453
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Vérification des colonnes utilisateurs « sql_identifier » invalides"
+
+#: version.c:461
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient le type de données « sql_identifier » dans les tables\n"
+"utilisateurs. Le format sur disque pour ce type de données a changé,\n"
+"donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer\n"
+"les colonnes problématiques, puis relancer la mise à jour.\n"
+"\n"
+"Une liste des colonnes problématiques se trouve dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: version.c:485
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Vérification des mises à jour d'extension"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "notice"
+
+#: version.c:538
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "connection to database failed: %s"
+#~ msgstr ""
+#~ "\n"
+#~ "échec de la connexion à la base de données : %s"
+
+#~ msgid ""
+#~ " --index-collation-versions-unknown\n"
+#~ " mark text indexes as needing to be rebuilt\n"
+#~ msgstr ""
+#~ " --index-collation-versions-unknown\n"
+#~ " marque les index de colonnes de type text comme nécessitant une reconstruction\n"
+
+#~ msgid "%s is not a directory\n"
+#~ msgstr "%s n'est pas un répertoire\n"
+
+#~ msgid "----------------\n"
+#~ msgstr "----------------\n"
+
+#~ msgid "------------------\n"
+#~ msgstr "------------------\n"
+
+#~ msgid "-----------------------------\n"
+#~ msgstr "-----------------------------\n"
+
+#~ msgid "------------------------------------------------\n"
+#~ msgstr "------------------------------------------------\n"
+
+#~ msgid "Cannot open file %s: %m\n"
+#~ msgstr "Ne peut pas ouvrir le fichier %s : %m\n"
+
+#~ msgid "Cannot read line %d from %s: %m\n"
+#~ msgstr "Ne peut pas lire la ligne %d à partir de %s : %m\n"
+
+#~ msgid "Creating script to analyze new cluster"
+#~ msgstr "Création d'un script pour analyser la nouvelle instance"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Les statistiques de l'optimiseur et les informations sur l'espace libre\n"
+#~ "ne sont pas transférées par pg_upgrade, donc une fois le nouveau\n"
+#~ "serveur démarré, pensez à exécuter :\n"
+#~ " %s\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
+#~ "because of backend API changes made during development.\n"
+#~ msgstr ""
+#~ "Cet outil peut seulement mettre à jour à partir de la version 9.0 de PostgreSQL (après le 11 janvier 2010)\n"
+#~ "à cause de changements dans l'API du moteur fait lors du développement.\n"
+
+#~ msgid "cannot find current directory\n"
+#~ msgstr "ne peut pas trouver le répertoire courant\n"
+
+#~ msgid "cannot write to log file %s\n"
+#~ msgstr "ne peut pas écrire dans le fichier de traces %s\n"
+
+#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+#~ msgstr "échec de la vérification de « %s » : ne peut pas lire le fichier (droit refusé)\n"
+
+#~ msgid "connection to database failed: %s"
+#~ msgstr "échec de la connexion à la base de données : %s"
+
+#~ msgid ""
+#~ "could not load library \"%s\":\n"
+#~ "%s\n"
+#~ msgstr ""
+#~ "n'a pas pu charger la biblothèque « %s »:\n"
+#~ "%s\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "n'a pas pu analyser le fichier PG_VERSION à partir de %s\n"
+
+#~ msgid "waitpid() failed: %s\n"
+#~ msgstr "échec de waitpid() : %s\n"
diff --git a/src/bin/pg_upgrade/po/ja.po b/src/bin/pg_upgrade/po/ja.po
new file mode 100644
index 0000000..f29a484
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ja.po
@@ -0,0 +1,1923 @@
+# pg_upgrade.po
+# Japanese message translation file for pg_upgrade
+#
+# Copyright (C) 2011-2022 PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL 14)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-19 10:01+0900\n"
+"PO-Revision-Date: 2022-07-28 13:23+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+"Plural-Forms: nplural=1; plural=0;\n"
+
+#: check.c:71
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"元の実行中サーバーの一貫性チェックを実行しています。\n"
+"--------------------------------------------------\n"
+
+#: check.c:77
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"整合性チェックを実行しています。\n"
+"-----------------------------\n"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"* クラスタは互換性があります *\n"
+
+#: check.c:227
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"この後pg_upgradeが失敗した場合は、続ける前に新しいクラスタを\n"
+"initdbで再作成する必要があります。\n"
+
+#: check.c:272
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"オプティマイザーの統計情報は、pg_upgrade では転送されません。\n"
+"新サーバーを起動した後、以下のコマンドを実行することを検討してください:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:278
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"このスクリプトを実行すると、旧クラスタのデータファイル %sが削除されます:\n"
+"\n"
+
+#: check.c:283
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"ユーザー定義のテーブル空間もしくは新クラスタのデータディレクトリが\n"
+"旧クラスタのディレクトリ内に存在するため、旧クラスタのデータ\n"
+"ファイルを削除するためのスクリプトを作成できませんでした。 古い\n"
+"クラスタの内容は手動で削除する必要があります。\n"
+
+#: check.c:295
+#, c-format
+msgid "Checking cluster versions"
+msgstr "クラスタのバージョンを確認しています"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "このユーティリティでは PostgreSQL 8.4 以降のバージョンからのみアップグレードできます。\n"
+
+#: check.c:311
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "このユーティリティは、PostgreSQL バージョン %s にのみアップグレードできます。\n"
+
+#: check.c:320
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "このユーティリティは PostgreSQL の過去のメジャーバージョンにダウングレードする用途では使用できません。\n"
+
+#: check.c:325
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "旧クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。\n"
+
+#: check.c:328
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "新クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。\n"
+
+#: check.c:345
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "現在動作中の PG 9.1 以前の旧サーバーをチェックする場合、旧サーバーのポート番号を指定する必要があります。\n"
+
+#: check.c:349
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "稼働中のサーバーをチェックする場合、新旧のポート番号が異なっている必要があります。\n"
+
+#: check.c:364
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "データベース\"%s\"のエンコーディングが一致しません: 旧 \"%s\"、新 \"%s\"\n"
+
+#: check.c:369
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "データベース\"%s\"の lc_collateの値が一致しません:旧 \"%s\"、新 \"%s\"\n"
+
+#: check.c:372
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "データベース\"%s\"の lc_ctypeの値が一致しません:旧 \"%s\"、新 \"%s\"\n"
+
+#: check.c:445
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "新クラスタのデータベース\"%s\"が空ではありません: リレーション\"%s.%s\"が見つかりました\n"
+
+#: check.c:502
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "新しいクラスタのテーブルスペースディレクトリを確認しています"
+
+#: check.c:513
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "新しいクラスタのテーブルスペースディレクトリはすでに存在します: \"%s\"\n"
+
+#: check.c:546
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"警告: 新データディレクトリが旧データディレクトリの中にあってはなりません、例えば%s\n"
+
+#: check.c:570
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"警告: ユーザー定義テーブル空間の場所がデータディレクトリ、例えば %s の中にあってはなりません。\n"
+
+#: check.c:580
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "旧クラスタを削除するスクリプトを作成しています"
+
+#: check.c:583 check.c:847 check.c:945 check.c:1075 check.c:1153 check.c:1415
+#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:204
+#: version.c:376 version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "ファイル\"%s\"をオープンできませんでした: %s\n"
+
+#: check.c:639
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "ファイル\"%s\"に実行権限を追加できませんでした: %s\n"
+
+#: check.c:659
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "データベースユーザーがインストールユーザーかどうかをチェックしています"
+
+#: check.c:675
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "データベースユーザー\"%s\"がインストールユーザーではありません\n"
+
+#: check.c:686
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "ユーザー数を特定できませんでした\n"
+
+#: check.c:694
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "新クラスタ内で定義できるのはインストールユーザーのみです。\n"
+
+#: check.c:714
+#, c-format
+msgid "Checking database connection settings"
+msgstr "データベース接続の設定を確認しています"
+
+#: check.c:736
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 には接続を許可してはなりません。すなわち、pg_database.datallowconn は false である必要があります。\n"
+
+#: check.c:746
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "template0 以外のすべてのデータベースは接続を許可する必要があります。すなわち pg_database.datallowconn が true でなければなりません。\n"
+
+#: check.c:771
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "準備済みトランザクションをチェックしています"
+
+#: check.c:780
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "移行元クラスタに準備済みトランザクションがあります\n"
+
+#: check.c:782
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "移行先クラスタに準備済みトランザクションがあります\n"
+
+#: check.c:808
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "bigint を渡す際にミスマッチが発生する contrib/isn をチェックしています"
+
+#: check.c:869 check.c:970 check.c:1095 check.c:1175 check.c:1232 check.c:1291
+#: check.c:1320 check.c:1438 function.c:262 version.c:278 version.c:316
+#: version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "致命的\n"
+
+#: check.c:870
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"移行元インストールに、bigint データ型に依存する「contrib/isn」の関数が\n"
+"含まれています。新旧のクラスタ間でのbigint値の受け渡し方法が異なるため、\n"
+"現時点ではこのクラスタをアップグレードすることはできません。\n"
+"旧クラスタ中の「contrib/isn」の関数等を使うデータベースを手動でダンプして、\n"
+"それらを削除してからアップグレードを実行し、その後削除したデータベースを\n"
+"リストアすることができます。 \n"
+"問題のある関数の一覧は以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:893
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "ユーザー定義の後置演算子を確認しています"
+
+#: check.c:971
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このインストールではユーザー定義の後置演算子が存在しますが、これらは今後\n"
+"サポートされません。以下のコマンドでこれらの後置演算子を削除して、前置演算子\n"
+"あるいは関数呼び出しに置き換えることを検討してください。\n"
+"以下のファイルにユーザー定義の後置演算子の一覧があります:\n"
+" %s\n"
+"\n"
+
+#: check.c:995
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "非互換の多態関数を確認しています"
+
+#: check.c:1096
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタには、\"anyarray\"または\"anyelement\"型の引数を持つ内部多態関数を\n"
+"参照するユーザー定義のオブジェクトが含まれています。これらのユーザー定義オブジェクトは\n"
+"アップグレード前に削除して、のちに\"anycompatiblearray\"および\"anycompatible\"を\n"
+"引数とする対応する新しい関数を参照するように変更して復元する必要があります。\n"
+"問題となるオブジェクトの一覧は以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1121
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS宣言されたテーブルをチェックしています"
+
+#: check.c:1176
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このインストールではWITH OIDS宣言されたテーブルが存在しますが、\n"
+"サポートされません。以下のコマンドでoidカラムを削除することを検討してください:\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"以下のファイルにこの問題を抱えるテーブルの一覧があります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1204
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "ユーザーテーブル中のシステム定義の複合型を確認しています"
+
+#: check.c:1233
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このインストールではユーザーテーブルにシステム定義の複合型が含まれています。\n"
+"これらの型のOIDはPostgreSQLバージョン間で不変ではないため、このクラスタは\n"
+"アップグレードできません。問題の列を削除した後、アップグレードを再実行できます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s\n"
+"\n"
+
+#: check.c:1261
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "ユーザーテーブル内の reg * データ型をチェックしています"
+
+#: check.c:1292
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このインストールではユーザーテーブルにreg*データ型のひとつが含まれています。\n"
+"これらのデータ型はシステムOIDを参照しますが、これは pg_upgradeでは\n"
+"保存されないため、現時点ではこのクラスタをアップグレードすることはできません。\n"
+"問題のテーブルを削除したのち、アップグレードを再実行できます。\n"
+"問題になる列の一覧は以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1314
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "互換性のない\"jsonb\"データ型をチェックしています"
+
+#: check.c:1321
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このインストールではユーザーテーブルに\"jsonb\"データ型が含まれています。\n"
+"この型の内部フォーマットは9.4ベータの間に変更されているため、現時点ではこの\n"
+"クラスタをアップグレードすることはできません。\n"
+"問題のテーブルを削除したのち、アップグレードを再実行できます。\n"
+"問題になる列の一覧は以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1343
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "'pg_' で始まるロールをチェックしています"
+
+#: check.c:1353
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "移行元クラスタに 'pg_' で始まるロールが含まれています\n"
+
+#: check.c:1355
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "移行先クラスタに \"pg_\" で始まるロールが含まれています\n"
+
+#: check.c:1376
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "ユーザー定義のエンコーディング変換を確認します"
+
+#: check.c:1439
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このインストールではユーザー定義のエンコーディング変換が含まれています。\n"
+"この変換関数のパラメータはPostgreSQLバージョン14で変更されているため、\n"
+"現在このクラスタをアップグレードすることはできません。旧クラスタ内のそれらの\n"
+"エンコーディング変換を削除したのち、アップグレードを再実行できます。\n"
+"ユーザー定義のエンコーディング変換一覧は以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1466
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "現在のロケールを取得できませんでした\n"
+
+#: check.c:1475
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "\"%s\"のシステムロケール名を取得できませんでした\n"
+
+#: check.c:1481
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "古いロケール\"%s\"を復元できませんでした\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "%s を使った制御情報が取得できませんでした: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: データベースクラスタの状態異常\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "ソースクラスタはリカバリモード中にシャットダウンされています。アップグレードをするにはドキュメントの通りに \"rsync\" を実行するか、プライマリとしてシャットダウンしてください。\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "ターゲットクラスタはリカバリモード中にシャットダウンされています。アップグレードをするにはドキュメントの通りに \"rsync\" を実行するか、プライマリとしてシャットダウンしてください。\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "移行元クラスタはクリーンにシャットダウンされていません。\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "移行先クラスタはクリーンにシャットダウンされていません。\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "移行元クラスタにクラスタ状態情報がありません:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "移行先クラスタにクラスタ状態情報がありません:\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal で問題発生\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: 制御情報の取得で問題発生\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "移行元クラスタに必要な制御情報の一部がありません:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "移行先クラスタに必要な制御情報の一部がありません:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " チェックポイントにおける次の XID\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " 最新のチェックポイントにおける次の OID\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " 最新のチェックポイントにおける次の MultiXactId\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " 最新のチェックポイントにおける最古の MultiXactId\n"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " 最新のチェックポイントにおける最古のXID\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " 最新のチェックポイントにおける次の MultiXactOffset\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " リセット後の最初の WAL セグメント\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8引数の引き渡し方法\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " 最大アラインメント\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " ブロックサイズ\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " リレーションセグメントのサイズ\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL のブロックサイズ\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL のセグメント サイズ\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " 識別子の最大長\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " インデックス対象カラムの最大数\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " 最大の TOAST チャンクサイズ\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " ラージオブジェクトのチャンクサイズ\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " 日付/時間が整数?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " データチェックサムのバージョン\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "必要な制御情報がないので続行できません。終了します\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"新旧のpg_controldataのアラインメントが不正であるかかまたは一致しません\n"
+"一方のクラスタが32ビットで、他方が64ビットである可能性が高いです\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata におけるブロックサイズが有効でないかまたは一致しません\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata におけるリレーションの最大セグメントサイズが有効でないか一致しません\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata における WAL ブロックサイズが有効でないか一致しません\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata における WAL セグメントサイズが有効でないか一致しません\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "新旧の pg_controldata における識別子の最大長が有効でないか一致しません\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "新旧の pg_controldata におけるインデックス付き列の最大数が有効でないか一致しません\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata における TOAST チャンクサイズの最大値が有効でないか一致しません\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata におけるラージオブジェクトのチャンクサイズが有効でないかまたは一致しません\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "新旧の pg_controldata における日付/時刻型データの保存バイト数が一致しません\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "旧クラスタではデータチェックサムを使用していませんが、新クラスタでは使用しています\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "旧クラスタではデータチェックサムを使用していますが、新クラスタでは使用していません\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "新旧の pg_controldata 間でチェックサムのバージョンが一致しません\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "旧の global/pg_control に \".old\" サフィックスを追加しています"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "%s の名前を %s に変更できません。\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"旧クラスタを起動する場合、%s/global/pg_control.oldから\n"
+"\".old\"拡張子を削除する必要があります。「リンク」モードが使われて\n"
+"いるため、一度新クラスタを起動してしまうと旧クラスタは安全に起動\n"
+"することができなくなります。\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "グローバルオブジェクトのダンプを作成しています"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "データベーススキーマのダンプを作成しています。\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "%s を使って pg_ctl のバージョンデータを取得できませんでした。: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "pg_ctl のバージョン出力を %s から取得できませんでした。\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "コマンドが長すぎます\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "ログファイル\"%s\"をオープンできませんでした: %m\n"
+
+#: exec.c:179
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*失敗*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "\"%s\"を実行していて問題が発生しました\n"
+
+#: exec.c:185
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"失敗の原因については\"%s\"または\"%s\"の最後の数行を参照してください。\n"
+"\n"
+
+#: exec.c:190
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"失敗の原因については、\"%s\"の最後の数行を参照してください。\n"
+"\n"
+
+#: exec.c:205 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "ログファイル\"%s\"に書き込めませんでした: %m\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "ファイル\"%s\"を読み取り用としてオープンできませんでした:%s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "カレントディレクトリに対して読み書き可能なアクセス権が必要です。\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "\"%s\"のチェックに失敗しました: %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\"はディレクトリではありません\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "\"%s\"のチェックに失敗しました:通常ファイルではありません\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "\"%s\"のチェックに失敗しました:実行できません(権限が拒否されました)\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "\"%s\"の確認に失敗しました:実行できません\n"
+
+#: exec.c:449
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "\"%1$s\"の確認に失敗しました: 不正なバージョン: \"%3$s\"を期待していましたが\"%2$s\"を検出しています\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "リレーション\"%s.%s\"の(\"%s\"から\"%s\"への)クローン中にエラー: %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のクローン中にエラー: ファイル\"%s\"を開けませんでした: %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のクローン中にエラー: ファイル\"%s\"を作成できませんでした: %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を開けませんでした: %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を作成できませんでした: %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を読めませんでした: %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"に書けませんでした: %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "リレーション\"%s.%s\"のコピー(\"%s\" -> \"%s\")中にエラー:%s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "リレーション\"%s.%s\"へのリンク(\"%s\" -> \"%s\")作成中にエラー:%s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を stat できませんでした: %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"中に不完全なページがありました\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "新旧ディレクトリ間のファイルのクローンができませんでした: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "ファイル\"%s\"を作成できませんでした: %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "このプラットフォームではファイルのクローニングはサポートされません\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"新旧のデータディレクトリ間でハードリンクを作成できませんでした: %s\n"
+"リンクモードでは、新旧のデータディレクトリが同じファイルシステム上に存在しなければなりません。\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"旧クラスタで\"plpython_call_handler\"関数が\"public\"スキーマ内に\n"
+"定義されていますが、これは\"pg_catalog\"スキーマで定義されている\n"
+"ものと重複しています。このことは以下のコマンドをpsqlで実行して確認\n"
+"できます:\n"
+"\n"
+" \\\\df *.plpython_call_handler\n"
+"\n"
+"\"public\"スキーマの方の関数は8.1以前の環境のplpythonが作成したもので、\n"
+"すでに廃止済みの \"plpython\" 共有オブジェクトファイルを参照している\n"
+"ため、pg_upgrade を完了させるには削除する必要があります。以下のコマンドを\n"
+"影響のあるデータベースで個別に実行することにより\"public\"スキーマの方の\n"
+"関数の削除ができます: \n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "継続するには、旧クラスタから問題となっている関数を削除してください。\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "必要なライブラリの有無を確認しています"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "ライブラリ\"%s\"をロードできませんでした: %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "データベース: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"旧の環境で、新の環境にはないローダブルライブラリを参照しています。\n"
+"これらのライブラリを新の環境に追加するか、もしくは旧の環境から\n"
+"それらを使っている関数を削除してください。 問題のライブラリの一覧は、\n"
+"以下のファイルに入っています:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "データベース\"%2$s\"で OID %1$u のリレーション名が一致しません: 元の名前 \"%3$s.%4$s\"、新しい名前 \"%5$s.%6$s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "データベース\"%s\"で新旧のテーブルの照合に失敗しました\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " これは \"%s.%s\" 上のインデックスです"
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " これは OID %u 上のインデックスです"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " これは \"%s.%s\" の TOAST テーブルです"
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " これは OID %u の TOAST テーブルです"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "データベース\"%2$s\"でOID%1$uを持つ新リレーションに対応するものが旧クラスタ内にありません: %3$s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "データベース\"%2$s\"でOID %1$uを持つ旧リレーションに対応するものが新クラスタ内にありません: %3$s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "データベース\"%s\"のマッピング:\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u -> %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"移行元データベース:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"移行先データベース:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "データベース: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: root では実行できません\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "旧ポート番号が無効です\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "新ポート番号が無効です\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "詳細は\"%s --help\"で確認してください。\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "コマンドライン引数が多すぎます (先頭は\"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "冗長モードで実行しています\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "旧クラスタのバイナリが置かれている"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "新クラスタのバイナリが置かれている"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "旧クラスタのデータが置かれている"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "新クラスタのデータが置かれている"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "ソケットが作成される"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "カレントディレクトリを特定できませんでした\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "Windowsでは、新クラスタのデータディレクトリの中でpg_upgradeを実行することはできません\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgradeは、PostgreSQLのクラスタを別のメジャーバージョンにアップグレードします。\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [オプション]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 旧クラスタの実行ファイルディレクトリ\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 新クラスタの実行ファイルディレクトリ(デフォルト\n"
+" はpg_upgradeと同じディレクトリ)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check クラスタのチェックのみ、データを一切変更しない\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 旧クラスタのデータディレクトリ\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 新クラスタのデータディレクトリ\n"
+
+#: option.c:298
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs 使用する同時実行プロセスまたはスレッドの数\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr ""
+" -k, --link 新クラスタにファイルをコピーする代わりに\n"
+" リンクする\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS サーバーに渡す旧クラスタのオプション\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS サーバーに渡す新クラスタのオプション\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 旧クラスタのポート番号(デフォルト %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 新クラスタのポート番号(デフォルト %d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQLとログファイルを、成功後も消さずに残す\n"
+
+#: option.c:305
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR 使用するソケットディレクトリ(デフォルトは\n"
+" カレントディレクトリ)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME クラスタのスーパーユーザー(デフォルト\"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 詳細な内部ログを有効化\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone 新クラスタにファイルをコピーする代わりに\n"
+" クローンする\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade を実行する前に、以下のことを行ってください:\n"
+" (新バージョンのinitdbを使って)新しいデータベースクラスタを作成する\n"
+" 旧クラスタのpostmasterをシャットダウンする\n"
+" 新クラスタのpostmasterをシャットダウンする\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade を動かす場合、次の情報を指定する必要があります: \n"
+" 旧クラスタのデータディレクトリ (-d DATADIR)\n"
+" 新クラスタのデータディレクトリ (-D DATADIR) \n"
+" 旧バージョンの\"bin\"ディレクトリ (-b BINDIR)\n"
+" 新バージョンの\"bin\"ディレクトリ(-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"実行例:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"または\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"%sディレクトリを指定する必要があります。\n"
+"コマンドラインオプション %s または環境変数 %s を使用してください。\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "移行元クラスタの実際のデータディレクトリを探しています"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "移行先クラスタの実際のデータディレクトリを探しています"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "%s を使ってデータディレクトリを取得できませんでした。: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "ファイル\"%2$s\"の%1$d行目を読み取れませんでした: %3$s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "ユーザー指定の旧ポート番号 %hu は %hu に訂正されました\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "ワーカープロセスを作成できませんでした: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "ワーカースレッドを作成できませんでした: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s()が失敗しました: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "子プロセスが異常終了しました: ステータス %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "子ワーカーが異常終了しました: %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"アップグレードを実行しています。\n"
+"------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "新クラスタの、次の OID を設定しています"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "データディレクトリをディスクに同期します"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"アップグレードが完了しました\n"
+"----------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 自身の実行ファイルが見つかりませんでした\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"旧クラスタで稼働中のpostmasterがあるようです。\n"
+"そのpostmasterをシャットダウンしたのちにやり直してください。\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"新クラスタで稼働中のpostmasterがあるようです。\n"
+"そのpostmasterをシャットダウンしたのちやり直してください。\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "新クラスタ内のすべての行を分析しています"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "新クラスタ内のすべての行を凍結しています"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "新クラスタ内のグローバルオブジェクトを復元しています"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "新クラスタ内のデータベーススキーマを復元しています\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "新しい %s からファイルを削除しています"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "ディレクトリ\"%s\"を削除できませんでした\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "旧の %s を新サーバーにコピーしています"
+
+#: pg_upgrade.c:470
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "新クラスタに最古のOIDを設定しています"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "新クラスタの、次のトランザクションIDと基点を設定しています"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "新クラスタの、次のmultixact IDとオフセットを設定しています"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "新クラスタの最古のmultixact IDを設定しています"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL アーカイブをリセットしています"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "新クラスタのfrozenxidとminmxidカウンタを設定しています"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "新クラスタのminmxidカウンタを設定しています"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "ユーザーリレーションをクローニングしています\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "ユーザーリレーションのファイルをコピーしています\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "ユーザーリレーションのファイルをリンクしています\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "新クラスタ内に旧データベース\"%s\"が見つかりません\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\"ファイル (\"%s\" -> \"%s\")の存在を確認中にエラー: %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "\"%s\"を\"%s\"に書き換えています\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "\"%s\"から\"%s\"へクローニングしています\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "\"%s\"を\"%s\"にコピーしています\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "\"%s\"から\"%s\"へリンクを作成しています\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "失敗しました、終了しています\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "実行中: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL コマンドが失敗しました\n"
+"%s\n"
+"%s"
+
+#: server.c:168
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "バージョンファイル\"%s\"をオープンできませんでした: %m\n"
+
+#: server.c:172
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "バージョンファイル\"%s\"をパースできませんでした\n"
+
+#: server.c:298
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"以下のコマンドで起動した移行元postmasterに接続できませんでした:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"以下のコマンドで起動した移行先postmasterに接続できませんでした:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl が移行元サーバーの起動に失敗した、あるいは接続に失敗しました\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl が移行先サーバーの起動に失敗した、あるいは接続に失敗しました\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリ不足\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq の環境変数 %s で、ローカルでないサーバー値が設定されています: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"テーブル空間を使用している場合、同じシステムカタログバージョン間での\n"
+"アップグレードはできません。\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "テーブル空間のディレクトリ\"%s\"が存在しません\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "テーブル空間のディレクトリ\"%s\"を stat できませんでした: %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "テーブル空間のパス\"%s\"がディレクトリではありません\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "ラージオブジェクトをチェックしています"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "警告"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"環境にラージオブジェクトが含まれています。新しいデータベースでは\n"
+"ラージオブジェクトのパーミッションテーブルが追加されています。\n"
+"アップグレードが終わったら、 pg_largeobject_metadata テーブルに\n"
+"デフォルトのパーミッションを投入するためのコマンドが案内されます。\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"環境にラージオブジェクトが含まれています。新しいデータベースでは\n"
+"ラージオブジェクトのパーミッションテーブルが追加されており、すべてのラージ\n"
+"オブジェクトについて、デフォルトのパーミッションを定義する必要があります。\n"
+"以下のファイルをpsqlでデータベースのスーパーユーザーとして実行することで\n"
+"デフォルトパーミッションを設定します。\n"
+" %s\n"
+"\n"
+
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "非互換の \"line\" データ型を確認しています"
+
+#: version.c:279
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このインストールにはユーザーテーブル中に\"line\"データ型が含まれています。\n"
+"このデータ型の内部形式および入出力フォーマットは移行元と移行先のバージョン間で\n"
+"変更されているため、このクラスタは現時点ではアップグレードできません。\n"
+"問題の列を削除してから、再度アップグレードを実行することができます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s\n"
+"\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "無効な\"unknown\"ユーザー列をチェックしています"
+
+#: version.c:317
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このインストールではユーザーテーブルに\"unknown\"データ型が含まれています。\n"
+"このデータ型はすでにテーブル内では利用できないため、このクラスタは現時点\n"
+"ではアップグレードできません。問題の列を削除したのち、アップグレードを\n"
+"再実行できます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s\n"
+"\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "ハッシュインデックスをチェックしています"
+
+#: version.c:421
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"このクラスタにはハッシュインデックスがあります。このインデックスは新旧のクラスタ間で\n"
+"内部フォーマットが異なるため、REINDEX コマンドを使って再構築する必要があります。\n"
+"アップグレードが終わったら、REINDEX を使った操作方法が表示されます。\n"
+"\n"
+
+#: version.c:427
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"環境にハッシュインデックスがあります。このインデックスは新旧のクラスタ間でフォーマットが\n"
+"異なるため、REINDEX コマンドを使って再構築する必要があります。以下のファイル\n"
+" %s\n"
+"を、psqlを使用してデータベースのスーパーユーザーとして実行することで、無効になった\n"
+"インデックスを再構築できます。\n"
+"それまでは、これらのインデックスは使用されません。\n"
+"\n"
+
+#: version.c:453
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "無効な\"sql_identifier\"ユーザー列を確認しています"
+
+#: version.c:461
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このインストールでは”sql_identifier”データ型がユーザーテーブルに含まれています。\n"
+"このデータ型のディスク上での形式が変更されているため、現在このクラスタは\n"
+"アップグレードできません。問題のある列を削除した後、アップグレードを再実行\n"
+"できます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s\n"
+"\n"
+
+#: version.c:485
+#, c-format
+msgid "Checking for extension updates"
+msgstr "機能拡張の更新を確認しています"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "注意"
+
+#: version.c:538
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"環境にALTER EXTENSIONコマンドで更新すべき機能拡張があります。以下のファイル\n"
+" %s\n"
+"を、psqlを使用してデータベースのスーパーユーザーとして実行することで、これらの機能拡張\n"
+"が更新されます。\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/ko.po b/src/bin/pg_upgrade/po/ko.po
new file mode 100644
index 0000000..5fa498a
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ko.po
@@ -0,0 +1,1889 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 13\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-05 20:45+0000\n"
+"PO-Revision-Date: 2020-10-06 14:02+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: check.c:66
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"옛 운영 서버에서 일관성 검사를 진행합니다.\n"
+"------------------------------------------\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"일관성 검사 수행중\n"
+"------------------\n"
+
+#: check.c:190
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*클러스터 호환성*\n"
+
+#: check.c:196
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"여기서 pg_upgrade 작업을 실패한다면, 재시도 하기 전에 먼저\n"
+"새 클러스터를 처음부터 다시 만들어 진행해야 합니다.\n"
+
+#: check.c:232
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade so,\n"
+"once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"pg_upgrade 작업에서는 최적화기를 위한 통계 정보까지 업그레이드\n"
+"하지는 않습니다. 새 서버가 실행 될 때, 다음 명령을 수행하길 권합니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:237
+#, c-format
+msgid ""
+"Optimizer statistics and free space information are not transferred\n"
+"by pg_upgrade so, once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"pg_upgrade 작업으로는 통계 정보와 빈 공간 정보는 업그레이드 되지\n"
+"않습니다. 새 서버가 실행 될 때, 다음 명령을 수행하길 권합니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:244
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"아래 스크립트를 실행하면, 옛 클러스터 자료를 지울 것입니다:\n"
+" %s\n"
+
+#: check.c:249
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"옛 클러스터 자료 파일을 지우는 스크립트를 만들지 못했습니다.\n"
+"사용자 정의 테이블스페이스나, 새 클러스터가 옛 클러스터 안에\n"
+"있기 때문입니다. 옛 클러스터 자료는 직접 찾아서 지우세요.\n"
+
+#: check.c:259
+#, c-format
+msgid "Checking cluster versions"
+msgstr "클러스터 버전 검사 중"
+
+#: check.c:271
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "이 도구는 PostgreSQL 8.4 이상 버전에서 사용할 수 있습니다.\n"
+
+#: check.c:275
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "이 도구는 PostgreSQL %s 버전으로만 업그레이드 할 수 있습니다.\n"
+
+#: check.c:284
+#, c-format
+msgid ""
+"This utility cannot be used to downgrade to older major PostgreSQL "
+"versions.\n"
+msgstr ""
+"이 도구는 더 낮은 메이져 PostgreSQL 버전으로 다운그레이드하는데 사용할 수 없"
+"습니다.\n"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Old cluster data and binary directories are from different major versions.\n"
+msgstr "옛 클러스터 자료와 실행파일 디렉터리가 서로 메이져 버전이 다릅니다.\n"
+
+#: check.c:292
+#, c-format
+msgid ""
+"New cluster data and binary directories are from different major versions.\n"
+msgstr "새 클러스터 자료와 실행파일 디렉터리가 서로 메이져 버전이 다릅니다.\n"
+
+#: check.c:309
+#, c-format
+msgid ""
+"When checking a pre-PG 9.1 live old server, you must specify the old "
+"server's port number.\n"
+msgstr ""
+"옛 서버가 9.1 버전 이전 이라면 옛 서버의 포트를 반드시 지정해야 합니다.\n"
+
+#: check.c:313
+#, c-format
+msgid ""
+"When checking a live server, the old and new port numbers must be "
+"different.\n"
+msgstr ""
+"운영 서버 검사를 할 때는, 옛 서버, 새 서버의 포트를 다르게 지정해야 합니다.\n"
+
+#: check.c:328
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"\"%s\" 데이터베이스의 인코딩이 서로 다릅니다: 옛 서버 \"%s\", 새 서버 \"%s"
+"\"\n"
+
+#: check.c:333
+#, c-format
+msgid ""
+"lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"\"%s\" 데이터베이스의 lc_collate 값이 서로 다릅니다: 옛 서버 \"%s\", 새 서버 "
+"\"%s\"\n"
+
+#: check.c:336
+#, c-format
+msgid ""
+"lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"\"%s\" 데이터베이스의 lc_ctype 값이 서로 다릅니다: 옛 서버 \"%s\", 새 서버 "
+"\"%s\"\n"
+
+#: check.c:409
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr ""
+"\"%s\" 새 데이터베이스 클러스터가 비어있지 않습니다.\n"
+" -- \"%s.%s\" 릴레이션을 찾았음\n"
+
+#: check.c:458
+#, c-format
+msgid "Creating script to analyze new cluster"
+msgstr "새 클러스터 통계정보 수집 스크립트를 만듭니다"
+
+#: check.c:472 check.c:600 check.c:864 check.c:943 check.c:1053 check.c:1144
+#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:199
+#: version.c:341
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "\"%s\" 파일을 열 수 없음: %s\n"
+
+#: check.c:527 check.c:656
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "\"%s\" 파일에 실행 권한을 추가 할 수 없음: %s\n"
+
+#: check.c:563
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e."
+"g. %s\n"
+msgstr ""
+"\n"
+"경고: 새 데이터 디렉터리는 옛 데이터 디렉터리 안에 둘 수 없습니다, 예: %s\n"
+
+#: check.c:587
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data "
+"directory, e.g. %s\n"
+msgstr ""
+"\n"
+"경고: 사용자 정의 테이블스페이스 위치를 데이터 디렉터리 안에 둘 수 없습니다, "
+"예: %s\n"
+
+#: check.c:597
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "옛 클러스터를 지우는 스크립트를 만듭니다"
+
+#: check.c:676
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "데이터베이스 사용자가 설치 작업을 한 사용자인지 확인합니다"
+
+#: check.c:692
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "\"%s\" 데이터베이스 사용자는 설치 작업을 한 사용자가 아닙니다\n"
+
+#: check.c:703
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "사용자 수를 확인할 수 없음\n"
+
+#: check.c:711
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "새 클러스터에서만 설치 사용 사용자가 정의될 수 있음\n"
+
+#: check.c:731
+#, c-format
+msgid "Checking database connection settings"
+msgstr "데이터베이스 연결 설정을 확인 중"
+
+#: check.c:753
+#, c-format
+msgid ""
+"template0 must not allow connections, i.e. its pg_database.datallowconn must "
+"be false\n"
+msgstr ""
+"template0 데이터베이스 접속을 금지해야 합니다. 예: 해당 데이터베이스의 "
+"pg_database.datallowconn 값이 false여야 합니다.\n"
+
+#: check.c:763
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their pg_database."
+"datallowconn must be true\n"
+msgstr ""
+"template0 데이터베이스를 제외한 다른 모든 데이터베이스는 접속이 가능해야합니"
+"다. 예: 그들의 pg_database.datallowconn 값은 true여야 합니다.\n"
+
+#: check.c:788
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "미리 준비된 트랜잭션을 확인 중"
+
+#: check.c:797
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "옛 클러스터에 미리 준비된 트랜잭션이 있음\n"
+
+#: check.c:799
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "새 클러스터에 미리 준비된 트랜잭션이 있음\n"
+
+#: check.c:825
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "contrib/isn 모듈의 bigint 처리가 서로 같은지 확인 중"
+
+#: check.c:886 check.c:965 check.c:1076 check.c:1167 function.c:262
+#: version.c:245 version.c:282 version.c:425
+#, c-format
+msgid "fatal\n"
+msgstr "치명적 오류\n"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"설치되어 있는 \"contrib/isn\" 모듈은 bigint 자료형을 사용합니다.\n"
+"이 bigint 자료형의 처리 방식이 새 버전과 옛 버전 사이 호환성이 없어,\n"
+"이 클러스터 업그레이드를 할 수 없습니다. 먼저 수동으로 데이터베이스를 \n"
+"덤프하고, 해당 모듈을 삭제하고, 업그레이드 한 뒤 다시 덤프 파일을 이용해\n"
+"복원할 수 있습니다. 문제가 있는 함수는 아래 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:911
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS 옵션 있는 테이블 확인 중"
+
+#: check.c:966
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"더 이상 WITH OIDS 옵션을 사용하는 테이블을 지원하지 않습니다.\n"
+"먼저 oid 칼럼이 있는 기존 테이블을 대상으로 다음 명령을 실행해서\n"
+"이 옵션을 뺄 것을 고려해 보십시오.\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"관련 테이블 목록은 아래 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:996
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "사용자가 만든 테이블에 reg* 자료형을 쓰는지 확인 중"
+
+#: check.c:1077
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the\n"
+"problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"옛 서버에서 사용자가 만든 테이블에서 reg* 자료형을 사용하고 있습니다.\n"
+"이 자료형들은 pg_upgrade 명령으로 내정된 시스템 OID를 사용하지 못할 수\n"
+"있습니다. 그래서 업그레이드 작업을 진행할 수 없습니다.\n"
+"사용하고 있는 테이블들을 지우고 업그레이드 작업을 다시 시도하세요.\n"
+"이런 자료형을 사용하는 칼럼들은 아래 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:1102
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "\"jsonb\" 자료형 호환성 확인 중"
+
+#: check.c:1168
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can remove the problem\n"
+"tables and restart the upgrade. A list of the problem columns is\n"
+"in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"사용자 테이블에서 \"jsonb\" 자료형을 사용하고 있습니다.\n"
+"9.4 베타 비전 이후 JSONB 내부 자료 구조가 바뀌었습니다.\n"
+"그래서, 업그레이드 작업이 불가능합니다.\n"
+"해당 테이블들을 지우고 업그레이드 작업을 진행하세요\n"
+"해당 자료형을 칼럼들은 아래 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:1190
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "\"pg_\"로 시작하는 롤 확인 중"
+
+#: check.c:1200
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "옛 클러스터에 \"pg_\" 시작하는 롤이 있습니다.\n"
+
+#: check.c:1202
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "새 클러스터에 \"pg_\"로 시작하는 롤이 있습니다.\n"
+
+#: check.c:1228
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "현재 로케일을 확인 할 수 없음\n"
+
+#: check.c:1237
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "\"%s\"용 시스템 로케일 이름을 알 수 없음\n"
+
+#: check.c:1243
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "\"%s\" 옛 로케일을 복원할 수 없음\n"
+
+#: controldata.c:127 controldata.c:195
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "%s 사용하는 컨트롤 자료를 구할 수 없음: %s\n"
+
+#: controldata.c:138
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: 데이터베이스 클러스터 상태 문제\n"
+
+#: controldata.c:156
+#, c-format
+msgid ""
+"The source cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary.\n"
+msgstr ""
+"원본 클러스터는 복구 모드(대기 서버 모드나, 복구 중) 상태에서 중지 되었습니"
+"다. 업그레이드 하려면, 문서에 언급한 것 처럼 \"rsync\"를 사용하든가, 그 서버"
+"를 운영 서버 모드로 바꾼 뒤 중지하고 작업하십시오.\n"
+
+#: controldata.c:158
+#, c-format
+msgid ""
+"The target cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary.\n"
+msgstr ""
+"대상 클러스터는 복구 모드(대기 서버 모드나, 복구 중) 상태에서 중지 되었습니"
+"다. 업그레이드 하려면, 문서에 언급한 것 처럼 \"rsync\"를 사용하든가, 그 서버"
+"를 운영 서버 모드로 바꾼 뒤 중지하고 작업하십시오.\n"
+
+#: controldata.c:163
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "원본 클러스터는 정상적으로 종료되어야 함\n"
+
+#: controldata.c:165
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "대상 클러스터는 정상 종료되어야 함\n"
+
+#: controldata.c:176
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "원본 클러스터에 클러스터 상태 정보가 없음:\n"
+
+#: controldata.c:178
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "대상 클러스터에 클러스터 상태 정보가 없음:\n"
+
+#: controldata.c:208 dump.c:49 pg_upgrade.c:339 pg_upgrade.c:375
+#: relfilenode.c:247 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:215
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal 문제\n"
+
+#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257
+#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309
+#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345
+#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382
+#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426
+#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470
+#: controldata.c:481
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: controldata 복원 문제\n"
+
+#: controldata.c:546
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "옛 클러스터에 필요한 컨트롤 정보가 몇몇 빠져있음:\n"
+
+#: controldata.c:549
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "새 클러스터에 필요한 컨트롤 정보가 몇몇 빠져있음:\n"
+
+#: controldata.c:552
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " 체크포인트 다음 XID\n"
+
+#: controldata.c:555
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " 마지막 체크포인트 다음 OID\n"
+
+#: controldata.c:558
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " 마지막 체크포인트 다음 MultiXactId\n"
+
+#: controldata.c:562
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " 마지막 체크포인트 제일 오래된 MultiXactId\n"
+
+#: controldata.c:565
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " 마지막 체크포인트 다음 MultiXactOffset\n"
+
+#: controldata.c:568
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " 리셋 뒤 첫 WAL 조각\n"
+
+#: controldata.c:571
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8 인자 처리 방식\n"
+
+#: controldata.c:574
+#, c-format
+msgid " maximum alignment\n"
+msgstr " 최대 정렬\n"
+
+#: controldata.c:577
+#, c-format
+msgid " block size\n"
+msgstr " 블록 크기\n"
+
+#: controldata.c:580
+#, c-format
+msgid " large relation segment size\n"
+msgstr " 대형 릴레이션 조각 크기\n"
+
+#: controldata.c:583
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL 블록 크기\n"
+
+#: controldata.c:586
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL 조각 크기\n"
+
+#: controldata.c:589
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " 최대 식별자 길이\n"
+
+#: controldata.c:592
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " 최대 인덱스 칼럼 수\n"
+
+#: controldata.c:595
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " 최대 토스트 조각 크기\n"
+
+#: controldata.c:599
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " 대형 객체 조각 크기\n"
+
+#: controldata.c:602
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " date/time 자료형을 정수로?\n"
+
+#: controldata.c:606
+#, c-format
+msgid " data checksum version\n"
+msgstr " 자료 체크섬 버전\n"
+
+#: controldata.c:608
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "필요한 컨트롤 정보 없이는 진행할 수 없음, 중지 함\n"
+
+#: controldata.c:623
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"클러스터간 pg_controldata 정렬이 서로 다릅니다.\n"
+"하나는 32비트고, 하나는 64비트인 경우 같습니다\n"
+
+#: controldata.c:627
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "클러스터간 pg_controldata 블록 크기가 서로 다릅니다.\n"
+
+#: controldata.c:630
+#, c-format
+msgid ""
+"old and new pg_controldata maximum relation segment sizes are invalid or do "
+"not match\n"
+msgstr "클러스터간 pg_controldata 최대 릴레이션 조각 크가가 서로 다릅니다.\n"
+
+#: controldata.c:633
+#, c-format
+msgid ""
+"old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "클러스터간 pg_controldata WAL 블록 크기가 서로 다릅니다.\n"
+
+#: controldata.c:636
+#, c-format
+msgid ""
+"old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "클러스터간 pg_controldata WAL 조각 크기가 서로 다릅니다.\n"
+
+#: controldata.c:639
+#, c-format
+msgid ""
+"old and new pg_controldata maximum identifier lengths are invalid or do not "
+"match\n"
+msgstr "클러스터간 pg_controldata 최대 식별자 길이가 서로 다릅니다.\n"
+
+#: controldata.c:642
+#, c-format
+msgid ""
+"old and new pg_controldata maximum indexed columns are invalid or do not "
+"match\n"
+msgstr "클러스터간 pg_controldata 최대 인덱스 칼럼수가 서로 다릅니다.\n"
+
+#: controldata.c:645
+#, c-format
+msgid ""
+"old and new pg_controldata maximum TOAST chunk sizes are invalid or do not "
+"match\n"
+msgstr "클러스터간 pg_controldata 최대 토스트 조각 크기가 서로 다릅니다.\n"
+
+#: controldata.c:650
+#, c-format
+msgid ""
+"old and new pg_controldata large-object chunk sizes are invalid or do not "
+"match\n"
+msgstr "클러스터간 pg_controldata 대형 객체 조각 크기가 서로 다릅니다.\n"
+
+#: controldata.c:653
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "클러스터간 pg_controldata date/time 저장 크기가 서로 다릅니다.\n"
+
+#: controldata.c:666
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr ""
+"옛 클러스터는 데이터 체크섬 기능을 사용하지 않고, 새 클러스터는 사용하고 있습"
+"니다.\n"
+
+#: controldata.c:669
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr ""
+"옛 클러스터는 데이터 체크섬 기능을 사용하고, 새 클러스터는 사용하고 있지 않습"
+"니다.\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "클러스터간 pg_controldata 체크섬 버전이 서로 다릅니다.\n"
+
+#: controldata.c:682
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "옛 global/pg_control 파일에 \".old\" 이름을 덧붙입니다."
+
+#: controldata.c:687
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "%s 이름을 %s 이름으로 바꿀 수 없음.\n"
+
+#: controldata.c:690
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"옛 버전으로 옛 클러스터를 사용해서 서버를 실행하려면,\n"
+"%s/global/pg_control.old 파일의 이름을 \".old\" 빼고 바꾸어\n"
+"사용해야합니다. 업그레이드를 \"link\" 모드로 했기 때문에,\n"
+"한번이라도 새 버전의 서버가 이 클러스터를 이용해서 실행되었다면,\n"
+"이 파일이 더 이상 안전하지 않기 때문입니다.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "전역 객체 덤프를 만듭니다"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "데이터베이스 스키마 덤프를 만듭니다\n"
+
+#: exec.c:44
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "%s 명령을 사용해서 pg_ctl 버전 자료를 구할 수 없음: %s\n"
+
+#: exec.c:50
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "%s에서 pg_ctl 버전을 알 수 없음\n"
+
+#: exec.c:104 exec.c:108
+#, c-format
+msgid "command too long\n"
+msgstr "명령이 너무 긺\n"
+
+#: exec.c:110 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:149 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "\"%s\" 로그 파일을 열 수 없음: %m\n"
+
+#: exec.c:178
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*실패*"
+
+#: exec.c:181
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "\"%s\" 실행에서 문제 발생\n"
+
+#: exec.c:184
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"\"%s\" 또는 \"%s\" 파일의 마지막 부분을 살펴보면\n"
+"이 문제를 풀 실마리가 보일 것입니다.\n"
+
+#: exec.c:189
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"\"%s\" 파일의 마지막 부분을 살펴보면\n"
+"이 문제를 풀 실마리가 보일 것입니다.\n"
+
+#: exec.c:204 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "\"%s\" 로그 파일을 쓸 수 없음: %m\n"
+
+#: exec.c:230
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "\"%s\" 파일을 읽기 위해 열 수 없습니다: %s\n"
+
+#: exec.c:257
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "현재 디렉터리의 읽기 쓰기 권한을 부여하세요.\n"
+
+#: exec.c:310 exec.c:372 exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "\"%s\" 검사 실패: %s\n"
+
+#: exec.c:313 exec.c:375
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" 파일은 디렉터리가 아닙니다.\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "\"%s\" 검사 실패: 일반 파일이 아닙니다\n"
+
+#: exec.c:451
+#, c-format
+msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+msgstr "\"%s\" 검사 실패: 해당 파일을 읽을 수 없음 (접근 권한 없음)\n"
+
+#: exec.c:459
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "\"%s\" 검사 실패: 실행할 수 없음 (접근 권한 없음)\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레이션 클론 중 오류: %s\n"
+
+#: file.c:50
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 클론 중 오류: \"%s\" 파일을 열 수 없음: %s\n"
+
+#: file.c:55
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 클론 중 오류: \"%s\" 파일을 만들 수 없음: %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 열 수 없음: %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 만들 수 없음: %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 읽을 수 없음: %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 쓸 수 없음: %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레이션 복사 중 오류: %s\n"
+
+#: file.c:151
+#, c-format
+msgid ""
+"error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레이션 링크 만드는 중 오류: %s\n"
+
+#: file.c:194
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr ""
+"\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일 상태 정보를 알 수 없음: %s\n"
+
+#: file.c:226
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일에 페이지가 손상되었음\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "옛 데이터 디렉터리와 새 데이터 디렉터리 사이 파일 클론 실패: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "\"%s\" 파일을 만들 수 없음: %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "이 운영체제는 파일 클론 기능을 제공하지 않습니다.\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file "
+"system.\n"
+msgstr ""
+"데이터 디렉터리간 하드 링크를 만들 수 없음: %s\n"
+"하드 링크를 사용하려면, 두 디렉터리가 같은 시스템 볼륨 안에 있어야 합니다.\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"옛 클러스터는 \"plpython_call_handler\" 함수가 \"public\" 스키마 안에\n"
+"정의 되어있습니다. 이 함수는 \"pg_catalog\" 스키마 안에 있어야합니다.\n"
+"psql에서 다음 명령으로 이 함수의 위치를 살펴 볼 수 있습니다:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"\"public\" 스키마 안에 이 함수가 있는 경우는 8.1 버전 이전 버전이었습니다.\n"
+"업그레이드 작업을 정상적으로 마치려면, 먼저 \"plpython\" 관련 객체들을 먼저\n"
+"모두 지우고, 새 버전용 모듈을 설치해서 사용해야 합니다.\n"
+"이 삭제 작업은 다음과 같이 진행합니다:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"이 작업은 관련 모든 데이터베이스 단위로 진행되어야 합니다.\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "옛 클러스터에서 문제가 있는 함수들을 삭제하고 진행하세요.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "필요한 라이브러리 확인 중"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "\"%s\" 라이브러리 로드 실패: %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "데이터베이스: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"옛 버전에는 있고, 새 버전에는 없는 라이브러리들이 있습니다. 새 버전에\n"
+"해당 라이브러리들을 설치하거나, 옛 버전에서 해당 라이브러리를 삭제하고,\n"
+"업그레이드 작업을 해야합니다. 문제가 있는 라이브러리들은 다음과 같습니다:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid ""
+"Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s"
+"\", new name \"%s.%s\"\n"
+msgstr ""
+"%u OID에 대한 \"%s\" 데이터베이스 이름이 서로 다릅니다: 옛 이름: \"%s.%s\", "
+"새 이름: \"%s.%s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "\"%s\" 데이터베이스 내 테이블 이름이 서로 다릅니다:\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " 해당 인덱스: \"%s.%s\""
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " 해당 인덱스의 OID: %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " \"%s.%s\" 객체의 토스트 테이블"
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " 해당 토스트 베이블의 OID: %u"
+
+#: info.c:274
+#, c-format
+msgid ""
+"No match found in old cluster for new relation with OID %u in database \"%s"
+"\": %s\n"
+msgstr ""
+"새 클러스터의 %u OID (해당 데이터베이스: \"%s\")가 옛 클러스터에 없음: %s\n"
+
+#: info.c:277
+#, c-format
+msgid ""
+"No match found in new cluster for old relation with OID %u in database \"%s"
+"\": %s\n"
+msgstr ""
+"옛 클러스터의 %u OID (해당 데이터베이스: \"%s\")가 새 클러스터에 없음: %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "\"%s\" 데이터베이스 맵핑 중:\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u / %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"원본 데이터베이스:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"대상 데이터베이스:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "데이터베이스: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: root 권한으로 실행할 수 없음\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "잘못된 옛 포트 번호\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "잘못된 새 포트 번호\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "보다 자세한 사용법은 \"%s --help\" 명령을 이용하세요.\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "너무 많은 명령행 인자를 지정 했음 (시작: \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "작업 내역을 자세히 봄\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "옛 클러스터 실행파일 위치"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "새 클러스터 실팽파일 위치"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "옛 클러스터 자료 위치"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "새 클러스터 자료 위치"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "소켓 파일 만들 위치"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "현재 디렉터리 위치를 알 수 없음\n"
+
+#: option.c:279
+#, c-format
+msgid ""
+"cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr ""
+"윈도우즈 환경에서는 pg_upgrade 명령은 새 클러스터 데이터 디렉터리 안에서는 실"
+"행할 수 없음\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"새 데이터 클러스터 버전과 pg_upgrade 버전의 메이저 버전이 서로 다릅니다.\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [옵션]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "옵션:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 옛 클러스터 실행 파일의 디렉터리\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 새 클러스터 실행 파일의 디렉터리 (기본값:\n"
+" pg_upgrade가 있는 디렉터리)\n"
+
+#: option.c:295
+#, c-format
+msgid ""
+" -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check 실 작업 없이, 그냥 검사만\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 옛 클러스터 데이터 디렉터리\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 새 클러스터 데이터 디렉터리\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+" -j, --jobs=NUM number of simultaneous processes or threads "
+"to use\n"
+msgstr ""
+" -j, --jobs=NUM 동시에 작업할 프로세스 또는 쓰레드 수\n"
+
+#: option.c:299
+#, c-format
+msgid ""
+" -k, --link link instead of copying files to new "
+"cluster\n"
+msgstr ""
+" -k, --link 새 클러스터 구축을 복사 대신 링크 사용\n"
+
+#: option.c:300
+#, c-format
+msgid ""
+" -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=옵션 옛 서버에서 사용할 서버 옵션들\n"
+
+#: option.c:301
+#, c-format
+msgid ""
+" -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=옵션 새 서버에서 사용할 서버 옵션들\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 옛 클러스터 포트 번호 (기본값 %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 새 클러스터 포트 번호 (기본값 %d)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+" -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain 작업 완료 후 사용했던 SQL과 로그 파일 남김\n"
+
+#: option.c:305
+#, c-format
+msgid ""
+" -s, --socketdir=DIR socket directory to use (default current "
+"dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR 사용할 소켓 디렉터리 (기본값: 현재 디렉터"
+"리)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=이름 클러스터 슈퍼유저 (기본값 \"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 작업 내역을 자세히 남김\n"
+
+#: option.c:308
+#, c-format
+msgid ""
+" -V, --version display version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" --clone clone instead of copying files to new "
+"cluster\n"
+msgstr ""
+" --clone 새 클러스터 구축을 복사 대신 클론 사용\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade 작업 전에 먼저 해야 할 것들:\n"
+" 새 버전의 initdb 명령으로 새 데이터베이스 클러스터를 만들고\n"
+" 옛 서버를 중지하고\n"
+" 새 서버도 중지하세요.\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade 작업은 다음 네개의 옵션 값은 반드시 지정해야 함:\n"
+" 옛 데이터 클러스터 디렉터리 (-d DATADIR)\n"
+" 새 데이터 클러스터 디렉터리 (-D DATADIR)\n"
+" 옛 버전의 \"bin\" 디렉터리 (-b BINDIR)\n"
+" 새 버전의 \"bin\" 디렉터리 (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"사용예:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"%s 위치의 디렉터리를 알고 있어야 함.\n"
+"%s 명령행 옵션이나, %s 환경 변수를 사용하세요.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "원본 클러스터용 실 데이터 디렉터리를 찾는 중"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "대상 클러스터용 실 데이터 디렉터리를 찾는 중"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "%s 지정한 데이터 디렉터리를 찾을 수 없음: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "%d 번째 줄을 \"%s\" 파일에서 읽을 수 없음: %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "지정한 %hu 옛 포트 번호를 %hu 번호로 바꿈\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "작업용 프로세스를 만들 수 없음: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "작업용 쓰레드를 만들 수 없음: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "waitpid() failed: %s\n"
+msgstr "waitpid() 실패: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "하위 작업자가 비정상 종료됨: 상태값 %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "하위 작업자가 비정상 종료됨: %s\n"
+
+#: pg_upgrade.c:108
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "\"%s\" 디렉터리 읽기 권한 없음: %s\n"
+
+#: pg_upgrade.c:123
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"업그레이드 진행 중\n"
+"------------------\n"
+
+#: pg_upgrade.c:166
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "새 클러스터용 다음 OID 설정 중"
+
+#: pg_upgrade.c:173
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "데이터 디렉터리 fsync 작업 중"
+
+#: pg_upgrade.c:185
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"업그레이드 완료\n"
+"---------------\n"
+
+#: pg_upgrade.c:220
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 실행할 프로그램을 찾을 수 없습니다.\n"
+
+#: pg_upgrade.c:246
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"옛 서버가 현재 운영 되고 있습니다.\n"
+"먼저 서버를 중지하고 진행하세요.\n"
+
+#: pg_upgrade.c:259
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"새 서버가 현재 운영 되고 있습니다.\n"
+"먼저 서버를 중지하고 진행하세요.\n"
+
+#: pg_upgrade.c:273
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "새 클러스터의 모든 로우에 대해서 통계 정보 수집 중"
+
+#: pg_upgrade.c:286
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "새 클러스터의 모든 로우에 대해서 영구 격리(freeze) 중"
+
+#: pg_upgrade.c:306
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "새 클러스터에 전역 객체를 복원 중"
+
+#: pg_upgrade.c:321
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "새 클러스터에 데이터베이스 스키마 복원 중\n"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "새 %s에서 파일 지우는 중"
+
+#: pg_upgrade.c:429
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "\"%s\" 디렉터리를 삭제 할 수 없음\n"
+
+#: pg_upgrade.c:448
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "옛 %s 객체를 새 서버로 복사 중"
+
+#: pg_upgrade.c:475
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "새 클러스터용 다음 트랜잭션 ID와 epoch 값 설정 중"
+
+#: pg_upgrade.c:505
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "새 클러스터용 다음 멀티 트랜잭션 ID와 위치 값 설정 중"
+
+#: pg_upgrade.c:529
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "새 클러스터용 제일 오래된 멀티 트랜잭션 ID 설정 중"
+
+#: pg_upgrade.c:549
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL 아카이브 재설정 중"
+
+#: pg_upgrade.c:592
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "새 클러스터에서 frozenxid, minmxid 값 설정 중"
+
+#: pg_upgrade.c:594
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "새 클러스터에서 minmxid 값 설정 중"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "사용자 릴레이션 파일 클론 중\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "사용자 릴레이션 파일 복사 중\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "사용자 릴레이션 파일 링크 중\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "\"%s\" 이름의 옛 데이터베이스를 새 클러스터에서 찾을 수 없음\n"
+
+#: relfilenode.c:234
+#, c-format
+msgid ""
+"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 파일이 있는지 확인 도중 오류 발생: %s\n"
+
+#: relfilenode.c:252
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "\"%s\" 객체를 \"%s\" 객체로 다시 쓰는 중\n"
+
+#: relfilenode.c:260
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "\"%s\" 객체를 \"%s\" 객체로 클론 중\n"
+
+#: relfilenode.c:265
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "\"%s\" 객체를 \"%s\" 객체로 복사 중\n"
+
+#: relfilenode.c:270
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "\"%s\" 객체를 \"%s\" 객체로 링크 중\n"
+
+#: server.c:33
+#, c-format
+msgid "connection to database failed: %s"
+msgstr "데이터베이스 연결 실패: %s"
+
+#: server.c:39 server.c:141 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "실패, 종료함\n"
+
+#: server.c:131
+#, c-format
+msgid "executing: %s\n"
+msgstr "실행중: %s\n"
+
+#: server.c:137
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL 명령 실패\n"
+"%s\n"
+"%s"
+
+#: server.c:167
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "\"%s\" 버전 파일 열기 실패: %m\n"
+
+#: server.c:171
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "\"%s\" 버전 파일 구문 분석 실패\n"
+
+#: server.c:297
+#, c-format
+msgid ""
+"\n"
+"connection to database failed: %s"
+msgstr ""
+"\n"
+"데이터베이스 연결 실패: %s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"다음 명령으로 실행된 원본 서버로 접속할 수 없음:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"다음 명령으로 실행된 대상 서버로 접속할 수 없음:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "원본 서버를 실행하는 pg_ctl 작업 실패, 또는 연결 실패\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "대상 서버를 실행하는 pg_ctl 작업 실패, 또는 연결 실패\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "%s libpq 환경 변수가 로컬 서버 값이 아님: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"사용자 정의 테이블스페이스를 사용하는 경우 같은 시스템 카탈로그 버전으로\n"
+"업그레이드 작업을 진행할 수 없습니다.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "\"%s\" 이름의 테이블스페이스 디렉터리가 없음\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "\"%s\" 테이블스페이스 디렉터리의 상태 정보를 구할 수 없음: %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "\"%s\" 테이블스페이스 경로는 디렉터리가 아님\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "대형 객체 확인 중"
+
+#: version.c:77 version.c:384
+#, c-format
+msgid "warning"
+msgstr "경고"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"이 데이터베이스는 대형 객체를 사용하고 있습니다. 새 데이터베이스에서는\n"
+"이들의 접근 권한 제어를 위해 추가적인 테이블을 사용합니다. 업그레이드 후\n"
+"이 객체들의 접근 권한은 pg_largeobject_metadata 테이블에 기본값으로 지정됩니"
+"다.\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"이 데이터베이스는 대형 객체를 사용하고 있습니다. 새 데이터베이스에서는\n"
+"이들의 접근 권한 제어를 위해 추가적인 테이블을 사용합니다. 그래서\n"
+"이들의 접근 권한을 기본값으로 설정하려면,\n"
+" %s\n"
+"파일을 새 서버가 실행 되었을 때 슈퍼유저 권한으로 psql 명령으로\n"
+"실행 하세요.\n"
+"\n"
+
+#: version.c:239
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "\"line\" 자료형 호환성 확인 중"
+
+#: version.c:246
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables. This\n"
+"data type changed its internal and input/output format between your old\n"
+"and new clusters so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"해당 데이터베이스에서 \"line\" 자료형을 사용하는 칼럼이 있습니다.\n"
+"이 자료형의 입출력 방식이 옛 버전과 새 버전에서 서로 호환하지 않습니다.\n"
+"먼저 이 자료형을 사용하는 테이블을 삭제 후 업그레이드 작업을 하고,\n"
+"수동으로 복원 작업을 해야 합니다. 해당 파일들은 다음과 같습니다:\n"
+" %s\n"
+"\n"
+
+#: version.c:276
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "잘못된 \"unknown\" 사용자 칼럼을 확인 중"
+
+#: version.c:283
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables. This\n"
+"data type is no longer allowed in tables, so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"해당 데이터베이스에서 사용자 테이블에서 \"unknown\" 자료형을 사용하고 있습니"
+"다.\n"
+"이 자료형은 더 이상 사용할 수 없습니다. 이 문제를 옛 버전에서 먼저 정리하고\n"
+"업그레이드 작업을 진행하세요. 해당 파일은 다음과 같습니다:\n"
+" %s\n"
+"\n"
+
+#: version.c:306
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "해쉬 인덱스 확인 중"
+
+#: version.c:386
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"해당 데이터베이스에서 해쉬 인덱스를 사용하고 있습니다. 해쉬 인덱스 자료구조"
+"가\n"
+"새 버전에서 호환되지 않습니다. 업그레이드 후에 해당 인덱스들을\n"
+"REINDEX 명령으로 다시 만들어야 합니다.\n"
+"\n"
+
+#: version.c:392
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"해당 데이터베이스에서 해쉬 인덱스를 사용하고 있습니다. 해쉬 인덱스 자료구조"
+"가\n"
+"새 버전에서 호환되지 않습니다. 업그레이드 후 다음 파일을\n"
+"슈퍼유저 권한으로 실행한 psql에서 실행해서, REINDEX 작업을 진행하세요:\n"
+" %s\n"
+"이 작업이 있기 전까지는 해당 인덱스는 invalid 상태로 사용할 수 없게 됩니다.\n"
+"\n"
+
+#: version.c:418
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "잘못된 \"sql_identifier\" 사용자 칼럼을 확인 중"
+
+#: version.c:426
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables\n"
+"and/or indexes. The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can remove the problem tables or\n"
+"change the data type to \"name\" and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"사용자 테이블 또는/이나 인덱스에 \"sql_identifier\" 자료형을 사용하고\n"
+"있습니다. 이 자료형의 저장 양식이 바뀌었기에, 이 클러스터는 업그레이드\n"
+"되어야합니다. 해당 테이블을 지우거나, 해당 칼럼의 자료형을 \"name\" 형으로\n"
+"바꾸고, 서버를 재실행 한 뒤 업그레이드 하십시오.\n"
+"문제의 칼럼이 있는 파일들은 다음과 같습니다:\n"
+" %s\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/ru.po b/src/bin/pg_upgrade/po/ru.po
new file mode 100644
index 0000000..e26ade1
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ru.po
@@ -0,0 +1,2169 @@
+# Russian message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2018, 2019, 2020, 2021, 2022.
+# Maxim Yablokov <m.yablokov@postgrespro.ru>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 06:29+0300\n"
+"PO-Revision-Date: 2022-01-19 16:26+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: check.c:70
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Проверка целостности на старом работающем сервере\n"
+"-------------------------------------------------\n"
+
+#: check.c:76
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Проведение проверок целостности\n"
+"-------------------------------\n"
+
+#: check.c:213
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Кластеры совместимы*\n"
+
+#: check.c:219
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Если работа pg_upgrade после этого прервётся, вы должны заново выполнить "
+"initdb\n"
+"для нового кластера, чтобы продолжить.\n"
+
+#: check.c:264
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Статистика оптимизатора утилитой pg_upgrade не переносится.\n"
+"Запустив новый сервер, имеет смысл выполнить:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:270
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"При запуске этого скрипта будут удалены файлы данных старого кластера:\n"
+" %s\n"
+
+#: check.c:275
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Не удалось создать скрипт для удаления файлов данных старого кластера,\n"
+"так как каталог старого кластера содержит пользовательские табличные\n"
+"пространства или каталог данных нового кластера.\n"
+"Содержимое старого кластера нужно будет удалить вручную.\n"
+
+#: check.c:287
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Проверка версий кластеров"
+
+#: check.c:299
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr ""
+"Эта утилита может производить обновление только с версии PostgreSQL 8.4 и "
+"новее.\n"
+
+#: check.c:303
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Эта утилита может только повышать версию PostgreSQL до %s.\n"
+
+#: check.c:312
+#, c-format
+msgid ""
+"This utility cannot be used to downgrade to older major PostgreSQL "
+"versions.\n"
+msgstr ""
+"Эта утилита не может понижать версию до более старой основной версии "
+"PostgreSQL.\n"
+
+#: check.c:317
+#, c-format
+msgid ""
+"Old cluster data and binary directories are from different major versions.\n"
+msgstr ""
+"Каталоги данных и исполняемых файлов старого кластера относятся к разным "
+"основным версиям.\n"
+
+#: check.c:320
+#, c-format
+msgid ""
+"New cluster data and binary directories are from different major versions.\n"
+msgstr ""
+"Каталоги данных и исполняемых файлов нового кластера относятся к разным "
+"основным версиям.\n"
+
+#: check.c:337
+#, c-format
+msgid ""
+"When checking a pre-PG 9.1 live old server, you must specify the old "
+"server's port number.\n"
+msgstr ""
+"Для проверки старого работающего сервера версии до 9.1 необходимо указать "
+"номер порта этого сервера.\n"
+
+#: check.c:341
+#, c-format
+msgid ""
+"When checking a live server, the old and new port numbers must be "
+"different.\n"
+msgstr ""
+"Для проверки работающего сервера новый номер порта должен отличаться от "
+"старого.\n"
+
+#: check.c:356
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"кодировки в базе данных \"%s\" различаются: старая - \"%s\", новая - \"%s"
+"\"\n"
+
+#: check.c:361
+#, c-format
+msgid ""
+"lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"значения lc_collate в базе данных \"%s\" различаются: старое - \"%s\", "
+"новое - \"%s\"\n"
+
+#: check.c:364
+#, c-format
+msgid ""
+"lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"значения lc_ctype в базе данных \"%s\" различаются: старое - \"%s\", новое "
+"- \"%s\"\n"
+
+#: check.c:437
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr ""
+"Новая база данных кластера \"%s\" не пустая: найдено отношение \"%s.%s\"\n"
+
+#: check.c:494
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Проверка каталогов табличных пространств в новом кластере"
+
+#: check.c:505
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr ""
+"каталог табличного пространства в новом кластере уже существует: \"%s\"\n"
+
+#: check.c:538
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e."
+"g. %s\n"
+msgstr ""
+"\n"
+"ПРЕДУПРЕЖДЕНИЕ: новый каталог данных не должен располагаться внутри старого "
+"каталога данных, то есть, в %s\n"
+
+#: check.c:562
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data "
+"directory, e.g. %s\n"
+msgstr ""
+"\n"
+"ПРЕДУПРЕЖДЕНИЕ: пользовательские табличные пространства не должны "
+"располагаться внутри каталога данных, то есть, в %s\n"
+
+#: check.c:572
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Создание скрипта для удаления старого кластера"
+
+#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336
+#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376
+#: version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "не удалось открыть файл \"%s\": %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "не удалось добавить право выполнения для файла \"%s\": %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Проверка, является ли пользователь БД стартовым пользователем"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "пользователь БД \"%s\" не является стартовым пользователем\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "не удалось определить количество пользователей\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "В новом кластере может быть определён только стартовый пользователь.\n"
+
+#: check.c:706
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Проверка параметров подключения к базе данных"
+
+#: check.c:728
+#, c-format
+msgid ""
+"template0 must not allow connections, i.e. its pg_database.datallowconn must "
+"be false\n"
+msgstr ""
+"База template0 не должна допускать подключения, то есть её свойство "
+"pg_database.datallowconn должно быть false\n"
+
+#: check.c:738
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their pg_database."
+"datallowconn must be true\n"
+msgstr ""
+"Все базы, кроме template0, должны допускать подключения, то есть их свойство "
+"pg_database.datallowconn должно быть true\n"
+
+#: check.c:763
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Проверка наличия подготовленных транзакций"
+
+#: check.c:772
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Исходный кластер содержит подготовленные транзакции\n"
+
+#: check.c:774
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Целевой кластер содержит подготовленные транзакции\n"
+
+#: check.c:800
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Проверка несоответствия при передаче bigint в contrib/isn"
+
+#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183
+#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "сбой\n"
+
+#: check.c:862
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции имеются функции \"contrib/isn\", задействующие тип "
+"biging.\n"
+"Однако в новом кластере значения bigint передаётся не так, как в старом,\n"
+"так что обновление кластера в текущем состоянии невозможно. Вы можете\n"
+"вручную выгрузить базы данных, где используется функциональность \"contrib/"
+"isn\",\n"
+"или удалить \"contrib/isn\" из старого кластера и перезапустить обновление. "
+"Список\n"
+"проблемных функций приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:885
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Проверка пользовательских постфиксных операторов"
+
+#: check.c:963
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции содержатся пользовательские постфиксные операторы, "
+"которые\n"
+"теперь не поддерживаются. Их следует удалить и использовать вместо них\n"
+"префиксные операторы или функции.\n"
+"Список пользовательских постфиксных операторов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:984
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Проверка таблиц со свойством WITH OIDS"
+
+#: check.c:1039
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции содержатся таблицы со свойством WITH OIDS, которое "
+"теперь\n"
+"не поддерживается. Отказаться от использования столбцов oid можно так:\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Список проблемных таблиц приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1067
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Проверка системных составных типов в пользовательских таблицах"
+
+#: check.c:1096
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют системные составные "
+"типы.\n"
+"OID таких типов могут различаться в разных версиях PostgreSQL, в настоящем\n"
+"состоянии обновить кластер невозможно. Вы можете удалить проблемные столбцы\n"
+"и перезапустить обновление. Список проблемных столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1124
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Проверка типов данных reg* в пользовательских таблицах"
+
+#: check.c:1155
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы содержат один из типов reg*.\n"
+"Эти типы данных ссылаются на системные OID, которые не сохраняются утилитой\n"
+"pg_upgrade, так что обновление кластера в текущем состоянии невозможно. Вы\n"
+"можете удалить проблемные столбцы и перезапустить обновление. Список "
+"проблемных\n"
+"столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Проверка несовместимого типа данных \"jsonb\""
+
+#: check.c:1184
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции таблицы используют тип данных jsonb.\n"
+"Внутренний формат \"jsonb\" изменился в версии 9.4 beta, поэтому обновить "
+"кластер\n"
+"в текущем состоянии невозможно. Вы можете удалить проблемные столбцы и\n"
+"перезапустить обновление. Список проблемных столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1206
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Проверка ролей с именами, начинающимися с \"pg_\""
+
+#: check.c:1216
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "В исходном кластере есть роли, имена которых начинаются с \"pg_\"\n"
+
+#: check.c:1218
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "В целевом кластере есть роли, имена которых начинаются с \"pg_\"\n"
+
+#: check.c:1239
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Проверка пользовательских перекодировок"
+
+#: check.c:1302
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции имеются пользовательские перекодировки.\n"
+"У функций перекодировок в PostgreSQL 14 поменялись параметры, поэтому\n"
+"в настоящем состоянии обновить кластер невозможно. Вы можете удалить\n"
+"перекодировки в старом кластере и перезапустить обновление.\n"
+"Список пользовательских перекодировок приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1329
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "не удалось получить текущую локаль\n"
+
+#: check.c:1338
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "не удалось получить системное имя локали для \"%s\"\n"
+
+#: check.c:1344
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "не удалось восстановить старую локаль \"%s\"\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "не удалось получить управляющие данные, выполнив %s: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: недопустимое состояние кластера баз данных\n"
+
+#: controldata.c:157
+#, c-format
+msgid ""
+"The source cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary.\n"
+msgstr ""
+"Исходный кластер был отключён в режиме восстановления. Чтобы произвести "
+"обновление, используйте документированный способ с rsync или отключите его в "
+"режиме главного сервера.\n"
+
+#: controldata.c:159
+#, c-format
+msgid ""
+"The target cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary.\n"
+msgstr ""
+"Целевой кластер был отключён в режиме восстановления. Чтобы произвести "
+"обновление, используйте документированный способ с rsync или отключите его в "
+"режиме главного сервера.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Исходный кластер не был отключён штатным образом.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Целевой кластер не был отключён штатным образом.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "В исходном кластере не хватает информации о состоянии кластера:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "В целевом кластере не хватает информации о состоянии кластера:\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: проблема с выводом pg_resetwal\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: проблема с получением управляющих данных\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "В исходном кластере не хватает необходимой управляющей информации:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "В целевом кластере не хватает необходимой управляющей информации:\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " следующий XID последней конт. точки\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " следующий OID последней конт. точки\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " следующий MultiXactId последней конт. точки\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " старейший MultiXactId последней конт. точки\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " oldestXID последней конт. точки\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " следующий MultiXactOffset последней конт. точки\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " первый сегмент WAL после сброса\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " метод передачи аргумента float8\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " максимальное выравнивание\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " размер блока\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " размер сегмента большого отношения\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " размер блока WAL\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " размер сегмента WAL\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " максимальная длина идентификатора\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " максимальное число столбцов в индексе\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " максимальный размер порции TOAST\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " размер порции большого объекта\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " дата/время представлены целыми числами?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " версия контрольных сумм данных\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr ""
+"Нет необходимой управляющей информации для продолжения, работа прерывается\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"старое и новое выравнивание в pg_controldata различаются или некорректны\n"
+"Вероятно, один кластер установлен в 32-битной системе, а другой ~ в 64-"
+"битной\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr ""
+"старый и новый размер блоков в pg_controldata различаются или некорректны\n"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata maximum relation segment sizes are invalid or do "
+"not match\n"
+msgstr ""
+"старый и новый максимальный размер сегментов отношений в pg_controldata "
+"различаются или некорректны\n"
+
+#: controldata.c:662
+#, c-format
+msgid ""
+"old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr ""
+"старый и новый размер блоков WAL в pg_controldata различаются или "
+"некорректны\n"
+
+#: controldata.c:665
+#, c-format
+msgid ""
+"old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr ""
+"старый и новый размер сегментов WAL в pg_controldata различаются или "
+"некорректны\n"
+
+#: controldata.c:668
+#, c-format
+msgid ""
+"old and new pg_controldata maximum identifier lengths are invalid or do not "
+"match\n"
+msgstr ""
+"старая и новая максимальная длина идентификаторов в pg_controldata "
+"различаются или некорректны\n"
+
+#: controldata.c:671
+#, c-format
+msgid ""
+"old and new pg_controldata maximum indexed columns are invalid or do not "
+"match\n"
+msgstr ""
+"старый и новый максимум числа столбцов, составляющих индексы, в "
+"pg_controldata различаются или некорректны\n"
+
+#: controldata.c:674
+#, c-format
+msgid ""
+"old and new pg_controldata maximum TOAST chunk sizes are invalid or do not "
+"match\n"
+msgstr ""
+"старый и новый максимальный размер порции TOAST в pg_controldata различаются "
+"или некорректны\n"
+
+#: controldata.c:679
+#, c-format
+msgid ""
+"old and new pg_controldata large-object chunk sizes are invalid or do not "
+"match\n"
+msgstr ""
+"старый и новый размер порции большого объекта различаются или некорректны\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr ""
+"старый и новый тип хранения даты/времени в pg_controldata различаются или "
+"некорректны\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr ""
+"в старом кластере не применялись контрольные суммы данных, но в новом они "
+"есть\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr ""
+"в старом кластере применялись контрольные суммы данных, но в новом их нет\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr ""
+"старая и новая версия контрольных сумм кластера в pg_controldata "
+"различаются\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Добавление расширения \".old\" к старому файлу global/pg_control"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Не удалось переименовать %s в %s.\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Если вы захотите запустить старый кластер, вам нужно будет убрать\n"
+"расширение \".old\" у файла %s/global/pg_control.old.\n"
+"Так как применялся режим \"ссылок\", работа старого кластера\n"
+"после того, как будет запущен новый, не гарантируется.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Формирование выгрузки глобальных объектов"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Формирование выгрузки схем базы данных\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "не удалось получить данные версии pg_ctl, выполнив %s: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "не удалось получить версию pg_ctl из результата %s\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "команда слишком длинная\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "не удалось открыть файл протокола \"%s\": %m\n"
+
+#: exec.c:179
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*ошибка*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "При выполнении \"%s\" возникли проблемы\n"
+
+#: exec.c:185
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Чтобы понять причину ошибки, просмотрите последние несколько строк\n"
+"файла \"%s\" или \"%s\".\n"
+
+#: exec.c:190
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Чтобы понять причину ошибки, просмотрите последние несколько строк\n"
+"файла \"%s\".\n"
+
+#: exec.c:205 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "не удалось записать в файл протокола \"%s\": %m\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "не удалось открыть файл \"%s\" для чтения: %s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "У вас должны быть права на чтение и запись в текущем каталоге.\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "проверка существования \"%s\" не пройдена: %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" не является каталогом\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "программа \"%s\" не прошла проверку: это не обычный файл\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "программа \"%s\" не прошла проверку: ошибка выполнения (нет доступа)\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "программа \"%s\" не прошла проверку: ошибка выполнения\n"
+
+#: exec.c:449
+#, c-format
+msgid ""
+"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr ""
+"программа \"%s\" не прошла проверку: получена некорректная версия \"%s\", "
+"ожидалась \"%s\"\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "ошибка при клонировании отношения \"%s.%s\" (из \"%s\" в \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr ""
+"ошибка при клонировании отношения \"%s.%s\": не удалось открыть файл \"%s\": "
+"%s\n"
+
+#: file.c:55
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr ""
+"ошибка при клонировании отношения \"%s.%s\": не удалось создать файл \"%s\": "
+"%s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось открыть файл \"%s\": "
+"%s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось создать файл \"%s\": "
+"%s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось прочитать файл \"%s"
+"\": %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось записать в файл \"%s"
+"\": %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "ошибка при копировании отношения \"%s.%s\" (из \"%s\" в \"%s\"): %s\n"
+
+#: file.c:151
+#, c-format
+msgid ""
+"error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr ""
+"ошибка при создании ссылки для отношения \"%s.%s\" (из \"%s\" в \"%s\"): %s\n"
+
+#: file.c:194
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось получить информацию о "
+"файле \"%s\": %s\n"
+
+#: file.c:226
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": в файле \"%s\" обнаружена "
+"неполная страница\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "не удалось клонировать файл из старого каталога данных в новый: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "не удалось создать файл \"%s\": %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "клонирование файлов не поддерживается в этой ОС\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file "
+"system.\n"
+msgstr ""
+"не удалось создать жёсткую ссылку между старым и новым каталогами данных: "
+"%s\n"
+"В режиме \"ссылок\" старый и новый каталоги данных должны находиться в одной "
+"файловой системе.\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"В старом кластере имеется функция \"plpython_call_handler\",\n"
+"определённая в схеме \"public\", представляющая собой копию функции,\n"
+"определённой в схеме \"pg_catalog\". Вы можете убедиться в этом,\n"
+"выполнив в psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"Версия этой функции в схеме \"public\" была создана инсталляцией\n"
+"plpython версии до 8.1 и должна быть удалена для завершения процедуры\n"
+"pg_upgrade, так как она ссылается на ставший устаревшим\n"
+"разделяемый объектный файл \"plpython\". Вы можете удалить версию этой "
+"функции\n"
+"из схемы \"public\", выполнив следующую команду:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"в каждой затронутой базе данных:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Удалите проблемные функции из старого кластера для продолжения.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Проверка наличия требуемых библиотек"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "загрузить библиотеку \"%s\" не удалось: %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "В базе данных: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции есть ссылки на загружаемые библиотеки, отсутствующие\n"
+"в новой инсталляции. Вы можете добавить эти библиотеки в новую инсталляцию\n"
+"или удалить функции, использующие их, из старой. Список проблемных\n"
+"библиотек приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid ""
+"Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s"
+"\", new name \"%s.%s\"\n"
+msgstr ""
+"Имена отношения с OID %u в базе данных \"%s\" различаются: старое имя - \"%s."
+"%s\", новое - \"%s.%s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Не удалось сопоставить старые таблицы с новыми в базе данных \"%s\"\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " это индекс в \"%s.%s\""
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " это индекс в отношении с OID %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " это TOAST-таблица для \"%s.%s\""
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " это TOAST-таблица для отношения с OID %u"
+
+#: info.c:274
+#, c-format
+msgid ""
+"No match found in old cluster for new relation with OID %u in database \"%s"
+"\": %s\n"
+msgstr ""
+"В старом кластере не нашлось соответствия для нового отношения с OID %u в "
+"базе данных \"%s\": %s\n"
+
+#: info.c:277
+#, c-format
+msgid ""
+"No match found in new cluster for old relation with OID %u in database \"%s"
+"\": %s\n"
+msgstr ""
+"В новом кластере не нашлось соответствия для старого отношения с OID %u в "
+"базе данных \"%s\": %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "отображения для базы данных \"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u в %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"исходные базы данных:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"целевые базы данных:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "База данных: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "имя_отношения: %s.%s: oid_отношения: %u табл_пространство: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: программу не должен запускать root\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "неверный старый номер порта\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "неверный новый номер порта\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Для дополнительной информации попробуйте \"%s --help\".\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Программа запущена в режиме подробных сообщений\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "расположение исполняемых файлов старого кластера"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "расположение исполняемых файлов нового кластера"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "расположение данных старого кластера"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "расположение данных нового кластера"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "расположение сокетов"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "не удалось определить текущий каталог\n"
+
+#: option.c:279
+#, c-format
+msgid ""
+"cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr ""
+"в Windows нельзя запустить pg_upgrade внутри каталога данных нового "
+"кластера\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade обновляет кластер PostgreSQL до другой основной версии.\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [ПАРАМЕТР]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr ""
+" -b, --old-bindir=КАТ_BIN каталог исполняемых файлов старого кластера\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=КАТ_BIN каталог исполняемых файлов нового кластера\n"
+" (по умолчанию каталог программы pg_upgrade)\n"
+
+#: option.c:295
+#, c-format
+msgid ""
+" -c, --check check clusters only, don't change any data\n"
+msgstr ""
+" -c, --check только проверить кластеры, не меняя никакие "
+"данные\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=КАТ_DATA каталог данных старого кластера\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=КАТ_DATA каталог данных нового кластера\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+" -j, --jobs=NUM number of simultaneous processes or threads "
+"to use\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО число одновременно используемых процессов "
+"или\n"
+" потоков\n"
+
+#: option.c:299
+#, c-format
+msgid ""
+" -k, --link link instead of copying files to new "
+"cluster\n"
+msgstr ""
+" -k, --link устанавливать ссылки вместо копирования "
+"файлов\n"
+" в новый кластер\n"
+
+#: option.c:300
+#, c-format
+msgid ""
+" -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr ""
+" -o, --old-options=ПАРАМЕТРЫ параметры старого кластера, передаваемые "
+"серверу\n"
+
+#: option.c:301
+#, c-format
+msgid ""
+" -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr ""
+" -O, --new-options=ПАРАМЕТРЫ параметры нового кластера, передаваемые "
+"серверу\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr ""
+" -p, --old-port=ПОРТ номер порта старого кластера (по умолчанию "
+"%d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr ""
+" -P, --new-port=ПОРТ номер порта нового кластера (по умолчанию "
+"%d)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+" -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain сохранить файлы журналов и SQL в случае "
+"успеха\n"
+
+#: option.c:305
+#, c-format
+msgid ""
+" -s, --socketdir=DIR socket directory to use (default current "
+"dir.)\n"
+msgstr ""
+" -s, --socketdir=КАТАЛОГ каталог сокетов (по умолчанию текущий)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr ""
+" -U, --username=ИМЯ суперпользователь кластера (по умолчанию \"%s"
+"\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr ""
+" -v, --verbose включить вывод подробных внутренних "
+"сообщений\n"
+
+#: option.c:308
+#, c-format
+msgid ""
+" -V, --version display version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" --clone clone instead of copying files to new "
+"cluster\n"
+msgstr ""
+" --clone клонировать, а не копировать файлы в новый "
+"кластер\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"До запуска pg_upgrade вы должны:\n"
+" создать новый кластер баз данных (используя новую версию initdb)\n"
+" остановить процесс postmaster, обслуживающий старый кластер\n"
+" остановить процесс postmaster, обслуживающий новый кластер\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Запуская pg_upgrade, вы должны указать:\n"
+" путь к каталогу данных старого кластера (-d КАТ_ДАННЫХ)\n"
+" путь к каталогу данных нового кластера (-D КАТ_ДАННЫХ)\n"
+" путь к каталогу \"bin\" старой версии (-b КАТ_BIN)\n"
+" путь к каталогу \"bin\" новой версии (-B КАТ_BIN)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Например:\n"
+" pg_upgrade -d старый_кластер/data -D новый_кластер/data -b старый_кластер/"
+"bin -B новый_кластер/bin\n"
+"или\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=старый_кластер/data\n"
+" $ export PGDATANEW=новый_кластер/data\n"
+" $ export PGBINOLD=старый_кластер/bin\n"
+" $ export PGBINNEW=новый_кластер/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=старый_кластер/data\n"
+" C:\\> set PGDATANEW=новый_кластер/data\n"
+" C:\\> set PGBINOLD=старый_кластер/bin\n"
+" C:\\> set PGBINNEW=новый_кластер/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Вы должны указать каталог, где находится %s.\n"
+"Воспользуйтесь для этого ключом командной строки %s или переменной окружения "
+"%s.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Поиск фактического каталога данных для исходного кластера"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Поиск фактического каталога данных для целевого кластера"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "не удалось получить каталог данных, выполнив %s: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "не удалось прочитать строку %d из файла \"%s\": %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "заданный пользователем старый номер порта %hu изменён на %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "не удалось создать рабочий процесс: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "не удалось создать рабочий поток: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "ошибка в %s(): %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "дочерний процесс завершился нештатно с ошибкой %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "дочерний процесс завершился аварийно: %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "не удалось считать права на каталог \"%s\": %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Выполнение обновления\n"
+"---------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Установка следующего OID для нового кластера"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Синхронизация каталога данных с ФС"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Обновление завершено\n"
+"--------------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не удалось найти свой исполняемый файл\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Видимо, запущен процесс postmaster, обслуживающий старый кластер.\n"
+"Остановите его и попробуйте ещё раз.\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Видимо, запущен процесс postmaster, обслуживающий новый кластер.\n"
+"Остановите его и попробуйте ещё раз.\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Анализ всех строк в новом кластере"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Замораживание всех строк в новом кластере"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Восстановление глобальных объектов в новом кластере"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Восстановление схем баз данных в новом кластере\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Удаление файлов из нового каталога %s"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "ошибка при удалении каталога \"%s\"\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Копирование старого каталога %s на новый сервер"
+
+#: pg_upgrade.c:470
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Установка старейшего OID для нового кластера"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr ""
+"Установка следующего идентификатора транзакции и эпохи для нового кластера"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr ""
+"Установка следующего идентификатора и смещения мультитранзакции для нового "
+"кластера"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Установка старейшего идентификатора мультитранзакции в новом кластере"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Сброс архивов WAL"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Установка счётчиков frozenxid и minmxid в новом кластере"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Установка счётчика minmxid в новом кластере"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "Клонирование файлов пользовательских отношений\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Копирование файлов пользовательских отношений\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Подключение файлов пользовательских отношений ссылками\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "старая база данных \"%s\" не найдена в новом кластере\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid ""
+"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr ""
+"ошибка при проверке существования файла отношения \"%s.%s\" (перенос \"%s\" "
+"в \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "переписывание \"%s\" в \"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "клонирование \"%s\" в \"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "копирование \"%s\" в \"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "создание ссылки на \"%s\" в \"%s\"\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Ошибка, выполняется выход\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "выполняется: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"Ошибка SQL-команды\n"
+"%s\n"
+"%s"
+
+#: server.c:168
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "не удалось открыть файл с версией \"%s\": %m\n"
+
+#: server.c:172
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "не удалось разобрать файл с версией \"%s\"\n"
+
+#: server.c:298
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"не удалось подключиться к главному процессу исходного сервера, запущенному "
+"командой:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"не удалось подключиться к главному процессу целевого сервера, запущенному "
+"командой:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr ""
+"программа pg_ctl не смогла запустить исходный сервер, либо к нему не удалось "
+"подключиться\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr ""
+"программа pg_ctl не смогла запустить целевой сервер, либо к нему не удалось "
+"подключиться\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памяти\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "в переменной окружения для libpq %s задано не локальное значение: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Обновление в рамках одной версии системного каталога невозможно,\n"
+"если используются табличные пространства.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "каталог табличного пространства \"%s\" не существует\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr ""
+"не удалось получить информацию о каталоге табличного пространства \"%s\": "
+"%s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "путь табличного пространства \"%s\" не указывает на каталог\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ок"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "Проверка больших объектов"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "предупреждение"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"В вашей инсталляции используются большие объекты. В новой базе данных\n"
+"имеется дополнительная таблица с правами для больших объектов. После "
+"обновления\n"
+"вам будет представлена команда для наполнения таблицы прав\n"
+"pg_largeobject_metadata правами по умолчанию.\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"В вашей инсталляции используются большие объекты. В новой базе данных\n"
+"имеется дополнительная таблица с правами для больших объектов, поэтому\n"
+"для всех больших объектов должны определяться права по умолчанию. Скрипт\n"
+" %s\n"
+"будучи выполненным администратором БД в psql, установит нужные права\n"
+"по умолчанию.\n"
+"\n"
+
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Проверка несовместимого типа данных \"line\""
+
+#: version.c:279
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных \"line"
+"\".\n"
+"В старом кластере внутренний формат и формат ввода/вывода этого типа "
+"отличается\n"
+"от нового, поэтому в настоящем состоянии обновить кластер невозможно. Вы "
+"можете\n"
+"удалить проблемные столбцы и перезапустить обновление. Список проблемных\n"
+"столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Проверка неправильных пользовательских столбцов типа \"unknown\""
+
+#: version.c:317
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных \"unknown"
+"\".\n"
+"Теперь использование этого типа данных в таблицах не допускается, поэтому\n"
+"в настоящем состоянии обновить кластер невозможно. Вы можете удалить "
+"проблемные\n"
+"столбцы и перезапустить обновление. Список проблемных столбцов приведён в "
+"файле:\n"
+" %s\n"
+"\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Проверка хеш-индексов"
+
+#: version.c:421
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"В вашей инсталляции используются хеш-индексы. Эти индексы имеют разные\n"
+"внутренние форматы в старом и новом кластерах, поэтому их необходимо\n"
+"перестроить с помощью команды REINDEX. По завершении обновления вы получите\n"
+"инструкции по выполнению REINDEX.\n"
+"\n"
+
+#: version.c:427
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"В вашей инсталляции используются хеш-индексы. Эти индексы имеют разные\n"
+"внутренние форматы в старом и новом кластерах, поэтому их необходимо\n"
+"перестроить с помощью команды REINDEX. Скрипт\n"
+" %s\n"
+"будучи выполненным администратором БД в psql, пересоздаст все неправильные\n"
+"индексы; до этого никакие хеш-индексы не будут использоваться.\n"
+"\n"
+
+#: version.c:453
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr ""
+"Проверка неправильных пользовательских столбцов типа \"sql_identifier\""
+
+#: version.c:461
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных\n"
+"\"sql_identifier\". Формат хранения таких данных на диске поменялся,\n"
+"поэтому обновить данный кластер невозможно. Вы можете удалить проблемные\n"
+"столбцы и перезапустить обновление.\n"
+"Список проблемных столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: version.c:485
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Проверка обновлённых расширений"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "замечание"
+
+#: version.c:538
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"В вашей инсталляции есть расширения, которые надо обновить\n"
+"командой ALTER EXTENSION. Скрипт\n"
+" %s\n"
+"будучи выполненным администратором БД в psql, обновит все\n"
+"эти расширения.\n"
+"\n"
+
+#~ msgid "Creating script to analyze new cluster"
+#~ msgstr "Создание скрипта для анализа нового кластера"
+
+#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+#~ msgstr ""
+#~ "проверка файла \"%s\" не пройдена: не удаётся прочитать файл (нет "
+#~ "доступа)\n"
+
+#~ msgid "connection to database failed: %s"
+#~ msgstr "не удалось подключиться к базе: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "connection to database failed: %s"
+#~ msgstr ""
+#~ "\n"
+#~ "не удалось подключиться к базе: %s"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Статистика оптимизатора и сведения о свободном месте утилитой pg_upgrade\n"
+#~ "не переносятся, поэтому, запустив новый сервер, имеет смысл выполнить:\n"
+#~ " %s\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "не удалось разобрать файл PG_VERSION из %s\n"
+
+#~ msgid ""
+#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
+#~ "because of backend API changes made during development.\n"
+#~ msgstr ""
+#~ "Эта утилита поддерживает обновление только до версии 9.0 после "
+#~ "2010-01-11,\n"
+#~ "так как в API серверной части были внесены изменения.\n"
+
+#~ msgid "Cannot open file %s: %m\n"
+#~ msgstr "Не удаётся открыть файл %s: %m\n"
+
+#~ msgid "Cannot read line %d from %s: %m\n"
+#~ msgstr "Не удалось прочитать строку %d из %s: %m\n"
+
+#~ msgid "------------------------------------------------\n"
+#~ msgstr "------------------------------------------------\n"
+
+#~ msgid "-----------------------------\n"
+#~ msgstr "-----------------------------\n"
+
+#~ msgid "------------------\n"
+#~ msgstr "------------------\n"
+
+#~ msgid "----------------\n"
+#~ msgstr "----------------\n"
diff --git a/src/bin/pg_upgrade/po/sv.po b/src/bin/pg_upgrade/po/sv.po
new file mode 100644
index 0000000..542a529
--- /dev/null
+++ b/src/bin/pg_upgrade/po/sv.po
@@ -0,0 +1,1925 @@
+# Swedish message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-04 09:33+0000\n"
+"PO-Revision-Date: 2022-08-04 12:29+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: check.c:71
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Utför konsistenskontroller på gamla live-servern\n"
+"------------------------------------------------\n"
+
+#: check.c:77
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Utför konsistenskontroller\n"
+"--------------------------\n"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Klustren är kompatibla*\n"
+
+#: check.c:227
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Om pg_upgrade misslyckas efter denna punkt så måste du\n"
+"köra om initdb på nya klustret innan du fortsätter.\n"
+
+#: check.c:272
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Optimeringsstatistik överförs inte av pg_upgrade.\n"
+"När du startar nya servern så vill du nog köra:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:278
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"När detta skript körs så raderas gamla klustrets datafiler:\n"
+" %s\n"
+
+#: check.c:283
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Kunde inte skapa ett script som raderar gamla klustrets datafiler\n"
+"då användardefinierade tabellutrymmen eller nya klustrets datakatalog\n"
+"ligger i gamla klusterkatalogen. Det gamla klustrets innehåll\n"
+"måste raderas för hand.\n"
+
+#: check.c:295
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Kontrollerar klustrets versioner"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Detta verktyg kan bara uppgradera från PostgreSQL version 8.4 eller nyare.\n"
+
+#: check.c:311
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Detta verktyg kan bara uppgradera till PostgreSQL version %s.\n"
+
+#: check.c:320
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Detta verktyg kan inte användas för att nergradera till äldre major-versioner av PostgreSQL.\n"
+
+#: check.c:325
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Gammal klusterdata och binära kataloger är från olika major-versioner.\n"
+
+#: check.c:328
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Nya klusterdata och binära kataloger är från olika major-versioner.\n"
+
+#: check.c:345
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "Vid kontroll av en gammal live-server före PG 9.1 så måste den gamla serverns portnummer anges.\n"
+
+#: check.c:349
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Vid kontroll av en live-server så måste gamla och nya portnumren vara olika.\n"
+
+#: check.c:364
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "kodning för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#: check.c:369
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_collate-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#: check.c:372
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_ctype-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#: check.c:445
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Nya databasklustret \"%s\" är inte tomt: hittade relation \"%s.%s\"\n"
+
+#: check.c:502
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Letar efter nya tablespace-kataloger i klustret"
+
+#: check.c:513
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "i klustret finns redan ny tablespace-katalog: \"%s\"\n"
+
+#: check.c:546
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"VARNING: nya datakatalogen skall inte ligga inuti den gamla datakatalogen, dvs. %s\n"
+
+#: check.c:570
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"VARNING: användardefinierade tabellutrymmens position skall inte vara i datakatalogen, dvs. %s\n"
+
+#: check.c:580
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Skapar skript för att radera gamla klustret"
+
+#: check.c:583 check.c:847 check.c:945 check.c:1075 check.c:1153 check.c:1415
+#: file.c:338 function.c:240 option.c:497 version.c:54 version.c:204
+#: version.c:376 version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "kan inte öppna fil \"%s\": %s\n"
+
+#: check.c:639
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "kan inte sätta rättigheten \"körbar\" på filen \"%s\": %s\n"
+
+#: check.c:659
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Kontrollerar att databasanvändaren är installationsanvändaren"
+
+#: check.c:675
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "databasanvändare \"%s\" är inte installationsanvändaren\n"
+
+#: check.c:686
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "kunde inte bestämma antalet användare\n"
+
+#: check.c:694
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Bara installationsanvändaren får finnas i nya klustret.\n"
+
+#: check.c:714
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Kontrollerar databasens anslutningsinställningar"
+
+#: check.c:736
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 får inte tillåta anslutningar, dvs dess pg_database.datallowconn måste vara false\n"
+
+#: check.c:746
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "Alla icke-template0-databaser måste tillåta anslutningar, dvs. deras pg_database.datallowconn måste vara true\n"
+
+#: check.c:771
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Letar efter förberedda transaktioner"
+
+#: check.c:780
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Källklustret innehåller förberedda transaktioner\n"
+
+#: check.c:782
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Målklustret innehåller förberedda transaktioner\n"
+
+#: check.c:808
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Letar efter contrib/isn med bigint-anropsfel"
+
+#: check.c:869 check.c:970 check.c:1095 check.c:1175 check.c:1232 check.c:1291
+#: check.c:1320 check.c:1438 function.c:262 version.c:278 version.c:316
+#: version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "fatalt\n"
+
+#: check.c:870
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller \"contrib/isn\"-funktioner son beror på\n"
+"datatypen bigint. Ditt gamla och nya kluster skickar bigint-värden\n"
+"på olika sätt så detta kluster kan för närvarande inte uppgraderas. Du\n"
+"kan manuellt dumpa databaser i gamla klustret som använder \"contrib/isn\"-finesser,\n"
+"radera dessa databaser, utföra uppgraderingen och sedan återställa databaserna.\n"
+"En lista med problemfunktionerna finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:893
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Letar efter användardefinierade postfix-operatorer"
+
+#: check.c:971
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller användardefinierade postfix-operatorer, vilket\n"
+"inte stöds längre. Överväg att ta bort postfix-operatorer och ersätt dem\n"
+"med prefix-operatorer eller funktionsanrrop.\n"
+"En lista med användardefinierade postfix-operatorer finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:995
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Letar efter inkompatibla polymorfa funktioner"
+
+#: check.c:1096
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller användardefinierade objekt som\n"
+"refererar till interna polymorfa funktioner med argument av\n"
+"typen \"anyarray\" eller \"anyelement\".\n"
+"Dessa användardefinierade objekt måste slängas innan uppgradering\n"
+"och kan återskapas efteråt efter att de ändrats till att referera till\n"
+"motsvarande nya funktioner med argument av typerna \"anycompatiblearray\"\n"
+"and \"anycompatible\".\n"
+"En lista med problemobjekten finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:1121
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Letar efter tabeller med WITH OIDS"
+
+#: check.c:1176
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller tabeller deklarerade med WITH OIDS som inte\n"
+"stöds längre. Överväg att ta bort oid-kolumnen med\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"En lista över tabeller med detta problem finns i filen:\n"
+" %s\n"
+"\n"
+
+# FIXME: is this msgid correct?
+#: check.c:1204
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Letar i användartabeller efter systemdefinierade typer av sorten \"composite\""
+
+#: check.c:1233
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller användartabeller med systemdefinierade typer\n"
+"av sorten \"composite\". OID:er för dessa typer är inte stabila över\n"
+"PostgreSQL-versioner så detta kluster kan inte uppgraderas för tillfället.\n"
+"Du kan slänga problemkolumnerna och återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+# FIXME: is this msgid correct?
+#: check.c:1261
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Letar efter reg*-datatyper i användartabeller"
+
+#: check.c:1292
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation använder en av reg*-datatyperna i en användartabell.\n"
+"Dessa datatyper refererar system-OID:er som inte bevaras av pg_upgrade\n"
+"så detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n"
+"problemkolumnerna och starta om uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+# FIXME: is this msgid correct?
+#: check.c:1314
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Letar efter inkompatibel \"jsonb\"-datatyp"
+
+#: check.c:1321
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller \"jsonb\"-datatypen i användartabeller.\n"
+"Interna formatet för \"jsonb\" ändrades under 9.4-betan så detta kluster kan\n"
+"för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna och\n"
+"starta om uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:1343
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Letar efter roller som startar med \"pg_\""
+
+#: check.c:1353
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Källklustret innehåller roller som startar med \"pg_\"\n"
+
+#: check.c:1355
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Målklustret innehåller roller som startar med \"pg_\"\n"
+
+#: check.c:1376
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Letar efter användardefinierade teckenkodkonverteringar"
+
+#: check.c:1439
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller användardefinierade teckenkodkonverteringar.\n"
+"Parametrar till konverteringsfunktioner ändrades i PostgreSQL 14 så\n"
+"detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n"
+"teckenkodkonverteringarna i gamla klustret och starta om uppgraderingen.\n"
+"En lista med användardefinierade teckenkodkonverteringar finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:1466
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "misslyckades med att hämta aktuell lokal\n"
+
+#: check.c:1475
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "misslyckades med att hämta systemlokalnamn för \"%s\"\n"
+
+#: check.c:1481
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "misslyckades med att återställa gamla lokalen \"%s\"\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "kunde inte hämta kontrolldata med %s: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: state-problem för databaskluster\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Källklustret stängdes ner när det var i återställningsläge. För att uppgradera så använd \"rsync\" enligt dokumentation eller stäng ner den som en primär.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Målklustret stängdes ner när det var i återställningsläge. För att uppgradera så använd \"rsync\" enligt dokumentation eller stäng ner den som en primär.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Källklustret har inte stängts ner på ett korrekt sätt.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Målklustret har inte stängts ner på ett korrekt sätt.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Källklustret saknar information om kluster-state:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Målklustret saknar information om kluster-state:\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal-problem\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: problem vid hämtning av kontrolldata\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Källklustret saknar lite kontrolldata som krävs:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Målklustret saknar lite kontrolldata som krävs:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " checkpoint nästa-XID\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " senaste checkpoint nästa-OID\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " senaster checkpoint nästa-MultiXactId\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " senaste checkpoint äldsta-MultiXactId\n"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " senaste checkpoint äldsta-XID\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " senaste checkpoint nästa-MultiXactOffset\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " första WAL-segmentet efter reset\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8 argumentöverföringsmetod\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " maximal alignment\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " blockstorlek\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " stora relationers segmentstorlek\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL-blockstorlek\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL-segmentstorlek\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " maximal identifierarlängd\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " maximalt antal indexerade kolumner\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " maximal TOAST-chunkstorlek\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " stora-objekt chunkstorlek\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " datum/tid är heltal?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " datachecksumversion\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Kan inte fortsätta utan kontrollinformation som krävs, avslutar\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"gamla och nya pg_controldata-alignments är ogiltiga eller matchar inte.\n"
+"Troligen är ett kluster en 32-bitars-installation och den andra 64-bitars\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata-blockstorlekar är ogiltiga eller matchar inte\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata maximala relationssegmentstorlekar är ogiltiga eller matchar inte\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata WAL-blockstorlekar är ogiltiga eller matchar inte\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata WAL-segmentstorlekar är ogiltiga eller matchar inte\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata maximal identifierarlängder är ogiltiga eller matchar inte\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata maxilmalt indexerade kolumner ogiltiga eller matchar inte\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata maximal TOAST-chunkstorlek ogiltiga eller matchar inte\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata stora-objekt-chunkstorlekar är ogiltiga eller matchar inte\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "gamla och nya pg_controldata datum/tid-lagringstyper matchar inte\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "gamla klustret använder inte datachecksummor men nya gör det\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "gamla klustret använder datachecksummor men nya gör inte det\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "gamla och nya klustrets pg_controldata checksumversioner matchar inte\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Lägger till \".old\"-suffix till gamla global/pg_control"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Kan inte byta namn på %s till %s.\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Om du vill starta gamla klustret så måste du ta bort\n"
+"\".old\"-suffixet från %s/global/pg_control.old.\n"
+"Detta då \"link\"-läge användes och gamla klustret kan inte\n"
+"startas på ett säkert sätt efter att nya klustret startats.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Skapar dump med globala objekt"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Skapar dump med databasscheman\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "kunde inte hämta pg_ctl versionsdata med %s: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "kunde inte läsa versionutdata för pg_ctl från %s\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "kommandot för långt\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "kunde inte öppna loggfil \"%s\": %m\n"
+
+#: exec.c:179
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*misslyckande*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Det var problem med att köra \"%s\"\n"
+
+#: exec.c:185
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Se de sista raderna i \"%s\" eller \"%s\" för\n"
+"en trolig orsak till misslyckandet.\n"
+
+#: exec.c:190
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Se de sista raderna i \"%s\" för\n"
+"en trolig orsak till misslyckandet.\n"
+
+#: exec.c:205 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "kunde inte skriva till loggfil \"%s\": %m\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "kunde inte öppna fil \"%s\" för läsning: %s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Du måste ha läs och skrivrättigheter till den aktuella katalogen.\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "kontroll av \"%s\" misslyckades: %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" är inte en katalog\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "kontroll av \"%s\" misslyckades: inte en vanlig fil\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera (rättighet saknas)\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera\n"
+
+#: exec.c:449
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "kontroll av \"%s\" misslyckades: hittade felaktig version \"%s\", förväntade \"%s\"\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "fel vid kloning av relation \"%s.%s\" (\"%s\" till \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "fel vid kloning av relation \"%s.%s\": kunde inte öppna filen \"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "fel vid kloning av relation \"%s.%s\": kunde inte skapa filen \"%s\": %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte öppna filen \"%s\": %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skapa filen \"%s\": %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte läsa filen \"%s\": %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skriva filen \"%s\": %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\" (\"%s\" till \"%s\"): %s\n"
+
+#: file.c:153
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "fel vid skapande av länk för relation \"%s.%s\" (\"%s\" till \"%s\"): %s\n"
+
+#: file.c:196
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte göra stat på file \"%s\": %s\n"
+
+#: file.c:228
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": partiell sida hittad i fil \"%s\"\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "kunde inte klona fil mellan gamla och nya datakatalogen: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "kan inte skapa fil \"%s\": %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "filkloning stöds inte på denna plattform\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"kunde inte skapa hård länk mellan gamla och nya datakatalogerna: %s\n"
+"I länk-läge måste gamla och nya datakatalogerna vara i samma filsystem.\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"Det gamla klustret har en \"plpython_call_handler\"-funktion definierad\n"
+"i \"public\"-schemat vilket är en kopia på den som definierats\n"
+"i \"pg_catalog\"-schemat. Du kan verifiera detta genom att i\n"
+"psql köra:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"\"public\"-schema-versionen av denna funktion har skapats av en\n"
+"pre-8.1-installation av plpython och måste raderas för att pg_upgrade\n"
+"skall kunna gå klart då den referar till en nu föråldrad\n"
+"\"plpython\" delad objektfil. Du kan ta bort \"public\"-schemaversionen\n"
+"av denna funktion genom att köra följande kommando:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"i varje inblandad databas:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Ta bort problemfunktionerna från gamla klustret för att fortsätta.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Kontrollerar att krävda länkbibliotek finns"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "kunde inte ladda länkbibliotek \"%s\": %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "I databas: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation refererar till laddbara bibliotek som saknas i nya\n"
+"installationen. Du kan lägga till dessa itll nya installationen eller\n"
+"ta bort funktionerna som använder dem i gamla installationen. En lista\n"
+"med problembiblioteken finns i filen:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Relationsname för OID %u i databas \"%s\" matchar inte: gammalt namn \"%s.%s\", nytt namn \"%s.%s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Misslyckades med att matcha ihop gamla och nya tabeller i databas \"%s\"\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " vilket är ett index för \"%s.%s\""
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " vilket är ett index för OID %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " vilket är TOAST-tabellen för \"%s.%s\""
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " vilket är TOAST-tabellen för OID %u"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "Ingen träff hittad i gamla klustret för ny relation med OID %u i databas \"%s\": %s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "Ingen träff hittad i nya klustret för gammal relation med OID %u i databas \"%s\": %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "avbildningar för databasen \"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u till %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"källdatabaser:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"måldatabaser:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "Databas: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relnamn: %s.%s: reloid: %u reltblutrymme: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: kan inte köras som root\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "ogiltigt gammalt portnummer\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "ogiltigt nytt portnummer\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "för många kommandoradsargument (första är \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Kör i utförligt läge\n"
+
+# FIXME: the source code need to be fixed here. it paste words together
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "gamla klusterbinärer är i"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "nya klusterbinärer är i"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "gamla klusterdatan är i"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "nya klusterdatan är i"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "uttag kommer skapas"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "kunde inte bestämma aktuell katalog\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "kan inte köra pg_upgrade inifrån nya klusterdatakatalogen i Windows\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade uppgraderar ett PostgreSQL-kluster till en annan major-version.\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [FLAGGA]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINKAT gamla klustrets katalog för körbara filer\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINKAT nya klustrets katalog för körbara filer\n"
+" (standard är samma som för pg_upgrade)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check testa klustren bara, ändra ingen data\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATAKAT gamla klustrets datakatalog\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATAKAT nya klustrets datakatalog\n"
+
+#: option.c:298
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM antal samtidiga processer eller trådar att använda\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link länka istället för att kopiera filer till nya klustret\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=FLAGGOR serverflaggor för gamla klustret\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=FLAGGOR serverflaggor för nya klustret\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT gamla klustrets portnummer (standard %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT nya klustrets portnummer (standard %d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain behåll SQL och loggfiler efter lyckad uppgradering\n"
+
+#: option.c:305
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=KAT uttagskatalog (standard är aktuell katalog.)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAMN klustrets superuser (standard \"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose slå på utförligt intern loggning\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " -clone klona istället för att kopiera filer till nya klustret\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denns hjälp, avsluta sedan\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Innan du kör pg_upgrade måste du:\n"
+" skapa ett nytt databaskluster (med nya versionens initdb)\n"
+" stänga ner den postmaster som hanterar gamla klustret\n"
+" stänga ner den postmaster som hanterar nya klustret\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"När du kör pg_upgrade måste du ange följande information:\n"
+" datakatalogen för gamla klustret (-d DATAKAT)\n"
+" datakatalogen för nya klustret (-D DATAKAT)\n"
+" \"bin\"-katalogen för gamla versionen (-b BINKAT)\n"
+" \"bin\"-katalogen för nya versionen (-B BINKAT)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Till exempel:\n"
+" pg_upgrade -d gammaltKluster/data -D nyttKluster/data -b gammaltKluster/bin -B nyttKluster/bin\n"
+"eller\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=gammaltKluster/data\n"
+" $ export PGDATANEW=nyttKluster/data\n"
+" $ export PGBINOLD=gammaltKluster/bin\n"
+" $ export PGBINNEW=nyttKluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=gammaltKluster/data\n"
+" C:\\> set PGDATANEW=nyttKluster/data\n"
+" C:\\> set PGBINOLD=gammaltKluster/bin\n"
+" C:\\> set PGBINNEW=nyttKluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Du måste identifiera katalogen där %s.\n"
+"Använd kommandoradsflaggan %s eller omgivningsvariabeln %s.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Letar efter den riktiga datakatalogen i källklustret"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Letar efter den riktiga datakatalogen för målklustret"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "kunde inte hämta datakatalogen med %s: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "kunde inte läsa rad %d från fil \"%s\": %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "användarangivet gammalt portnummer %hu korrigerat till %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "kunde inte skapa arbetsprocess: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "kunde inte skapa arbetstråd: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() misslyckades: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "barnprocess avslutade felaktigt: status %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "barnprocess avslutade felaktigt: %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "kunde inte läsa rättigheter på katalog \"%s\": %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Utför uppgradering\n"
+"------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Sätter nästa OID för nya klustret"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synkar datakatalog till disk"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Uppgradering klar\n"
+"-----------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: kunde inte hitta det egna programmets körbara fil\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Det verkar vara en postmaster igång som hanterar gamla klustret.\n"
+"Stänga ner den postmastern och försök igen.\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Det verkar vara en postmaster igång som hanterar nya klustret.\n"
+"Stänga ner den postmastern och försök igen.\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyserar alla rader i nya klustret"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Fryser alla rader i nya klustret"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Återställer globala objekt i nya klustret"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Återställer databasscheman i nya klustret\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Raderar filer från ny %s"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "kunde inte ta bort katalog \"%s\"\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopierar gammal %s till ny server"
+
+#: pg_upgrade.c:470
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Sätter äldsta XID för nya klustret"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Sätter nästa transaktions-ID och epoch för nytt kluster"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Sätter nästa multixact-ID och offset för nytt kluster"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Sätter äldsta multixact-ID i nytt kluster"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Resettar WAL-arkiv"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Sätter räknarna frozenxid och minmxid för nytt kluster"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Sätter räknarenm minmxid för nytt kluster"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "Klonar användares relationsfiler\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Kopierar användares relationsfiler\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Länkar användares relationsfiler\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "gamla databasen \"%s\" kan inte hittas i nya klustret\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "fel vid kontroll av filexistens \"%s.%s\" (\"%s\" till \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "skriver om \"%s\" till \"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "klonar \"%s\" till \"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "kopierar \"%s\" till \"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "länkar \"%s\" till \"%s\"\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Misslyckades, avslutar\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "kör: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL-kommando misslyckades\n"
+"%s\n"
+"%s"
+
+#: server.c:168
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "kunde inte öppna versionsfil \"%s\": %m\n"
+
+#: server.c:172
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "kunde inte tolka versionsfil \"%s\"\n"
+
+#: server.c:298
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"kunde inte ansluta till käll-postmaster som startats med kommandot:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"kunde inte ansluta till mål-postmaster som startats med kommandot:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl misslyckades att start källservern eller så misslyckades anslutningen\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl misslyckades att start målservern eller så misslyckades anslutningen\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq:s omgivningsvariabel %s har ett icke-lokalt servervärde: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Kan inte uppgradera till/från samma systemkatalogversion när\n"
+"man använder tablespace.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "tablespace-katalogen \"%s\" finns inte\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "kunde inte göra stat på tablespace-katalog \"%s\": %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "tablespace-sökväg \"%s\" är inte en katalog\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "Letar efter stora objekt"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "varning"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Din installation innehåller stora objekt. Den nya databasen\n"
+"har en extra rättighetstabell för stora objekt. Efter uppgradering\n"
+"kommer du ges ett kommando för att populera rättighetstabellen\n"
+"pg_largeobject_metadata med standardrättigheter.\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Din installation innehåller stora objekt. Den nya databasen har en extra\n"
+"rättighetstabell för stora onbjekt så standardrättigheter måste ges för\n"
+"alla stora objekt. Filen\n"
+" %s\n"
+"kan köras med psql av databasens superuser för att sätta\n"
+"standardrättigheter.\n"
+"\n"
+
+# FIXME: is this msgid correct?
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Letar efter inkompatibel \"line\"-datatyp"
+
+#: version.c:279
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller datatypen \"line\" i användartabeller. Denna\n"
+"datatype har ändrat sitt interna format samt sitt in/ut-format mellan din\n"
+"gamla och nya version så detta kluster kan för närvarande inte uppgraderas.\n"
+"Du kan radera problemkolumnerna och återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Letar efter ogiltiga användarkolumner av typen \"unknown\""
+
+#: version.c:317
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller datatypen \"unknown\" i användartabeller.\n"
+"Denna datatyp tillåts inte längre i tabeller så detta kluster kan\n"
+"för närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n"
+"återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Letar efter hash-index"
+
+#: version.c:421
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Din installation innehåller hash-index. Dessa index har olika internt\n"
+"format i ditt gamla och nya kluster så de måste omindexeras med\n"
+"kommandot REINDEX. Efter uppgraderingen så kommer du få\n"
+"REINDEX-instruktioner.\n"
+"\n"
+
+#: version.c:427
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Din installation innehåller hash-index. Dessa index har olika internt\n"
+"format i ditt gamla och nya kluster så de måste omindexeras med\n"
+"kommandot REINDEX. Filen\n"
+" %s\n"
+"kan köras med psql av databasens superuser och kommer återskapa alla\n"
+"ogiltiga index; innan dess så kommer inget av dess index användas.\n"
+"\n"
+
+#: version.c:453
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Letar efter ogiltiga användarkolumner av typen \"sql_identifier\""
+
+#: version.c:461
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller datatypen \"sql_identifier\" i användartabeller.\n"
+"Formatet på disk för denna datatyp har ändrats så detta kluster kan för\n"
+"närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n"
+"återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+#: version.c:485
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Letar efter uppdatering av utökningar"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "notis"
+
+#: version.c:538
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"Din installation innehåller utökningar som skall updateras med kommandot\n"
+"ALTER EXTENSION. Filen\n"
+" %s\n"
+"kan köras med psql av databasens superuser och kommer uppdatera\n"
+"dessa utökningar.\n"
diff --git a/src/bin/pg_upgrade/po/tr.po b/src/bin/pg_upgrade/po/tr.po
new file mode 100644
index 0000000..db725cf
--- /dev/null
+++ b/src/bin/pg_upgrade/po/tr.po
@@ -0,0 +1,1666 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Abdullah GÜLNER <agulner@gmail.com>, 2017, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2019-04-02 07:45+0000\n"
+"PO-Revision-Date: 2021-09-16 09:42+0200\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: \n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: check.c:66
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Eski Canlı Sunucuda Tutarlılık Testleri Gerçekleştirliyor\n"
+"------------------------------------------------\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Tutarlılık Testleri Gerçekleştiriliyor\n"
+"-----------------------------\n"
+
+#: check.c:166
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Cluster'lar uyumlu*\n"
+
+#: check.c:172
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Eğer pg_upgrade bu noktadan sonra başarısız olursa,\n"
+"devam etmeden önce yeni cluster'da tekrar initdb yapılmalıdır.\n"
+
+#: check.c:208
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade so,\n"
+"once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Eniyileyici (optimizer) istatistikleri pg_upgrade tarafından aktarılmadığından\n"
+"yeni sunucuyu başlattığınızda, %s\n"
+"çalıştırmanız önerilir.\n"
+"\n"
+
+#: check.c:213
+#, c-format
+msgid ""
+"Optimizer statistics and free space information are not transferred\n"
+"by pg_upgrade so, once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Eniyileyici (optimizer) istatistikleri ve boş alan bilgisi pg_upgrade\n"
+"tarafından aktarılmadığından, yeni sunucuyu başlattığınızda \n"
+"%s çalıştırmanız önerilir\n"
+"\n"
+
+#: check.c:220
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Bu betiğin (script) çalıştırılması eski cluster'ın veri dosyalarını silecektir:\n"
+" %s\n"
+
+#: check.c:225
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Eski kümenin (cluster) veri dosyalarını silecek betik (script) oluşturulamadı;\n"
+"çünkü eski kümenin dizininde kullanıcı-tanımlı tablespace'ler veya \n"
+"yeni kümenin veri dizini bulunuyor. Eski kümeye ait içerikler\n"
+"elle silinmeli.\n"
+
+#: check.c:235
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Cluster sürümleri kontrol ediliyor"
+
+#: check.c:247
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Bu uygulama sadece PostgreSQL 8.4 ve sonraki sürümlerden yükseltme yapabilir.\n"
+
+#: check.c:251
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Bu uygulama sadece PostgreSQL'in %s sürümüne yükseltme yapabilir.\n"
+
+#: check.c:260
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "pg-upgrade uygulaması daha eski ana PostgreSQL sürümlerine geçiş için kullanılamaz.\n"
+
+#: check.c:265
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Eski kümenin (cluster) veri ve ikili (binary) dizinleri farklı ana sürümlerden.\n"
+
+#: check.c:268
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Yeni küme (cluster) veri ve ikili (binary) dizinleri farklı ana (major) sürümlerden.\n"
+
+#: check.c:285
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "PG 9.1 öncesi eski bir canlı sunucu kontrol edildiğinde, eski sunucunun port numarasını belirtmelisiniz.\n"
+
+#: check.c:289
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Canlı bir sunucu kontrol edilirken, eski ve yeni port numaraları farklı olmalı.\n"
+
+#: check.c:304
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "\"%s\" veritabanı için dil kodlaması eşleşmiyor: eskisi \"%s\", yenisi \"%s\"\n"
+
+#: check.c:309
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "\"%s\" veritabanı için lc_collate değerleri eşleşmiyor: eskisi \"%s\", yenisi \"%s\"\n"
+
+#: check.c:312
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "\"%s\" veritabanı için lc_ctype değerleri eşleşmiyor: eskisi \"%s\", yenisi \"%s\"\n"
+
+#: check.c:385
+#, c-format
+msgid "New cluster database \"%s\" is not empty\n"
+msgstr "Yeni cluster veritabanı \"%s\" boş değil\n"
+
+#: check.c:432
+#, c-format
+msgid "Creating script to analyze new cluster"
+msgstr "Yeni kümeyi (cluster) analiz etmek için betik (script) oluşturuluyor "
+
+#: check.c:446 check.c:574 check.c:838 check.c:949 check.c:1040 function.c:253
+#: option.c:480 version.c:57 version.c:156 version.c:257 version.c:339
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "\"%s\" dosyası açılamadı: %s\n"
+
+#: check.c:501 check.c:630
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "\"%s\" dosyasına çalıştırma (execute) izni eklenemedi: %s\n"
+
+#: check.c:537
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"UYARI: yeni veri dizini eski veri dizini içinde olmamalı, örn. %s\n"
+
+#: check.c:561
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"UYARI: kullanıcı-tanımlı tablespace lokasyonları veri dizini içinde olmamalıdır, örn. %s\n"
+
+#: check.c:571
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Eski kümeyi (cluster) silmek için betik (script) oluşturuluyor."
+
+#: check.c:650
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Veritabanı kullanıcısının kurulum kullanıcısı olup olmadığı kontrol ediliyor"
+
+#: check.c:666
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "Veritabanı kullanıcısı \"%s\" kurulum kullanıcısı değil\n"
+
+#: check.c:677
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "kullanıcı sayısı belirlenemedi\n"
+
+#: check.c:685
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Yeni kümede (cluster) sadece kurulum kullanıcısı tanımlanabilir\n"
+
+#: check.c:705
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Veritabanı bağlantı ayarları kontrol ediliyor"
+
+#: check.c:727
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 bağlantıya izin vermemeli, yani pg_database.datallowconn değeri \"false\" olmalı\n"
+
+#: check.c:737
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "template0 dışındaki tüm veritabanları bağlantıya izin vermeli, yani pg_database.datallowconn değerleri \"true\" olmalı\n"
+
+#: check.c:762
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Hazırlanmış işlemler (prepared transaction) için kontrol gerçekleştiriliyor"
+
+#: check.c:771
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Kaynak küme (cluster) hazırlanmış işlemler (prepared transaction) içeriyor\n"
+
+#: check.c:773
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Hedef küme(cluster) hazırlanmış işlemler içeriyor\n"
+
+#: check.c:799
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "bigint-geçirme uyuşmazlığı olan contrib/isn için denetim gerçekleştiriliyor"
+
+#: check.c:860 check.c:972 check.c:1063 function.c:268 version.c:179
+#: version.c:280
+#, c-format
+msgid "fatal\n"
+msgstr "ölümcül (fatal)\n"
+
+#: check.c:861
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually upgrade databases that use \"contrib/isn\" facilities and remove\n"
+"\"contrib/isn\" from the old cluster and restart the upgrade. A list of\n"
+"the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuz bigint veri tipine dayalı \"contrib/isn\" fonksiyonları\n"
+"içeriyor. Eski ve yeni kümeleriniz (cluster) bigint değerlerini farklı\n"
+"geçirdiğinden bu küme şu anda yükseltilemiyor. \"contrib/isn\" imkanlarını\n"
+"kullanan veritabanlarını \"contrib/isn\" yi eski kümeden çıkartarak\n"
+" elle yükseltebilir ve yükseltmeyi tekrar başlatabilirsiniz.\n"
+"Problemli fonksiyonların bir listesi aşağıdaki dosyadadır:\n"
+" %s\n"
+"\n"
+
+#: check.c:893
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Kullanıcı tablolarındaki reg* veri tipleri için kontrol yapılıyor"
+
+#: check.c:973
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuz kullanıcı tablolarında reg* veri tiplerinden birini kullanıyor.\n"
+"Bu veri tipleri pg_upgrade tarafından korunmayan sistem OID'lerine referans\n"
+"veriyor, dolayısıyla bu küme şu anda yükseltilemiyor. Sorunlu tabloları\n"
+"çıkartıp yükseltmeyi yeniden başlatabilirsiniz. Sorunlu sütunların listesi\n"
+"aşağıdaki dosyadadır:\n"
+" %s\n"
+"\n"
+
+#: check.c:998
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Uyumlu olmayan (incompatible) \"jsonb\" veri tipi için kontrol gerçekleştiriliyor"
+
+#: check.c:1064
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade. A list\n"
+"of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kullanıcı tablolarınızda \"jsonb\" veri tipi içeren alanlar bulunmaktadır.\n"
+"9.4 beta ile birlikte \"jsonb\" iç formatı değiştiğinden bu küme (cluster) şu anda\n"
+"yükseltilemiyor. Sorunlu tabloları çıkartarak (remove) yükseltmeyi tekrar \n"
+"başlatabilirsiniz. Problemli sütunların bir listesini şu dosyada bulabilirsiniz:\n"
+"%s\n"
+
+#: check.c:1085
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "\"pg_\" ie başlayan roller için kontrol gerçekleştiriliyor"
+
+#: check.c:1095
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Kaynak küme (cluster) \"pg_\" ile başlayan roller içeriyor\n"
+
+#: check.c:1097
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Hedef küme (cluster) \"pg_\" ile başlayan roller içeriyor\n"
+
+#: check.c:1123
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "geçerli yerel ayarları (locale) almakta başarısız olundu\n"
+
+#: check.c:1132
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "\"%s\" için sistem yerel ayarlarını (locale) almakta başarısız olundu\n"
+
+#: check.c:1138
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "Eski \"%s\" yerel ayarlarını (locale) geri yüklemekte başarısız olundu\n"
+
+#: controldata.c:128 controldata.c:195
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "%s kullanılarak kontrol verisi alınamadı: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: veritabanı kümesini durumu ile ilgili sorun\n"
+
+#: controldata.c:156
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Kaynak küme kurtarma (recovery) modunda iken kapatıldı. Yükseltmek için, belgelerde açıklandığı gibi \"rsync\" kullanın ya da birincil (primary) sunucu olarak kapatın.\n"
+
+#: controldata.c:158
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Hedef küme kurtarma (recovery) modunda iken kapatıldı. Yükseltmek için, belgelerde açıklandığı gibi \"rsync\" kullanın ya da birincil (primary) sunucu olarak kapatın.\n"
+
+#: controldata.c:163
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Kaynak küme düzgün bir şekilde kapatılmamış.\n"
+
+#: controldata.c:165
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Hedef küme düzgün bir şekilde kapatılmamış.\n"
+
+#: controldata.c:176
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Kaynak kümede (cluster) küme durumu bilgisi eksik:\n"
+
+#: controldata.c:178
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Hedef kümede (cluster) küme durumu bilgisi eksik:\n"
+
+#: controldata.c:208 dump.c:51 pg_upgrade.c:333 pg_upgrade.c:370
+#: relfilenode.c:244 util.c:80
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:215
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal sorunu\n"
+
+#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257
+#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309
+#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345
+#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382
+#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426
+#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470
+#: controldata.c:481
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: controldata alma (retrieval) sorunu\n"
+
+#: controldata.c:546
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Kaynak kümede (cluster) bazı gerekli kontrol bilgileri eksik:\n"
+
+#: controldata.c:549
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Hedef kümede (cluster) bazı gerekli kontrol bilgileri eksik:\n"
+
+#: controldata.c:552
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " sonraki XID kontrol noktası (checkpoint)\n"
+
+#: controldata.c:555
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " sonraki OID en son kontrol noktası (checkpoint)\n"
+
+#: controldata.c:558
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " sonraki MultiXactId en son kontrol noktası (checkpoint)\n"
+
+#: controldata.c:562
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " En eski MultiXactId en son kontrol noktası (checkpoint)\n"
+
+#: controldata.c:565
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " sonraki MultiXactOffset en son kontrol noktası\n"
+
+#: controldata.c:568
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " sıfırlama (reset) sonrası ilk WAL kesimi (segment)\n"
+
+#: controldata.c:571
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8 argumanı geçirme yöntemi\n"
+
+#: controldata.c:574
+#, c-format
+msgid " maximum alignment\n"
+msgstr " azami hizalanma (max alignment)\n"
+
+#: controldata.c:577
+#, c-format
+msgid " block size\n"
+msgstr " blok boyutu (block size)\n"
+
+#: controldata.c:580
+#, c-format
+msgid " large relation segment size\n"
+msgstr " büyük ilişki (relation) kesimi (segment) boyutu\n"
+
+#: controldata.c:583
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL blok boyutu (block size)\n"
+
+#: controldata.c:586
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL kesim boyutu (segment size)\n"
+
+#: controldata.c:589
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " azami tanımlayıcı (identifier) uzunluğu\n"
+
+#: controldata.c:592
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " azami indeksli sütun sayısı\n"
+
+#: controldata.c:595
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " azami TOAST yığın (chunk) boyutu\n"
+
+#: controldata.c:599
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " büyük-nesne yığın (chunk) boyutu\n"
+
+#: controldata.c:602
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " tarih/saat değerleri tamsayı mı?\n"
+
+#: controldata.c:606
+#, c-format
+msgid " data checksum version\n"
+msgstr " veri sağlama (checksum) sürümü\n"
+
+#: controldata.c:608
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Gerekli kontrol bilgisi olmadan devam edilemez, sonlandırılıyor\n"
+
+#: controldata.c:623
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"eski ve yeni pg_controldata hizalamaları (alignment) ya geçersiz ya da eşleşmiyor\n"
+"Muhtemelen bir küme 32-bit diğeri 64-bit kurulumları\n"
+
+#: controldata.c:627
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata hizalamaları (alignment) ya geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:630
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami ilişki (relation) kesim (segment) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:633
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata WAL blok boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:636
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata WAL kesim (segment) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:639
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami tanımlayıcı uzunlukları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:642
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami indeksli sütunları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:645
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami TOAST yığın (chunk) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:650
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata büyük-nesne (large-obj.) yığın (chunk) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:653
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "eski ve yeni pg_controldata tarih/saat saklama tipleri geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:666
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "eski küme veri sağlamaları (checksum) kullanmıyorken yenisi kullanıyor\n"
+
+#: controldata.c:669
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "eski küme veri sağlamaları (checksum) kullanıyorken yenisi kullanmıyor\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "eski ve yeni küme (cluster) pg_controldata sağlama sürümleri geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:682
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "eski global/pg_control'e \".old\" soneki ekleniyor"
+
+#: controldata.c:687
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "%s ismi %s'ye değiştirilemiyor.\n"
+
+#: controldata.c:690
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Eski kümeyi (cluster) başlatmak istiyorsanız, \".old\" sonekini\n"
+"%s/global/pg_control.old 'dan çıkartmanız gerekecektir.\n"
+"\"link\" kipi (mode) kullanıldığından, bir kere yeni küme başlatıldığında\n"
+"eski küme güvenle başlatılamaz.\n"
+"\n"
+
+#: dump.c:22
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Global nesnelerin dökümü (dump) oluşturuluyor"
+
+#: dump.c:33
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Veritabanı şemalarının dökümü (dump) oluşturuluyor\n"
+
+#: exec.c:44
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "%s kullanılarak pg_ctl sürüm verisi alınamadı: %s\n"
+
+#: exec.c:50
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "%s den pg_ctl sürüm çıktısı alınamadı\n"
+
+#: exec.c:104 exec.c:108
+#, c-format
+msgid "command too long\n"
+msgstr "çok uzun komut\n"
+
+#: exec.c:110 util.c:38 util.c:226
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:149 exec.c:204 option.c:101 option.c:217
+#, c-format
+msgid "could not write to log file \"%s\"\n"
+msgstr "\"%s\" günlük (log) dosyasına yazılamadı\n"
+
+#: exec.c:178
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*hata*"
+
+#: exec.c:181
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "\"%s\"nin çalıştırılmasında sorunlar oluştu\n"
+
+#: exec.c:184
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Hatanın muhtemel sebebi için \"%s\" veya \n"
+"\"%s\"nin son bir kaç satırına bakınız.\n"
+
+#: exec.c:189
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Hatanın muhtemel sebebi için \"%s\" nin\n"
+"son bir kaç satırına bakınız.\n"
+
+#: exec.c:230
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "\"%s\" dosyası okuma için açılamadı: %s\n"
+
+#: exec.c:257
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Geçerli dizinde okuma ve yazma erişiminiz olmalı.\n"
+
+#: exec.c:310 exec.c:372 exec.c:427
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "\"%s\" kontrolü aksadı: %s\n"
+
+#: exec.c:313 exec.c:375
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" bir dizin değil\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr ""
+"\"%s\" kontrolü hata verdi: normal bir dosya değil\n"
+" \n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+msgstr "\"%s\" kontrolü hata verdi: dosya okunamıyor (izin yok)\n"
+
+#: exec.c:450
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "\"%s\" kontrolü hata verdi: çalıştırılamıyor (izin yok)\n"
+
+#: file.c:44 file.c:147
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyası açılamadı: %s\n"
+
+#: file.c:49 file.c:156
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyası oluşturulamadı: %s\n"
+
+#: file.c:63 file.c:180
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyası okunamadı: %s\n"
+
+#: file.c:75 file.c:258
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyasına yazılamadı: %s\n"
+
+#: file.c:89
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu (\"%s\" \"%s\"ye): %s\n"
+
+#: file.c:108
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" ilişkisi için bağlantı oluşturulurken hata oluştu (\"%s\" \"%s\"ye): %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyasının durumu görüntülenemiyor (stat) : %s\n"
+
+#: file.c:183
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyasında kısmi (partial) sayfa (page) bulundu\n"
+
+#: file.c:284
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"eski ve yeni veri dizinleri arasında sabit bağlantı (hard link) oluşturulamadı: %s\n"
+"Bağlantı kipinde eski ve yeni veri dizinleri aynı dosya sisteminde olmalı.\n"
+
+#: function.c:110
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"Eski kümenin \"public\" şemasında tanımlı bir \"plpython_call_handler\"\n"
+"fonksiyonu var ki bunun bir kopyası da \"pg_catalog\" şemasında da tanımlı.\n"
+"Bunu teyit etmek için psql'de şunu çalıştırabilirsiniz:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"Bu fonksiyonun \"public\" şemasındaki sürümü plpython'un 8.1 öncesi bir\n"
+"kurulumu tarafından oluşturulmuş, ve eski \"plpython\" paylaşımlı nesne \n"
+"dosyasına referans verdiği için pg_upgrade'in tamamlanması için \n"
+"kaldırılmalıdır. Bu fonksiyonun \"public\" şemasınaki sürümünü etkilenen\n"
+"bütün veritabanlarında aşağıdaki komutu çalıştırarak kaldırabilirsiniz:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+
+#: function.c:128
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:138
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Devam etmek için problemli fonksiyonları çıkartınız (remove).\n"
+
+#: function.c:211
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Gereken kütüphanelerin varlığı kontrol ediliyor"
+
+#: function.c:255
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "\"%s\" kütüphanesi yüklenemedi: %s"
+
+#: function.c:269
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Eski kurulumunuz yenisinde eksik olan yüklenebilir kütüphanelere referans\n"
+"veriyor. Bu kütüphaneleri yeni kuruluma ekleyebilir, ya da bunları kullanan\n"
+"fonksiyonları eski kurulumdan çıkarabilirsiniz. Sorunlu kütüphanelerin bir\n"
+"listesi aşağıdaki dosyadadır:\n"
+" %s\n"
+"\n"
+" \n"
+
+#: info.c:133
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "%u OID'si için \"%s\" veritabanındaki ilişki isimleri eşleşmiyor: eski isim \"%s.%s\", yeni isim \"%s.%s\"\n"
+
+#: info.c:153
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "\"%s\" veritabanında eski ve yeni tabloların eşleştirilmesi başarısız oldu\n"
+
+#: info.c:242
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " \"%s.%s\" üzerinde bir indeks "
+
+#: info.c:252
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " %u OID'li nesne üzerinde bir indeks"
+
+#: info.c:264
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " \"%s.%s\" için TOAST tablosu"
+
+#: info.c:272
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " %u OID'li nesne için TOAST tablosu"
+
+#: info.c:276
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "%u OID li yeni ilişki (relation) için eski kümede (cluster) karşılık bulunamadı (veritabanı: \"%s): %s\n"
+
+#: info.c:279
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "%u OID li eski ilişki (relation) için yeni kümede (cluster) karşılık bulunamadı (veritabanı: \"%s): %s\n"
+
+#: info.c:291
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "\"%s\" veritabanı için eşleştrimeler:\n"
+
+#: info.c:294
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u yu %uya\n"
+
+#: info.c:299 info.c:638
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"kaynak veritabanları:\n"
+
+#: info.c:326
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"hedef veritabanları:\n"
+
+#: info.c:636
+#, c-format
+msgid "Database: %s\n"
+msgstr "Veritabanı: %s\n"
+
+#: info.c:649
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:98
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: root kullanıcısyla çalıştırılamaz\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid old port number\n"
+msgstr "geçersiz eski port numarası\n"
+
+#: option.c:180
+#, c-format
+msgid "invalid new port number\n"
+msgstr "geçersiz yeni port numarası\n"
+
+#: option.c:202
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Verbose kipte çalışıyor\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın\n"
+
+#: option.c:242
+msgid "old cluster binaries reside"
+msgstr "eski küme ikili dosyaları bulunmakta"
+
+#: option.c:244
+msgid "new cluster binaries reside"
+msgstr "yeni küme ikili dosyaları bulunmakta"
+
+#: option.c:246
+msgid "old cluster data resides"
+msgstr "eski küme verisi bulunmakta"
+
+#: option.c:248
+msgid "new cluster data resides"
+msgstr "yeni küme verisi bulunmakta"
+
+#: option.c:265 option.c:462
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "geçerli dizin belirlenemedi\n"
+
+#: option.c:268
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "pg_upgrade, Windows üzerindeki yeni küme (cluster) veri dizini içerisinden çalıştırılamıyor\n"
+
+#: option.c:277
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade bir PostgreSQL kümesini (cluster) farklı bir ana sürüme yükseltir.\n"
+"\n"
+
+#: option.c:278
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: option.c:279
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [SEÇENEK]...\n"
+"\n"
+
+#: option.c:280
+#, c-format
+msgid "Options:\n"
+msgstr "Seçenekler:\n"
+
+#: option.c:281
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR eski küme (cluster) için çalıştırılabilir (executable) dizini\n"
+
+#: option.c:282
+#, c-format
+msgid " -B, --new-bindir=BINDIR new cluster executable directory\n"
+msgstr " -B, --new-bindir=BINDIR yeni küme (cluster) çalıştırılabilir (executable) dizini\n"
+
+#: option.c:283
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check sadece kümeleri (cluster) kontrol et, veri değişikliği yapma\n"
+
+#: option.c:284
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR eski küme (cluster) veri dizini\n"
+
+#: option.c:285
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR yeni küme (cluster) veri dizini\n"
+
+#: option.c:286
+#, c-format
+msgid " -j, --jobs number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs kullanılacak eşzamanlı süreç veya iş parçacığı (thread) sayısı\n"
+
+#: option.c:287
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link dosyaları yeni kümeye (cluster) kopyalama yerine bağlantılandır\n"
+
+#: option.c:288
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS sunucuya geçirilecek eski küme (cluster) seçenekleri\n"
+
+#: option.c:289
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS sunucuya geçirilecek yeni küme (cluster) seçenekleri\n"
+
+#: option.c:290
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT eski küme port numarası (varsayılan %d)\n"
+
+#: option.c:291
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT yeni küme port numarası (varsayılan %d)\n"
+
+#: option.c:292
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain başarılı işlem sonrası SQL ve log dosyalarını tut\n"
+
+#: option.c:293
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME küme (cluster) superuser'ı (varsayılan \"%s\") \n"
+
+#: option.c:294
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose açıklamalı (verbose) dahili loglamayı etkinleştir\n"
+
+#: option.c:295
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini görüntüle, sonrasında çık\n"
+
+#: option.c:296
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonrasında çık\n"
+
+#: option.c:297
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade 'i çalıştırmadan önce yapılması gerekenler:\n"
+" (initdb'nin yeni sürümünü kullanarak) yeni bir veritabanı kümesi (cluster) oluşturmak\n"
+" eski kümeye hizmet veren postmaster'ı kapatmak\n"
+" yeni kümeye hizmet veren postmaster'ı kapatmak\n"
+
+#: option.c:302
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade çalıştırdığınızda, aşağıdaki bilgileri sağlamalısınız:\n"
+" eski küme için veri dizini (-d DATADIR)\n"
+" yeni küme için veri dizini (-D DATADIR)\n"
+" eski sürüm için \"bin\" dizini (-b BINDIR)\n"
+" yeni sürüm için \"bin\" dizini (-B BINDIR)\n"
+
+#: option.c:308
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Örnek:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"veya\n"
+"\n"
+"\n"
+
+#: option.c:313
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:319
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:325
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: option.c:358
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"%s'nin olduğu dizini belirtmelisiniz.\n"
+"Lütfen %s komut-satırı seçeneğini ya da %s ortam değişkenini kullanınız.\n"
+
+#: option.c:409
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Kaynak küme (cluster) için gerçek veri dizini bulunuyor"
+
+#: option.c:411
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Hedef küme (cluster) için gerçek veri dizini bulunuyor"
+
+#: option.c:423
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "%s kullanılarak veri dizini alınamadı: %s\n"
+
+#: option.c:488
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "%d satırı, \"%s\" dosyasından okunamadı: %s\n"
+
+#: option.c:506
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "kullanıcı tarafından sağlanan eski port numarası%hu %hu olarak düzeltildi\n"
+
+#: parallel.c:128 parallel.c:241
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "işçi süreci yaratılamadı: %s\n"
+
+#: parallel.c:147 parallel.c:262
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "işçi threadi yaratılamadı: %s\n"
+
+#: parallel.c:305
+#, c-format
+msgid "waitpid() failed: %s\n"
+msgstr "waitpid() başarısız oldu: %s\n"
+
+#: parallel.c:309
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "alt süreç (child process) olağan dışı olarak sonlandı: durum %d\n"
+
+#: parallel.c:324
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "Alt işçi (child worker) olağan dışı olarak sonlandı: %s\n"
+
+#: pg_upgrade.c:106
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "\"%s\" dizininin erişim hakları okunamıyor: %s\n"
+
+#: pg_upgrade.c:123
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Yükseltme (upgrade) gerçekleştiriliyor\n"
+"----------------------------------\n"
+
+#: pg_upgrade.c:166
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Yeni küme (cluster) için sonraki OID belirleniyor"
+
+#: pg_upgrade.c:173
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Veri dizinini diske eşzamanla (sync)"
+
+#: pg_upgrade.c:185
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Yükseltme (upgrade) tamamlandı\n"
+"----------------------------\n"
+
+#: pg_upgrade.c:231
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Eski kümeye (cluster) hizmet veren bir postmaster var görünüyor.\n"
+"Lütfen o postmaster'ı kapatıp tekrar deneyin.\n"
+
+#: pg_upgrade.c:244
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Yeni kümeye (cluster) hizmet veren bir postmaster var görünüyor.\n"
+"Lütfen o postmaster'ı kapatıp tekrar deneyin.\n"
+
+#: pg_upgrade.c:250
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: çalıştırılabilir dosya bulunamadı\n"
+
+#: pg_upgrade.c:267
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Yeni cluster daki tüm satırlar (row) analiz ediliyor."
+
+#: pg_upgrade.c:280
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Yeni cluster daki tüm satırlar donduruluyor."
+
+#: pg_upgrade.c:300
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Yeni kümede (cluster) global objeler geri yükleniyor (restore)"
+
+#: pg_upgrade.c:315
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Yeni kümede (cluster) veritabanı şemaları geri yükleniyor\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "yeni %s deki dosyalar siliniyor"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "%s dizini silinemedi\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Eski %s yeni sunucuya kopyalanıyor"
+
+#: pg_upgrade.c:471
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Yeni küme (cluster) için sonraki işlem (transaction) ID ve dönem değeri belirleniyor."
+
+#: pg_upgrade.c:501
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Yeni kümede (cluster) sonraki multixact ID değeri ve göreli konum değeri (offset) belirleniyor"
+
+#: pg_upgrade.c:525
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Yeni kümede (cluster) en eski multixact ID değeri belirleniyor"
+
+#: pg_upgrade.c:545
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL arşivleri sıfırlanıyor (reset)"
+
+#: pg_upgrade.c:588
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Yeni kümede (cluster) frozenxid ve minmxid sayaçları belirleniyor"
+
+#: pg_upgrade.c:590
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Yeni kümede (cluster) minmxid sayacı belirleniyor"
+
+#: relfilenode.c:34
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Kullanıcı ilişki dosyaları bağlantılanıyor\n"
+
+#: relfilenode.c:36
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Kullanıcı ilişki dosyaları kopyalanıyor\n"
+
+#: relfilenode.c:110
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "eski veritabanı \"%s\" yeni kümede (cluster) bulunmuyor\n"
+
+#: relfilenode.c:231
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "dosya varlığını kontrol sırasında hata oluştu \"%s.%s\" (\"%s\"yi \"%s\"ye): %s\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "\"%s\", \"%s\"ye yeniden yazılıyor\n"
+
+#: relfilenode.c:255
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "\"%s\", \"%s\"ye kopyalanıyor\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "\"%s\", \"%s\" ye bağlantılanıyor\n"
+
+#: server.c:34
+#, c-format
+msgid "connection to database failed: %s"
+msgstr "veritabanına bağlantı başarısız oldu: %s"
+
+#: server.c:40 server.c:142 util.c:136 util.c:166
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Başarısız, çıkılıyor\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "çalıştırılıyor: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL komutu çalıştırılamadı\n"
+"%s\n"
+"%s"
+
+#: server.c:168
+#, c-format
+msgid "could not open version file: %s\n"
+msgstr "sürüm dosyası açılamadı: %s\n"
+
+#: server.c:172
+#, c-format
+msgid "could not parse PG_VERSION file from %s\n"
+msgstr "PG_VERSION dosyası %s den ayrıştırılamadı (parse)\n"
+
+#: server.c:295
+#, c-format
+msgid ""
+"\n"
+"connection to database failed: %s"
+msgstr ""
+"\n"
+"veritabanına bağlantı başarısız oldu: %s"
+
+#: server.c:300
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"aşağıdaki komutla başlatılan kaynak postmaster'a bağlanılamadı:\n"
+"%s\n"
+
+#: server.c:304
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"aşağıdaki komutla başlatılan hedef postmaster'a bağlanılamadı:\n"
+"%s\n"
+
+#: server.c:318
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl kaynak sunucuyu başlatmakta başarısız oldu, ya da bağlantı başarısız\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl hedef sunucuyu başlatmakta başarısız oldu, ya da bağlantı başarısız\n"
+
+#: server.c:365
+#, c-format
+msgid "out of memory\n"
+msgstr "bellek yetersiz\n"
+
+#: server.c:378
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "%s libpq ortam değişkeni yerel olmayan (non-local) bir sunucu değerine sahip: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Tablespace'ler kullanıldığında aynı sistem katalog sürümüne/sürümünden\n"
+"yükseltme yapılamaz.\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "tablespace için \"%s\" dizini mevcut değil\n"
+
+#: tablespace.c:91
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "\"%s\" tablesapace dizininin durumu görüntülenemedi (stat): %s\n"
+
+#: tablespace.c:96
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "tablespace için verilen \"%s\" yolu bir dizin değil\n"
+
+#: util.c:50
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:83
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:175
+#, c-format
+msgid "ok"
+msgstr "tamam"
+
+#: version.c:32
+#, c-format
+msgid "Checking for large objects"
+msgstr "Büyük nesneler (large objects) için kontrol yapılıyor"
+
+#: version.c:80 version.c:382
+#, c-format
+msgid "warning"
+msgstr "uyarı"
+
+#: version.c:82
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda büyük nesneler mevcut. Yeni veritabanının\n"
+"ilave bir büyük nesne yetkilendirme tablosu var. Yükseltme sonrası,\n"
+"size pg_largeobjet_metadata tablosunu varsayılan yetkilerle\n"
+" doldurmak için bir komut verilecek.\n"
+"\n"
+" \n"
+
+#: version.c:88
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda büyük nesneler mevcut. Yeni veritabanının\n"
+"ilave bir büyük nesne yetkilendirme tablosu var, yani bütün büyük\n"
+"nesneler için varsayılan yetkiler tanımlanmalı. Aşağıdaki dosya:\n"
+" %s\n"
+"psql'de veritabanı superuser'ı tarafından çalıştırıldığında varsayılan yetkileri ayarlayacak.\n"
+"\n"
+"\n"
+"\n"
+
+#: version.c:118
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Uyumlu olmayan \"line\" veri tipi için kontrol yapılıyor"
+
+#: version.c:180
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables. This\n"
+"data type changed its internal and input/output format between your old\n"
+"and new clusters so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuzda kullanıcı tablolarında \"line\" veri tipi mevcut. Bu \n"
+"veri tipi, girdi/çıktı formatı eski ve yeni sürümler arasında değişiklik\n"
+"gösterdiği için bu küme şu anda yükseltilemiyor. Sorunlu tabloları\n"
+"çıkartıp yükseltmeyi tekrar başlatabilirsiniz. Problemli sütunları \n"
+"aşağıdaki dosyada bulabilirsiniz:\n"
+" %s\n"
+"\n"
+"\n"
+
+#: version.c:215
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Geçersiz \"bilinmeyen\" kullanıcı sütunları için kontrol yapılıyor"
+
+#: version.c:281
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables. This\n"
+"data type is no longer allowed in tables, so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuz kullanıcı tablolarında \"unknown\" veri tipini içeriyor. Bu veri tipi\n"
+"tablolarda artık kullanılamadığından, bu küme (cluster) şu anda yüksletilemez\n"
+"Problemli tabloları çıkartarak (remove) yükseltmeyi tekrar başlatabilirsiniz.\n"
+"Problemli alanların bir listesini şu dosya içinde bulabilirsiniz:\n"
+" %s\n"
+"\n"
+
+#: version.c:304
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Hash indeksler kontrol ediliyor"
+
+#: version.c:384
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda hash indeksler mevcut. Bu indeksler eski ve yeni \n"
+"kümelerinizde farklı dahili formatlara sahip, bu yüzden REINDEX \n"
+"komutuyla tekrar indekslemelisiniz. Yükseltme sonrası size \n"
+"REINDEX talimatları verilecek.\n"
+"\n"
+"\n"
+
+#: version.c:390
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda hash indeksler mevcut. Bu indeksler eski ve yeni \n"
+"kümelerinizde farklı dahili formatlara sahip, bu yüzden REINDEX \n"
+"komutuyla tekrar indekslemelisiniz. Aşağıdaki dosya:\n"
+" %s\n"
+"psql'de veritabanı superuser'ı tarafından çalıştırıldığında bütün geçersiz\n"
+"indeksleri yeniden oluşturacak; o zamana kadar bu indeksler kullanılmayacak.\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/uk.po b/src/bin/pg_upgrade/po/uk.po
new file mode 100644
index 0000000..691969c
--- /dev/null
+++ b/src/bin/pg_upgrade/po/uk.po
@@ -0,0 +1,1721 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-03-16 09:17+0000\n"
+"PO-Revision-Date: 2022-06-19 10:10\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_14_STABLE/pg_upgrade.pot\n"
+"X-Crowdin-File-ID: 778\n"
+
+#: check.c:70
+#, c-format
+msgid "Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr "Перевірка цілістності на старому працюючому сервері\n"
+"------------------------------------------------\n"
+
+#: check.c:76
+#, c-format
+msgid "Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr "Проведення перевірок цілістності\n"
+"-----------------------------\n"
+
+#: check.c:213
+#, c-format
+msgid "\n"
+"*Clusters are compatible*\n"
+msgstr "\n"
+"*Кластери сумісні*\n"
+
+#: check.c:219
+#, c-format
+msgid "\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr "\n"
+"Якщо робота pg_upgrade після цієї точки перерветься, вам потрібно буде заново виконати initdb \n"
+"для нового кластера, перед продовженням.\n"
+
+#: check.c:264
+#, c-format
+msgid "Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n\n"
+msgstr "Статистика оптимізатора не передається за допомогою pg_upgrade.\n"
+"Після запуску нового серверу, розгляньте можливість запуску:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n\n"
+
+#: check.c:270
+#, c-format
+msgid "Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr "При запуску цього скрипту файли даних старого кластера будуть видалені:\n"
+" %s\n"
+
+#: check.c:275
+#, c-format
+msgid "Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr "Не вдалося створити скрипт для видалення файлів даних старого кластеру,\n"
+"тому що каталог даних старого кластера містить користувацькі табличні\n"
+"простори або каталог даних нового кластера. Вміст старого кластера\n"
+"треба буде видалити вручну.\n"
+
+#: check.c:287
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Перевірка версій кластерів"
+
+#: check.c:299
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Ця утиліта може виконувати оновлення тільки з версії PostgreSQL 8.4 і новіше.\n"
+
+#: check.c:303
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Ця утиліта може тільки підвищувати версію PostgreSQL до %s.\n"
+
+#: check.c:312
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Ця утиліта не може не може використовуватись щоб понижувати версію до більш старих основних версій PostgreSQL.\n"
+
+#: check.c:317
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Каталог даних і двійковий каталог старого кластера з різних основних версій.\n"
+
+#: check.c:320
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Каталог даних і двійковий каталог нового кластера з різних основних версій.\n"
+
+#: check.c:337
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "Для перевірки старого працюючого сервера до версії 9.1, вам необхідно вказати номер порта цього сервера.\n"
+
+#: check.c:341
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Для перевірки працюючого сервера, старий і новий номер порта повинні бути різними.\n"
+
+#: check.c:356
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "кодування для бази даних \"%s\" не збігаються: старе \"%s\", нове \"%s\"\n"
+
+#: check.c:361
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "значення lc_collate для бази даних \"%s\" не збігаються: старе \"%s\", нове \"%s\"\n"
+
+#: check.c:364
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "значення lc_ctype для бази даних \"%s\" не збігаються: старе \"%s\", нове \"%s\"\n"
+
+#: check.c:437
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Новий кластер бази даних \"%s\" не порожній: знайдено відношення \"%s.%s\"\n"
+
+#: check.c:494
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Перевірка каталогів табличних просторів кластера"
+
+#: check.c:505
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "каталог нового кластерного табличного простору вже існує: \"%s\"\n"
+
+#: check.c:538
+#, c-format
+msgid "\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr "\n"
+"ПОПЕРЕДЖЕННЯ: новий каталог даних не повинен бути всередині старого каталогу даних, наприклад %s\n"
+
+#: check.c:562
+#, c-format
+msgid "\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr "\n"
+"ПОПЕРЕДЖЕННЯ: користувацькі розташування табличних просторів не повинні бути всередині каталогу даних, наприклад %s\n"
+
+#: check.c:572
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Створення скрипту для видалення старого кластеру"
+
+#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336
+#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376
+#: version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "не вдалося відкрити файл \"%s\": %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "не вдалося додати право виконання для файлу \"%s\": %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Перевірка, чи є користувач бази даних стартовим користувачем"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "користувач бази даних \"%s\" не є стартовим користувачем\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "не вдалося визначити кількість користувачів\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "В новому кластері може бути визначеним тільки стартовий користувач.\n"
+
+#: check.c:706
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Перевірка параметрів підключення до бази даних"
+
+#: check.c:728
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 не повинна дозволяти підключення, тобто pg_database.datallowconn повинно бути false\n"
+
+#: check.c:738
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "Всі бази даних, окрім template0, повинні дозволяти підключення, тобто pg_database.datallowconn повинно бути true\n"
+
+#: check.c:763
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Перевірка підготовлених транзакцій"
+
+#: check.c:772
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Початковий кластер містить підготовлені транзакції\n"
+
+#: check.c:774
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Цільовий кластер містить підготовлені транзакції\n"
+
+#: check.c:800
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Перевірка невідповідності при передаванні bigint в contrib/isn"
+
+#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183
+#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "збій\n"
+
+#: check.c:862
+#, c-format
+msgid "Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить функції \"contrib/isn\", що використовують тип даних bigint. Старі та нові кластери передають значення bigint по-різному, тому цей кластер наразі неможливо оновити. Ви можете вручну вивантажити бази даних зі старого кластеру, що використовує засоби \"contrib/isn\", видалити їх, виконати оновлення, а потім відновити їх. Список проблемних функцій подано у файлі:\n"
+" %s\n\n"
+
+#: check.c:885
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Перевірка постфіксних операторів визначених користувачем"
+
+#: check.c:963
+#, c-format
+msgid "Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить користувацькі постфіксні оператори, що більше не підтримуються.\n"
+"Розгляньте можливість видалення постфіксних операторів та заміни їх на префіксні оператори або виклики функцій.\n"
+"Список користувацьких постфіксних операторів знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:984
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Перевірка таблиць WITH OIDS"
+
+#: check.c:1039
+#, c-format
+msgid "Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить таблиці, створені як WITH OIDS, що більше не підтримуються. Розгляньте видалення стовпців, що містять oid за допомогою\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Список проблемних таблиць подано у файлі:\n"
+" %s\n\n"
+
+#: check.c:1067
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Перевірка складених типів визначених системою у таблицях користувача"
+
+#: check.c:1096
+#, c-format
+msgid "Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить складені типи визначені системою у таблицях користувача.\n"
+"Ці типи OID не стабільні між версіями PostgreSQL, тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:1124
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Перевірка типів даних reg* в користувацьких таблицях"
+
+#: check.c:1155
+#, c-format
+msgid "Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить один з типів даних reg* у таблицях користувача.\n"
+"Ці типи даних посилаються на OID системи, які не зберігаються за допомогою pg_upgrade, тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Перевірка несумісного типу даних \"jsonb\""
+
+#: check.c:1184
+#, c-format
+msgid "Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить тип даних \"jsonb\" у таблицях користувача.\n"
+"Внутрішній формат \"jsonb\" змінено під час версії 9.4 beta,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:1206
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Перевірка ролей, які починаються з \"pg_\""
+
+#: check.c:1216
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Початковий кластер містить ролі, які починаються з \"pg_\"\n"
+
+#: check.c:1218
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Цільовий кластер містить ролі, які починаються з \"pg_\"\n"
+
+#: check.c:1239
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Перевірка користувацьких перетворення кодувань"
+
+#: check.c:1302
+#, c-format
+msgid "Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить користувацькі перетворення кодувань.\n"
+"Параметри функції перетворення змінено у версії PostgreSQL 14,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити перетворення кодувань в старому кластері та перезапустити оновлення.\n"
+"Список перетворень кодувань знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:1329
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "не вдалося отримати поточну локаль\n"
+
+#: check.c:1338
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "не вдалося отримати системне ім'я локалі для \"%s\"\n"
+
+#: check.c:1344
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "не вдалося відновити стару локаль \"%s\"\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "не вдалося отримати контрольні дані за допомогою %s: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: неприпустимий стан кластера баз даних\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Початковий кластер завершив роботу в режимі відновлення. Щоб виконати оновлення, використайте документований спосіб з \"rsync\" або вимкніть його в режимі головного сервера.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Цільовий кластер завершив роботу в режимі відновлення. Щоб виконати оновлення, використайте документований спосіб з \"rsync\" або вимкніть його в режимі головного сервера.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Початковий кластер завершив роботу некоректно.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Цільовий кластер завершив роботу некоректно.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "В початковому кластері відсутня інформація про стан кластеру:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "В цільовому кластері відсутня інформація про стан кластеру:\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: проблема pg_resetwal\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: проблема з отриманням контрольних даних\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "У початковому кластері відсутня необхідна контрольна інформація:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "У цільовому кластері відсутня необхідна контрольна інформація:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " наступний XID контрольної точки\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " наступний OID останньої контрольної точки\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " наступний MultiXactId останньої контрольної точки\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " найстарший MultiXactId останньої контрольної точки\n"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " найстарший oldestXID останньої контрольної точки\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " наступний MultiXactOffset останньої контрольної точки\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " перший сегмет WAL після скидання\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " метод передачі аргументу float8\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " максимальне вирівнювання\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " розмір блоку\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " розмір сегменту великого відношення\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " розмір блоку WAL\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " розмір сегменту WAL\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " максимальна довжина ідентифікатора\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " максимальна кількість індексованих стовпців\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " максимальний розмір порції TOAST\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " розмір порції великого об'єкту\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " дата/час представлені цілими числами?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " версія контрольних сум даних\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Не можна продовжити без необхідної контрольної інформації, завершення\n"
+
+#: controldata.c:652
+#, c-format
+msgid "old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr "старе і нове вирівнювання в pg_controldata неприпустимі або не збігаються\n"
+"Ймовірно, один кластер встановлений у 32-бітній системі, а інший - у 64-бітній\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "старий і новий розмір блоків в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "старий і новий максимальний розмір сегментів відношень в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "старий і новий розмір блоків WAL в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "старий і новий розмір сегментів WAL в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "стара і нова максимальна довжина ідентифікаторів в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "стара і нова максимальна кількість індексованих стовпців в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "старий і новий максимальний розмір порції TOAST в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "старий і новий розмір порції великого об'єкту в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "старий і новий тип сховища дати/часу в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "старий кластер не використовує контрольні суми даних, але новий використовує\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "старий кластер використовує контрольні суми даних, але новий не використовує\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "стара і нова версія контрольних сум кластера в pg_controldata не збігаються\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Додавання суфікса \".old\" до старого файла global/pg_control"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Не вдалося перейменувати %s на %s.\n"
+
+#: controldata.c:719
+#, c-format
+msgid "\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n\n"
+msgstr "\n"
+"Якщо ви хочете запустити старий кластер, вам необхідно видалити\n"
+"суфікс \".old\" з файлу %s/global/pg_control.old. Через використання\n"
+"режиму \"link\" робота старого кластера після запуску нового може бути\n"
+"небезпечна.\n\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Створення вивантаження глобальних об'єктів"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Створення вивантаження схем бази даних\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "не вдалося отримати дані версії pg_ctl, виконавши %s: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "не вдалося отримати версію pg_ctl з результату %s\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "команда занадто довга\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "не вдалося відкрити файл журналу \"%s\": %m\n"
+
+#: exec.c:179
+#, c-format
+msgid "\n"
+"*failure*"
+msgstr "\n"
+"*неполадка*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Під час виконання \"%s\" виникли проблеми\n"
+
+#: exec.c:185
+#, c-format
+msgid "Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "Щоб зрозуміти причину неполадки, зверніться до декількох останніх рядків\n"
+"файлу \"%s\" або \"%s\".\n"
+
+#: exec.c:190
+#, c-format
+msgid "Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "Щоб зрозуміти причину неполадки, зверніться до декількох останніх рядків\n"
+"файлу \"%s\".\n"
+
+#: exec.c:205 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "не вдалося записати до файлу журналу \"%s\": %m\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "не вдалося відкрити файл \"%s\" для читання: %s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Ви повинні мати права на читання і запис в поточному каталозі.\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "перевірка \"%s\" провалена: %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" не є каталогом\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "перевірка \"%s\" провалена: це не звичайний файл\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "перевірка \"%s\" провалена: виконання неможливе (немає доступу)\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "помилка перевірки \"%s\": не можна виконати\n"
+
+#: exec.c:449
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "помилка перевірки \"%s\": неправильна версія: знайдено \"%s\", очікувалось \"%s\"\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "помилка при клонуванні відношення \"%s.%s\" (\"%s\" до \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "помилка при клонуванні відношення \"%s.%s\": не вдалося відкрити файл \"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "помилка при клонуванні відношення \"%s.%s\": не вдалося створити файл \"%s\": %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося відкрити файл \"%s\": %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося створити файл \"%s\": %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося прочитати файл \"%s\": %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося записати до файлу \"%s\": %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\" ( з \"%s\" в \"%s\"): %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "помилка під час створення посилання для відношення \"%s.%s\" ( з \"%s\" в \"%s\"): %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося отримати стан файлу \"%s\": %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": у файлі \"%s\" знайдена часткова сторінка\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "не вдалося клонувати файл між старим і новим каталогами даних: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "не можливо створити файл \"%s\": %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "клонування файлів не підтримується на цій платформі\n"
+
+#: file.c:369
+#, c-format
+msgid "could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr "не вдалося створити жорстке посилання між старим і новим каталогами даних: %s\n"
+"В режимі посилань старий і новий каталоги даних повинні знаходитись в одній файловій системі.\n"
+
+#: function.c:114
+#, c-format
+msgid "\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n\n"
+" \\df *.plpython_call_handler\n\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n\n"
+" DROP FUNCTION public.plpython_call_handler()\n\n"
+"in each affected database:\n\n"
+msgstr "\n"
+"Старий кластер має функцію \"plpython_call_handler\", визначену в схемі\n"
+"\"public\", яка є дублікатом функції, визначеної в схемі \"pg_catalog\". Ви\n"
+"можете переконатися в цьому, виконавши в psql:\n\n"
+" \\df *.plpython_call_handler\n\n"
+"Версія цієї функції в схемі \"public\" була створена встановленням plpython \n"
+"версії до 8.1 і повинна бути видалена до завершення процедури pg_upgrade,\n"
+"адже вона посилається на застарілий спільний об'єктний файл \"plpython\". Ви\n"
+"можете видалити версію цієї функції зі схеми \"public\", виконавши наступну\n"
+"команду:\n\n"
+" DROP FUNCTION public.plpython_call_handler()\n\n"
+"у кожній базі даних, якої це стосується:\n\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Видаліть проблемні функції старого кластера для продовження.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Перевірка наявності необхідних бібліотек"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "не вдалося завантажити бібліотеку \"%s\": %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "У базі даних: %s\n"
+
+#: function.c:263
+#, c-format
+msgid "Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n\n"
+msgstr "У вашій інсталяції є посилання на завантажувані бібліотеки, що \n"
+"відсутні в новій інсталяції. Ви можете додати ці бібліотеки до нової інсталяції\n"
+"або видалити функції, які використовують їх зі старої інсталяції. Список\n"
+"проблемних бібліотек подано у файлі:\n"
+" %s\n\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Імена відношень з OID %u в базі даних \"%s\" не збігаються: старе ім'я \"%s.%s\", нове ім'я \"%s.%s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Не вдалося зіставити старі таблиці з новими в базі даних \"%s\"\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " це індекс в \"%s.%s\""
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " це індекс у відношенні з OID %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " це TOAST-таблиця для \"%s.%s\""
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " це TOAST-таблиця для відношення з OID %u"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "У старому кластері не знайдено відповідності для нового відношення з OID %u в базі даних %s\": %s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "У новому кластері не знайдено відповідності для старого відношення з OID %u в базі даних \"%s\": %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "відображення для бази даних \"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u в %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid "\n\n"
+msgstr "\n\n"
+
+#: info.c:322
+#, c-format
+msgid "\n"
+"source databases:\n"
+msgstr "\n"
+"вихідні бази даних:\n"
+
+#: info.c:324
+#, c-format
+msgid "\n"
+"target databases:\n"
+msgstr "\n"
+"цільові бази даних:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "База даних: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "ім'я_відношення: %s.%s: oid_відношення: %u табл_простір: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: не може виконуватись як root\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "неприпустимий старий номер порту\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "неприпустимий новий номер порту\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Виконується в детальному режимі\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "розташування двійкових даних старого кластера"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "розташування двійкових даних нового кластера"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "розташування даних старого кластера"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "розташування даних нового кластера"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "сокети будуть створені"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "не вдалося визначити поточний каталог\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "у Windows не можна виконати pg_upgrade всередині каталогу даних нового кластера\n"
+
+#: option.c:288
+#, c-format
+msgid "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n\n"
+msgstr "pg_upgrade оновлює кластер PostgreSQL до іншої основної версії.\n\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: option.c:290
+#, c-format
+msgid " pg_upgrade [OPTION]...\n\n"
+msgstr " pg_upgrade [OPTION]...\n\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR каталог виконуваних файлів старого кластера\n"
+
+#: option.c:293
+#, c-format
+msgid " -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr " -B, --new-bindir=BINDIR каталог виконуваних файлів нового кластера (за замовчуванням\n"
+" той самий каталог, що і pg_upgrade)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check тільки перевірити кластери, не змінювати ніякі дані\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR каталог даних старого кластера\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR каталог даних нового кластера\n"
+
+#: option.c:298
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM число одночасних процесів або потоків для використання\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link встановлювати посилання замість копіювання файлів до нового кластера\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS параметри старого кластера, які передаються серверу\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS параметри нового кластера, які передаються серверу\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT номер порту старого кластера (за замовчуванням %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT номер порту нового кластера (за замовчуванням %d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain зберегти файли журналів і SQL після успішного завершення\n"
+
+#: option.c:305
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR директорія сокету для використання (за замовчування поточна директорія)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME суперкористувач кластера (за замовчуванням \"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose активувати виведення детальних внутрішніх повідомлень\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version відобразити інформацію про версію, потім вийти\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone клонувати замість копіювання файлів до нового кластера\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: option.c:311
+#, c-format
+msgid "\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr "\n"
+"До виконання pg_upgrade ви повинні:\n"
+" створити новий кластер баз даних (використовуючи нову версію initdb)\n"
+" завершити процес postmaster, який обслуговує старий кластер\n"
+" завершити процес postmaster, який обслуговує новий кластер\n"
+
+#: option.c:316
+#, c-format
+msgid "\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr "\n"
+"Коли ви виконуєте pg_upgrade, ви повинні надати наступну інформацію:\n"
+" каталог даних старого кластера (-d DATADIR)\n"
+" каталог даних нового кластера (-D DATADIR)\n"
+" каталог \"bin\" старого кластера (-b BINDIR)\n"
+" каталог \"bin\" нового кластера (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid "\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr "\n"
+"Наприклад:\n"
+" pg_upgrade -d старий_кластер/data -D новий_кластер/data -b старий_кластер/bin -B новий_кластер/bin\n"
+"або\n"
+
+#: option.c:327
+#, c-format
+msgid " $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr " $ export PGDATAOLD=старий_кластер/data\n"
+" $ export PGDATANEW=новий_кластер/data\n"
+" $ export PGBINOLD=старий_кластер/bin\n"
+" $ export PGBINNEW=новий_кластер/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid " C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr " C:\\> set PGDATAOLD=старий_кластер/data\n"
+" C:\\> set PGDATANEW=новий_кластер/data\n"
+" C:\\> set PGBINOLD=старий_кластер/bin\n"
+" C:\\> set PGBINNEW=новий_кластер/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid "You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr "Ви повинні визначити каталог, де знаходиться %s.\n"
+"Будь ласка, використайте параметр командного рядка %s або змінну середовища %s.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Пошук дійсного каталогу даних для початкового кластера"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Пошук дійсного каталогу даних для цільового кластера"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "не вдалося отримати каталог даних, виконавши %s: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "не вдалося прочитати рядок %d з файлу \"%s\": %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "вказаний користувачем старий номер порту %hu змінений на %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "не вдалося створити робочий процес: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "не вдалося створити робочий потік: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() помилка: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "дочірній процес завершився ненормально: статус %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "дочірній процес завершився аварійно: %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "не вдалося прочитати права на каталог \"%s\": %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid "\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr "\n"
+"Виконання оновлення\n"
+"------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Встановлення наступного OID для нового кластера"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Синхронізація каталогу даних на диск"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid "\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr "\n"
+"Оновлення завершено\n"
+"----------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не вдалося знайти ехе файл власної програми\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid "There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr "Мабуть, запущений процес postmaster, який обслуговує старий кластер.\n"
+"Будь ласка, завершіть роботу процесу і спробуйте знову.\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid "There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr "Мабуть, запущений процес postmaster, який обслуговує новий кластер.\n"
+"Будь ласка, завершіть роботу процесу і спробуйте знову.\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Аналіз всіх рядків у новому кластері"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Закріплення всіх рядків у новому кластері"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Відновлення глобальних об'єктів у новому кластері"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Відновлення схем баз даних у новому кластері\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Видалення файлів з нового %s"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "не вдалося видалити каталог \"%s\"\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Копіювання старого %s до нового серверу"
+
+#: pg_upgrade.c:470
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Встановлення найстарішого XID для нового кластеру"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Установка наступного ID транзакції й епохи для нового кластера"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Установка наступного ID і зсуву мультитранзакції для нового кластера"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Установка найстаршого ID мультитранзакції в новому кластері"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Скидання архівів WAL"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Установка лічильників frozenxid і minmxid у новому кластері"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Установка лічильника minmxid у новому кластері"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "Клонування файлів користувацьких відношень\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Копіювання файлів користувацьких відношень\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Підключення файлів користувацьких відношень посиланнями\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "стара база даних \"%s\" не знайдена в новому кластері\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "помилка під час перевірки існування файлу \"%s.%s\" (з \"%s\" в \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "перезаписування \"%s\" в \"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "клонування \"%s\" до \"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "копіювання \"%s\" в \"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "створення посилання на \"%s\" в \"%s\"\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Помилка, вихід\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "виконується: %s\n"
+
+#: server.c:138
+#, c-format
+msgid "SQL command failed\n"
+"%s\n"
+"%s"
+msgstr "Помилка SQL-команди\n"
+"%s\n"
+"%s"
+
+#: server.c:168
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "не вдалося відкрити файл версії \"%s\": %m\n"
+
+#: server.c:172
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "не вдалося проаналізувати файл версії \"%s\"\n"
+
+#: server.c:298
+#, c-format
+msgid "\n"
+"%s"
+msgstr "\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid "could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr "не вдалося підключитися до початкового процесу postmaster, запущеного командою:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid "could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr "не вдалося підключитися до цільового процесу postmaster, запущеного командою:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl не зміг запустити початковий сервер або сталася помилка підключення\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl не зміг запустити цільовий сервер або сталася помилка підключення\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "недостатньо пам'яті\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "у змінній середовища для libpq %s задано не локальне значення: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid "Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr "Оновлення в межах однієї версії системного каталогу неможливе,\n"
+"якщо використовуються табличні простори.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "каталог табличного простору \"%s\" не існує\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "не вдалося отримати стан каталогу табличного простору \"%s\": %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "шлях табличного простору \"%s\" не вказує на каталог\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "Перевірка великих об'єктів"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "попередження"
+
+#: version.c:79
+#, c-format
+msgid "\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n\n"
+msgstr "\n"
+"Ваша інсталяція містить великі об'єкти. Нова база даних має\n"
+"додаткову таблицю з правами для великих об'єктів. Після оновлення ви отримаєте команду для заповнення таблиці pg_largeobject_metadata \n"
+"з правами за замовчуванням.\n\n"
+
+#: version.c:85
+#, c-format
+msgid "\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n\n"
+msgstr "\n"
+"Ваша інсталяція містить великі об'єкти. Нова база даних має\n"
+"додаткову таблицю з правами для великих об'єктів, тож для всіх\n"
+"великих об'єктів повинні визначатись права за замовчуванням. Файл\n"
+" %s\n"
+"дозволяє встановити такі права (він призначений для виконання в psql\n"
+"суперкористувачем бази даних).\n\n"
+
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Перевірка несумісного типу даних \"line\""
+
+#: version.c:279
+#, c-format
+msgid "Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить тип даних \"line\" в таблицях користувача.\n"
+"Внутрішній формат та формат вводу/виводу цього типу даних змінено між вашою старою та новими версіями,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Перевірка неприпустимих користувацьких стовпців \"unknown\""
+
+#: version.c:317
+#, c-format
+msgid "Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить \"unknown\" тип даних у таблицях користувача.\n"
+"Цей тип даних більше не допускається в таблицях,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Перевірка геш-індексів"
+
+#: version.c:421
+#, c-format
+msgid "\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n\n"
+msgstr "\n"
+"Ваша інсталяція містить геш-індекси. Ці індекси мають різні внутрішні\n"
+"формати в старому і новому кластерах, тож їх потрібно повторно індексувати\n"
+"за допомогою команди REINDEX. Після оновлення вам буде надано інструкції REINDEX.\n\n"
+
+#: version.c:427
+#, c-format
+msgid "\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n\n"
+msgstr "\n"
+"Ваша інсталяція містить геш-індекси. Ці індекси мають різні внутрішні\n"
+"формати в старому і новому кластерах, тож їх потрібно повторно індексувати\n"
+"за допомогою команди REINDEX. Файл\n"
+" %s\n"
+"після виконання суперкористувачем бази даних в psql, повторно створить\n"
+"всі неприпустимі індекси; до цього ніякі геш-індекси не будуть використовуватись.\n\n"
+
+#: version.c:453
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Перевірка неприпустимих користувацьких стовпців \"sql_identifier\""
+
+#: version.c:461
+#, c-format
+msgid "Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить \"sql_identifier\" тип даних у таблицях користувача.\n"
+"Формат зберігання для цього типу даних змінено,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: version.c:485
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Перевірка оновлень розширення"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "повідомлення"
+
+#: version.c:538
+#, c-format
+msgid "\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n\n"
+msgstr "\n"
+"Ваша інсталяція містить розширення, які потрібно оновити\n"
+"командою ALTER EXTENSION . Файл\n"
+" %s,\n"
+"коли виконується суперкористувачем бази даних за допомогою\n"
+"psql, оновить ці розширення.\n\n"
+
diff --git a/src/bin/pg_upgrade/po/zh_CN.po b/src/bin/pg_upgrade/po/zh_CN.po
new file mode 100644
index 0000000..4ab61a5
--- /dev/null
+++ b/src/bin/pg_upgrade/po/zh_CN.po
@@ -0,0 +1,1850 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:46+0000\n"
+"PO-Revision-Date: 2021-08-15 18:40+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: check.c:70
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"在旧的活动的服务器上执行一致性检查\n"
+"------------------------------------------------\n"
+
+#: check.c:76
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"正在执行一致性检查\n"
+"-----------------------------\n"
+
+#: check.c:213
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*群集是兼容的*\n"
+
+#: check.c:219
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"如果pg_upgrade在这一点之后失败,在继续之前必须重新初始化新集群.\n"
+
+#: check.c:264
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"优化器统计数据不会通过pg_upgrade传输。\n"
+"启动新服务器后,考虑运行:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:270
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"运行此脚本将删除旧群集的数据文件:\n"
+" %s\n"
+
+#: check.c:275
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"无法创建删除旧群集数据文件的脚本.\n"
+"因为用户定义的表空间或新集群的数据目录存在于旧集群目录中.\n"
+"必须手动删除旧群集的内容.\n"
+
+#: check.c:287
+#, c-format
+msgid "Checking cluster versions"
+msgstr "正在检查群集版本"
+
+#: check.c:299
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "此实用程序只能从PostgreSQL 8.4及更高版本升级.\n"
+
+#: check.c:303
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "此实用程序只能升级到PostgreSQL版本%s.\n"
+
+#: check.c:312
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "此实用程序不能用于降级到旧的主PostgreSQL版本.\n"
+
+#: check.c:317
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "旧的集群数据和二进制目录来自不同的主版本.\n"
+
+#: check.c:320
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "新的集群数据和二进制目录来自不同的主版本.\n"
+
+#: check.c:337
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "在检查pre-PG 9.1之前的活动旧服务器时,必须指定旧服务器的端口号.\n"
+
+#: check.c:341
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "检查活动服务器时,新端口号和旧端口号必须不同.\n"
+
+#: check.c:356
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "数据库\"%s\"的编码不匹配: 旧的 \"%s\", 新的 \"%s\"\n"
+
+#: check.c:361
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "数据库\"%s\"的lc_collate不匹配: 旧的 \"%s\", 新的 \"%s\"\n"
+
+#: check.c:364
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "数据库\"%s\"的lc_ctype不匹配: 旧的 \"%s\", 新的 \"%s\"\n"
+
+#: check.c:437
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "新群集数据库\"%s\"不是空的:找到关系\"%s.%s\"\n"
+
+#: check.c:494
+msgid "Checking for new cluster tablespace directories"
+msgstr "正在检查新的群集表空间目录"
+
+#: check.c:505
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "新的群集表空间目录已存在: \"%s\"\n"
+
+#: check.c:538
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"警告:新数据目录不应位于旧数据目录中,例如 %s\n"
+
+#: check.c:562
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"警告:用户定义的表空间位置不应在数据目录中,例如 %s\n"
+
+#: check.c:572
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "正在创建删除旧群集的脚本"
+
+#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336
+#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376
+#: version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "无法打开文件 \"%s\": %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "无法向文件\"%s\"添加执行权限: %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "正在检查数据库用户是否为安装用户"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "数据库用户\"%s\"不是安装用户\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "无法确定用户数\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "只能在新群集中定义安装用户.\n"
+
+#: check.c:706
+#, c-format
+msgid "Checking database connection settings"
+msgstr "正在检查数据库连接设置"
+
+#: check.c:728
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0不能允许连接,即,其pg_database.datallowconn必须为false\n"
+
+#: check.c:738
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "所有非template0数据库必须允许连接,即,它们的pg_database.dataallowconn必须为true\n"
+
+#: check.c:763
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "正在检查准备的交易记录"
+
+#: check.c:772
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "源群集包含准备好的事务\n"
+
+#: check.c:774
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "目标集群包含准备好的事务\n"
+
+#: check.c:800
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "正在检查contrib/isn和bigint-passing是否不匹配"
+
+#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183
+#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "致命的\n"
+
+#: check.c:862
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含\"contrib/isn\"函数,这些函数依赖于bigint数据类型\n"
+"旧群集和新群集传递的bigint值不同,因此当前无法升级此群集\n"
+"您可以手动的在旧集群中转储数据库,\n"
+"使用 \"contrib/isn\"\n"
+"删除它们,执行升级,然后恢复它们。\n"
+"文件中有问题函数的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:885
+msgid "Checking for user-defined postfix operators"
+msgstr "正在检查用户定义的后缀运算符"
+
+#: check.c:963
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户定义的后缀运算符,它们\n"
+"不再支持了。考虑删除后缀运算符并用前缀运算符或函数调用替换它们\n"
+"函数调用替换它们.\n"
+"以下的文件中有用户定义的后缀运算符列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:984
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "正在检查带有OIDS的表"
+
+#: check.c:1039
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用OID声明的表,这不再受支持\n"
+"考虑使用以下的SQL移除OID列\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"有问题的表在以下的文件中:\n"
+" %s\n"
+"\n"
+
+#: check.c:1067
+msgid "Checking for system-defined composite types in user tables"
+msgstr "在用户表中检查系统定义的复合类型"
+
+#: check.c:1096
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的系统定义的复合类型。\n"
+"这些类型OID在PostgreSQL版本中不稳定。\n"
+"因此,当前无法升级此群集。\n"
+"你可以删除有问题的列并重新启动升级。\n"
+"以下的文件中有问题列的列表\n"
+" %s\n"
+"\n"
+
+#: check.c:1124
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "正在检查用户表中的reg*数据类型"
+
+#: check.c:1155
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的某个reg*数据类型.\n"
+"这些数据类型引用了pg_upgrade不保留的系统OID, \n"
+"因此当前无法升级此群集 . You can\n"
+"您可以删除问题表并重新启动升级.\n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "正在检查不兼容的\"jsonb\"数据类型"
+
+#: check.c:1184
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"jsonb\"数据类型.\n"
+"\"jsonb\"的内部格式在9.4测试版期间发生了更改,\n"
+"因此当前无法升级该集群。\n"
+"您可以删除问题表并重新启动升级. \n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1206
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "正在检查以\"pg_\"开头的角色"
+
+#: check.c:1216
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "源集群包含以\"pg_\"开头的角色\n"
+
+#: check.c:1218
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "目标集群包含以\"pg_\"开头的角色\n"
+
+#: check.c:1239
+msgid "Checking for user-defined encoding conversions"
+msgstr "正在检查用户定义的编码转换"
+
+#: check.c:1302
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户定义的编码转换。\n"
+"转换函数参数在PostgreSQL版本14中已更改。\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级. \n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1329
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "无法获取当前区域设置\n"
+
+#: check.c:1338
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "无法获取\"%s\"的系统区域设置名称\n"
+
+#: check.c:1344
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "还原旧区域\"%s\"失败\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "无法使用%s获取控制数据:%s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: 数据库集群状态问题\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "在恢复模式下,源群集已关闭。要升级,请使用文档中的\"rsync\",或将其作为主服务器关闭。\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "目标群集在恢复模式下关闭。要升级,请使用文档中的\"rsync\",或将其作为主服务器关闭。\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "源群集未完全关闭。\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "目标群集未完全关闭。\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "源集群缺少集群状态信息:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "目标集群缺少集群状态信息:\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal问题\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: 控制数据检索问题\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "源集群缺少一些必需的控制信息:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "目标集群缺少一些必需的控制信息:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " 下一个XID检查点\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " 最新检查点下一个OID\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " 最新检查点下一个MultiXactId\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " 最新检查点最旧的MultiXactId\n"
+
+#: controldata.c:591
+msgid " latest checkpoint oldestXID\n"
+msgstr " 最新检查点的最旧XID\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " 最新检查点下一个MultiXactOffset\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " 重置后的第一个WAL段\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8参数传递方法\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " 最大对齐方式\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " 块大小\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " 大关系段大小\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL块大小\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL段大小\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " 最大标识符长度\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " 最大索引列数\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " 最大TOAST块大小\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " 大对象块大小\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " 日期/时间是整数?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " 数据校验和版本\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "没有所需的控制信息,无法继续,正在终止\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"新旧pg_controldata对齐无效或不匹配\n"
+"可能一个集群是32位安装,另一个是64位安装\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata块大小无效或不匹配\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "新旧pg controldata最大关系段大小无效或不匹配\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata WAL块大小无效或不匹配\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata WAL段大小无效或不匹配\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "新旧pg_controldata最大标识符长度无效或不匹配\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "新旧pg_controldata最大索引列无效或不匹配\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata最大TOAST块大小无效或不匹配\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "旧的和新的pg_controldata大对象块大小无效或不匹配\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "新的和旧的pg_controldata日期/时间存储类型不匹配\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "旧群集不使用数据校验和,但新群集使用数据校验和\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "旧群集使用数据校验和,但新群集不使用\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "旧群集和新群集pg_controldata校验和版本不匹配\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "向旧的global/pg_control添加\".old\"后缀"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "无法将%s重命名为%s。\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"如果要启动旧群集,则需要从%s/global/pg_control.old中\n"
+"删除\".old\"后缀。\n"
+"由于使用了\"link\"模式,一旦新群集启动,\n"
+"旧群集就无法安全启动。\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "正在创建全局对象的转储"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "正在创建数据库schemas的转储\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "无法使用using %s获取pg_ctl的版本数据: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "无法从%s获取pg_ctl版本输出\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "命令太长了\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+msgid "could not open log file \"%s\": %m\n"
+msgstr "无法打开日志文件\"%s\": %m\n"
+
+#: exec.c:179
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*失败*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "执行\"%s\"时出现问题\n"
+
+#: exec.c:185
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "有关故障的可能原因,请查阅\"%s\"或 \"%s\"的最后几行。\n"
+
+#: exec.c:190
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "有关故障的可能原因,请查阅\"%s\"的最后几行。\n"
+
+#: exec.c:205 option.c:226
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "不能写到日志文件\"%s\": %m\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "无法打开文件\"%s\"用于读取: %s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "您必须具有当前目录中的读写权限。\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "检查\"%s\"失败: %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\"不是一个目录\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "检查\"%s\"失败:不是常规文件\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "检查\"%s\"失败:无法执行(权限被拒绝)\n"
+
+#: exec.c:439
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "检查\"%s\"失败:无法执行\n"
+
+#: exec.c:449
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "检查\"%s\"失败:版本不正确:找到\"%s\",应为\"%s\"\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "克隆关系\"%s.%s\"时出错(从\"%s\"到\"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "克隆关系\"%s.%s\"时出错:无法打开文件\"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "克隆关系\"%s.%s\"时出错:无法创建文件\"%s\": %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法打开文件\"%s\": %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法创建文件\"%s\": %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法读取文件\"%s\": %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法写入文件 \"%s\": %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "将关系\"%s.%s\"(\"%s\"复制到\"%s\")时出错: %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "为关系\"%s.%s\"创建链接时出错(从\"%s\"到\"%s\"): %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法统计文件\"%s\": %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "复制关系\"%s.%s\"时出错:在文件\"%s\"中找到部分页\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "无法在新旧数据目录之间克隆文件: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "无法创建文件 \"%s\": %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "此平台不支持文件克隆\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"无法在新旧数据目录之间创建硬链接: %s\n"
+"在链接模式下,旧的和新的数据目录必须在同一文件系统上。\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"旧集群在\"public\"模式中定义了一个\"plpython_call_handler\"函数,\n"
+"这是\"pg_catalog\"模式中定义的函数的副本。\n"
+" 您可以通过执行\n"
+"在 psql中:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"这个函数的\"public\"模式版本是由plpython的8.1之前的安装创建的, \n"
+"必须删除才能完成pg_upgrade\n"
+"因为它引用了一个现在已经过时的\"plpython\"共享对象文件。\n"
+"通过运行以下命令,可以删除此函数的\"public\"模式版本:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"在每个受影响的数据库中:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "从旧群集中删除问题函数以继续。\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "正在检查是否存在所需的库"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "无法加载库 \"%s\": %s"
+
+#: function.c:253
+msgid "In database: %s\n"
+msgstr "在数据库: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装引用了新安装中缺少的可加载库。\n"
+"您可以将这些库添加到新安装中,或者从旧安装中删除使用它们的函数。\n"
+"文件中有问题库列表:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "数据库\"%2$s\"中OID %1$u的关系名称不匹配:旧名称 \"%3$s.%4$s\",新名称\"%5$s.%6$s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "未能匹配数据库\"%s\"中的新旧表\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " 这是\"%s.%s\"上的索引"
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " 哪一个OID %u上的索引"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " 哪一个是\"%s.%s\"的TOAST表"
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " 哪一个是OID %u的TOAST表"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "在旧群集中找不到与数据库\"%2$s\"中OID %1$u的新关系的匹配项: %3$s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "在新群集中找不到与数据库\"%2$s\"中OID %1$u的旧关系的匹配项:%3$s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "映射为数据库\"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u到%u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"源数据库:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"目标数据库:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "数据库: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: 不能使用root用户运行\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "旧端口号无效\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "新端口号无效\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: option.c:214
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "命令行参数太多 (第一个是 \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "以详细模式运行\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "旧群集二进制文件驻留"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "新群集二进制文件驻留"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "旧群集数据驻留"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "新群集数据驻留"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "将创建套接字"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "无法确定当前目录\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "无法从Windows上的新群集数据目录内运行pg_upgrade\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade将PostgreSQL集群升级到其他主版本。\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [选项]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 旧群集可执行目录\n"
+
+#: option.c:293
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 新群集可执行目录\n"
+" (默认目录与pg_upgrade相同)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check 仅检查群集,不更改任何数据\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 旧群集数据目录\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 新群集数据目录\n"
+
+#: option.c:298
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM 要同时使用的进程或线程数\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link 使用硬链接来代替将文件拷贝到新群集\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS 要传递到服务器的旧群集选项\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS 要传递到服务器的新群集选项\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 旧群集端口号(默认值为%d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 新群集端口号(默认值为%d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain 成功后保留SQL和日志文件\n"
+
+#: option.c:305
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR 要使用的套接字目录(默认值为当前路径)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME 集群超级用户(默认值为\"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 启用详细的内部日志\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version 显示版本信息,然后退出\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone 克隆而不是将文件复制到新群集\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助,然后退出\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"在运行pg_upgrade之前,您必须 :\n"
+" 创建一个新的数据库群集 (使用新版本的initdb)\n"
+" 关闭旧群集的postmaster服务\n"
+" 关闭新群集的postmaster服务\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"运行pg_upgrade时,必须提供以下信息:\n"
+" 旧群集的数据目录 (-d DATADIR)\n"
+" 新群集的数据目录 (-D DATADIR)\n"
+" 旧版本的\"bin\"目录 (-b BINDIR)\n"
+" 新版本的\"bin\"目录 (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"例如:\n"
+" pg_upgrade -d 旧集群/data -D 新集群/data -b 旧集群/bin -B 新集群/bin\n"
+"或者\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=旧集群/data\n"
+" $ export PGDATANEW=新集群/data\n"
+" $ export PGBINOLD=旧集群/bin\n"
+" $ export PGBINNEW=新集群/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=旧集群/data\n"
+" C:\\> set PGDATANEW=新集群/data\n"
+" C:\\> set PGBINOLD=旧集群/bin\n"
+" C:\\> set PGBINNEW=新集群/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"必须标识%s所在的目录。\n"
+"请使用%s命令行选项或%s环境变量。\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "正在查找源群集的实际数据目录"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "正在查找目标群集的实际数据目录"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "无法使用%s获取数据目录: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "无法从文件\"%2$s\"读取第%1$d行: %3$s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "用户提供的旧端口号%hu已更正为%hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "无法创建工作进程: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "无法创建工作线程: %s\n"
+
+#: parallel.c:300
+msgid "%s() failed: %s\n"
+msgstr "%s()失败: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "子进程异常退出:状态 %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "子工作线程异常退出: %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "无法读取目录\"%s\"的权限: %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"正在执行升级\n"
+"------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "为新群集设置下一个OID"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "将数据目录同步到磁盘"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"升级完成\n"
+"----------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 无法找到执行文件\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"好像有一个postmaster正在为旧群集服务。\n"
+"请关闭那个postmaster,然后再试一次。\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"好像有一个postmaster正在为新群集服务。\n"
+"请关闭那个postmaster,然后再试一次。\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "正在分析新群集中的所有行"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "正在冻结新群集中的所有行"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "正在在新群集中还原全局对象"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "在新群集中还原数据库schemas\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "正在从新%s中删除文件"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "无法删除目录\"%s\"\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "正在将旧的 %s复制到新服务中"
+
+#: pg_upgrade.c:470
+msgid "Setting oldest XID for new cluster"
+msgstr "为新群集设置最旧的XID"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "正在为新集群设置下一个事务ID和epoch"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "正在为新集群设置下一个多事务ID和偏移量"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "在新集群中设置最旧的多事务ID"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "正在重置WAL归档"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "正在在新集群中设置frozenxid和minmxid计数器"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "正在在新群集中设置minmxid计数器"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "正在克隆用户关系文件\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "正在复制用户关系文件\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "正在链接用户关系文件\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "在新群集中找不到旧数据库\"%s\"\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "检查文件是否存在\"%s.%s\"时出错 (\"%s\" 到 \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"重写为\"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"克隆到\"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"复制到\"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "正在将\"%s\"链接到\"%s\"\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "故障,退出\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "正在执行: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL命令失败 \n"
+"%s\n"
+"%s"
+
+#: server.c:168
+msgid "could not open version file \"%s\": %m\n"
+msgstr "无法打开版本文件\"%s\": %m\n"
+
+#: server.c:172
+msgid "could not parse version file \"%s\"\n"
+msgstr "无法解析版本文件\"%s\"\n"
+
+#: server.c:298
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"无法连接到用命令启动的源postmaster :\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"无法连接到用命令启动的目标postmaster :\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl无法启动源服务器,或者连接失败\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl无法启动目标服务器,或连接失败\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "内存不足\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq环境变量%s具有非本地服务器值: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"使用表空间时无法升级到相同的系统目录版本。\n"
+"或者,使用表空间时无法从同一系统目录版本升级。\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "表空间目录\"%s\"不存在\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "无法统计表空间目录\"%s\": %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "表空间路径\"%s\"不是目录\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "成功"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "正在检查大对象"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "警告"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含大对象。新数据库有一个附加的大对象权限表。\n"
+"升级后,将向您提供一个命令,以使用默认权限填充\n"
+"pg_largeobject_metadata表。\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含大对象。 新数据库有一个附加的大对象权限表,\n"
+"因此必须为所有大对象定义默认权限。文件\n"
+" %s\n"
+"当数据库由psql执行时,超级用户将设置默认权限。\n"
+"\n"
+
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "正在检查不兼容的\"line\"数据类型"
+
+#: version.c:279
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"line\"数据类型。\n"
+"此数据类型更改了旧群集和新群集之间的\n"
+"内部格式和输入/输出格式,\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级。\n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "正在检查无效的\"unknown\"用户列"
+
+#: version.c:317
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"unknown\"数据类型。\n"
+"表中不再允许此数据类型,\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级。\n"
+"文件中有问题列的列表 :\n"
+" %s\n"
+"\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "正在检查哈希索引"
+
+#: version.c:421
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含哈希索引。\n"
+"这些索引在旧集群和新集群之间具有不同的内部格式,因此必须\n"
+"使用REINDEX命令重新索引它们。\n"
+"升级后,您将得到REINDEX指令。\n"
+"\n"
+
+#: version.c:427
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含哈希索引. These indexes have different\n"
+"这些索引在旧集群和新集群之间具有不同的内部格式,\n"
+"因此必须使用REINDEX命令重新索引它们。 文件\n"
+" %s\n"
+"当数据库超级用户通过psql执行时,将重新创建所有无效的索引;\n"
+"在此之前,不会使用这些索引。\n"
+"\n"
+
+#: version.c:453
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "正在检查无效的\"sql_identifier\"用户列"
+
+#: version.c:461
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"sql_identifier\"数据类型。\n"
+"此数据类型的磁盘格式已更改。\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级。\n"
+"文件中有问题列的列表 :\n"
+" %s\n"
+"\n"
+
+#: version.c:485
+msgid "Checking for extension updates"
+msgstr "正在检查扩展更新"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "通知"
+
+#: version.c:538
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含应使用\n"
+"ALTER EXTENSION命令更新的扩展。 文件\n"
+" %s\n"
+"当数据库超级用户通过psql执行时,\n"
+"将更新这些扩展。\n"
+"\n"
+
diff --git a/src/bin/pg_upgrade/relfilenode.c b/src/bin/pg_upgrade/relfilenode.c
new file mode 100644
index 0000000..4deae7d
--- /dev/null
+++ b/src/bin/pg_upgrade/relfilenode.c
@@ -0,0 +1,271 @@
+/*
+ * relfilenode.c
+ *
+ * relfilenode functions
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/relfilenode.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+
+#include "access/transam.h"
+#include "catalog/pg_class_d.h"
+#include "pg_upgrade.h"
+
+static void transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace);
+static void transfer_relfile(FileNameMap *map, const char *suffix, bool vm_must_add_frozenbit);
+
+
+/*
+ * transfer_all_new_tablespaces()
+ *
+ * Responsible for upgrading all database. invokes routines to generate mappings and then
+ * physically link the databases.
+ */
+void
+transfer_all_new_tablespaces(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata)
+{
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ pg_log(PG_REPORT, "Cloning user relation files\n");
+ break;
+ case TRANSFER_MODE_COPY:
+ pg_log(PG_REPORT, "Copying user relation files\n");
+ break;
+ case TRANSFER_MODE_LINK:
+ pg_log(PG_REPORT, "Linking user relation files\n");
+ break;
+ }
+
+ /*
+ * Transferring files by tablespace is tricky because a single database
+ * can use multiple tablespaces. For non-parallel mode, we just pass a
+ * NULL tablespace path, which matches all tablespaces. In parallel mode,
+ * we pass the default tablespace and all user-created tablespaces and let
+ * those operations happen in parallel.
+ */
+ if (user_opts.jobs <= 1)
+ parallel_transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata,
+ new_pgdata, NULL);
+ else
+ {
+ int tblnum;
+
+ /* transfer default tablespace */
+ parallel_transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata,
+ new_pgdata, old_pgdata);
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ parallel_transfer_all_new_dbs(old_db_arr,
+ new_db_arr,
+ old_pgdata,
+ new_pgdata,
+ os_info.old_tablespaces[tblnum]);
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+ }
+
+ end_progress_output();
+ check_ok();
+}
+
+
+/*
+ * transfer_all_new_dbs()
+ *
+ * Responsible for upgrading all database. invokes routines to generate mappings and then
+ * physically link the databases.
+ */
+void
+transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata, char *old_tablespace)
+{
+ int old_dbnum,
+ new_dbnum;
+
+ /* Scan the old cluster databases and transfer their files */
+ for (old_dbnum = new_dbnum = 0;
+ old_dbnum < old_db_arr->ndbs;
+ old_dbnum++, new_dbnum++)
+ {
+ DbInfo *old_db = &old_db_arr->dbs[old_dbnum],
+ *new_db = NULL;
+ FileNameMap *mappings;
+ int n_maps;
+
+ /*
+ * Advance past any databases that exist in the new cluster but not in
+ * the old, e.g. "postgres". (The user might have removed the
+ * 'postgres' database from the old cluster.)
+ */
+ for (; new_dbnum < new_db_arr->ndbs; new_dbnum++)
+ {
+ new_db = &new_db_arr->dbs[new_dbnum];
+ if (strcmp(old_db->db_name, new_db->db_name) == 0)
+ break;
+ }
+
+ if (new_dbnum >= new_db_arr->ndbs)
+ pg_fatal("old database \"%s\" not found in the new cluster\n",
+ old_db->db_name);
+
+ mappings = gen_db_file_maps(old_db, new_db, &n_maps, old_pgdata,
+ new_pgdata);
+ if (n_maps)
+ {
+ print_maps(mappings, n_maps, new_db->db_name);
+
+ transfer_single_new_db(mappings, n_maps, old_tablespace);
+ }
+ /* We allocate something even for n_maps == 0 */
+ pg_free(mappings);
+ }
+}
+
+/*
+ * transfer_single_new_db()
+ *
+ * create links for mappings stored in "maps" array.
+ */
+static void
+transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace)
+{
+ int mapnum;
+ bool vm_crashsafe_match = true;
+ bool vm_must_add_frozenbit = false;
+
+ /*
+ * Do the old and new cluster disagree on the crash-safetiness of the vm
+ * files? If so, do not copy them.
+ */
+ if (old_cluster.controldata.cat_ver < VISIBILITY_MAP_CRASHSAFE_CAT_VER &&
+ new_cluster.controldata.cat_ver >= VISIBILITY_MAP_CRASHSAFE_CAT_VER)
+ vm_crashsafe_match = false;
+
+ /*
+ * Do we need to rewrite visibilitymap?
+ */
+ if (old_cluster.controldata.cat_ver < VISIBILITY_MAP_FROZEN_BIT_CAT_VER &&
+ new_cluster.controldata.cat_ver >= VISIBILITY_MAP_FROZEN_BIT_CAT_VER)
+ vm_must_add_frozenbit = true;
+
+ for (mapnum = 0; mapnum < size; mapnum++)
+ {
+ if (old_tablespace == NULL ||
+ strcmp(maps[mapnum].old_tablespace, old_tablespace) == 0)
+ {
+ /* transfer primary file */
+ transfer_relfile(&maps[mapnum], "", vm_must_add_frozenbit);
+
+ /*
+ * Copy/link any fsm and vm files, if they exist
+ */
+ transfer_relfile(&maps[mapnum], "_fsm", vm_must_add_frozenbit);
+ if (vm_crashsafe_match)
+ transfer_relfile(&maps[mapnum], "_vm", vm_must_add_frozenbit);
+ }
+ }
+}
+
+
+/*
+ * transfer_relfile()
+ *
+ * Copy or link file from old cluster to new one. If vm_must_add_frozenbit
+ * is true, visibility map forks are converted and rewritten, even in link
+ * mode.
+ */
+static void
+transfer_relfile(FileNameMap *map, const char *type_suffix, bool vm_must_add_frozenbit)
+{
+ char old_file[MAXPGPATH];
+ char new_file[MAXPGPATH];
+ int segno;
+ char extent_suffix[65];
+ struct stat statbuf;
+
+ /*
+ * Now copy/link any related segments as well. Remember, PG breaks large
+ * files into 1GB segments, the first segment has no extension, subsequent
+ * segments are named relfilenode.1, relfilenode.2, relfilenode.3.
+ */
+ for (segno = 0;; segno++)
+ {
+ if (segno == 0)
+ extent_suffix[0] = '\0';
+ else
+ snprintf(extent_suffix, sizeof(extent_suffix), ".%d", segno);
+
+ snprintf(old_file, sizeof(old_file), "%s%s/%u/%u%s%s",
+ map->old_tablespace,
+ map->old_tablespace_suffix,
+ map->old_db_oid,
+ map->old_relfilenode,
+ type_suffix,
+ extent_suffix);
+ snprintf(new_file, sizeof(new_file), "%s%s/%u/%u%s%s",
+ map->new_tablespace,
+ map->new_tablespace_suffix,
+ map->new_db_oid,
+ map->new_relfilenode,
+ type_suffix,
+ extent_suffix);
+
+ /* Is it an extent, fsm, or vm file? */
+ if (type_suffix[0] != '\0' || segno != 0)
+ {
+ /* Did file open fail? */
+ if (stat(old_file, &statbuf) != 0)
+ {
+ /* File does not exist? That's OK, just return */
+ if (errno == ENOENT)
+ return;
+ else
+ pg_fatal("error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
+ map->nspname, map->relname, old_file, new_file,
+ strerror(errno));
+ }
+
+ /* If file is empty, just return */
+ if (statbuf.st_size == 0)
+ return;
+ }
+
+ unlink(new_file);
+
+ /* Copying files might take some time, so give feedback. */
+ pg_log(PG_STATUS, "%s", old_file);
+
+ if (vm_must_add_frozenbit && strcmp(type_suffix, "_vm") == 0)
+ {
+ /* Need to rewrite visibility map format */
+ pg_log(PG_VERBOSE, "rewriting \"%s\" to \"%s\"\n",
+ old_file, new_file);
+ rewriteVisibilityMap(old_file, new_file, map->nspname, map->relname);
+ }
+ else
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ pg_log(PG_VERBOSE, "cloning \"%s\" to \"%s\"\n",
+ old_file, new_file);
+ cloneFile(old_file, new_file, map->nspname, map->relname);
+ break;
+ case TRANSFER_MODE_COPY:
+ pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\"\n",
+ old_file, new_file);
+ copyFile(old_file, new_file, map->nspname, map->relname);
+ break;
+ case TRANSFER_MODE_LINK:
+ pg_log(PG_VERBOSE, "linking \"%s\" to \"%s\"\n",
+ old_file, new_file);
+ linkFile(old_file, new_file, map->nspname, map->relname);
+ }
+ }
+}
diff --git a/src/bin/pg_upgrade/server.c b/src/bin/pg_upgrade/server.c
new file mode 100644
index 0000000..7fed0ae
--- /dev/null
+++ b/src/bin/pg_upgrade/server.c
@@ -0,0 +1,387 @@
+/*
+ * server.c
+ *
+ * database server functions
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/server.c
+ */
+
+#include "postgres_fe.h"
+
+#include "common/connect.h"
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+static PGconn *get_db_conn(ClusterInfo *cluster, const char *db_name);
+
+
+/*
+ * connectToServer()
+ *
+ * Connects to the desired database on the designated server.
+ * If the connection attempt fails, this function logs an error
+ * message and calls exit() to kill the program.
+ */
+PGconn *
+connectToServer(ClusterInfo *cluster, const char *db_name)
+{
+ PGconn *conn = get_db_conn(cluster, db_name);
+
+ if (conn == NULL || PQstatus(conn) != CONNECTION_OK)
+ {
+ pg_log(PG_REPORT, "%s", PQerrorMessage(conn));
+
+ if (conn)
+ PQfinish(conn);
+
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ }
+
+ PQclear(executeQueryOrDie(conn, ALWAYS_SECURE_SEARCH_PATH_SQL));
+
+ return conn;
+}
+
+
+/*
+ * get_db_conn()
+ *
+ * get database connection, using named database + standard params for cluster
+ *
+ * Caller must check for connection failure!
+ */
+static PGconn *
+get_db_conn(ClusterInfo *cluster, const char *db_name)
+{
+ PQExpBufferData conn_opts;
+ PGconn *conn;
+
+ /* Build connection string with proper quoting */
+ initPQExpBuffer(&conn_opts);
+ appendPQExpBufferStr(&conn_opts, "dbname=");
+ appendConnStrVal(&conn_opts, db_name);
+ appendPQExpBufferStr(&conn_opts, " user=");
+ appendConnStrVal(&conn_opts, os_info.user);
+ appendPQExpBuffer(&conn_opts, " port=%d", cluster->port);
+ if (cluster->sockdir)
+ {
+ appendPQExpBufferStr(&conn_opts, " host=");
+ appendConnStrVal(&conn_opts, cluster->sockdir);
+ }
+
+ conn = PQconnectdb(conn_opts.data);
+ termPQExpBuffer(&conn_opts);
+ return conn;
+}
+
+
+/*
+ * cluster_conn_opts()
+ *
+ * Return standard command-line options for connecting to this cluster when
+ * using psql, pg_dump, etc. Ideally this would match what get_db_conn()
+ * sets, but the utilities we need aren't very consistent about the treatment
+ * of database name options, so we leave that out.
+ *
+ * Result is valid until the next call to this function.
+ */
+char *
+cluster_conn_opts(ClusterInfo *cluster)
+{
+ static PQExpBuffer buf;
+
+ if (buf == NULL)
+ buf = createPQExpBuffer();
+ else
+ resetPQExpBuffer(buf);
+
+ if (cluster->sockdir)
+ {
+ appendPQExpBufferStr(buf, "--host ");
+ appendShellString(buf, cluster->sockdir);
+ appendPQExpBufferChar(buf, ' ');
+ }
+ appendPQExpBuffer(buf, "--port %d --username ", cluster->port);
+ appendShellString(buf, os_info.user);
+
+ return buf->data;
+}
+
+
+/*
+ * executeQueryOrDie()
+ *
+ * Formats a query string from the given arguments and executes the
+ * resulting query. If the query fails, this function logs an error
+ * message and calls exit() to kill the program.
+ */
+PGresult *
+executeQueryOrDie(PGconn *conn, const char *fmt,...)
+{
+ static char query[QUERY_ALLOC];
+ va_list args;
+ PGresult *result;
+ ExecStatusType status;
+
+ va_start(args, fmt);
+ vsnprintf(query, sizeof(query), fmt, args);
+ va_end(args);
+
+ pg_log(PG_VERBOSE, "executing: %s\n", query);
+ result = PQexec(conn, query);
+ status = PQresultStatus(result);
+
+ if ((status != PGRES_TUPLES_OK) && (status != PGRES_COMMAND_OK))
+ {
+ pg_log(PG_REPORT, "SQL command failed\n%s\n%s", query,
+ PQerrorMessage(conn));
+ PQclear(result);
+ PQfinish(conn);
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ }
+ else
+ return result;
+}
+
+
+/*
+ * get_major_server_version()
+ *
+ * gets the version (in unsigned int form) for the given datadir. Assumes
+ * that datadir is an absolute path to a valid pgdata directory. The version
+ * is retrieved by reading the PG_VERSION file.
+ */
+uint32
+get_major_server_version(ClusterInfo *cluster)
+{
+ FILE *version_fd;
+ char ver_filename[MAXPGPATH];
+ int v1 = 0,
+ v2 = 0;
+
+ snprintf(ver_filename, sizeof(ver_filename), "%s/PG_VERSION",
+ cluster->pgdata);
+ if ((version_fd = fopen(ver_filename, "r")) == NULL)
+ pg_fatal("could not open version file \"%s\": %m\n", ver_filename);
+
+ if (fscanf(version_fd, "%63s", cluster->major_version_str) == 0 ||
+ sscanf(cluster->major_version_str, "%d.%d", &v1, &v2) < 1)
+ pg_fatal("could not parse version file \"%s\"\n", ver_filename);
+
+ fclose(version_fd);
+
+ if (v1 < 10)
+ {
+ /* old style, e.g. 9.6.1 */
+ return v1 * 10000 + v2 * 100;
+ }
+ else
+ {
+ /* new style, e.g. 10.1 */
+ return v1 * 10000;
+ }
+}
+
+
+static void
+stop_postmaster_atexit(void)
+{
+ stop_postmaster(true);
+}
+
+
+bool
+start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
+{
+ char cmd[MAXPGPATH * 4 + 1000];
+ PGconn *conn;
+ bool pg_ctl_return = false;
+ char socket_string[MAXPGPATH + 200];
+
+ static bool exit_hook_registered = false;
+
+ if (!exit_hook_registered)
+ {
+ atexit(stop_postmaster_atexit);
+ exit_hook_registered = true;
+ }
+
+ socket_string[0] = '\0';
+
+#if defined(HAVE_UNIX_SOCKETS) && !defined(WIN32)
+ /* prevent TCP/IP connections, restrict socket access */
+ strcat(socket_string,
+ " -c listen_addresses='' -c unix_socket_permissions=0700");
+
+ /* Have a sockdir? Tell the postmaster. */
+ if (cluster->sockdir)
+ snprintf(socket_string + strlen(socket_string),
+ sizeof(socket_string) - strlen(socket_string),
+ " -c %s='%s'",
+ (GET_MAJOR_VERSION(cluster->major_version) <= 902) ?
+ "unix_socket_directory" : "unix_socket_directories",
+ cluster->sockdir);
+#endif
+
+ /*
+ * Since PG 9.1, we have used -b to disable autovacuum. For earlier
+ * releases, setting autovacuum=off disables cleanup vacuum and analyze,
+ * but freeze vacuums can still happen, so we set
+ * autovacuum_freeze_max_age to its maximum.
+ * (autovacuum_multixact_freeze_max_age was introduced after 9.1, so there
+ * is no need to set that.) We assume all datfrozenxid and relfrozenxid
+ * values are less than a gap of 2000000000 from the current xid counter,
+ * so autovacuum will not touch them.
+ *
+ * Turn off durability requirements to improve object creation speed, and
+ * we only modify the new cluster, so only use it there. If there is a
+ * crash, the new cluster has to be recreated anyway. fsync=off is a big
+ * win on ext4.
+ *
+ * Force vacuum_defer_cleanup_age to 0 on the new cluster, so that
+ * vacuumdb --freeze actually freezes the tuples.
+ */
+ snprintf(cmd, sizeof(cmd),
+ "\"%s/pg_ctl\" -w -l \"%s\" -D \"%s\" -o \"-p %d%s%s %s%s\" start",
+ cluster->bindir, SERVER_LOG_FILE, cluster->pgconfig, cluster->port,
+ (cluster->controldata.cat_ver >=
+ BINARY_UPGRADE_SERVER_FLAG_CAT_VER) ? " -b" :
+ " -c autovacuum=off -c autovacuum_freeze_max_age=2000000000",
+ (cluster == &new_cluster) ?
+ " -c synchronous_commit=off -c fsync=off -c full_page_writes=off -c vacuum_defer_cleanup_age=0" : "",
+ cluster->pgopts ? cluster->pgopts : "", socket_string);
+
+ /*
+ * Don't throw an error right away, let connecting throw the error because
+ * it might supply a reason for the failure.
+ */
+ pg_ctl_return = exec_prog(SERVER_START_LOG_FILE,
+ /* pass both file names if they differ */
+ (strcmp(SERVER_LOG_FILE,
+ SERVER_START_LOG_FILE) != 0) ?
+ SERVER_LOG_FILE : NULL,
+ report_and_exit_on_error, false,
+ "%s", cmd);
+
+ /* Did it fail and we are just testing if the server could be started? */
+ if (!pg_ctl_return && !report_and_exit_on_error)
+ return false;
+
+ /*
+ * We set this here to make sure atexit() shuts down the server, but only
+ * if we started the server successfully. We do it before checking for
+ * connectivity in case the server started but there is a connectivity
+ * failure. If pg_ctl did not return success, we will exit below.
+ *
+ * Pre-9.1 servers do not have PQping(), so we could be leaving the server
+ * running if authentication was misconfigured, so someday we might went
+ * to be more aggressive about doing server shutdowns even if pg_ctl
+ * fails, but now (2013-08-14) it seems prudent to be cautious. We don't
+ * want to shutdown a server that might have been accidentally started
+ * during the upgrade.
+ */
+ if (pg_ctl_return)
+ os_info.running_cluster = cluster;
+
+ /*
+ * pg_ctl -w might have failed because the server couldn't be started, or
+ * there might have been a connection problem in _checking_ if the server
+ * has started. Therefore, even if pg_ctl failed, we continue and test
+ * for connectivity in case we get a connection reason for the failure.
+ */
+ if ((conn = get_db_conn(cluster, "template1")) == NULL ||
+ PQstatus(conn) != CONNECTION_OK)
+ {
+ pg_log(PG_REPORT, "\n%s", PQerrorMessage(conn));
+ if (conn)
+ PQfinish(conn);
+ if (cluster == &old_cluster)
+ pg_fatal("could not connect to source postmaster started with the command:\n"
+ "%s\n",
+ cmd);
+ else
+ pg_fatal("could not connect to target postmaster started with the command:\n"
+ "%s\n",
+ cmd);
+ }
+ PQfinish(conn);
+
+ /*
+ * If pg_ctl failed, and the connection didn't fail, and
+ * report_and_exit_on_error is enabled, fail now. This could happen if
+ * the server was already running.
+ */
+ if (!pg_ctl_return)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("pg_ctl failed to start the source server, or connection failed\n");
+ else
+ pg_fatal("pg_ctl failed to start the target server, or connection failed\n");
+ }
+
+ return true;
+}
+
+
+void
+stop_postmaster(bool in_atexit)
+{
+ ClusterInfo *cluster;
+
+ if (os_info.running_cluster == &old_cluster)
+ cluster = &old_cluster;
+ else if (os_info.running_cluster == &new_cluster)
+ cluster = &new_cluster;
+ else
+ return; /* no cluster running */
+
+ exec_prog(SERVER_STOP_LOG_FILE, NULL, !in_atexit, !in_atexit,
+ "\"%s/pg_ctl\" -w -D \"%s\" -o \"%s\" %s stop",
+ cluster->bindir, cluster->pgconfig,
+ cluster->pgopts ? cluster->pgopts : "",
+ in_atexit ? "-m fast" : "-m smart");
+
+ os_info.running_cluster = NULL;
+}
+
+
+/*
+ * check_pghost_envvar()
+ *
+ * Tests that PGHOST does not point to a non-local server
+ */
+void
+check_pghost_envvar(void)
+{
+ PQconninfoOption *option;
+ PQconninfoOption *start;
+
+ /* Get valid libpq env vars from the PQconndefaults function */
+
+ start = PQconndefaults();
+
+ if (!start)
+ pg_fatal("out of memory\n");
+
+ for (option = start; option->keyword != NULL; option++)
+ {
+ if (option->envvar && (strcmp(option->envvar, "PGHOST") == 0 ||
+ strcmp(option->envvar, "PGHOSTADDR") == 0))
+ {
+ const char *value = getenv(option->envvar);
+
+ if (value && strlen(value) > 0 &&
+ /* check for 'local' host values */
+ (strcmp(value, "localhost") != 0 && strcmp(value, "127.0.0.1") != 0 &&
+ strcmp(value, "::1") != 0 && value[0] != '/'))
+ pg_fatal("libpq environment variable %s has a non-local server value: %s\n",
+ option->envvar, value);
+ }
+ }
+
+ /* Free the memory that libpq allocated on our behalf */
+ PQconninfoFree(start);
+}
diff --git a/src/bin/pg_upgrade/tablespace.c b/src/bin/pg_upgrade/tablespace.c
new file mode 100644
index 0000000..bd49d30
--- /dev/null
+++ b/src/bin/pg_upgrade/tablespace.c
@@ -0,0 +1,119 @@
+/*
+ * tablespace.c
+ *
+ * tablespace functions
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/tablespace.c
+ */
+
+#include "postgres_fe.h"
+
+#include "pg_upgrade.h"
+
+static void get_tablespace_paths(void);
+static void set_tablespace_directory_suffix(ClusterInfo *cluster);
+
+
+void
+init_tablespaces(void)
+{
+ get_tablespace_paths();
+
+ set_tablespace_directory_suffix(&old_cluster);
+ set_tablespace_directory_suffix(&new_cluster);
+
+ if (os_info.num_old_tablespaces > 0 &&
+ strcmp(old_cluster.tablespace_suffix, new_cluster.tablespace_suffix) == 0)
+ pg_fatal("Cannot upgrade to/from the same system catalog version when\n"
+ "using tablespaces.\n");
+}
+
+
+/*
+ * get_tablespace_paths()
+ *
+ * Scans pg_tablespace and returns a malloc'ed array of all tablespace
+ * paths. It's the caller's responsibility to free the array.
+ */
+static void
+get_tablespace_paths(void)
+{
+ PGconn *conn = connectToServer(&old_cluster, "template1");
+ PGresult *res;
+ int tblnum;
+ int i_spclocation;
+ char query[QUERY_ALLOC];
+
+ snprintf(query, sizeof(query),
+ "SELECT %s "
+ "FROM pg_catalog.pg_tablespace "
+ "WHERE spcname != 'pg_default' AND "
+ " spcname != 'pg_global'",
+ /* 9.2 removed the spclocation column */
+ (GET_MAJOR_VERSION(old_cluster.major_version) <= 901) ?
+ "spclocation" : "pg_catalog.pg_tablespace_location(oid) AS spclocation");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ if ((os_info.num_old_tablespaces = PQntuples(res)) != 0)
+ os_info.old_tablespaces =
+ (char **) pg_malloc(os_info.num_old_tablespaces * sizeof(char *));
+ else
+ os_info.old_tablespaces = NULL;
+
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ struct stat statBuf;
+
+ os_info.old_tablespaces[tblnum] = pg_strdup(PQgetvalue(res, tblnum, i_spclocation));
+
+ /*
+ * Check that the tablespace path exists and is a directory.
+ * Effectively, this is checking only for tables/indexes in
+ * non-existent tablespace directories. Databases located in
+ * non-existent tablespaces already throw a backend error.
+ * Non-existent tablespace directories can occur when a data directory
+ * that contains user tablespaces is moved as part of pg_upgrade
+ * preparation and the symbolic links are not updated.
+ */
+ if (stat(os_info.old_tablespaces[tblnum], &statBuf) != 0)
+ {
+ if (errno == ENOENT)
+ report_status(PG_FATAL,
+ "tablespace directory \"%s\" does not exist\n",
+ os_info.old_tablespaces[tblnum]);
+ else
+ report_status(PG_FATAL,
+ "could not stat tablespace directory \"%s\": %s\n",
+ os_info.old_tablespaces[tblnum], strerror(errno));
+ }
+ if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL,
+ "tablespace path \"%s\" is not a directory\n",
+ os_info.old_tablespaces[tblnum]);
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+}
+
+
+static void
+set_tablespace_directory_suffix(ClusterInfo *cluster)
+{
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 804)
+ cluster->tablespace_suffix = pg_strdup("");
+ else
+ {
+ /* This cluster has a version-specific subdirectory */
+
+ /* The leading slash is needed to start a new directory. */
+ cluster->tablespace_suffix = psprintf("/PG_%s_%d",
+ cluster->major_version_str,
+ cluster->controldata.cat_ver);
+ }
+}
diff --git a/src/bin/pg_upgrade/test.sh b/src/bin/pg_upgrade/test.sh
new file mode 100644
index 0000000..f353e56
--- /dev/null
+++ b/src/bin/pg_upgrade/test.sh
@@ -0,0 +1,282 @@
+#!/bin/sh
+
+# src/bin/pg_upgrade/test.sh
+#
+# Test driver for pg_upgrade. Initializes a new database cluster,
+# runs the regression tests (to put in some data), runs pg_dumpall,
+# runs pg_upgrade, runs pg_dumpall again, compares the dumps.
+#
+# Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+
+set -e
+
+: ${MAKE=make}
+
+# Guard against parallel make issues (see comments in pg_regress.c)
+unset MAKEFLAGS
+unset MAKELEVEL
+
+# Run a given "initdb" binary and overlay the regression testing
+# authentication configuration.
+standard_initdb() {
+ # To increase coverage of non-standard segment size and group access
+ # without increasing test runtime, run these tests with a custom setting.
+ # Also, specify "-A trust" explicitly to suppress initdb's warning.
+ # --allow-group-access and --wal-segsize have been added in v11.
+ "$1" -N --wal-segsize 1 --allow-group-access -A trust
+ if [ -n "$TEMP_CONFIG" -a -r "$TEMP_CONFIG" ]
+ then
+ cat "$TEMP_CONFIG" >> "$PGDATA/postgresql.conf"
+ fi
+ ../../test/regress/pg_regress --config-auth "$PGDATA"
+}
+
+# What flavor of host are we on?
+# Treat MINGW* (msys1) and MSYS* (msys2) the same.
+testhost=`uname -s | sed 's/^MSYS/MINGW/'`
+
+# Establish how the server will listen for connections
+case $testhost in
+ MINGW*)
+ LISTEN_ADDRESSES="localhost"
+ PG_REGRESS_SOCKET_DIR=""
+ PGHOST=localhost
+ ;;
+ *)
+ LISTEN_ADDRESSES=""
+ # Select a socket directory. The algorithm is from the "configure"
+ # script; the outcome mimics pg_regress.c:make_temp_sockdir().
+ if [ x"$PG_REGRESS_SOCKET_DIR" = x ]; then
+ set +e
+ dir=`(umask 077 &&
+ mktemp -d /tmp/pg_upgrade_check-XXXXXX) 2>/dev/null`
+ if [ ! -d "$dir" ]; then
+ dir=/tmp/pg_upgrade_check-$$-$RANDOM
+ (umask 077 && mkdir "$dir")
+ if [ ! -d "$dir" ]; then
+ echo "could not create socket temporary directory in \"/tmp\""
+ exit 1
+ fi
+ fi
+ set -e
+ PG_REGRESS_SOCKET_DIR=$dir
+ trap 'rm -rf "$PG_REGRESS_SOCKET_DIR"' 0
+ trap 'exit 3' 1 2 13 15
+ fi
+ PGHOST=$PG_REGRESS_SOCKET_DIR
+ ;;
+esac
+
+POSTMASTER_OPTS="-F -c listen_addresses=\"$LISTEN_ADDRESSES\" -k \"$PG_REGRESS_SOCKET_DIR\""
+export PGHOST
+
+# don't rely on $PWD here, as old shells don't set it
+temp_root=`pwd`/tmp_check
+rm -rf "$temp_root"
+mkdir "$temp_root"
+
+: ${oldbindir=$bindir}
+
+: ${oldsrc=../../..}
+oldsrc=`cd "$oldsrc" && pwd`
+newsrc=`cd ../../.. && pwd`
+
+# We need to make pg_regress use psql from the desired installation
+# (likely a temporary one), because otherwise the installcheck run
+# below would try to use psql from the proper installation directory
+# of the target version, which might be outdated or not exist. But
+# don't override anything else that's already in EXTRA_REGRESS_OPTS.
+EXTRA_REGRESS_OPTS="$EXTRA_REGRESS_OPTS --bindir='$oldbindir'"
+export EXTRA_REGRESS_OPTS
+
+# While in normal cases this will already be set up, adding bindir to
+# path allows test.sh to be invoked with different versions as
+# described in ./TESTING
+PATH=$bindir:$PATH
+export PATH
+
+BASE_PGDATA="$temp_root/data"
+PGDATA="${BASE_PGDATA}.old"
+export PGDATA
+
+# Send installcheck outputs to a private directory. This avoids conflict when
+# check-world runs pg_upgrade check concurrently with src/test/regress check.
+# To retrieve interesting files after a run, use pattern tmp_check/*/*.diffs.
+outputdir="$temp_root/regress"
+EXTRA_REGRESS_OPTS="$EXTRA_REGRESS_OPTS --outputdir=$outputdir"
+export EXTRA_REGRESS_OPTS
+mkdir "$outputdir"
+
+# pg_regress --make-tablespacedir would take care of that in 14~, but this is
+# still required for older versions where this option is not supported.
+if [ "$newsrc" != "$oldsrc" ]; then
+ mkdir "$outputdir"/testtablespace
+ mkdir "$outputdir"/sql
+ mkdir "$outputdir"/expected
+fi
+
+logdir=`pwd`/log
+rm -rf "$logdir"
+mkdir "$logdir"
+
+# Clear out any environment vars that might cause libpq to connect to
+# the wrong postmaster (cf pg_regress.c)
+#
+# Some shells, such as NetBSD's, return non-zero from unset if the variable
+# is already unset. Since we are operating under 'set -e', this causes the
+# script to fail. To guard against this, set them all to an empty string first.
+PGDATABASE=""; unset PGDATABASE
+PGUSER=""; unset PGUSER
+PGSERVICE=""; unset PGSERVICE
+PGSSLMODE=""; unset PGSSLMODE
+PGREQUIRESSL=""; unset PGREQUIRESSL
+PGCONNECT_TIMEOUT=""; unset PGCONNECT_TIMEOUT
+PGHOSTADDR=""; unset PGHOSTADDR
+
+# Select a non-conflicting port number, similarly to pg_regress.c
+PG_VERSION_NUM=`grep '#define PG_VERSION_NUM' "$newsrc"/src/include/pg_config.h | awk '{print $3}'`
+PGPORT=`expr $PG_VERSION_NUM % 16384 + 49152`
+export PGPORT
+
+i=0
+while psql -X postgres </dev/null 2>/dev/null
+do
+ i=`expr $i + 1`
+ if [ $i -eq 16 ]
+ then
+ echo port $PGPORT apparently in use
+ exit 1
+ fi
+ PGPORT=`expr $PGPORT + 1`
+ export PGPORT
+done
+
+# buildfarm may try to override port via EXTRA_REGRESS_OPTS ...
+EXTRA_REGRESS_OPTS="$EXTRA_REGRESS_OPTS --port=$PGPORT"
+export EXTRA_REGRESS_OPTS
+
+standard_initdb "$oldbindir"/initdb
+"$oldbindir"/pg_ctl start -l "$logdir/postmaster1.log" -o "$POSTMASTER_OPTS" -w
+
+# Create databases with names covering the ASCII bytes other than NUL, BEL,
+# LF, or CR. BEL would ring the terminal bell in the course of this test, and
+# it is not otherwise a special case. PostgreSQL doesn't support the rest.
+dbname1=`awk 'BEGIN { for (i= 1; i < 46; i++)
+ if (i != 7 && i != 10 && i != 13) printf "%c", i }' </dev/null`
+# Exercise backslashes adjacent to double quotes, a Windows special case.
+dbname1='\"\'$dbname1'\\"\\\'
+dbname2=`awk 'BEGIN { for (i = 46; i < 91; i++) printf "%c", i }' </dev/null`
+dbname3=`awk 'BEGIN { for (i = 91; i < 128; i++) printf "%c", i }' </dev/null`
+createdb "regression$dbname1" || createdb_status=$?
+createdb "regression$dbname2" || createdb_status=$?
+createdb "regression$dbname3" || createdb_status=$?
+
+# Extra options to apply to the dump. This may be changed later.
+extra_dump_options=""
+
+if "$MAKE" -C "$oldsrc" installcheck-parallel; then
+ oldpgversion=`psql -X -A -t -d regression -c "SHOW server_version_num"`
+
+ # Before dumping, tweak the database of the old instance depending
+ # on its version.
+ if [ "$newsrc" != "$oldsrc" ]; then
+ # This SQL script has its own idea of the cleanup that needs to be
+ # done on the cluster to-be-upgraded, and includes version checks.
+ # Note that this uses the script stored on the new branch.
+ psql -X -d regression -f "$newsrc/src/bin/pg_upgrade/upgrade_adapt.sql" \
+ || psql_fix_sql_status=$?
+
+ # Handling of --extra-float-digits gets messy after v12.
+ # Note that this changes the dumps from the old and new
+ # instances if involving an old cluster of v11 or older.
+ if [ $oldpgversion -lt 120000 ]; then
+ extra_dump_options="--extra-float-digits=0"
+ fi
+ fi
+
+ pg_dumpall $extra_dump_options --no-sync \
+ -f "$temp_root"/dump1.sql || pg_dumpall1_status=$?
+
+ if [ "$newsrc" != "$oldsrc" ]; then
+ # update references to old source tree's regress.so etc
+ fix_sql=""
+ case $oldpgversion in
+ 804??)
+ fix_sql="UPDATE pg_proc SET probin = replace(probin::text, '$oldsrc', '$newsrc')::bytea WHERE probin LIKE '$oldsrc%';"
+ ;;
+ *)
+ fix_sql="UPDATE pg_proc SET probin = replace(probin, '$oldsrc', '$newsrc') WHERE probin LIKE '$oldsrc%';"
+ ;;
+ esac
+ psql -X -d regression -c "$fix_sql;" || psql_fix_sql_status=$?
+
+ mv "$temp_root"/dump1.sql "$temp_root"/dump1.sql.orig
+ sed "s;$oldsrc;$newsrc;g" "$temp_root"/dump1.sql.orig >"$temp_root"/dump1.sql
+ fi
+else
+ make_installcheck_status=$?
+fi
+"$oldbindir"/pg_ctl -m fast stop
+if [ -n "$createdb_status" ]; then
+ exit 1
+fi
+if [ -n "$make_installcheck_status" ]; then
+ exit 1
+fi
+if [ -n "$psql_fix_sql_status" ]; then
+ exit 1
+fi
+if [ -n "$pg_dumpall1_status" ]; then
+ echo "pg_dumpall of pre-upgrade database cluster failed"
+ exit 1
+fi
+
+PGDATA="$BASE_PGDATA"
+
+standard_initdb 'initdb'
+
+pg_upgrade $PG_UPGRADE_OPTS -d "${PGDATA}.old" -D "$PGDATA" -b "$oldbindir" -p "$PGPORT" -P "$PGPORT"
+
+# make sure all directories and files have group permissions, on Unix hosts
+# Windows hosts don't support Unix-y permissions.
+case $testhost in
+ MINGW*|CYGWIN*) ;;
+ *) if [ `find "$PGDATA" -type f ! -perm 640 | wc -l` -ne 0 ]; then
+ echo "files in PGDATA with permission != 640";
+ exit 1;
+ fi ;;
+esac
+
+case $testhost in
+ MINGW*|CYGWIN*) ;;
+ *) if [ `find "$PGDATA" -type d ! -perm 750 | wc -l` -ne 0 ]; then
+ echo "directories in PGDATA with permission != 750";
+ exit 1;
+ fi ;;
+esac
+
+pg_ctl start -l "$logdir/postmaster2.log" -o "$POSTMASTER_OPTS" -w
+
+pg_dumpall $extra_dump_options --no-sync \
+ -f "$temp_root"/dump2.sql || pg_dumpall2_status=$?
+pg_ctl -m fast stop
+
+if [ -n "$pg_dumpall2_status" ]; then
+ echo "pg_dumpall of post-upgrade database cluster failed"
+ exit 1
+fi
+
+case $testhost in
+ MINGW*) MSYS2_ARG_CONV_EXCL=/c cmd /c delete_old_cluster.bat ;;
+ *) sh ./delete_old_cluster.sh ;;
+esac
+
+if diff "$temp_root"/dump1.sql "$temp_root"/dump2.sql >/dev/null; then
+ echo PASSED
+ exit 0
+else
+ echo "Files $temp_root/dump1.sql and $temp_root/dump2.sql differ"
+ echo "dumps were not identical"
+ exit 1
+fi
diff --git a/src/bin/pg_upgrade/upgrade_adapt.sql b/src/bin/pg_upgrade/upgrade_adapt.sql
new file mode 100644
index 0000000..27c4c7f
--- /dev/null
+++ b/src/bin/pg_upgrade/upgrade_adapt.sql
@@ -0,0 +1,91 @@
+--
+-- SQL queries for upgrade tests across different major versions.
+--
+-- This file includes a set of SQL queries to make a cluster to-be-upgraded
+-- compatible with the version this file is based on. Note that this
+-- requires psql, as per-version queries are controlled with a set of \if
+-- clauses.
+
+-- This script is backward-compatible, so it is able to work with any version
+-- newer than 9.2 we are upgrading from, up to the branch this script is stored
+-- on (even if this would not run if running pg_upgrade with the same version
+-- for the origin and the target).
+
+-- \if accepts a simple boolean value, so all the version checks are
+-- saved based on this assumption.
+SELECT
+ ver <= 902 AS oldpgversion_le92,
+ ver <= 904 AS oldpgversion_le94,
+ ver <= 906 AS oldpgversion_le96,
+ ver <= 1000 AS oldpgversion_le10,
+ ver <= 1100 AS oldpgversion_le11,
+ ver <= 1300 AS oldpgversion_le13
+ FROM (SELECT current_setting('server_version_num')::int / 100 AS ver) AS v;
+\gset
+
+-- Objects last appearing in 9.2.
+\if :oldpgversion_le92
+-- Note that those tables are removed from the regression tests in 9.3
+-- and newer versions.
+DROP TABLE abstime_tbl;
+DROP TABLE reltime_tbl;
+DROP TABLE tinterval_tbl;
+\endif
+
+-- Objects last appearing in 9.4.
+\if :oldpgversion_le94
+-- This aggregate has been fixed in 9.5 and later versions, so drop
+-- and re-create it.
+DROP AGGREGATE array_cat_accum(anyarray);
+CREATE AGGREGATE array_larger_accum (anyarray) (
+ sfunc = array_larger,
+ stype = anyarray,
+ initcond = $${}$$);
+-- This operator has been fixed in 9.5 and later versions, so drop and
+-- re-create it.
+DROP OPERATOR @#@ (NONE, bigint);
+CREATE OPERATOR @#@ (PROCEDURE = factorial,
+ RIGHTARG = bigint);
+\endif
+
+-- Objects last appearing in 9.6.
+\if :oldpgversion_le96
+DROP FUNCTION public.oldstyle_length(integer, text);
+\endif
+
+-- Objects last appearing in 10.
+\if :oldpgversion_le10
+DROP FUNCTION IF EXISTS boxarea(box);
+DROP FUNCTION IF EXISTS funny_dup17();
+\endif
+
+-- Objects last appearing in 11.
+\if :oldpgversion_le11
+-- WITH OIDS is supported until v11, so remove its support for any
+-- relations marked as such.
+DO $stmt$
+ DECLARE
+ rec text;
+ BEGIN
+ FOR rec in
+ SELECT oid::regclass::text
+ FROM pg_class
+ WHERE relname !~ '^pg_'
+ AND relhasoids
+ AND relkind in ('r','m')
+ ORDER BY 1
+ LOOP
+ execute 'ALTER TABLE ' || rec || ' SET WITHOUT OIDS';
+ END LOOP;
+ END; $stmt$;
+\endif
+
+-- Objects last appearing in 13.
+\if :oldpgversion_le13
+-- Until v10, operators could only be dropped one at a time, so be careful
+-- to stick with one command for each drop here.
+DROP OPERATOR public.#@# (pg_catalog.int8, NONE);
+DROP OPERATOR public.#%# (pg_catalog.int8, NONE);
+DROP OPERATOR public.!=- (pg_catalog.int8, NONE);
+DROP OPERATOR public.#@%# (pg_catalog.int8, NONE);
+\endif
diff --git a/src/bin/pg_upgrade/util.c b/src/bin/pg_upgrade/util.c
new file mode 100644
index 0000000..fc20472
--- /dev/null
+++ b/src/bin/pg_upgrade/util.c
@@ -0,0 +1,243 @@
+/*
+ * util.c
+ *
+ * utility functions
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/util.c
+ */
+
+#include "postgres_fe.h"
+
+#include <signal.h>
+
+#include "common/username.h"
+#include "pg_upgrade.h"
+
+LogOpts log_opts;
+
+static void pg_log_v(eLogType type, const char *fmt, va_list ap) pg_attribute_printf(2, 0);
+
+
+/*
+ * report_status()
+ *
+ * Displays the result of an operation (ok, failed, error message,...)
+ */
+void
+report_status(eLogType type, const char *fmt,...)
+{
+ va_list args;
+ char message[MAX_STRING];
+
+ va_start(args, fmt);
+ vsnprintf(message, sizeof(message), fmt, args);
+ va_end(args);
+
+ pg_log(type, "%s\n", message);
+}
+
+
+/* force blank output for progress display */
+void
+end_progress_output(void)
+{
+ /*
+ * In case nothing printed; pass a space so gcc doesn't complain about
+ * empty format string.
+ */
+ prep_status(" ");
+}
+
+
+/*
+ * prep_status
+ *
+ * Displays a message that describes an operation we are about to begin.
+ * We pad the message out to MESSAGE_WIDTH characters so that all of the "ok" and
+ * "failed" indicators line up nicely.
+ *
+ * A typical sequence would look like this:
+ * prep_status("about to flarb the next %d files", fileCount );
+ *
+ * if(( message = flarbFiles(fileCount)) == NULL)
+ * report_status(PG_REPORT, "ok" );
+ * else
+ * pg_log(PG_FATAL, "failed - %s\n", message );
+ */
+void
+prep_status(const char *fmt,...)
+{
+ va_list args;
+ char message[MAX_STRING];
+
+ va_start(args, fmt);
+ vsnprintf(message, sizeof(message), fmt, args);
+ va_end(args);
+
+ if (strlen(message) > 0 && message[strlen(message) - 1] == '\n')
+ pg_log(PG_REPORT, "%s", message);
+ else
+ /* trim strings that don't end in a newline */
+ pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, message);
+}
+
+
+static void
+pg_log_v(eLogType type, const char *fmt, va_list ap)
+{
+ char message[QUERY_ALLOC];
+
+ vsnprintf(message, sizeof(message), _(fmt), ap);
+
+ /* PG_VERBOSE and PG_STATUS are only output in verbose mode */
+ /* fopen() on log_opts.internal might have failed, so check it */
+ if (((type != PG_VERBOSE && type != PG_STATUS) || log_opts.verbose) &&
+ log_opts.internal != NULL)
+ {
+ if (type == PG_STATUS)
+ /* status messages need two leading spaces and a newline */
+ fprintf(log_opts.internal, " %s\n", message);
+ else
+ fprintf(log_opts.internal, "%s", message);
+ fflush(log_opts.internal);
+ }
+
+ switch (type)
+ {
+ case PG_VERBOSE:
+ if (log_opts.verbose)
+ printf("%s", message);
+ break;
+
+ case PG_STATUS:
+ /* for output to a display, do leading truncation and append \r */
+ if (isatty(fileno(stdout)))
+ /* -2 because we use a 2-space indent */
+ printf(" %s%-*.*s\r",
+ /* prefix with "..." if we do leading truncation */
+ strlen(message) <= MESSAGE_WIDTH - 2 ? "" : "...",
+ MESSAGE_WIDTH - 2, MESSAGE_WIDTH - 2,
+ /* optional leading truncation */
+ strlen(message) <= MESSAGE_WIDTH - 2 ? message :
+ message + strlen(message) - MESSAGE_WIDTH + 3 + 2);
+ else
+ printf(" %s\n", message);
+ break;
+
+ case PG_REPORT:
+ case PG_WARNING:
+ printf("%s", message);
+ break;
+
+ case PG_FATAL:
+ printf("\n%s", message);
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ break;
+
+ default:
+ break;
+ }
+ fflush(stdout);
+}
+
+
+void
+pg_log(eLogType type, const char *fmt,...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ pg_log_v(type, fmt, args);
+ va_end(args);
+}
+
+
+void
+pg_fatal(const char *fmt,...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ pg_log_v(PG_FATAL, fmt, args);
+ va_end(args);
+ printf(_("Failure, exiting\n"));
+ exit(1);
+}
+
+
+void
+check_ok(void)
+{
+ /* all seems well */
+ report_status(PG_REPORT, "ok");
+ fflush(stdout);
+}
+
+
+/*
+ * quote_identifier()
+ * Properly double-quote a SQL identifier.
+ *
+ * The result should be pg_free'd, but most callers don't bother because
+ * memory leakage is not a big deal in this program.
+ */
+char *
+quote_identifier(const char *s)
+{
+ char *result = pg_malloc(strlen(s) * 2 + 3);
+ char *r = result;
+
+ *r++ = '"';
+ while (*s)
+ {
+ if (*s == '"')
+ *r++ = *s;
+ *r++ = *s;
+ s++;
+ }
+ *r++ = '"';
+ *r++ = '\0';
+
+ return result;
+}
+
+
+/*
+ * get_user_info()
+ */
+int
+get_user_info(char **user_name_p)
+{
+ int user_id;
+ const char *user_name;
+ char *errstr;
+
+#ifndef WIN32
+ user_id = geteuid();
+#else
+ user_id = 1;
+#endif
+
+ user_name = get_user_name(&errstr);
+ if (!user_name)
+ pg_fatal("%s\n", errstr);
+
+ /* make a copy */
+ *user_name_p = pg_strdup(user_name);
+
+ return user_id;
+}
+
+
+/*
+ * str2uint()
+ *
+ * convert string to oid
+ */
+unsigned int
+str2uint(const char *str)
+{
+ return strtoul(str, NULL, 10);
+}
diff --git a/src/bin/pg_upgrade/version.c b/src/bin/pg_upgrade/version.c
new file mode 100644
index 0000000..ccb0126
--- /dev/null
+++ b/src/bin/pg_upgrade/version.c
@@ -0,0 +1,548 @@
+/*
+ * version.c
+ *
+ * Postgres-version-specific routines
+ *
+ * Copyright (c) 2010-2021, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/version.c
+ */
+
+#include "postgres_fe.h"
+
+#include "catalog/pg_class_d.h"
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+/*
+ * new_9_0_populate_pg_largeobject_metadata()
+ * new >= 9.0, old <= 8.4
+ * 9.0 has a new pg_largeobject permission table
+ */
+void
+new_9_0_populate_pg_largeobject_metadata(ClusterInfo *cluster, bool check_mode)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for large objects");
+
+ snprintf(output_path, sizeof(output_path), "pg_largeobject.sql");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ int i_count;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* find if there are any large objects */
+ res = executeQueryOrDie(conn,
+ "SELECT count(*) "
+ "FROM pg_catalog.pg_largeobject ");
+
+ i_count = PQfnumber(res, "count");
+ if (atoi(PQgetvalue(res, 0, i_count)) != 0)
+ {
+ found = true;
+ if (!check_mode)
+ {
+ PQExpBufferData connectbuf;
+
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n", output_path,
+ strerror(errno));
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, active_db->db_name);
+ fputs(connectbuf.data, script);
+ termPQExpBuffer(&connectbuf);
+
+ fprintf(script,
+ "SELECT pg_catalog.lo_create(t.loid)\n"
+ "FROM (SELECT DISTINCT loid FROM pg_catalog.pg_largeobject) AS t;\n");
+ }
+ }
+
+ PQclear(res);
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ report_status(PG_WARNING, "warning");
+ if (check_mode)
+ pg_log(PG_WARNING, "\n"
+ "Your installation contains large objects. The new database has an\n"
+ "additional large object permission table. After upgrading, you will be\n"
+ "given a command to populate the pg_largeobject_metadata table with\n"
+ "default permissions.\n\n");
+ else
+ pg_log(PG_WARNING, "\n"
+ "Your installation contains large objects. The new database has an\n"
+ "additional large object permission table, so default permissions must be\n"
+ "defined for all large objects. The file\n"
+ " %s\n"
+ "when executed by psql by the database superuser will set the default\n"
+ "permissions.\n\n",
+ output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_data_types_usage()
+ * Detect whether there are any stored columns depending on given type(s)
+ *
+ * If so, write a report to the given file name, and return true.
+ *
+ * base_query should be a SELECT yielding a single column named "oid",
+ * containing the pg_type OIDs of one or more types that are known to have
+ * inconsistent on-disk representations across server versions.
+ *
+ * We check for the type(s) in tables, matviews, and indexes, but not views;
+ * there's no storage involved in a view.
+ */
+bool
+check_for_data_types_usage(ClusterInfo *cluster,
+ const char *base_query,
+ const char *output_path)
+{
+ bool found = false;
+ FILE *script = NULL;
+ int dbnum;
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+ PQExpBufferData querybuf;
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname,
+ i_attname;
+
+ /*
+ * The type(s) of interest might be wrapped in a domain, array,
+ * composite, or range, and these container types can be nested (to
+ * varying extents depending on server version, but that's not of
+ * concern here). To handle all these cases we need a recursive CTE.
+ */
+ initPQExpBuffer(&querybuf);
+ appendPQExpBuffer(&querybuf,
+ "WITH RECURSIVE oids AS ( "
+ /* start with the type(s) returned by base_query */
+ " %s "
+ " UNION ALL "
+ " SELECT * FROM ( "
+ /* inner WITH because we can only reference the CTE once */
+ " WITH x AS (SELECT oid FROM oids) "
+ /* domains on any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typbasetype = x.oid AND typtype = 'd' "
+ " UNION ALL "
+ /* arrays over any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typelem = x.oid AND typtype = 'b' "
+ " UNION ALL "
+ /* composite types containing any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_class c, pg_catalog.pg_attribute a, x "
+ " WHERE t.typtype = 'c' AND "
+ " t.oid = c.reltype AND "
+ " c.oid = a.attrelid AND "
+ " NOT a.attisdropped AND "
+ " a.atttypid = x.oid ",
+ base_query);
+
+ /* Ranges were introduced in 9.2 */
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 902)
+ appendPQExpBufferStr(&querybuf,
+ " UNION ALL "
+ /* ranges containing any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x "
+ " WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid");
+
+ appendPQExpBufferStr(&querybuf,
+ " ) foo "
+ ") "
+ /* now look for stored columns of any such type */
+ "SELECT n.nspname, c.relname, a.attname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_namespace n, "
+ " pg_catalog.pg_attribute a "
+ "WHERE c.oid = a.attrelid AND "
+ " NOT a.attisdropped AND "
+ " a.atttypid IN (SELECT oid FROM oids) AND "
+ " c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_INDEX) ") AND "
+ " c.relnamespace = n.oid AND "
+ /* exclude possible orphaned temp tables */
+ " n.nspname !~ '^pg_temp_' AND "
+ " n.nspname !~ '^pg_toast_temp_' AND "
+ /* exclude system catalogs, too */
+ " n.nspname NOT IN ('pg_catalog', 'information_schema')");
+
+ res = executeQueryOrDie(conn, "%s", querybuf.data);
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ i_attname = PQfnumber(res, "attname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_relname),
+ PQgetvalue(res, rowno, i_attname));
+ }
+
+ PQclear(res);
+
+ termPQExpBuffer(&querybuf);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ return found;
+}
+
+/*
+ * check_for_data_type_usage()
+ * Detect whether there are any stored columns depending on the given type
+ *
+ * If so, write a report to the given file name, and return true.
+ *
+ * type_name should be a fully qualified type name. This is just a
+ * trivial wrapper around check_for_data_types_usage() to convert a
+ * type name into a base query.
+ */
+bool
+check_for_data_type_usage(ClusterInfo *cluster,
+ const char *type_name,
+ const char *output_path)
+{
+ bool found;
+ char *base_query;
+
+ base_query = psprintf("SELECT '%s'::pg_catalog.regtype AS oid",
+ type_name);
+
+ found = check_for_data_types_usage(cluster, base_query, output_path);
+
+ free(base_query);
+
+ return found;
+}
+
+
+/*
+ * old_9_3_check_for_line_data_type_usage()
+ * 9.3 -> 9.4
+ * Fully implement the 'line' data type in 9.4, which previously returned
+ * "not enabled" by default and was only functionally enabled with a
+ * compile-time switch; as of 9.4 "line" has a different on-disk
+ * representation format.
+ */
+void
+old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for incompatible \"line\" data type");
+
+ snprintf(output_path, sizeof(output_path), "tables_using_line.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.line", output_path))
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains the \"line\" data type in user tables.\n"
+ "This data type changed its internal and input/output format\n"
+ "between your old and new versions so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * old_9_6_check_for_unknown_data_type_usage()
+ * 9.6 -> 10
+ * It's no longer allowed to create tables or views with "unknown"-type
+ * columns. We do not complain about views with such columns, because
+ * they should get silently converted to "text" columns during the DDL
+ * dump and reload; it seems unlikely to be worth making users do that
+ * by hand. However, if there's a table with such a column, the DDL
+ * reload will fail, so we should pre-detect that rather than failing
+ * mid-upgrade. Worse, if there's a matview with such a column, the
+ * DDL reload will silently change it to "text" which won't match the
+ * on-disk storage (which is like "cstring"). So we *must* reject that.
+ */
+void
+old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for invalid \"unknown\" user columns");
+
+ snprintf(output_path, sizeof(output_path), "tables_using_unknown.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.unknown", output_path))
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains the \"unknown\" data type in user tables.\n"
+ "This data type is no longer allowed in tables, so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * old_9_6_invalidate_hash_indexes()
+ * 9.6 -> 10
+ * Hash index binary format has changed from 9.6->10.0
+ */
+void
+old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char *output_path = "reindex_hash.sql";
+
+ prep_status("Checking for hash indexes");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* find hash indexes */
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, c.relname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_index i, "
+ " pg_catalog.pg_am a, "
+ " pg_catalog.pg_namespace n "
+ "WHERE i.indexrelid = c.oid AND "
+ " c.relam = a.oid AND "
+ " c.relnamespace = n.oid AND "
+ " a.amname = 'hash'"
+ );
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (!check_mode)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ PQExpBufferData connectbuf;
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, active_db->db_name);
+ fputs(connectbuf.data, script);
+ termPQExpBuffer(&connectbuf);
+ db_used = true;
+ }
+ fprintf(script, "REINDEX INDEX %s.%s;\n",
+ quote_identifier(PQgetvalue(res, rowno, i_nspname)),
+ quote_identifier(PQgetvalue(res, rowno, i_relname)));
+ }
+ }
+
+ PQclear(res);
+
+ if (!check_mode && db_used)
+ {
+ /* mark hash indexes as invalid */
+ PQclear(executeQueryOrDie(conn,
+ "UPDATE pg_catalog.pg_index i "
+ "SET indisvalid = false "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_am a, "
+ " pg_catalog.pg_namespace n "
+ "WHERE i.indexrelid = c.oid AND "
+ " c.relam = a.oid AND "
+ " c.relnamespace = n.oid AND "
+ " a.amname = 'hash'"));
+ }
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ report_status(PG_WARNING, "warning");
+ if (check_mode)
+ pg_log(PG_WARNING, "\n"
+ "Your installation contains hash indexes. These indexes have different\n"
+ "internal formats between your old and new clusters, so they must be\n"
+ "reindexed with the REINDEX command. After upgrading, you will be given\n"
+ "REINDEX instructions.\n\n");
+ else
+ pg_log(PG_WARNING, "\n"
+ "Your installation contains hash indexes. These indexes have different\n"
+ "internal formats between your old and new clusters, so they must be\n"
+ "reindexed with the REINDEX command. The file\n"
+ " %s\n"
+ "when executed by psql by the database superuser will recreate all invalid\n"
+ "indexes; until then, none of these indexes will be used.\n\n",
+ output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * old_11_check_for_sql_identifier_data_type_usage()
+ * 11 -> 12
+ * In 12, the sql_identifier data type was switched from name to varchar,
+ * which does affect the storage (name is by-ref, but not varlena). This
+ * means user tables using sql_identifier for columns are broken because
+ * the on-disk format is different.
+ */
+void
+old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for invalid \"sql_identifier\" user columns");
+
+ snprintf(output_path, sizeof(output_path), "tables_using_sql_identifier.txt");
+
+ if (check_for_data_type_usage(cluster, "information_schema.sql_identifier",
+ output_path))
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains the \"sql_identifier\" data type in user tables.\n"
+ "The on-disk format for this data type has changed, so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * report_extension_updates()
+ * Report extensions that should be updated.
+ */
+void
+report_extension_updates(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char *output_path = "update_extensions.sql";
+
+ prep_status("Checking for extension updates");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_name;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* find extensions needing updates */
+ res = executeQueryOrDie(conn,
+ "SELECT name "
+ "FROM pg_available_extensions "
+ "WHERE installed_version != default_version"
+ );
+
+ ntups = PQntuples(res);
+ i_name = PQfnumber(res, "name");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ PQExpBufferData connectbuf;
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, active_db->db_name);
+ fputs(connectbuf.data, script);
+ termPQExpBuffer(&connectbuf);
+ db_used = true;
+ }
+ fprintf(script, "ALTER EXTENSION %s UPDATE;\n",
+ quote_identifier(PQgetvalue(res, rowno, i_name)));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ report_status(PG_REPORT, "notice");
+ pg_log(PG_REPORT, "\n"
+ "Your installation contains extensions that should be updated\n"
+ "with the ALTER EXTENSION command. The file\n"
+ " %s\n"
+ "when executed by psql by the database superuser will update\n"
+ "these extensions.\n\n",
+ output_path);
+ }
+ else
+ check_ok();
+}