integer超出范围,剩余磁盘空间太小,无法将id转换为bigint和其他解决方案



当我insert时,我得到integer out of range,因为我的id/主键被错误地创建为int而不是bigintbigserial。我试过了:

ALTER TABLE tbl ALTER COLUMN id TYPE BIGINT;

但是我得到以下错误,因为我的可用磁盘空间不够大。

ERROR: could not extend file "base/16401/3275205": No space left on device HINT: Check free disk space. SQL state: 53100

我现在无法增加磁盘空间,因为令人沮丧的原因我不会深入讨论。

我还尝试重新使用ID(我从这个表中删除了很多记录,所以有很大的差距),通过这样做来重新启动我的seq:https://dba.stackexchange.com/questions/111823/compacting-a-sequence-in-postgresql

但对于该链接中的解决方案#1:我想我没有磁盘空间了。该表为117GB,我在...data/base中有大约24GB可用。我确实有150GB的可用空间用于存储临时文件(不同的装载),这不是默认配置,但这样做是为了在...data/base中为数据库存储节省空间。如果我可以在Temp文件位置创建表,这可能会奏效,但我不知道如何做到这一点。

对于该链接中的解决方案#2:当我进入update部分时,我在pgAdmin4:中得到了这个

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request.  Either the server is overloaded or there is an error in the application.</p>

但是,当我运行时,查询仍在运行

select pid,query,state,wait_event,* from pg_stat_activity where state <> 'idle'

对于失败的update查询,我没有得到任何服务器日志。

我最终杀死了那个更新查询,以为它最终会失败。(我再次运行这个,除非其他人有更好的想法,否则会让它在上面的html错误中运行。)

对于该链接中的解决方案#3:我有16GM的RAM,所以不够。

下一个:如何重置postgres中的序列并用新数据填充id列?

我试过这个:

UPDATE table SET id = DEFAULT;
ALTER SEQUENCE seq RESTART;
UPDATE table SET id = DEFAULT;

ERROR: integer out of range

这会在您尝试插入时创建一个重复的密钥:

ALTER SEQUENCE seq RESTART WITH 1;
UPDATE t SET idcolumn=nextval('seq');

还有什么我可以试试的吗?

PostgreSQL 9.6

Scott Marlowe和Vao Tsun的评论有效:

在(linux)服务器上打开一个终端

导航到要将新名称空间作为的位置

制作目录:mkdir dirname

将所有权授予postgres:chown postgres:postgres dirname

创建表:CREATE TABLESPACE new_tbl_space LOCATION '/path/dirname'

将表放入表空间:alter table tbl set tablespace '/path/dirname'

做占用这么多磁盘空间的事情:ALTER TABLE tbl ALTER COLUMN id TYPE BIGINT;

将表空间改回:alter table tbl set tablespace pg_default

删除表空间:我在Tablespaces节点/对象的pgadmin4中这样做了

(这是记忆中的。如果我错过了什么,请告诉我。)

编辑:这有重写整个表的副作用,就像一个完全的真空释放任何死磁盘空间。

最新更新