我有一个相当复杂的 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会继续存在。问题:我怎样才能实现这一目标?
我们偶尔会遇到这样的问题:在升级某些软件和数据库时,缺乏经验(或工作过度,不排除我自己)的系统管理员(除了 Oracle 之外,我们没有单独的 DBA)以用户身份运行数据库升级脚本,而不是以用户身份运行数据库升级脚本。postgres正确的应用程序用户。
更新:添加了重点。正如记录的那样,我们的正常操作模式涉及以普通用户身份运行这些脚本。提出这个问题是为了解决那些意外未遵循该程序的情况。
\n\n如何将(一个)数据库中所有对象的所有权(无论它们属于谁)更改为特定用户?
\n\n这里描述的方法对我不起作用,因为:
\n\nREASSIGN OWNED显然是每个集群,而不是每个数据库(太宽泛)REASSIGN OWNED不适用于拥有的对象postgres我真的想要基本上相当于 Unixchown -R newowner /path命令,只是为了整个 PostgreSQL 数据库(其中的所有模式、表、indic\xc4\x93s 等)。
所涉及的最低 PostgreSQL 版本是 9.1 (Debian wheezy),无论 Debian不稳定在任何给定时间有什么最高版本。
\n我有一个应用程序可以批量加载到一个大表(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。
我正在调查 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?
表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) 就像我的第一个问题中详细介绍的那样,我有一个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 来从无几何表创建数据透视表。
为了简单起见,我将只显示我想要用于枢轴的表结构,然后使用给出的方法来创建其他表结构,我希望:)
我想使用的字段是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 v9.4.4 中的写入密集型数据库,它会导致我的设备上出现 IO。我fsync只想关闭单个数据库,而不是 PostgreSQL 服务器范围。(我承认,当发生意外关闭时,它可能会导致损坏)。帮我看看如何制作。
postgresql performance postgresql-9.4 postgresql-performance
我正在将旧 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) 我正在 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 ×10
amazon-rds ×2
performance ×2
plpgsql ×2
dynamic-sql ×1
insert ×1
limits ×1
offset-fetch ×1
permissions ×1
pg-dump ×1
pivot ×1
ssl ×1
transaction ×1
trigger ×1