标签: postgresql

postgresql 的高可用性

我是 PostgreSQL 数据库的新手。最近我们的开发人员需要对我们的系统进行一些升级。

因此,我们计划实施一些方法来实现数据库故障转移。

根据我在此处阅读 postgresql wiki ,我们正在尝试实现热备用或热备用。所以我的问题是:

  1. 它们之间的主要区别是什么?
  2. 哪一个更好?
  3. 有没有其他方法可以考虑在我们的 Postgres 数据库中实现高可用性?

postgresql linux high-availability

8
推荐指数
1
解决办法
1437
查看次数

在 Postgres 中,如何将不同的字符转换为枚举类型?

我有一个 Postgres 8.4 表,其中包含类型为“字符变化”的列,但我想将它们转换为枚举类型。

尝试更改表格时

ALTER TABLE logs ALTER COLUMN interface_type TYPE interface_types
USING interface_type::text::interface_types;
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

default for column "interface_type" cannot be cast to type interface_types
Run Code Online (Sandbox Code Playgroud)

该列的默认值是枚举类型中值的文本版本。所以这应该是可能的,尽管我没有运气谷歌搜索解决方案。

我假设我需要为它定义一个演员表。如何?

postgresql cast

8
推荐指数
1
解决办法
5446
查看次数

每个连接的临时架构?

我正在尝试将我的单元测试从 H2 迁移到 Postgresql。

目前,H2 为我提供了一个内存模式,这样每个连接都映射到一个唯一的模式、创建表、运行测试并删除模式。模式创建和销毁由 H2 自动处理。

单元测试同时运行。

在 Postgresql 中执行此操作的最佳方法是什么?具体来说,

  1. 如何获得每个连接的唯一架构?
    • 测试框架应该生成唯一的名称还是有一个内置的机制来做到这一点?
  2. 如何确保在断开连接时删除架构?
    • 当单元测试被终止时,我不想以悬空模式结束。
  3. 什么方法会产生最高的性能?
    • 我需要每秒创建/删除数十个模式。

更新:我在这里找到了一个相关的答案但它无法删除模式,以防运行单元测试的进程被杀死。

postgresql unit-test

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

查询 PostgreSQL 9 中分组连续行的总和

我有关于在不同国家旅行的人的数据,如下所示:

country | begintimestamp      | distance    

Germany | 2015-01-01 00:00:00 | 100
Germany | 2015-01-01 01:12:13 | 30
France  | 2015-01-01 02:13:14 | 40
France  | 2015-01-01 03:14:15 | 20
Spain   | 2015-01-01 04:15:16 | 10
France  | 2015-01-01 05:16:17 | 30
France  | 2015-01-01 05:17:18 | 5
Germany | 2015-01-01 06:18:19 | 3
Run Code Online (Sandbox Code Playgroud)

我需要的是能够收到这样的结果 -distance与最早的连续行相加begintimestamp

country | begintimestamp      | distance

Germany | 2015-01-01 00:00:00 | 130  // 100+30, the distance of two first rows summed. …
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions

8
推荐指数
1
解决办法
3104
查看次数

PostgreSQL中具有主键的重复行

假设我有一个名为 的表people,其中id是主键:

+-----------+---------+---------+
|  id       |  fname  |  lname  |
| (integer) | (text)  | (text)  |
+===========+=========+=========+
|  1        | Daniel  | Edwards |
|  2        | Fred    | Holt    |
|  3        | Henry   | Smith   |
+-----------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个行重复查询,该查询足够健壮,可以解释表的架构更改。每当我向表中添加一列时,我都不想回去修改重复查询。

我知道我可以做到这一点,这将复制记录 ID 2 并为复制的记录提供一个新 ID:

INSERT INTO people (fname, lname) SELECT fname, lname FROM people WHERE id = 2;
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加一age列,则需要修改查询以同时考虑年龄列。

显然我不能执行以下操作,因为它还会复制主键,从而导致duplicate key value violates unique constraint-- 而且,无论如何我都不希望它们共享相同的 ID:

INSERT INTO people …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql default-value postgresql-9.4

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

为什么 PostgreSQL 需要 ACCESS EXCLUSIVE LOCK?

我知道 PostgreSQL 为并发控制提供了多种锁定模式。当我通读他们的文件时,我不明白为什么ACCESS EXCLUSIVE在任何情况下都需要锁。EXCLUSIVE锁和ACCESS EXCLUSIVE锁之间的唯一区别似乎是ACCESS EXCLUSIVE锁不允许从表中读取。

