标签: postgresql

即使函数中止,也会在 UDF 中持久插入

我有一个相当复杂的 UDF(在一堆表中移动并创建一堆新表),其中可能会发生多次中止。在每次操作之前,我想记录操作发生的时间和查询本身。UDF 如下所示:

log function_start

log sql1
execute sql1

log sql2
execute sql2

...

log sqlN
execute sqlN

log function_end
Run Code Online (Sandbox Code Playgroud)

每条日志语句都意味着向下表中插入一条新记录:

CREATE TABLE backup_logs
(
  id serial NOT NULL,
  t timestamp with time zone default now(),
  sql text,
  CONSTRAINT backup_logs_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

如果发生中止,我希望sql1, sql2, ... sqlN回滚,但inserto into backup_logs会继续存在。问题:我怎样才能实现这一目标?

postgresql insert transaction plpgsql postgresql-9.4

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

PostgreSQL 的 chown -R 等效项

我们偶尔会遇到这样的问题:在升级某些软件和数据库时,缺乏经验(或工作过度,不排除我自己)的系统管理员(除了 Oracle 之外,我们没有单独的 DBA)以用户身份运行数据库升级脚本,而不是以用户身份运行数据库升级脚本。postgres正确的应用程序用户

\n\n

更新:添加了重点。正如记录的那样,我们的正常操作模式涉及以普通用户身份运行这些脚本。提出这个问题是为了解决那些意外未遵循该程序的情况。

\n\n

如何将(一个)数据库中所有对象的所有权(无论它们属于谁)更改为特定用户?

\n\n

这里描述的方法对我不起作用,因为:

\n\n
    \n
  • REASSIGN OWNED显然是每个集群,而不是每个数据库(太宽泛)
  • \n
  • REASSIGN OWNED不适用于拥有的对象postgres
  • \n
  • @AlexSoto\xe2\x80\x99s 答案的手动枚举需要事先知道所涉及对象的类型
  • \n
\n\n

我真的想要基本上相当于 Unixchown -R newowner /path命令,只是为了整个 PostgreSQL 数据库(其中的所有模式、表、indic\xc4\x93s 等)。

\n\n

所涉及的最低 PostgreSQL 版本是 9.1 (Debian wheezy),无论 Debian不稳定在任何给定时间有什么最高版本。

\n

postgresql permissions

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

为什么 Postgres 需要这么长时间才能返回序列号?

我有一个应用程序可以批量加载到一个大表(1 亿行)中。我正在使用 Postgres 的COPY FROM功能从平面文件加载数据。目标表的主键为id

为了让批量插入工作,我使用以下方法为加载文件中的每一行创建了 id:

 SELECT  nextval('apps_id_seq'::regclass)
 FROM    "apps"
 ORDER   BY "apps"."id" ASC
 LIMIT   1 
Run Code Online (Sandbox Code Playgroud)

不幸的是,我没有看到这个查询花费的时间超过 150 秒。它会导致大量备份,因为其中一些文件包含数万行。

然而,当我在命令行运行它时,我得到了千分之一毫秒的返回结果。这是一个explain analyze

                                                            QUERY PLAN                                                                
------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.57..0.64 rows=1 width=4) (actual time=0.016..0.017 rows=1 loops=1)
   ->  Index Only Scan using apps_pkey on apps  (cost=0.57..15886651.40 rows=228128608 width=4) (actual time=0.015..0.015 rows=1 loops=1)
     Heap Fetches: 0
 Total runtime: 0.030 ms
Run Code Online (Sandbox Code Playgroud)

可能是什么导致了延迟?服务正在报告延迟NewRelic

postgresql performance postgresql-performance

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

PostgreSQL:对 pg_stat_activity 中的所有查询运行 EXPLAIN

我正在调查 RDS 上 PostgreSQL 数据库的高负载。作为调查的一部分,我正在运行以下查询:

SELECT now()-query_start, state, query FROM pg_stat_activity ORDER BY 1 DESC;
Run Code Online (Sandbox Code Playgroud)

此查询返回数据库上运行时间最长的查询。然后,我手动将查询文本复制到另一个窗口,并运行EXPLAIN每个查询以识别需要索引的较长查询。

有没有办法自动运行EXPLAIN每个查询pg_stat_activity

postgresql pg-stat-activity amazon-rds

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

如何处理 select 中的大偏移量?

jtest有 200k 行,每行包含 jsonb { id: "<uuid>", key: <index> }<index>每行递增 1-200k 的整数)。上还有btree索引data->'key'

create extension if not exists pgcrypto;
create table jtest (data jsonb not null default '{}');
insert into jtest (data)
select json_build_object('id', gen_random_uuid(), 'key', i)::jsonb
FROM generate_series(1,200000) i;
create index jtest_key on jtest ((data->'key'));
Run Code Online (Sandbox Code Playgroud)

