标签: postgresql

关于“交易 ID 环绕”

现在,我阅读了关于“Transaction ID Wraparound”的文档,但有一些我真的不明白,该文档是以下网址 http://www.postgresql.org/docs/9.0/static/routine-vacuuming .html#VACUUM-FOR-WRAPAROUND

23.1.4. 防止事务 ID 环绕失败

PostgreSQL 的 MVCC 事务语义依赖于能够比较事务 ID (XID) 编号:插入 XID 大于当前事务 XID 的行版本是“将来”的,不应对当前事务可见。但是由于事务 ID 的大小有限(32 位),一个长时间运行(超过 40 亿个事务)的集群将遭受事务 ID 环绕:XID 计数器环绕为零,并且突然之间的事务在过去似乎在未来——这意味着它们的输出变得不可见。简而言之,灾难性的数据丢失。(实际上,数据仍然存在,但是如果您无法获得它,那就太冷了。)为了避免这种情况,必须至少每 20 亿个事务一次对每个数据库中的每个表进行一次真空吸尘。

我不理解语句“将遭受交易 ID 环绕:XID 计数器环绕为零,突然之间过去的交易似乎在未来 - 这意味着它们的输出变得不可见”

有人可以解释一下吗?为什么在数据库遭受事务 ID 环绕之后,过去的事务会出现在未来?简而言之,我想知道在autovacuum事务ID回绕后PostgreSQL是否会出现“数据丢失”的情况?

对于我个人的观点,我们可以通过使用 txid_current() 函数来获取当前事务 ID,输出是 64 位的,不会被循环。所以我认为知道为 xmin 的元组的插入事务 ID 会比得到的 xid 更大通过 txid_current() 函数。除了您将在关闭 PostgreSQL 服务器后使用 pg_resetxlog reset reset transaction ID。我对吗 ?谢谢

postgresql

10
推荐指数
2
解决办法
8572
查看次数

缓存表的填充因子是什么?

我已经大量更新/访问了存储序列化 java 对象的表。它们在表中停留 2-3 小时(在此期间也在更新),然后被删除。表的大小约为 300MB。我发现它非常非常频繁地被 VACUUMed 并想知道改变它fillfactor是否会有所帮助?

nosql postgresql configuration vacuum fill-factor

10
推荐指数
1
解决办法
2158
查看次数

如何使用 pgAdmin 3 编辑`postgresql.conf`?

如何使用 pgAdmin 应用程序编辑“postgresql.conf”文件?

在 Postgres 9.3.x 上使用 pgAdmin 1.18.1,当我选择File>Open postgresql.conf,会出现一个文件选择器对话框。而且,是的,我在 pgAdmin 中以超级用户“postgres”的身份连接。

我知道我已经在旧版本的 Postgres 中做到了这一点。

postgresql pgadmin

10
推荐指数
1
解决办法
3万
查看次数

postgresql 中的 SQL 每小时数据聚合

我是数据库的新手,所以我正在寻求您的帮助。

我有一个包含时间序列数据的表。

2012/01/01 00:10, 10
2012/01/01 00:30, 5
2012/01/01 01:00, 10
2012/01/01 01:40, 10
2012/01/01 02:00, 20
Run Code Online (Sandbox Code Playgroud)

该表通过仅保留间隔的上限来存储基于间隔的数据。例如,第一行表示从 [00:00 - 00:10] 的区间,值为 10,第二行表示从 (00:10 - 00:30] 的区间,值为 5,第三行表示区间区间为 (00:30 - 01:00),值为 10。

我需要在 Postgres 中进行一个有效的查询来聚合上述结构的每小时数据。所以结果会是这样的:

2012/01/01 00:00, 2012/01/01 01:00, 25
2012/01/01 01:00, 2012/01/01 02:00, 30
Run Code Online (Sandbox Code Playgroud)

请注意,时间序列数据很大,因此非常感谢您对索引的任何帮助。

谢谢,丹

