程序员の奇妙冒险

返回
PostgreSQL PostgreSQL
2025-11-26 15:07 阅读:71 评论:0

PostgreSQL 临时表迁移 + 原子替换方案 删表数据彻底释放磁盘空间

此方案存在缺点,迁移期间数据延迟/丢失 如果要删除整表数据,可直接执行命令TRUNCATE TABLE 表名;,此操作会删除表所有数据以及立即释放空间 操作脚本如下 步骤1 查看原表所有索引 步骤2 创建临时表(复制原表结构和数据,如需过滤数据添加 WHERE 条件,如果没有WHERE 条件则复制原

  • 此方案存在缺点,迁移期间数据延迟/丢失
  • 如果要删除整表数据,可直接执行命令TRUNCATE TABLE 表名;,此操作会删除表所有数据以及立即释放空间
  • 操作脚本如下

步骤1

  • 查看原表所有索引
1
2
3
SELECT indexname, indexdef
FROM pg_indexes
WHERE schemaname = 'public' AND tablename = 'tbl_format_tracking';

步骤2

  • 创建临时表(复制原表结构和数据,如需过滤数据添加 WHERE 条件,如果没有WHERE 条件则复制原表所有数据)
1
2
CREATE TABLE public.temp_tbl_user AS
SELECT * FROM public.tbl_user WHERE TO_CHAR(created_time, 'YYYY-MM-DD') >= '2025-11-20';

步骤3

  • 复制主键
1
2
3
4
-- (col1, col2)
-- id
ALTER TABLE public.temp_tbl_user
ADD PRIMARY KEY (id); -- track_id (track_id, format_id)

步骤4

  • 复制原表所有索引,复制普通索引(按步骤1查询的 indexdef 逐一创建)示例
1
CREATE INDEX temp_tbl_user_created_time_idx ON public.temp_tbl_user USING btree (created_time);

步骤5

  • 验证临时表与原始表结构是否一致(可跳过)
1
2
3
4
SELECT column_name, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = 'public' AND table_name = 'temp_tbl_user'
ORDER BY ordinal_position;

步骤6

1
2
3
4
5
6
--
DROP TABLE public.tbl_user;
--
ALTER TABLE public.temp_tbl_user RENAME TO tbl_user;
--
ANALYZE public.tbl_user;
评论 (0)
暂无评论 来抢沙发吧~