Questions tagged «postgresql»

PostgreSQL的所有版本。如果该上下文很重要,请添加其他特定于版本的标记,例如postgresql-11。


1
锁定Postgres以进行UPDATE / INSERT组合
我有两张桌子。一个是日志表;另一个是日志表。另一个实质上包含只能使用一次的优惠券代码。 用户需要能够兑换优惠券,这将在日志表中插入一行并将优惠券标记为已使用(通过将used列更新为true)。 自然,这里存在明显的比赛条件/安全性问题。 在过去的mySQL世界中,我做过类似的事情。在那个世界中,我将全局锁定两个表,在一次只能执行一次的前提下,确保逻辑安全,然后在完成后解锁表。 Postgres中有更好的方法吗?特别是,我担心锁是全局的,但不一定是全局的-我真的只需要确保没有其他人试图输入该特定代码,那么也许行级锁会起作用吗?

2
如果操作是由带有UPDATE CASCADE的FK约束引起的,则FOR EACH STATEMENT触发器多久执行一次?
我了解FOR EACH STATEMENT在执行时,表t上定义的触发器将运行一次UPDATE t ...。 现在,当使用t定义时FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE,我更新的N行a,这会导致触发器被调用一次或N次吗? 换句话说,由FK约束级联的表更改更像是单个UPDATE,还是更像一系列UPDATEs?

1
用于快照一致性备份的存储快照-不同的数据和日志卷
我们正在vmware /共享存储环境中运行许多Linux VM,每个Linux VM都运行自己的postgreSQL实例(混合使用9.0和9.3)。当前,整个VM都位于单个根分区/卷上,使用基础VMFS卷的基于存储的快照进行备份/还原过程(以及复制到我们的DR站点),我们已经取得了巨大的成功(〜8年)。 由于我们的存储体系结构,将postgres WAL文件分离到一个非缓存的(主要是写入的)卷中会比较有利,这样可以减少我们在存储方面的缓存混乱。使用我们的存储(Nimble Storage),我们可以将两个卷都分配到一个保护/快照组,但是我无法从供应商处得出快照将在保护组中的所有卷上完全同时发生-可能会,但是总是有相隔毫秒的机会。 为此,我们进行了一些实验,所有实验都使用pg_bench尽可能快地将数据写入数据库。实验之后,我们恢复了快照的卷并启动了VM + postgres 快照数据和日志卷同时接近-结果:数据库已恢复 首先快照数据量,约1分钟后日志量-结果:数据库已恢复 首先是快照日志卷,之后是约1分钟的数据卷-结果:数据库已恢复 在WAL检查点将新数据写入数据文件之后,快照日志卷首先出现,数据量在大约3分钟后出现:结果:数据库已恢复 因此,测试似乎告诉我们,只要两个快照在卷级别上是一致的,并且相对紧密,就可以基于WAL / Log卷快照的时间获得数据库的一致副本。 我的问题:这样安全吗?我们在测试中缺少哪些极端情况?可能出什么问题? Postgres的文档表明这样做并不安全,但是测试似乎表明它非常健壮:http : //www.postgresql.org/docs/9.1/static/backup-file.html 如果您的数据库分布在多个文件系统中,则可能没有任何方法可以获取所有卷的完全同步的冻结快照。例如,如果数据文件和WAL日志位于不同的磁盘上,或者表空间位于不同的文件系统上,则由于快照必须同时进行,因此可能无法使用快照备份。在这种情况下,请务必仔细阅读文件系统文档,然后再使用一致快照技术。 注意:是的,我们知道其他确保其一致性的选项,例如将PostgreSQL置于热备份模式或使用我们存储的VMware集成来静默VM本身,但是我们正在寻找一种仅存储的解决方案以提高速度,便利性,对客户的影响为零。

2
如何在PL / pgSQL中获取手动引发的异常的异常上下文?
在Postgres中,我们使用以下代码获取异常的“堆栈跟踪”: EXCEPTION WHEN others THEN GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT; 对于“自然”异常,这很好用,但是如果我们使用 RAISE EXCEPTION 'This is an error!'; ...那么就没有堆栈跟踪。根据邮件列表条目,这可能是故意的,尽管我一生都无法弄清原因。这让我想找出引发异常的另一种方法,而不是使用RAISE。我只是想念一些明显的东西吗?有人对此有把戏吗?是否有我可以让Postgres抛出的异常,其中包含我选择的字符串,这样我不仅可以在错误消息中得到我的字符串,而且还可以得到完整的堆栈跟踪信息? 这是一个完整的示例: CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$ DECLARE v_error_stack text; BEGIN -- Comment this out to see how a "normal" exception will give you the stack trace RAISE …

