标签: postgresql

Postgresql 自己执行了“快速关闭”。为什么?它是怎么做到的?

在在这里发布之前,我已经尽可能多地用谷歌搜索和手动阅读。

版本信息:Ubuntu10.x 上的 Postgres8.4

我有一台运行 postgres 服务器的个人笔记本电脑,一个使用 JDBC 的 Java 脚本运行了 1600 分钟(我已经运行了数周前),然后死了说管理员重新启动了服务器。这是我在 pgsql 日志中发现的内容:

Feb 29 07:46:55 krufe-laptop postgres[3578]: [2-1] 2012-02-29 07:46:55 EST LOG:  incomplete startup packet
Feb 29 07:46:56 krufe-laptop postgres[1113]: [2-1] 2012-02-29 07:46:56 EST LOG:  received fast shutdown request
Feb 29 07:46:56 krufe-laptop postgres[1113]: [3-1] 2012-02-29 07:46:56 EST LOG:  aborting any active transactions
Feb 29 07:46:56 krufe-laptop postgres[24095]: [2-1] 2012-02-29 07:46:56 EST FATAL:  terminating connection due to administrator command
Feb 29 07:46:56 krufe-laptop postgres[24095]: [2-2] 2012-02-29 07:46:56 …
Run Code Online (Sandbox Code Playgroud)

postgresql

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

查询期间从磁盘检索什么?

相当简单的问题,可能在某处得到了回答,但我似乎无法为 Google 形成正确的搜索问题......

在查询该表的子集时,特定表中的列数是否会影响查询的性能?

例如,如果表 Foo 有 20 列,但我的查询只选择了其中的 5 列,那么有 20(而不是 10)列会影响查询性能吗?为简单起见,假设 WHERE 子句中的任何内容都包含在这 5 列中。

除了操作系统的磁盘缓存之外,我还担心 Postgres 的缓冲区缓存的使用。我对 Postgres 的物理存储设计一无所知。表存储在多个页面上(默认为每页 8k 大小),但我不太明白元组是如何从那里排列的。PG 是否足够聪明,只能从磁盘中获取包含这 5 列的数据?

postgresql performance query-performance

15
推荐指数
2
解决办法
2169
查看次数

为什么 PostgreSQL 允许查询 array[0] 即使它使用基于 1 的数组?

我一直在我的一个 PostgreSQL 数据库中使用数组。

我创建了一个包含至少一个元素的几何数组的表:

CREATE TABLE test_arrays (
    polygons geometry(Polygon,4326)[],
    CONSTRAINT non_empty_polygons_chk 
        CHECK ((COALESCE(array_length(polygons, 1), 0) <> 0))
);
Run Code Online (Sandbox Code Playgroud)

我添加了几行,并在表中查询每个几何数组中的第一个元素:

SELECT polygons[0] FROM test_arrays;
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,我得到了一个空行列表!

经过一些研究,事实证明PostgreSQL 数组是基于一个的

数组下标数字写在方括号内。默认情况下,PostgreSQL 使用基于 1 的数组编号约定,即 n 个元素的数组以 array[1] 开头,以 array[n] 结尾。

所以SELECT polygons[0] FROM test_arrays;工作并返回polygon每一行的第一行。

如果 PostgreSQL 使用基于 1 的编号约定,为什么允许查询第 0 个元素,结果是否有任何意义?

postgresql array postgresql-9.3

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

PostgreSQL 递归后裔深度

我需要从它的祖先计算后代的深度。当一个记录有 时object_id = parent_id = ancestor_id,它被认为是一个根节点(祖先)。我一直在尝试WITH RECURSIVE使用 PostgreSQL 9.4运行查询。

我不控制数据或列。数据和表架构来自外部源。该表正在不断增长。现在每天大约有 3 万条记录。树中的任何节点都可能丢失,并且它们将在某个时候从外部源中拉出。它们通常按created_at DESC顺序拉取,但数据是通过异步后台作业拉取的。