postgresql performance aggregate query-performance

10
推荐指数
1
解决办法
1万
查看次数

明确授予更新序列列序列的必要权限?

最近我确实以超级用户的身份创建了一个表,其中包括一个序列号列,例如,

create table my_table
(
    id serial primary key,
    data integer
);
Run Code Online (Sandbox Code Playgroud)

因为我希望我的非超级用户用户拥有对该表的写访问权限,所以我授予了它权限:

grant select, update, insert, delete on table my_table to writer;
Run Code Online (Sandbox Code Playgroud)

在这样做之后的随机时间点,该用户所做的插入开始失败,因为该用户没有修改my_table_id_seq与串行列关联的序列的权限。不幸的是,我无法在我当前的数据库上重现它。

我通过授予用户所需的权限来解决这个问题,如下所示:

grant all on table my_table_id_seq to writer;
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解

  • 为什么,在某些时候,以前足够的权限可能会开始失败?
  • 为具有串行列的表授予写权限的正确方法是什么?

postgresql permissions sequence

10
推荐指数
1
解决办法
1万
查看次数

pgAdmin 在任何远程操作上都非常慢

我从远程连接到我们的开发服务器的本地 pgAdmin 运行此查询:

select * from users order by random() limit 1;

它挂起17秒并显示

Total query runtime: 148 ms. 
1 row retrieved.
Run Code Online (Sandbox Code Playgroud)

它也挂在任何操作上:甚至右键单击表格。

之后我通过 RDP 连接并在相同的 pgAdmin 版本中运行相同的查询,该版本立即显示结果query time: 32 ms

然后我再次从本地 pgAdmin 运行查询:

Total query runtime: 337 ms.
1 row retrieved.
Run Code Online (Sandbox Code Playgroud)

我对服务器的 ping 时间为 130 毫秒。连接速度应该足够了,因为我可以非常快地通过 FTP 上传文件。

使用本地 psql 运行时的相同查询在几秒钟内完成,包括连接时间。

我的本地 pgAdmin 中与我的本地数据库副本相同的查询也立即完成。

pgAdmin 版本是 1.20.0。也检查了最新的 1.22 - 仍然相同。

我可以做些什么来加速 pgAdmin?

请注意 psql 工作正常,我在那里没有看到相同的延迟。

17 秒查询运行的 pgAdmin 日志:

2016-02-06 16:18:03 INFO   : queueing : select …
Run Code Online (Sandbox Code Playgroud)

postgresql performance pgadmin postgresql-9.4 postgresql-performance

10
推荐指数
1
解决办法
8195
查看次数

Postgres 似乎忽略了 listen_addresses 设置

我正在尝试在我的 Postgres 9.5.7 数据库(运行 Ubuntu 16.04)上禁用远程客户端访问。

我做了我认为正确的更改(见下文)但无济于事。我可以想到我的更改不起作用的两个原因:

  • 我正在编辑错误的文件
  • 我没有正确重启服务

我以为我排除了这些,但远程客户端仍然可以通话。那么我错过了什么?

实际上,我想要做的是恢复启用远程客户端访问的更改,以便我可以捕获这些更改并使用我们的盐堆栈重新应用它们。在我开始通过 salt 运行部署测试之前,我想知道远程访问被禁用,以便我可以确信我的 salt 堆栈正在进行更改。

一些数据

我正在使用我正在编辑的相同配置文件启动 postgres(ps重新格式化输出以提高可读性)

postgres@testweb:~$ ps -eaf | grep bin/post
postgres [snip] /usr/lib/postgresql/9.5/bin/postgres 
                -D /var/lib/postgresql/9.5/main 
                -c config_file=/etc/postgresql/9.5/main/postgresql.conf
Run Code Online (Sandbox Code Playgroud)

postgres 配置为仅侦听 localhost 端口(之前是 '*')

postgres@testweb:~$ grep listen_addresses /etc/postgresql/9.5/main/postgresql.conf
listen_addresses = 'localhost'      # what IP address(es) to listen on;
Run Code Online (Sandbox Code Playgroud)