3
电子邮件地址是唯一键还是主键?
我是数据库的新手。我四处阅读,发现使用电子邮件地址作为主键可能不是一个好主意,因为字符串比较慢,这会影响复杂连接中的性能;如果电子邮件发生更改,我必须更改所有外键,这需要很多工作努力。 但是,如果我的用户表要求每个用户都有一个电子邮件地址,并且每个电子邮件地址都应该是唯一的,那么在电子邮件列上添加唯一索引就足够了吗?因为afaik唯一字段允许空值,而我要求每个用户都有一个电子邮件地址,但不允许空值。我在这里想念什么吗?或者我想使电子邮件列唯一,并确保在服务器上的数据验证期间用户确实输入了电子邮件地址,以便每个用户都有一个电子邮件地址?

1
忙碌的桌子没有被打扫
我们在Windows上使用Postgres 9.2来存储低频时间序列数据:我们每周7天,每24小时每秒每秒插入约2000行,而没有停机。DELETE每隔10分钟左右在表上运行一次,以将表的长度保持固定的天数。最终是相当稳定的9亿行。(对于那些有兴趣,SELECT,INSERT,DELETE都是高性能)。 因此DELETE,在删除行时不会释放磁盘空间。为此,我们需要VACUUM运行。 我查询,pg_stat_user_tables并且VACUUM似乎从未运行过。 我从各种文档(http://www.postgresql.org/docs/9.2/static/routine-vacuuming.html)了解到: 我们似乎启用了自动真空,并且它正在其他表上运行。 auto-vacuum不会运行FULL,并且不应在表上要求排他锁。 有谁想到为什么自动真空不运行?这纯粹是因为桌子一直在忙吗? 它是值得的运行VACUUM后,每DELETE在这种情况下(其中每10分钟一班)? 编辑: 通过下面的SO链接使用SQL查询: -[ RECORD 2 ]---+--------------------------- schemaname | stats relname | statistic_values_by_sec last_vacuum | last_autovacuum | n_tup | 932,315,264 dead_tup | 940,727,818 av_threshold | 186,463,103 expect_av | * 和原始输出: -[ RECORD 3 ]-----+--------------------------- relid | 501908 schemaname | stats relname | …

1
数据校验和如何与流复制交互?
数据校验和是9.3中引入的新功能,并且: 有一个新的GUC参数“ ignore_checksum_failure”,即使检测到损坏,该参数也将强制PostgreSQL继续处理事务 如果复制主服务器上的校验和失败,该损坏的数据将复制到从服务器还是复制暂停。是否取决于设置ignore_checksum_failure? 该自述文件具有一些有用的相关信息,但不能直接回答问题。

1
PostgreSQL事务提交数小时
我遇到一个问题,从用户到我的PostgreSQL服务器有两个连接,它们已经运行了大约4个小时,并且处于提交状态已经有一段时间了(我一直在观察它至少1个小时) 。这些连接阻止了其他查询的运行,但它们本身并未被阻止。 这是有问题的两个连接。 postgres=# select * from pg_stat_activity where usename = 'xxxxx'; datid | datname | procpid | usesysid | usename | current_query | waiting | xact_start | query_start | backend_start | client_addr | client_port -------+---------+---------+----------+---------+---------------+---------+-------------------------------+-------------------------------+-------------------------------+---------------+------------- 20394 | xxxxxx | 17509 | 94858 | xxxxx | COMMIT | f | …

1
在PostgreSQL 8.4中执行触发功能需要哪些特权?
在PostgreSQL 8.4中执行触发功能需要哪些特权? 似乎为角色设置的特权与执行触发功能无关紧要。我想我已经看到有一天执行触发器功能所需的特权是EXECUTE特权,但对于表的所有者而言,而不是执行触发触发器的触发器的实际角色。 我找不到说明这一点的文档部分,有什么帮助吗?

1
如何在Postgres中获取窗口函数的集合?
我有一张表,其中包含两列整数数组的排列/组合,第三列包含一个值,如下所示: CREATE TABLE foo ( perm integer[] NOT NULL, combo integer[] NOT NULL, value numeric NOT NULL DEFAULT 0 ); INSERT INTO foo VALUES ( '{3,1,2}', '{1,2,3}', '1.1400' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( '{3,1,2}', '{1,2,3}', '0' ), ( '{3,1,2}', '{1,2,3}', '1.2680' ), ( …

1
我如何请求刷新Postgresql事务日志?
我遇到以下问题:PostgreSQL 9.2附带了一个“垂直” Linux发行版(Sophos UMT),用于存储其配置。不幸的是,自上次更新以来,某些实例的事务日志(WAL)似乎一直在增长,而从未被刷新过。这导致pg_xlog文件夹长到比基本文件夹大几个数量级。 我现在处在一个微妙的情况:由于WAL文件的过度增长,其中一台计算机(VM)的磁盘将在星期一之前装满。我已经向供应商提出了支持案例,但是到目前为止,他们的帮助不是很大(他们建议我们使用更大的磁盘来重建VM)。 永远不会备份该数据库,因为该软件以不同的方式执行备份(它具有自己的备份过程并通过电子邮件发送备份文件),我想这就是WAF增长如此之多的原因。 恐怕我还远不是PostgreSQL专家,所以很可能我在问一个愚蠢或显而易见的问题,但是,请求刷新WAL文件的程序是什么? 理想情况下,我正在寻找一种程序,该程序将允许我在有问题的系统上刷新这些WAL文件,以便为自己购买足够的时间以使供应商发布更好的修复程序。 编辑:根据要求,这是SELECT version();查询的输出: PostgreSQL 9.2.4 on i686-pc-linux-gnu, compiled by gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973], 32-bit (1列) 和SELECT name, current_setting(name), source FROM pg_settings WHERE source NOT IN ('default', 'override');查询 hot_standby | on | configuration file listen_addresses | * | configuration file log_destination …
11 postgresql 

1
Postgres:count(*)vs count(id)
我在文档中看到了count(*)和之间的区别count(pk)。我一直在使用count(pk)(这里pk是SERIAL PRIMARY KEY)不知道约的存在count(*)。 我的问题是关于Postgres的内部优化。是否足够聪明地知道SERIAL PRIMARY KEY每行中都会存在一个a ,并且永远不会为假,仅对行进行计数?还是会对每行进行多余的谓词检查?我同意这可能是毫无意义的优化,但我很好奇。 我看了看输出EXPLAIN和EXPLAIN VERBOSE为count(*),count(id)并count(id > 50)看看是否EXPLAIN提到检查其输出的断言。没有。

2
查找最长前缀的算法
我有两张桌子。 第一个是带有前缀的表 code name price 343 ek1 10 3435 nt 4 3432 ek2 2 其次是带有电话号码的通话记录 number time 834353212 10 834321242 20 834312345 30 我需要编写一个脚本,该脚本从每个记录的前缀中找到最长的前缀,并将所有这些数据写入第三张表,如下所示: number code .... 834353212 3435 834321242 3432 834312345 343 对于数字834353212,我们必须修剪“ 8”,然后从前缀表3435中找到最长的代码。 我们必须始终删除第一个“ 8”,并且前缀必须在开头。 我很久以前用非常糟糕的方式解决了这个任务。这是可怕的perl脚本,它对每个记录进行很多查询。该脚本: 从调用表中获取一个数字,在循环中从length(number)到1 => $ prefix做子字符串 进行查询:从前缀中选择count(*),例如“ $ prefix”之类的代码 如果count> 0,则使用第一个前缀并写入表 第一个问题是查询计数-是call_records * length(number)。第二个问题是LIKE表达式。恐怕这些很慢。 …

1
错误:在无法接受集合的上下文中调用了set_valued函数。什么事啊
我在ubuntu 12.04上使用Postgresql 9.1。 克雷格的回答启发,我的问题类型SETOF或SETOF纪录的级联我以为我会使用顺利return query,setof record等一系列的发电机到这个PLPGSQL功能: create or replace function compute_all_pair_by_craig(id_obj bigint) returns setof record as $$ begin return query select o.id, generate_series(0,o.value) from m_obj as o; end; $$ language plpgsql; 在执行过程中,我得到了错误: ERROR: set_valued function called in context that cannot accept a set 怎么了 ?与Craig相反,我告诉函数返回setof record。 我可以实现与Craig完全一样的工作,即通过定义类型create type pair_id_value as …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.