简体   繁体   English

将 Postgres 从 10 升级到 12 — 编码问题

[英]Upgrading Postgres from 10 to 12 — problem with encodings

I'm trying to upgrade a postgres server from 10 12, and am having problems with the encodings.我正在尝试从 10 12 升级 postgres 服务器,但遇到编码问题。 I'm following what I believe to be established recipes.我正在遵循我认为已建立的食谱。

Behold:看:

postgres@serverbot:~$ psql -l
                              List of databases
    Name     |  Owner   | Encoding  | Collate | Ctype |   Access privileges
-------------+----------+-----------+---------+-------+-----------------------
 postgres    | postgres | SQL_ASCII | C       | C     |
 template0   | postgres | SQL_ASCII | C       | C     | =c/postgres          +
             |          |           |         |       | postgres=CTc/postgres
 template1   | postgres | SQL_ASCII | C       | C     | postgres=CTc/postgres+
             |          |           |         |       | =c/postgres
 thingsboard | postgres | SQL_ASCII | C       | C     | =Tc/postgres         +
             |          |           |         |       | postgres=CTc/postgres+
             |          |           |         |       | nagios=c/postgres
(4 rows)

Notice the encodings on the 10 database.注意 10 数据库上的编码。 Time to create the database for 12.是时候为 12 创建数据库了。

postgres@serverbot:~$ sudo service postgresql stop

postgres@serverbot:~$ /usr/lib/postgresql/12/bin/initdb -E SQL_ASCII --locale=C  -D /var/lib/postgresql/12/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory /var/lib/postgresql/12/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... America/New_York
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

initdb: 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/lib/postgresql/12/bin/pg_ctl -D /var/lib/postgresql/12/data -l logfile start

Excellent!优秀! Let's fire up the new server.让我们启动新服务器。

postgres@serverbot:~$ /usr/lib/postgresql/12/bin/pg_ctl -D /var/lib/postgresql/12/data -l logfile start
waiting for server to start.... done
server started

And verify the encodings...并验证编码...

postgres@serverbot:~$ psql -l
                             List of databases
   Name    |  Owner   | Encoding  | Collate | Ctype |   Access privileges
-----------+----------+-----------+---------+-------+-----------------------
 postgres  | postgres | SQL_ASCII | C       | C     |
 template0 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
           |          |           |         |       | postgres=CTc/postgres
 template1 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
           |          |           |         |       | postgres=CTc/postgres
(3 rows)

Everything matches... time to upgrade!一切都匹配......是时候升级了!

postgres@serverbot:~$ /usr/lib/postgresql/12/bin/pg_upgrade \
--old-datadir=/var/lib/postgresql/10/main \
--new-datadir=/var/lib/postgresql/12/main \
--old-bindir=/usr/lib/postgresql/10/bin \
--new-bindir=/usr/lib/postgresql/12/bin \
--old-options '-c config_file=/etc/postgresql/10/main/postgresql.conf' \
--new-options '-c config_file=/etc/postgresql/12/main/postgresql.conf' \
--link --check
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 tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          ok

encodings for database "postgres" do not match:  old "SQL_ASCII", new "UTF8"
Failure, exiting

postgres@serverbot:~$

Doh!哦!

What is wrong here?这里有什么问题? I assert that the encodings do match, and I'm stuck.我断言编码确实匹配,但我被卡住了。

Can anyone offer any advice?任何人都可以提供任何建议吗?

What I see is:我看到的是:

postgres@serverbot:~$ /usr/lib/postgresql/12/bin/pg_ctl -D /var/lib/postgresql/12/data -l logfile start
waiting for server to start.... done
server started

and then:进而:

postgres@serverbot:~$ /usr/lib/postgresql/12/bin/pg_upgrade \
--old-datadir=/var/lib/postgresql/10/main \
--new-datadir=/var/lib/postgresql/12/main \

[...]

Note the $PGDATA directories.注意$PGDATA目录。 The database cluster you did the initdb for is different from the one you are doing the pg_upgrade to.您为其执行initdb的数据库集群与您正在执行pg_upgrade的数据库集群不同。

UPDATE .更新 Since you seem to be using a Debian based OS and it's Postgres packaging, it might work better to stick with the packaging tools:由于您似乎在使用基于 Debian 的操作系统并且它是 Postgres 打包,因此坚持使用打包工具可能会更好:

sudo pg_createcluster  --locale=C 12 ascii 
Creating new PostgreSQL cluster 12/ascii ...
/usr/lib/postgresql/12/bin/initdb -D /var/lib/postgresql/12/ascii --auth-local peer --auth-host md5 --locale C
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C".
The default database encoding has accordingly been set to "SQL_ASCII".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/12/ascii ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... America/Los_Angeles
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:


    pg_ctlcluster 12 ascii start

Ver Cluster Port Status Owner    Data directory               Log file
12  ascii   5434 down   postgres /var/lib/postgresql/12/ascii /var/log/postgresql/postgresql-12-ascii.log


postgres=# \l
                             List of databases
   Name    |  Owner   | Encoding  | Collate | Ctype |   Access privileges   
-----------+----------+-----------+---------+-------+-----------------------
 postgres  | postgres | SQL_ASCII | C       | C     | 
 template0 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
           |          |           |         |       | postgres=CTc/postgres
 template1 | postgres | SQL_ASCII | C       | C     | =c/postgres          +
           |          |           |         |       | postgres=CTc/postgres
(3 rows)

Also I would use pg_upgradecluster , see here for more information.我也将使用pg_upgradecluster ,请参阅此处了解更多信息。 This keeps everything in the same system.这使所有内容都在同一个系统中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM