简单的问题:我想将 Postgres 服务器的所有数据、模式、角色以及所有内容从 Windows 迁移到 Linux。
我可以只复制%PGDATA%
Windows 中服务器指向 Linux 的目录的内容,并在那里启动服务器,将 PGDATA 参数/变量指向该目录吗?换句话说,数据文件平台是否独立于从一个操作系统移植到另一个操作系统?
我还开发了一个用于克隆 PG 数据库、模式+数据的脚本,但出于各种原因,我更愿意将数据文件放在 USB 驱动器上并完成它。
简单的问题:我想将 Postgres 服务器的所有数据、模式、角色以及所有内容从 Windows 迁移到 Linux。
我可以只复制%PGDATA%
Windows 中服务器指向 Linux 的目录的内容,并在那里启动服务器,将 PGDATA 参数/变量指向该目录吗?换句话说,数据文件平台是否独立于从一个操作系统移植到另一个操作系统?
我还开发了一个用于克隆 PG 数据库、模式+数据的脚本,但出于各种原因,我更愿意将数据文件放在 USB 驱动器上并完成它。
我正在研究一个复制模式和数据的脚本。我首先创建所有结构,除了foreign keys
从源中读取它之后system tables
,然后复制数据,然后创建 FK,以便在我复制父级后将一个可能的孤儿插入到子表中(当我运行脚本时) ),即使 FK 创建由于孤立数据而失败,我仍然可以获得基本架构和数据。
我的下一步是做一些事情,比如将try/catch
create FK 语句包裹起来,如果它失败,删除导致它的孤立数据。这样做会有些复杂,因为我必须提取所有引用键并组装我自己的删除语句(我目前不这样做,因为 PG 系统表提供了一个REFERENCES
可以连接的就绪语句)。
但我想知道是否有一种方法可以为ALTER TABLE x ADD CONSTRAINT fk_y FOREIGN KEY ... DELETE ANY WOULD-BE ORPHANS
我节省这一步。
所以如果我的父表是:
parent_id | parent_name
---------------------------------
1 | Joe
2 | Mary
孩子是:
child_id | child_name | parent_parent_id
--------------------------------------------------
11 | Jimmy | 1
21 | Joey | 2
31 | Jeff | 3
'Jeff' 将在强制引用完整性之前被删除,因为他的父级和他在源父级复制到目标之后被引入源。然后可以根据一致的数据创建 FK。
澄清(来自评论/聊天讨论):
您是否在单个事务中读取数据?
我不使用单笔交易,因为它太大了。我按表分解检索到的数据,并按表段(5000 或 10000 行的批次)对一些大表进行分解。
这本质上是一个 ETL,它从 DB 中生成一个“邪恶的双胞胎”。希望这是有道理的。
平均而言,我的环境中的数据库副本需要 20 分钟(对于小型数据库)到 1.5-2 小时(对于较大的数据库),有些表有数百万行。我在 Python 脚本的内存中逐块加载
pg_dump
或呢pg_basebackup
?
pg_dump
不做的事情,例如更好的日志记录。此外,pg_dump 期望在源和目标以及许多其他问题上使用相同的用户。我试过了,不喜欢。我更喜欢我的工具,我想解决这个仅偶尔发生的小问题。我只是注意到 PostgreSQL 允许在数据库中重复外键(可能还有其他约束)名称,只要它们在不同的表上即可。
因此,如果父表是Foo
并且它有两个子表BarX
并且BarY
,则可以命名两个表上的外键FK_fooid
。
IMO,这是一个糟糕的设计,因为
select * from information_schema.referential_constraints
where constraint_name = 'FK_fooid'
将返回两个相同的行,无法区分哪一个对应于哪个表/键。
有没有办法在 Postgres 中禁用跨数据库的约束名称重复并强制每个约束具有唯一名称?
我的本地 Postgres 服务器配置为在计算机启动时启动。我刚刚更改了postgresql.conf
文件,不得不重新启动服务器。我做了:
pg_ctl restart
从在下一个命令提示符处启动服务器的命令行 BUT:
pg_ctl:旧的服务器进程(PID:2968)似乎消失了 无论如何启动服务器 服务器启动 D:\>2016-10-12 16:24:48 EDT LOG:将日志输出重定向到日志收集器进程 2016-10-12 16:24:48 EDT 提示:未来的日志输出将出现在目录“pg_log”中。
如果我ctrl-c
退出它或关闭命令窗口,则会关闭服务器。如何pg_ctl
在后台使用(重新)启动服务器,模拟默认情况下的工作方式(作为 Windows 服务)?
我正在使用 Postgres。该表看起来像这样:
tran_id SERIAL PRIMARY KEY,
account_id integer NOT NULL CONSTRAINT fk_account_id REFERENCES base.account(account_id) ON DELETE CASCADE,
tran_type base.my_enum not null,
tran_note varchar(64) not null,
process_id integer not null,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
我感兴趣的是能够快速找到只有process_id
0 的行。该值意味着该行正在等待某种处理,非 0 行基本上是我不想存档的旧日志,因为应用程序也需要查找特定帐户的交易数量。因此将已处理和待处理的数据放在同一个表中很方便。 但是,我对能够快速找到该字段不是 0 的行不感兴趣,并且我不想使用资源来索引这些其他值。
在一个实现中,该表有近 20 万个账户,每个账户平均约 200 笔交易,因此约 4000 万行,或多或少。在任何给定时间,可能有几十个新交易要处理,即WHERE process_id = 0
. 处理后, 将process_id
更新为 0 以外的值。
我永远不会搜索process_id
除 0 以外的其他值。因此,我有兴趣拥有一个仅指向该值为 0 的行的索引,而不必理会其他值,以便索引更紧凑、更快。这可能吗?