基于主机的身份验证设置为 localhost。如果我禁用访问,这应该无关紧要,对吗?我的理解是,如果listen_addresses='localhost'那时远程客户端访问将不起作用。

postgres@testweb:~$ grep ^host /etc/postgresql/9.5/main/pg_hba.conf
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
Run Code Online (Sandbox Code Playgroud)

我正在编辑正确的配置文件,但 listen_addresses 声称 *

postgres@testweb:~$ sql
psql (9.5.7)
Type "help" …
Run Code Online (Sandbox Code Playgroud)

postgresql configuration pg-hba.conf

10
推荐指数
1
解决办法
8758
查看次数

PostgreSQL Upsert 不适用于分区表

有一张这样的表:

CREATE TABLE aggregated_master (
  "user"       BIGINT,
  type         TEXT,
  date         TIMESTAMP,
  operations   BIGINT,
  amount       NUMERIC,
  PRIMARY KEY ( "user", type, date )
);
Run Code Online (Sandbox Code Playgroud)

这张表是很多分区继承的主表。分区由 DATE 字段中的 MONTH 完成。例如:2017 年 8 月的分区将是 agg_201708,它的 PK 将是 pk_agg_201708 在插入之前通常会触发将插入重定向到正确的分区。

问题是我想在这个表中做一个 UPSERT。DO CONFLICT 部分不起作用。

最初的代码是这样的

INSERT INTO aggregated_master (user, type, date, oeprations, amount)
SELECT user, type, date, SUM(ops), SUM(amt)
FROM ...
WHERE ...
GROUP BY USER, TYPE, DATE
ON CONFLICT ON CONSTRAINT pk_aggregated
DO UPDATE SET operations = EXCLUDED.operations
          ,   amount = EXCLUDED.amount
Run Code Online (Sandbox Code Playgroud)

但是后来我注意到约束 …

postgresql plpgsql upsert

10
推荐指数
2
解决办法
5367
查看次数

Postgres COPY 与冲突忽略 - 可能吗?

我想在 Postgres 命令中添加冲突忽略copy。我知道我可以将数据复制到没有唯一索引/主键的表中,然后使用插入语法on conflict。但我想知道这是否可以直接来自COPY

postgresql copy postgresql-12

10
推荐指数
1
解决办法
7591
查看次数

UNION ALL 子句的结果是否始终按顺序附加?

根据标准 SQL UNION/UNION ALL不保证没有外部ORDER BY子句的任何特定排序顺序 - 就像 SQL 中几乎没有任何地方不保证排序顺序一样ORDER BY

然而,Postgres 对 的普通情况使用“附加”步骤UNION ALL,因此第一个分支的结果(即使在其分区中未排序)总是出现在下一个分支之前,等等。Postgres 只是按照给定的顺序附加每个分支的结果。这与以下LIMIT条款特别相关:

SELECT 1 FROM tbl  -- or any complex query
UNION ALL
SELECT 2
LIMIT  1
Run Code Online (Sandbox Code Playgroud)

显然这不适用于UNION(without ALL)。但除此之外,我从未见过 Postgres 无序返回,即上述查询中的“2”SELECT ,而第一个查询也会返回行。即使第一站的费用极其昂贵,也不会。

我过去曾对这种行为进行过查询。现在我遇到了一个说法, Postgres 可能会在这里返回无序的行,但没有实际证据证实。

当前的Postgres 手册对此事有这样的说法:

UNION有效地将 的结果附加query2到 的结果query1(尽管不能保证这是实际返回行的顺序)。此外,它还从结果中消除重复行,其方式与 DISTINCT, except相同UNION ALL

这还不清楚。引用的顺序是否适用于子句列表SELECT,或每个子句中的行,还是仅适用于返回的集合?另外,UNION ALL …

postgresql order-by union

10
推荐指数
1
解决办法
7301
查看次数