当我insert
时,我得到integer out of range
,因为我的id/主键被错误地创建为int
而不是bigint
或bigserial
。我试过了:
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中这样做了
(这是记忆中的。如果我错过了什么,请告诉我。)
编辑:这有重写整个表的副作用,就像一个完全的真空释放任何死磁盘空间。