为什么这个 postgres 数据库升级失败了?
我尝试将 Postgresql 9.6 升级到 10,但没有成功。
我成功运行了
brew upgrade postgresql
,然后运行了
brew postgresql-upgrade-database
,但出现失败消息。问题似乎是这一行:
数据库“postgres”的 lc_collat​​e 值不匹配:旧的“en_GB.UTF-8”,新的“en_US.UTF-8”
整个消息是:
==> Upgrading postgresql data from 9.6 to 10...
Stopping `postgresql`... (might take a while)
==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)
==> Moving postgresql data from /usr/local/var/postgres to /usr/local/var/postgres.o
The files belonging to this database system will be owned by user "jbkimac".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /usr/local/var/postgres ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
/usr/local/opt/postgresql/bin/pg_ctl -D /usr/local/var/postgres -l logfile start
Performing Consistency Checks
-----------------------------
Checking cluster versions ok
Checking database user is the install user ok
Checking database connection settings ok
Checking for prepared transactions ok
Checking for reg* data types in user tables ok
Checking for contrib/isn with bigint-passing mismatch ok
Checking for invalid "unknown" user columns ok
Creating dump of global objects ok
Creating dump of database schemas
ok
lc_collate values for database "postgres" do not match: old "en_GB.UTF-8", new "en_US.UTF-8"
Failure, exiting
Error: Upgrading postgresql data from 9.6 to 10 failed!
==> Removing empty postgresql initdb database...
==> Moving postgresql data back from /usr/local/var/postgres.old to /usr/local/var/p
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
Error: Failure while executing; `/usr/local/opt/postgresql/bin/pg_upgrade -r -b /usr/local/Cellar/postgresql/9.6.1/bin -B /usr/local/opt/postgresql/bin -d /usr/local/var/postgres.old -D /usr/local/var/postgres -j 8` exited with 1.
有人能帮我建议如何解决这个
“en_GB.UTF-8”,新的“en_US.UTF-8”
冲突问题吗?
brew services stop postgresql
brew postgresql-upgrade-database
brew services start postgresql
我遇到了与
brew postgresql-upgrade-database
相同的问题,并且必须更改
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/cmd/brew-postgresql-upgrade-database.rb
,正如 @Thermatix 所提到的。
--lc-collat​​e
和
--lc-ctype
都必须与当前数据库设置相对应。在我的情况下,两者都为
ch_DE.UTF8
。
这个问题已经很老了,但万一它可以帮助到别人:默认数据库可能没有用正确的
lc_ctype
和
lc_collat​​e
进行初始化。忽略错误消息并尝试修复错误设置
真的
很简单。
要逐步执行(无需
brew postgresql-upgrade-database
):
-
以防万一,请保存当前数据库模式(例如使用
pg_dumpall
)并将数据文件夹移动到另一个位置(默认情况下为/usr/local/var/posgres
) -
然后,使用最新版本初始化默认数据库:
$ initdb --lc-collat​​e=en_GB.UTF-8 --lc-ctype=en_GB.UTF-8 -E UTF-8 /usr/local/var/postgres
-
最后将旧数据导入新版本的数据文件夹(此处来自 PG 13 到 14):
$ /usr/local/Cellar/postgresql/14.1_1/bin/pg_upgrade -r -b /usr/local/Cellar/postgresql@13/13.5_1/bin/ -B /usr/local/Cellar/postgresql/14.1_1/bin/ -d /usr/local/var/postgres.old -D /usr/local/var/postgres -j 4