PostgreSQL 大数据量(超过50GB)导出方案

发布于:2025-07-16 ⋅ 阅读:(13) ⋅ 点赞:(0)

1.正常导出

导出指定库

./pg_dump -d test_db  -p 2360 > /home/softwares/postgresql/test_db.sql

导出指定表

./pg_dump -p 2360 -U postgres -t test_schema.test_table test_db > /home/softwares/postgresql/m.sql

 -t参数说明,-t test_schema.test_table test_db 分别跟模式名.表名 库名,如果省略库名则默认从与用户名同名的库中导出表。

导出和导入
 pg_dump -p 5432 -U postgresql -d huaxiang -n hx_syn_data -f /mnt/mydik/pgsql/hx_syn_data_schema.sql
 psql -p 5432 -U postgresql -d huaxiang -n hx_syn_data -f /data/hx_syn_data_schema.sql
 

二、大文件导出

1. 使用pg_dump的自定义格式与并行导出

pg_dump -U username -d database_name -t large_table -Fc -v -j 4 -f large_table.backup
  • -Fc:使用自定义格式,支持压缩和选择性恢复
  • -j 4:启用4个并行工作线程(根据服务器CPU核心数调整)
  • -v:显示详细进度信息

2. 使用目录格式导出

pg_dump -U username -d dbname -t huge_table -Fd -v -j 8 -f /path/to/directory/

pg_dump -U username -d dbname -t huge_table -Fd -j 16 -Z 5 -f /mnt/backup/huge_table_dir

  • -Fd:使用目录格式,每个表一个文件
  • -j 8:使用8个并行工作线程
  • 输出到指定目录而非单个文件
  • -Z 5:启用Zlib压缩(级别5,平衡压缩率和速度)

3. 使用COPY命令分批次导出

对于超大表,可以按条件分批次导出到多个CSV文件:

-- 在psql中执行
\copy (SELECT * FROM large_table WHERE id >= 1 AND id <= 10000000) TO '/path/to/part1.csv' WITH CSV HEADER;
\copy (SELECT * FROM large_table WHERE id >= 10000001 AND id <= 20000000) TO '/path/to/part2.csv' WITH CSV HEADER;

4. 使用pg_bulkload工具

pg_bulkload是专门为大数据量导入设计的工具,但也可以用于高效导出:

pg_bulkload -d database_name -U username -o "TYPE=CSV" -o "FILE=/path/to/output.csv" -t large_table
  • 特点 绕过SQL层,直接访问存储格式
  • 性能显著高于常规方法

5. 结合split命令分割输出文件

对于超大导出文件,可以使用Unix的split命令分割:

pg_dump -U username -d database_name -t large_table -F p | split -b 10G - large_table_part_
这将生成多个10GB的文件(large_table_part_aa, large_table_part_ab等

优化建议

  1. ​关闭索引和触发器​​:在导出前考虑禁用非关键索引和触发器,导出后再重建

  2. ​调整服务器参数​​:临时增加maintenance_work_mem等内存参数可提高导出性能

  3. ​网络优化​​:如果导出到远程,考虑使用压缩传输

    pg_dump -U username -d database_name -t large_table -Fc | gzip | ssh user@remote "cat > /path/to/backup.gz"
    


网站公告

今日签到

点亮在社区的每一天
去签到