我正在将旧 postgres 服务器上的所有数据库转移到新服务器上。为此,我使用 pg_dumpall,然后使用 pg_restore。然而,似乎没有序列被转储。这不是我第一次遇到这个问题。我在使用 pg_dump 备份单个数据库时遇到了同样的问题。
搜索发现了一些类似的问题,但它们似乎与转储/恢复单个表有关。就我而言,我正在转储整个数据库,因此我无法弄清楚为什么序列没有得到恢复。
如何进一步调查此问题和/或解决问题,以便我不必在服务器上的每个表上重建序列?
我用来创建备份的命令:
pg_dump --host localhost --port 5432 --username "postgres" --format custom --blobs --file /home/spencerrecneps/backups/census.backup census
Run Code Online (Sandbox Code Playgroud)
我用来在干净的服务器上恢复备份的命令:
pg_restore -Cv -h localhost -p 5432 -U postgres -d postgres ./census.backup > err.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
pg_restore -l 的结果是:
;
; Archive created at Mon Sep 28 10:12:32 2015
; dbname: census
; TOC Entries: 63
; Compression: -1
; Dump Version: 1.12-0
; Format: CUSTOM
; Integer: 4 bytes
; Offset: 8 bytes
; Dumped from database …
Run Code Online (Sandbox Code Playgroud) 我有一系列遵循一般模式的更新语句:一次更新聚合来自另一个表(或有时是多个表)的值,下一次更新根据聚合值生成排名。对于总共 46 个更新语句,此过程重复 23 次。每个更新对独立运行需要 30-40 秒,但是当我通过 PgAdmin 将它们作为单个事务一起运行时,它需要一个多小时,而不是我期望的基于单个查询时间的约 15 分钟。(上次尝试时,我最终停止执行并单独运行它们。)
如果我通过 psql 在文件中运行相同的更新集,则该过程将在预期的 15 分钟时间内完成。
查询计划器是否有一些怪癖会根据在单个事务中运行的大量更新语句来更改执行计划?鉴于 psql 和 PgAdmin 之间的不同行为,我认为这与查询打包执行的方式有关,但我不太熟悉,无法了解其中的区别。
有没有办法编写我的代码,以便在通过 PgAdmin 作为单个事务运行时提高性能?
我在 Ubuntu 16.04 上使用 PostgreSQL 9.5。
以下是代码中的两个示例对联:
-- bike_driver_aggressive
UPDATE generated.crash_aggregates
SET bike_driver_aggressive = (
SELECT COUNT(*)
FROM crashes_bike2 c
WHERE c.int_id = crash_aggregates.int_id
AND c.aggressive_driverfault
);
WITH ranks AS (
SELECT int_id,
rank() OVER (ORDER BY bike_driver_aggressive DESC) AS rank
FROM crash_aggregates
)
UPDATE generated.crash_aggregates
SET bike_driver_aggressive_rank = ranks.rank
FROM ranks
WHERE crash_aggregates.int_id = ranks.int_id; …
Run Code Online (Sandbox Code Playgroud)