【问题标题】:Change column type VARCHAR to TEXT in PostgreSQL without lock table在没有锁表的 PostgreSQL 中将列类型 VARCHAR 更改为 TEXT
【发布时间】:2017-10-23 21:18:54
【问题描述】:

我有一个“父表”和分区表,其中包含很多列,现在我需要将列 VARCHAR(32) 更改为 TEXT,因为我们需要更大的长度灵活性。

所以我会更改父级,他们也会更改所有分区。

但该表有 2 个与该列有关的唯一索引,还有 1 个索引。

此查询锁定表:

ALTER TABLE my_schema.my_table
ALTER COLUMN column_need_change TYPE VARCHAR(64) USING 
column_need_change :: VARCHAR(64);

还有这个:

ALTER TABLE my_schema.my_table
ALTER COLUMN column_need_change TYPE TEXT USING column_need_change :: TEXT;

我看到了这个解决方案:

UPDATE pg_attribute SET atttypmod = 64+4
WHERE attrelid = 'my_schema.my_table'::regclass
AND attname = 'column_need_change ';

但我不喜欢这个解决方案。

如何在不锁表的情况下将VARCHAR(32)类型改为TEXT,我需要在更新之间继续推送一些表中的数据。

我的 Postgresql 版本:9.6

编辑:

这是我最终采取的解决方案:

ALTER TABLE my_schema.my_table
ALTER COLUMN column_need_change TYPE TEXT USING column_need_change :: TEXT;

查询将我的表锁定在 1m 52s 548ms 之间,260 万行,但没关系。

【问题讨论】:

    标签: postgresql alter-table


    【解决方案1】:

    受支持且安全的变体是使用ALTER TABLE。这不会重写表,因为varchartext 具有相同的磁盘表示,因此一旦获得ACCESS EXCLUSIVE 表锁,它将在瞬间完成。

    如果您的交易时间很短,您只会遇到短暂的停顿,而ALTER TABLE 会等待所有之前的交易完成。

    弄乱系统目录是很危险的,这样做需要您自担风险。

    可能侥幸逃脱

    UPDATE pg_attribute
    SET atttypmod = -1,
        atttypid  = 25
    WHERE attrelid = 'my_schema.my_table'::regclass
      AND attname = 'column_need_change';
    

    但如果它破坏了某些东西,你可以保留碎片......

    【讨论】:

    • 对于某些读者来说可能不明显的是,在 Postgres 中(如果我错了,请有人纠正我!) varchar 字段的长度限制实际上只是对允许值的限制,并且不影响列在磁盘上的存储方式。在大多数其他 DBMS 中,增加该长度需要重写表,因为该行将被布置在磁盘上,只有足够的空间容纳最初指定的限制。
    • 就PostgreSQL而言你是对的(我不知道其他DBMS)。
    • @IMSoP:如果更改是“兼容的”,Oracle 和 SQL Server 也不会重写表(或任何索引),例如从varchar(20)varchar(500)
    • @IMSoP:在估计查询结果所需的内存时使用“固定宽度”,而不是在磁盘上存储数据。参见例如这里:dba.stackexchange.com/a/162117/1822
    • Postgres docs 表示虽然 ALTER TABLE 版本不会为这些类型重写表(列内容不变并且类型是二进制强制的),但它将使用列不管,这将锁定表一段时间。如果这是一个大表,那么索引也可能很大,因此重写它们可能需要相当长的时间。我打了这个案子。只是给其他勇敢的读者留个便条。
    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多