小编Lau*_*lbe的帖子

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

如何将所有表从一个 Postgres 模式移动到另一个

我想将所有表从架构移动xyz到默认架构public

我可以移动单个表

ALTER TABLE table_name
    SET SCHEMA public;
Run Code Online (Sandbox Code Playgroud)

我可以得到所有的桌子

SELECT table_name FROM information_schema.tables WHERE table_schema='xyz'
Run Code Online (Sandbox Code Playgroud)

有没有办法将这两者结合在一起?

schema postgresql alter-table

7
推荐指数
2
解决办法
6864
查看次数

将 Postgres 超级用户限制为仅限本地连接

我有一个包含多个用户的数据库:foobarsuper。我正在考虑pg_hba.conf锁定访问权限。

我希望允许foobar能够通过密码身份验证从任何 IP 进行连接。或者在本地使用信任身份验证。

我想允许super只能通过信任身份验证在本地登录。切勿来自非本地地址。

我就是从这个开始的。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# Allow everything if you're on the same machine.
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
Run Code Online (Sandbox Code Playgroud)

但是,然后我陷入困境,因为我不知道如何说“所有用户,除了超级用户”。我正在寻找这样的东西。

host    all             not_super       all                     md5
Run Code Online (Sandbox Code Playgroud)

我认为我可以采取的一种方法是列出foobar明确。但是,我想知道是否还有其他方法。

host    all             foo             all                     md5
host    all             bar             all                     md5
Run Code Online (Sandbox Code Playgroud)

postgresql authentication

6
推荐指数
1
解决办法
1722
查看次数

如何从大型 mysqldump 文件中恢复特定表?

从一个非常大的备份文件(mysqldump的创建)我需要带回只有一个(或几个)特定表(S),而无需加载所有表。

有没有快速的替代品?

mysql mysqldump restore

6
推荐指数
1
解决办法
468
查看次数

PostgreSQL 11:如何对 1000 个租户进行分区

设置

我们有一个多租户应用程序,大约有 1000 个客户。当客户流失时,我们会在一段时间后删除他们的所有数据。我们有一些非常大的表,我们正在考虑使用分区来按客户拆分它们。

问题

1000 个租户(客户)是很多分区 - 在 PostgreSQL 上这样做合理吗?

更多细节

目前,我们的租户之间的分离是通过account_id数据库中所有表上的列来实现的。有几张桌子都很大。例如,有一个event表(我对分区感兴趣的表)包含审核日志和我们应用程序中发生的所有事件的其他事件。

以下是有关事件表的一些事实:

  • 它包含大约 300M 行+一些复合/部分索引。
  • 事件计数account_id非常不均匀,5% 的帐户拥有 50% 的数据。
  • 有一个时间戳字段和其他一些字段(JSONB,author_id等等)
  • 写操作:主要插入和删除(每account_id)。删除的数据可能有数百万行。没有更新。删除大帐户的情况很少见,目前并不是一个大的性能问题。
  • 选择特定事件(通过account_id+ id)或给定时间段内的所有事件。并不总是设定时间段。account_id始终出现在查询中。

可能的解决方案

分区方式account_id

优点:

  • 删除速度会很快,因为DROP TABLE.
  • 查询也应该相当不错,因为所有查询都包含WHERE account_id = 123

缺点:

  • 1000 个分区对于 Postgres 来说太多了吗?
  • 每个帐户的事件分布不均匀,创建了一些超大分区和一些小分区。

按时间戳分区:

优点:

  • 最近的数据通常会被访问,并且会使带有时间戳的查询更快。
  • 事件的分布更加可预测/均匀。

缺点:

  • 删除单个帐户可能会触及很多分区 - 这不是一个大问题。
  • 始终需要包含按时间戳的过滤器 - 这并不总是可能的。

postgresql partitioning

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

为什么无法转换为 PostgreSQL 索引中的时间戳?

我正在处理从外部源收到的 JSON 文档。在本文档中,有一个timestamp属性对应于timestampPostgreSQL 数据类型的文本格式。换句话说,它可以被转换为timestamp类型:(data->>'timestamp')::timestamp

