PostgreSQLPostgreSQL
2025-11-26 15:07阅读:28评论:0
PostgreSQL 临时表迁移 + 原子替换方案 删表数据彻底释放磁盘空间
此方案存在缺点,迁移期间数据延迟/丢失 如果要删除整表数据,可直接执行命令TRUNCATE TABLE 表名;,此操作会删除表所有数据以及立即释放空间 操作脚本如下 步骤1 查看原表所有索引 步骤2 创建临时表(复制原表结构和数据,如需过滤数据添加 WHERE 条件,如果没有WHERE 条件则复制原
- 此方案存在缺点,迁移期间数据___PROTECTED_5__0___PROTECTED_6__3___PROTECTED_7__1___PROTECTED_8__4___PROTECTED_9__2__
- 查看原表所有索引
1
2
3
4
SELECT indexname, indexdef FROM pg_indexes WHERE schemaname = 'public' AND tablename = 'tbl_format_tracking'; _PROTECTED0__
- 创建临时表(复制原表结构和数据,如需过滤数据添加 WHERE 条件,如果没有WHERE 条件则复制原表所有数据)
1
2
3
CREATE TABLE public.temp_tbl_user ASSELECT * FROM public.tbl_user WHERE TO_CHAR(created_time, 'YYYY-MM-DD') >= '2025-11-20'; _PROTECTED0__
- 复制主键
1
2
3
4
5
-- 复制主键(替换为原表实际主键列,如多列用 (col1, col2))-- 确认主键列(示例假设主键为 id,需按实际修改)ALTER TABLE public.temp_tbl_user ADD PRIMARY KEY (id); -- 必改:替换为你的实际主键列(如 track_id 或 (track_id, format_id)) _PROTECTED0__
- 复制原表所有索引,复制普通索引(按步骤1查询的 indexdef 逐一创建)示例
1
2
CREATE INDEX temp_tbl_user_created_time_idx ON public.temp_tbl_user USING btree (created_time); _PROTECTED0__
- 验证临时表与原始表结构是否一致(可跳过)
1
2
3
4
5
SELECT column_name, is_nullable, column_defaultFROM information_schema.columnsWHERE table_schema = 'public' AND table_name = 'temp_tbl_user'ORDER BY ordinal_position; _PROTECTED0__
1
2
3
4
5
6
7
-- 删除原表(或者命名为其他名称后续再删除)DROP TABLE public.tbl_user;-- 临时表重命名为原表名ALTER TABLE public.temp_tbl_user RENAME TO tbl_user;-- 更新表统计信息ANALYZE public.tbl_user;