pgsql导出导入超过50G数据、解决方法
一、遇到的问题:
最近要迁移服务器,文件、图片、视频都好说,最后到pgsql了导出就88G大的纯sql300G,还是压缩后的
源文件快1个T了,
遇到问题,导出的时候时间一长就超时。。。。导致导出失败,时间够了....导出的文件太大。。。服务器硬盘又满了。。。。。,大表能导出了,但是纯sql超过100G就导入失败,不是超时,就是编码不对,一导导一天,一个报错全白费,就从头来。。。。。哎,没经验呀。经过各种坑,最后导入成功,分享一下成功经验。
二、总结经验:大文件导出
先测试命令
pg_dump -p 5432 -U postgresql -d huaxiang -n hx_syn_data -Fd -j 32 -Z 5 -f /mnt/mydik/pgsql/hx_syn_data_dir/
2.1导出
使用 nohup 防止超时 直接使用pg_dump,记得配置全局的环境变量,
nohup pg_dump -p 5432 -U postgresql -d huaxiang -n hx_syn_data -Fd -j 32 -Z 5 -f /mnt/mydik/pgsql/hx_syn_data_dir/ > pg_dump.log 2>&1 &
-p
:端口-U:用户 postgresql
-d:数据库 根据自己实际情况改
-n:数据库中的模式
-Fd
:使用目录格式,每个表一个文件-j 32
:使用32个并行工作线程-Z 5
:压缩- 输出到指定目录而非单个文件
-Z 5
:启用Zlib压缩(级别5,平衡压缩率和速度导出之后一个表一个文件,还有一个toc.dat文件
# 查看pg_dump进程是否仍在运行 ps aux | grep pg_dump
# 检查是否有僵尸进程 top -b -n 1 | grep defunct
2.2然后是导入
pg_restore -p 5432 -U postgresql -d huaxiang -n hx_syn_data -j 32 -Fd /mnt/mydik/pgsql/hx_syn_data_dir/
我的通过上面的就导出,导入成功了。
-----------------------------------------------------如果数据源超过1T可以使用下面的方案
分批次导出大表
# 先导出结构 ./pg_dump -p 5432 -U postgresql -d huaxiang -n hx_syn_data -s -Fd -j 8 -f /mnt/mydik/pgsql/hx_syn_data_structure/ # 然后按表分批导出数据 for table in $(psql -p 5432 -U postgresql -d huaxiang -c "\dt hx_syn_data.*" -At | cut -d'|' -f2); do ./pg_dump -p 5432 -U postgresql -d huaxiang -t hx_syn_data.$table -a -Fd -j 2 -f /mnt/mydik/pgsql/hx_syn_data_data/${table}_data/ done
然后是导入
pg_restore -p 5432 -U postgresql -d huaxiang -n hx_syn_data -j 32 -Fd /mnt/mydik/pgsql/hx_syn_data_dir/
导入的时候也非常快,我的导出13G也就十几秒。