我想timestamp在索引中使用该属性。我尝试了以下方法:

create table t
(
    data    jsonb
);

create index on t(((data->>'timestamp')::timestamp));
Run Code Online (Sandbox Code Playgroud)

我正进入(状态:

ERROR:  functions in index expression must be marked IMMUTABLE
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我知道转换为 atimestamptz并不是不可变的,因为本地化配置设置不是静态的,但我无法将该逻辑应用于转换为timestamp.

还有办法将我的timestamp财产放入索引吗?

我正在使用几天前发布的 PostgreSQL 12。

postgresql index timestamp cast postgresql-12

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

将数组值限制为允许的值集

我想设置一个 CHECK 约束来确保text[]列的元素仅包含某些值。

设置一个例子:

CREATE TABLE foo(
  countries text[]
);

INSERT INTO foo VALUES ('{"Morocco", "Mali", "Indonesia"}');
INSERT INTO foo VALUES ('{"Sokovia", "Mali"}');
Run Code Online (Sandbox Code Playgroud)

现在只允许“摩洛哥”、“马里”和“印度尼西亚”,因此第二行应该被约束拒绝。

我有一个“有效”的解决方案:

CHECK (array_length(
  array_remove(
    array_remove(
      array_remove(
        countries,
        'Indonesia'
      ), 'Mali'
    ), 'Morocco'
  ), 1) IS NULL)
Run Code Online (Sandbox Code Playgroud)

但这不太可读。

我也尝试过这个:

CHECK ((
  SELECT unnest(countries)
  EXCEPT
  SELECT unnest(array['Morocco', 'Mali', 'Indonesia'])
) IS NULL)
Run Code Online (Sandbox Code Playgroud)

但:

错误无法在检查约束中使用子查询

postgresql array check-constraints

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

选择指定行之前/之后的 N 行

假设我在 Postgres (11.3) 中有一个简单的表:

create table posts
(
    id serial not null,
    created_at timestamp(0)
    constraint posts_pkey
        primary key (id)
);
Run Code Online (Sandbox Code Playgroud)

如果用户请求 id=5869,我需要能够在按列排序的查询中返回该行之前的 N 行和之后的 N 行created_at。如果我们能够假设 越大id,则 越大created_at,我们可以做一些相对简单的事情,如下所示:

(select * from posts where id < 5869 order by id limit 10)
union all
(select * from posts where id >= 5869 order by id limit 11);
Run Code Online (Sandbox Code Playgroud)

但是,我无法假设更高的 id 是最近创建的,我想知道在这种情况下检索该数据的最佳方法是什么。此方法有效,但在 100k 行数据集上速度非常慢:

WITH 
  boundaries AS (
    SELECT *,
           row_number() OVER (ORDER BY created_at DESC) AS …
Run Code Online (Sandbox Code Playgroud)

postgresql

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

如果 archive_mode 关闭,Postgres 是否会自动旋转 WAL 文件(pg_xlog)?

我对 PostgreSQL 管理还比较陌生,我正在尝试了解具体的细节。我的问题是,假设我不需要灾难恢复并且我没有通过设置打开归档archive_mode = on,Postgres 是否有内部机制可以将 WAL 文件轮换出来pg_xlog?如果有,频率是多少?

稍微不同的是,设置archive_mode = on但不配置archive_command- 是否存在 Postgres 将尝试存档到的默认位置?

postgresql transaction-log postgresql-9.6 archive-log

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

如果所有 LUN 都来自同一个 RAID 池,是否有必要将 tempdb 文件移动到不同的磁盘驱动器?

根据最佳实践,建议将所有tempdb(不仅仅是 tempdb)文件移动到不同的物理磁盘中。

我有一个虚拟服务器,最初有来自同一RAID 10池的 4 个 LUN。在卷管理器的帮助下,我将这 4 个 LUN 转换为 4 个不同的卷。

现在的问题是,移动tempdb到单独的卷中是否会产生任何影响,或者就性能而言,将它们与其他 SQL Server 文件保留在一起就可以了?

sql-server tempdb virtualisation sql-server-2014 raid

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