我们最初对这个问题有一个代码解决方案,但现在有 500 万行以上,几乎需要 30 分钟才能完成。

示例表定义和测试数据:

CREATE TABLE objects (
  id          serial NOT NULL PRIMARY KEY,
  customer_id integer NOT NULL,
  object_id   integer NOT NULL,
  parent_id   integer,
  ancestor_id integer,
  generation  integer NOT NULL DEFAULT 0
);

INSERT INTO objects(id, customer_id , object_id, parent_id, ancestor_id, generation)
VALUES (2, 1, 2, 1, 1, -1), --no parent yet
       (3, 2, …
Run Code Online (Sandbox Code Playgroud)

postgresql cte update recursive

15
推荐指数
1
解决办法
4303
查看次数

如何无缝升级 AWS RDS postgres 数据库的主要版本?

今天早上我参与了升级 AWS RDS 上的 PostgreSQL 数据库。我们想从 9.3.3 版迁移到 9.4.4 版。我们已经在临时数据库上“测试”了升级,但是临时数据库要小得多,并且不使用多可用区。事实证明,这个测试是相当不充分的。

我们的生产数据库使用多可用区。过去我们做过次要版本升级,在这种情况下,RDS会先升级standby,然后将其提升为master。因此,故障转移期间发生的唯一停机时间约为 60 秒。

我们假设主要版本升级也会发生同样的情况,但是我们错了。

关于我们设置的一些细节:

  • db.m3.large
  • 预配置 IOPS (SSD)
  • 300 GB 存储空间,其中使用了 139 GB
  • 我们有未完成的 RDS 操作系统升级,我们希望批量进行此升级以最大程度地减少停机时间

以下是我们执行升级时记录的 RDS 事件:

在此处输入图片说明

数据库 CPU 在大约 08:44 和 10:27 之间达到最大值。RDS 拍摄升级前和升级后的快照似乎占用了大部分时间。

AWS文档不警告这样的反响,尽管从阅读他们很显然,我们在处理一个明显的缺陷是,我们没有创建的副本生产的多AZ建立数据库,并尝试将其升级为试运行

总的来说,这非常令人沮丧,因为 RDS 给我们的关于它正在做什么以及可能需要多长时间的信息非常少。(再次,进行试运行会有所帮助......)

除此之外,我们想从这次事件中吸取教训,所以这里是我们的问题:

  • 在RDS做大版本升级时出现这种情况正常吗?
  • 如果我们想在未来以最少的停机时间进行主要版本升级,我们将如何进行?是否有某种巧妙的方法可以使用复制使其更加无缝?

postgresql amazon-rds

15
推荐指数
2
解决办法
4668
查看次数

psql:致命:用户的对等身份验证失败

我刚刚在 Ubuntu 15.10 上安装了 PostgreSQL 9.4。

  1. 我创建了一个用户 createuser -P myuser
  2. 我创建了一个数据库 createdb -O myuser mydatabase
  3. 我编辑pg_hba.conf并添加local mydatabase myuser md5
  4. 我重新启动了 PostgreSQL sudo service postgresql restart

用户myuser只是一个 PostgresSQL 用户,在 Ubuntu 上没有用户帐户。

当我尝试使用psql -W mydatabase myuser它连接到数据库时失败并显示psql: FATAL: Peer authentication failed for user "myuser".

PostgreSQL 正在运行……

? postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since Thu 2016-03-03 09:53:00 CET; 9min ago
  Process: 22219 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main …
Run Code Online (Sandbox Code Playgroud)

postgresql authentication postgresql-9.4 pg-hba.conf

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

postgres 如何通过命令删除模式中的所有表

我使用 postgresql,我需要删除模式中存在的所有表。如何从命令提示符中删除。

postgresql postgresql-9.4

15
推荐指数
2
解决办法
4万
查看次数

PostgreSQL 9.6 列删除和对带有 CTE 的 SQL 函数的副作用

如果我有一个包含 3 列的表格——比如 A、B 和 D——并且我不得不引入一个新的——比如 C 来替换 D 的当前位置。我将使用以下方法:

  1. 引入 2 个新列作为 C 和 D2。
  2. 将 D 的内容复制到 D2。
  3. 删除 D。
  4. 将 D2 重命名为 D。

新的顺序是 A、B、C 和 D。

我认为这是一种合法的做法,因为(到目前为止)它没有产生任何问题。

但是,今天我遇到了一个问题,当一个函数在同一张表上执行语句时返回以下错误:

table row type and query-specified row type do not match

以及以下细节:

Query provides a value for a dropped column at ordinal position 13

我尝试重新启动 PostgreSQL,VACUUM FULL按照此处此处的建议执行并最终删除并重新创建该函数,但这些解决方案不起作用(除了他们尝试解决系统表已被更改的情况之外)。

有幸使用一个非常小的数据库,我导出了它,删除了它,然后重新导入它并解决了我的功能问题


我意识到这样一个事实,即不应通过修改系统表(弄脏pg_attribute等)弄乱列的自然顺序,如下所示:

是否可以更改 Postgres 中列的自然顺序?

从我的函数抛出的错误来看,我现在意识到用我的方法改变列的顺序也是一个禁忌。任何人都可以说明为什么我所做的也是错误的? …

postgresql metadata database-internals functions postgresql-9.6

15
推荐指数
1
解决办法
1762
查看次数

使用窗口函数结转分区中的第一个非空值

考虑一个记录访问的表

create table visits (
  person varchar(10),
  ts timestamp, 
  somevalue varchar(10) 
)
Run Code Online (Sandbox Code Playgroud)

考虑这个示例数据(时间戳简化为计数器)

ts| person    |  somevalue
-------------------------
1 |  bob      |null
2 |  bob      |null
3 |  jim      |null
4 |  bob      |  A
5 |  bob      | null
6 |  bob      |  B
7 |  jim      |  X
8 |  jim      |  Y
9 |  jim      |  null
Run Code Online (Sandbox Code Playgroud)

我试图将这个人的最后一个非空值传递到他未来的所有访问中,直到该值发生变化(即成为下一个非空值)。

预期结果集如下所示:

ts|  person   | somevalue | carry-forward 
-----------------------------------------------
1 |  bob      |null       |   null
2 |  bob      |null       | …
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions

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

对大量重复值使用什么索引?

让我们做几个假设:

我有一个看起来像这样的表:

 a | b
---+---
 a | -1
 a | 17
  ...
 a | 21
 c | 17
 c | -3
  ...
 c | 22
Run Code Online (Sandbox Code Playgroud)

关于我的套装的事实:

  • 整个表的大小是 ~ 10 10行。

  • 我有 ~ 100k 行,列中有值aa其他值类似(例如c)。

  • 这意味着在“a”列中有大约 100k 个不同的值。

  • 我的大多数查询都会读取 a 中给定值的全部或大部分值,例如select sum(b) from t where a = 'c'.

  • 该表的编写方式使得连续值在物理上接近(要么按顺序写入,要么我们假设CLUSTER已在该表和列上使用a)。

  • 该表很少更新,我们只关心读取速度。

  • 该表相对较窄(比如每个元组约 25 个字节,+ 23 个字节的开销)。

现在的问题是,我应该使用什么样的索引?我的理解是:

  • BTree我的问题是 BTree 索引会很大,因为据我所知它会存储重复值(它必须这样做,因为它不能假设表是物理排序的)。如果 BTree 很大,我最终不得不读取索引和索引指向的表部分。(我们可以使用fillfactor = 100来稍微减小索引的大小。)

  • BRIN …

postgresql performance index clustered-index postgresql-9.6 query-performance

15
推荐指数
2
解决办法
8735
查看次数