现在,我阅读了关于“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。我对吗 ?谢谢
我已经大量更新/访问了存储序列化 java 对象的表。它们在表中停留 2-3 小时(在此期间也在更新),然后被删除。表的大小约为 300MB。我发现它非常非常频繁地被 VACUUMed 并想知道改变它fillfactor是否会有所帮助?
如何使用 pgAdmin 应用程序编辑“postgresql.conf”文件?
在 Postgres 9.3.x 上使用 pgAdmin 1.18.1,当我选择File>Open postgresql.conf,会出现一个文件选择器对话框。而且,是的,我在 pgAdmin 中以超级用户“postgres”的身份连接。
我知道我已经在旧版本的 Postgres 中做到了这一点。
我是数据库的新手,所以我正在寻求您的帮助。
我有一个包含时间序列数据的表。
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)
请注意,时间序列数据很大,因此非常感谢您对索引的任何帮助。
谢谢,丹
最近我确实以超级用户的身份创建了一个表,其中包括一个序列号列,例如,
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)
有人可以帮我理解
我从远程连接到我们的开发服务器的本地 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
我正在尝试在我的 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) 有一张这样的表:
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)
但是后来我注意到约束 …
我想在 Postgres 命令中添加冲突忽略copy。我知道我可以将数据复制到没有唯一索引/主键的表中,然后使用插入语法on conflict。但我想知道这是否可以直接来自COPY?
根据标准 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 ×10
performance ×2
pgadmin ×2
aggregate ×1
copy ×1
fill-factor ×1
nosql ×1
order-by ×1
permissions ×1
pg-hba.conf ×1
plpgsql ×1
sequence ×1
union ×1
upsert ×1
vacuum ×1