PostgreSQL 大数据量(超过50GB)导出方案
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 分别跟模式名.表名 库名,如果省略库名则默认从与用户名同名的库中导出表。
二、大文件导出
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等
优化建议
关闭索引和触发器:在导出前考虑禁用非关键索引和触发器,导出后再重建
调整服务器参数:临时增加maintenance_work_mem等内存参数可提高导出性能
网络优化:如果导出到远程,考虑使用压缩传输
pg_dump -U username -d database_name -t large_table -Fc | gzip | ssh user@remote "cat > /path/to/backup.gz"