但是,人们能够阅读不是一件好事吗?在什么情况下应该阻止用户阅读?在文档中,我看到通常DROP TABLE等会使用ACCESS EXCLUSIVE锁,但为什么呢?我在想,也许当您删除表时,当您尝试读取时,数据已经部分消失,因此结果将被破坏。但是后来我意识到由于 Postgres 中的所有内容都是事务性的,DROP TABLE因此在提交之前不应该生效。所以我的猜测应该是错误的。

我还是很困惑。ACCESS EXCLUSIVE当您将它与EXCLUSIVE锁定进行比较时,为什么又需要锁定?我最好的猜测是用ACCESS EXCLUSIVE锁替换锁EXCLUSIVE不会破坏 PostgreSQL。只是有时人们不希望别人阅读。我错过了什么?

postgresql mvcc

8
推荐指数
1
解决办法
5402
查看次数

如何在 Postgres 9.3 上安装/启用 uuid-ossp 扩展?

我在 Ubuntu Linux 14.04 上使用 Postgres 9.3。如何安装/启用 uuid-ossp 扩展?我首先验证了 contrib 包是否已安装……

root@prodbox:/home/rails/myproject# apt-get install postgresql-contrib
Reading package lists... Done
Building dependency tree       
Reading state information... Done
postgresql-contrib is already the newest version.
Run Code Online (Sandbox Code Playgroud)

然后我登录并尝试创建扩展...

root@prodbox:/home/rails/myproject# su - postgres
postgres@prodbox:~$ psql
psql (9.6.0, server 9.3.11)
Type "help" for help.

postgres=# CREATE EXTENSION "uuid-ossp";
ERROR:  could not open extension control file "/usr/share/postgresql/9.3/extension/uuid-ossp.control": No such file or directory
Run Code Online (Sandbox Code Playgroud)

我都没有想法了。我错过了什么?

postgresql postgresql-9.3 uuid postgresql-extensions

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

PostgreSQL:使用自定义列自动更新 updated_at

以前,我会将多个表合并为一个并返回结果,但在许多表中我有相同的列名。这就是为什么我决定用表名作为列名的前缀。但这打破了我必须自动更新我的updated_at专栏的触发器。

这是我的功能:

CREATE OR REPLACE FUNCTION update_updated_at()
  RETURNS TRIGGER AS $$
  BEGIN
      NEW.updated_at = now();
      RETURN NEW;
  END;
  $$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

我会添加一个触发器,如:

CREATE TRIGGER update_users_updated_at
  BEFORE UPDATE ON users
  FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
Run Code Online (Sandbox Code Playgroud)

但是现在我的专栏被命名了users_updated_at,这不起作用。我的问题是有什么方法可以将列名传递给触发器并更新传递的列,还是有其他我不知道的方法?

postgresql trigger plpgsql functions row-modification-time

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

我可以在 timescaledb 中使用 hypertables 来获得更好的插入率吗?

我有一个 PostgreSQL 数据库,我运行了大量的负载。我希望这个负载尽可能快。我已经在使用复制命令等。

我一直在阅读关于timescaledb以及它如何提供改进的插入性能。但是,如果我只关心插入性能,我想知道使用 hypertables 而不是常规表是否有任何缺点?

postgresql performance timescaledb postgresql-performance

8
推荐指数
1
解决办法
1803
查看次数

外键列中的 NULL

我一直在学习SIMPLEFULL匹配 PostgreSQL 中的外键,我想知道以下思考过程是否正确:

一旦外键的至少一个引用列包含一个NULL值,就没有指向被引用表的链接。这是因为根据 3VL,aNULL无法与另一个NULL值进行比较。这也意味着在相关列中至少包含一个值的引用行被更新或删除时,定义的级联操作(例如... DO DELETE, ... DO SET NULL, ..)NULL永远不会发生,因为没有指向引用行的链接。更具体地说,假设有一个从表A(x, y)到的外键B(x, y)。如果同时AB包含的行(5, NULL)xy,有没有联系,因为NULL该行A是不是等于NULL在列B

这样对吗?我对 SQL 很陌生,所以我想知道我是否正确理解了这一点。

postgresql foreign-key

8
推荐指数
1
解决办法
3037
查看次数