第一个查询(快速):

EXPLAIN ANALYZE
select j.data
from jtest j
order by j.data->'key' 
limit 20;

-- "Limit  (cost=0.42..1.43 rows=20 width=74) (actual time=0.023..0.044 rows=20 loops=1)"
-- "  ->  Index Scan using …
Run Code Online (Sandbox Code Playgroud)

postgresql limits offset-fetch postgresql-9.4

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

使用当前行和当前表名作为变量的触发函数(最后部分)

就像我的第一个问题中详细介绍的那样,我有一个Postgres 9.1数据库,其中有多个表,这些表具有完全相同的列名,它们仅在列值上有所不同:

tbl_log_a
tbl_log_b
tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)

26 个表(从 a 到 z)。trfn_tbl_log_%letter%每个表都有一个触发器,它调用名为(from ato )的触发器函数z,该函数执行完全相同的操作:

CREATE OR REPLACE FUNCTION trfn_tbl_log_a_timetypespan()
  RETURNS trigger AS
$BODY$
DECLARE
v_timetype character varying;
v_timestmp_timetype timestamp without time zone;
v_timetypespan_resume interval;
v_stmtserial real;
v_sumtimetypespan_fnname interval;

BEGIN

IF NEW.timetype = 'lap' THEN
  SELECT timetype, timestmp, timetypespan FROM tbl_log_a WHERE fnname = NEW.fnname AND (timetype = 'start' OR timetype = 'resume') ORDER BY stmtserial DESC LIMIT 1 INTO v_timetype, v_timestmp_timetype, v_timetypespan_resume; …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger dynamic-sql plpgsql postgresql-9.1

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

在 PostgreSQL 9.0 中创建 crosstab() 数据透视表

我自己有一个相当复杂的问题,我希望有人可以帮助我。

我想使用 PostgreSQL 来从无几何表创建数据透视表。

为了简单起见,我将只显示我想要用于枢轴的表结构,然后使用给出的方法来创建其他表结构,我希望:)

我想使用的字段是postcode_nospace_, 和ageband

ageband顶部的列是行,postcode_nospace_每个邮政编码的计数是数据。

有 2132 条记录,其中一些记录有多个邮政编码,因此计数。

CREATE TABLE adult_social_care.activities_in_localities_asc
(
  ogc_fid integer NOT NULL,
  sort numeric(5,0),
  ageband character(12),
  postcode_nospace_ character(8),
  wkb_geometry geometry,
  CONSTRAINT activities_in_localities_asc_pkey PRIMARY KEY (ogc_fid)
);
Run Code Online (Sandbox Code Playgroud)

更新:

这是我想要实现的结果,如具有相同数据的 Excel 数据透视表所示。

postcode 18_24  25_34   35_44   45_54   55_64   65_74   Total Count
----------------------------------------------------------------------------
BB115DE     1           2                   2      3       8
FY38LZ                              1       1              2
Run Code Online (Sandbox Code Playgroud)

通过环顾四周,我编译了以下 SQL 查询。它按邮政编码分组并创建所需的字段名称。但是这些字段是空白的。理想情况下,我还希望total_count在表格末尾有一列。

SELECT * FROM crosstab(
    'SELECT postcode_nospace_, ageband, count(ageband) as total_count
     FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql pivot postgresql-9.0

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

单个数据库的 PostgreSQL fsync 关闭

我有一个存储在 PostgreSQL v9.4.4 中的写入密集型数据库,它会导致我的设备上出现 IO。我fsync只想关闭单个数据库,而不是 PostgreSQL 服务器范围。(我承认,当发生意外关闭时,它可能会导致损坏)。帮我看看如何制作。

postgresql performance postgresql-9.4 postgresql-performance

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

pg_restore 不恢复序列

我正在将旧 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)

postgresql pg-dump

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

强制 PostgreSQL 客户端在 Amazon RDS 上使用 SSL

我正在 Amazon RDS 上运行 PostgreSQL 9.4.x 实例。我可以使用类似于以下命令行的 SSL 成功连接到该服务器:

psql "host=x.y.z.rds.amazonaws.com dbname=aaa user=bbb sslmode=verify-full"
Run Code Online (Sandbox Code Playgroud)

如何强制客户端使用 SSL(使窃听更加困难)?以下情况应该无法连接:

psql "host=x.y.z.rds.amazonaws.com dbname=aaa user=bbb sslmode=disable"
Run Code Online (Sandbox Code Playgroud)

据我所知,在 Amazon RDS 上您无法编辑pg_hba.conf,因此我无法hostssl在其中添加条目。

这篇 AWS 博客文章建议了如何使用 MySQL 来完成此操作,但我找不到 PostgreSQL 类似信息的链接。

我的动机是防止自己(或其他用户)意外地通过网络传输未加密的敏感信息。

postgresql ssl amazon-rds

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