PostgreSQL 数据导出
在日常运维中,我们经常需要导出 PostgreSQL 数据库,可能是为了迁移、备份,或者给开发环境同步一份生产数据。但很多时候,数据库中总有一些「又大又没用」的表——比如日志表、历史记录表——导出它们既浪费时间又占用存储空间。
本文将介绍一套实用的 PostgreSQL 导出流程:先查看各表大小,再按需排除,精准导出。
一、导出前:先查看哪些表大
在执行导出之前,先搞清楚数据库里到底有哪些「大表」,可以避免盲目导出。
SELECT
schemaname,
relname AS table_name,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
pg_size_pretty(pg_relation_size(relid)) AS table_size,
pg_size_pretty(pg_indexes_size(relid)) AS index_size,
n_live_tup AS estimated_rows
FROM pg_stat_user_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(relid) DESC;
这个查询会返回 public 模式下所有表的信息:
total_size:表总大小(含数据和索引)table_size:纯数据大小index_size:索引大小estimated_rows:估算行数
执行完后,你就能清楚地看到哪些表是「空间大户」,从而决定哪些表的数据不需要导出。
二、执行导出:pg_dump 精准排除
pg_dump 是 PostgreSQL 自带的逻辑备份工具。
下面这条命令展示了如何只导出 public 模式下的表结构 + 部分表的数据,同时排除掉多个大表或不需要数据的表:
PGPASSWORD=postgres pg_dump \
-U postgres \
-h localhost \
-d aiops \
-n public \
--no-owner \
--no-privileges \
--exclude-table-data='public.event_process_node' \
--exclude-table-data='public.event' \
--exclude-table-data='public.metrics_decimal_*_chunk' \
--exclude-table-data='public.per_period_income_event' \
--exclude-table-data='public.health_status_his' \
--exclude-table-data='public.notify_his' \
--exclude-table-data='public.notify_result' \
--exclude-table-data='public.dial_indicator' \
--exclude-table-data='public.res' \
--exclude-table-data='public.res_probe' \
-f public.sql
各参数说明:
| 参数 | 作用 |
|---|---|
PGPASSWORD=postgres | 通过环境变量指定密码(注意安全性) |
-U postgres | 数据库用户名 |
-h localhost | 数据库主机地址 |
-d aiops | 要导出的数据库名称 |
-n public | 只导出 public 模式 |
--no-owner | 不输出设置对象所有权的命令 |
--no-privileges | 不输出权限相关的命令 |
--exclude-table-data='table_name' | 排除指定表的数据,但保留表结构 |
-f public.sql | 输出文件名 |
关于 --exclude-table-data 的几点说明:
- 只排除数据,不排除结构:被排除的表仍然会出现在导出文件中,但只有
CREATE TABLE等结构定义,没有INSERT数据。 - 支持通配符:比如
public.metrics_decimal_*_chunk可以匹配所有符合该模式的分区表。 - 可多次使用:每个要排除的表都需要单独写一个
--exclude-table-data。
三、注意事项
- 密码安全:在命令行中直接使用
PGPASSWORD环境变量存在安全风险。 - 版本一致性:导出和恢复时,尽量保持源库和目标库的 PostgreSQL 版本一致,避免兼容性问题。
总结
PostgreSQL 的导出其实可以很精细:先用查询摸清各表大小,再用 pg_dump 配合 --exclude-table-data 精准排除不需要的数据。这套「先查后导」的流程既能节省导出时间,又能控制备份文件的大小,值得在实际工作中推广使用。

957

被折叠的 条评论
为什么被折叠?



