—— 阿尔伯特·爱因斯坦

程序员の奇妙冒险

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 AS
SELECT * 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_default
FROM information_schema.columns
WHERE 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;
 
评论(0)
暂无评论来抢沙发吧~