由于历史原因,我们过去常常在 Postgresql 数据库中使用一个非常大的表来存储基于时间的一系列测量值。经过长时间的使用,当表的大小达到 200+ GB 时,我们决定对其进行一些清理,比如只保留 90 天的数据,以加快速度并节省一些磁盘空间。
问题是,这样做delete from ... where clock_column < ...不会回收磁盘上的任何空间,因此我们需要VACUUM FULL在删除后保留它们。
由于我们无法承受如此长的时间停止数据库,因此我们决定采用分区方法并创建每日表,以便我们能够在时间到期时将它们一一删除。所以现在我们有了table(最初的、巨大的),并以 date 命名table160101,table160102等等。
现在我想做:
初始表的备份(仅初始表)
2.1 在其中进行一些清理(仅在其中)或
2.2 也许简单地截断它(仅它)
但当我进行测试时,我看到COPY table TO 'file'创建了整个表的转储(两者和table全部等)。同样的方式,清除整个表,而不是第一个表(在测试服务器上测试)。table160101table160102TRUNCATE
当我在 中使用分区表时SELECT,我可以简单地说明ONLY选择要使用的表。但我找不到在COPYor中做到这一点的方法TRUNCATE。
所以问题是:如何在不牺牲表中数据的情况下归档我的目标?
PS 我需要归档的是,当所有“每日”数据都在“每日”表中时,我只是不喜欢保留带有非常旧数据的初始大表。事实上,TRUNCATE唯一的想法就是好主意。
考虑这两个查询:
SELECT
t1.id, *
FROM
t1
INNER JOIN
t2 ON t1.id = t2.id
where t1.id > -9223372036513411363;
Run Code Online (Sandbox Code Playgroud)
和:
SELECT
t1.id, *
FROM
t1
INNER JOIN
t2 ON t1.id = t2.id
where t1.id > -9223372036513411363 and t2.id > -9223372036513411363;
Run Code Online (Sandbox Code Playgroud)
注意:不是-9223372036513411363表中的最小值,并且条件将结果(从总行数 3.5 亿行)减少到 1700 万行。
就我个人而言,我希望 PostgreSQL 能够为这两个查询提供相同的计划,因为t1.id = t2.id自动意味着第二个条件。但不幸的是,PostgreSQL 正在创建两个不同的计划,第二个计划要好得多:
我非常喜欢第一个查询,因为我想从连接创建一个视图,并将 where 条件放在视图上的查询上,我在其中看到单个 id 列(我使用连接,USING因此单个 id 列在视图中可见) 。另外,我将连接两个以上的表,并且我不希望为每个连接添加这样的条件。
这种行为有什么原因吗?或者这是一个错误?有什么解决方法吗?
ON …postgresql performance join execution-plan postgresql-9.3 postgresql-performance
我们目前在生产数据库中使用 PostgreSQL 9.2,我们希望迁移到使用 PostgreSQL 9.4 的新 RDS 实例。但是,我们需要拥有创建函数的权限,但只有超级用户才能在 RDS 上创建函数,而我的用户无法被授予超级用户权限。
CREATE FUNCTION crosstab50(text, OUT rownumber integer, OUT c1 text,...)
RETURNS SETOF record
LANGUAGE c
STABLE STRICT
AS '$libdir/tablefunc', 'crosstab';
Run Code Online (Sandbox Code Playgroud)
但我们在恢复操作期间遇到此错误:
ERROR: permission denied for language c
Run Code Online (Sandbox Code Playgroud) 在附录 A:PostgreSQL 错误代码中,它说:
对于某些类型的错误,服务器会报告与错误关联的数据库对象(表、表列、数据类型或约束)的名称;例如,导致 unique_violation 错误的唯一约束的名称。此类名称在错误报告消息的单独字段中提供,以便应用程序无需尝试从消息的可能本地化的人类可读文本中提取它们。
大胆强调我的。我有下表:
CREATE TABLE recipes (
id SERIAL,
title TEXT UNIQUE NOT NULL,
description TEXT NOT NULL,
instructions TEXT NOT NULL,
image BYTEA,
CONSTRAINT recipes_pk PRIMARY KEY(id),
CONSTRAINT title_unique UNIQUE(title)
);
Run Code Online (Sandbox Code Playgroud)
当我尝试插入具有重复标题的新行时,我在 pgAdmin3 中收到以下错误消息:
ERROR: duplicate key value violates unique constraint "title_unique"
DETAIL: Key (title)=(mytitle) already exists.
Run Code Online (Sandbox Code Playgroud)
或者,使用 PHP:
["errorInfo"]=>
array(3) {
[0]=>
string(5) "23505"
[1]=>
int(7)
[2]=>
string(117) "ERROR: duplicate key value violates unique constraint "title_unique"
DETAIL: Key (title)=(mytitle) already exists." …Run Code Online (Sandbox Code Playgroud) PostgreSQL 下的备份新手。我一直在使用常规命令备份数据库,效果很好。除非不存储任何用户或权限。我知道我需要单独做这件事。
我一直在使用以下命令来转储集群上的用户:
pg_dumpall -U backups -r > /tmp/globals.only.dump
Run Code Online (Sandbox Code Playgroud)
-r 或 -g 返回相同的结果。我最终在文件中得到的只是:
CREATE ROLE backups;
ALTER ROLE backups WITH SUPERUSER NOINHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION PASSWORD '0000000000000000000000000000000000';
Run Code Online (Sandbox Code Playgroud)
似乎所有权限都丢失了,但我通过 NaviCat 设置了其中 15 个权限。
手动重新创建所有权限显然对于生产来说是不可行的。如何强制随角色导出权限?随后,我如何将它们导入到另一个 PostgreSQL 服务器中?
我使用的 SQL 文件PostgreSQL大小约为 7GB。如何打开/执行 SQL 文件?我研究并尝试过使用 Navicat Premium、Razor SQL、HeidiSQL、Workbench。总而言之,我已经失去了记忆。我确信这是一个 PostgreSQL 数据库转储。
如何更改定义的 WAL 目录?在安装过程中,我定义了一个目录,/var/lib/wal并且$PGDATA/pg_xlog有一个指向该目录的符号链接。
如何更改 postgres 设置以将 WAL 文件写入其他位置 - 而无需重新安装?
是否可以有一个包含四列的表:
CREATE TABLE accrual (
add_date date NOT NULL,
user_id integer NOT NULL,
rate integer NOT NULL,
amount numeric(7,3)
);
Run Code Online (Sandbox Code Playgroud)
然后对其进行限制,以便如果我已经有一个条目,例如
('2016-04-01', 3, 120, 25.6)
Run Code Online (Sandbox Code Playgroud)
尝试插入具有相同日期和 user_id 但不同速率的另一个条目会失败吗?IE
('2016-04-01', 3, 140, 15)
Run Code Online (Sandbox Code Playgroud)
会失败,但是
('2016-04-02', 3, 140, 15)
Run Code Online (Sandbox Code Playgroud)
或者
('2016-04-01', 4, 140, 15)
Run Code Online (Sandbox Code Playgroud)
或者
('2016-04-01', 3, 120, 15)
Run Code Online (Sandbox Code Playgroud)
会好吗?
需要明确的是,日期和 user_id 基本上就像一个索引,除了重复索引完全没问题,只要费率相同。金额不受限制。
我正在使用 postrgesql 9.5 数据库,并且使用 PHP。我的猜测是,最简单的方法是编写一些 PHP 代码来执行检查。我能找到的最接近的问题是这个:
但它是关于 Oracle 数据库的,并且略有不同。
感谢您的任何建议!
有没有办法强制 PostgreSQL 使用我在物化视图表上创建的索引?我尝试了移动列属性的所有可能组合,以使 Postgres 使用我的索引......
我有这张表:
=> explain select * from flight3mv1;
QUERY PLAN
-------------------------------------------------------------
Seq Scan on flight3mv1 (cost=0.00..3.50 rows=150 width=26)
(1 row)
Run Code Online (Sandbox Code Playgroud)
当我在物化视图上创建索引时,我的查询计划没有任何变化。
=> create index flight3mv1index on flight3mv1(c_nation,s_nation);
=> analyze flight3mv1;
=> explain select * from flight3mv1 where c_nation='CHINA' and s_nation='CHINA';
QUERY PLAN
---------------------------------------------------------------------------------------
Seq Scan on flight3mv1 (cost=0.00..4.25 rows=6 width=26)
Filter: (((c_nation)::text = 'CHINA'::text) AND ((s_nation)::text = 'CHINA'::text))
(2 rows)
Run Code Online (Sandbox Code Playgroud)
这是我的 Flight3mv1 表:
=> \d flight3mv1
Materialized view "public.flight3mv1"
Column | Type | Modifiers
----------+-----------------------+-----------
c_nation …Run Code Online (Sandbox Code Playgroud) 如何告诉 PostgreSQL 返回第一个遇到的值而不是聚合列?
Table "public.cache"
Column | Type | Modifiers | Storage | Stats target | Description
-----------+---------+-----------+---------+--------------+-------------
user_id | integer | | plain | |
object_id | integer | | plain | |
data | integer | | plain | |
data2 | boolean | | plain | |
Indexes:
"cache_object_id_user_id_key" UNIQUE CONSTRAINT, btree (object_id, user_id)
"cache_user_id_object_id_key" UNIQUE CONSTRAINT, btree (user_id, object_id)
Has OIDs: no
Run Code Online (Sandbox Code Playgroud)
按 object_id 和 data2 进行查询分组将使哈希聚合,这是我想避免的。
SELECT object_id, data2 FROM cache GROUP BY object_id, data2; …Run Code Online (Sandbox Code Playgroud) postgresql ×10
performance ×2
aggregate ×1
amazon-rds ×1
aws ×1
backup ×1
join ×1
optimization ×1
partitioning ×1
php ×1
pivot ×1