今天在微信群里看到有人在问,pg_dump能不能像Oracle一样从列表中读取指定的表名然后导出呢?
尽管pg_dump支持导出的-t选项进行模糊匹配,也支持-T来排序不需要导出的表。但实际应用中我们往往经常会碰到需要碰到比方说用户给了一个表清单,说要把这些表都导出来,这种时候如果一张张去匹配,不仅工作量大,而且pg_dump的命令也会很长。
技巧一:根据文件导出指定表
这里给出一个简单的脚本参考下,用来满足这种需求:
pg_dump -d database_name $(cat table_list.txt | xargs -I % echo "-t %") > file_name.sql
上面的脚本中我们将需要导出的表名写入table_list.txt文件中即可。
技巧二:根据query导出指定数据
除此之外,还有个经常碰到问题。pg_dump有没有类似Oracle中expdp的query选项呢,即根据查询结果导出某张表数据。
pg_dump是不支持该功能的,比较常见的做法是根据查询创建张临时表然后进行导出。初次之外我们也可以利用copy命令支持过滤的功能来间接实现:使用 pg_dump 命令来生成表的 DDL,然后使用 psql 命令和 COPY 命令将数据导出到文件中。
1、pg_dump导出表结构:
pg_dump -U username -s -t tablename dbname > schema.sql
2、copy导出数据
psql -U username -d dbname -c "COPY (SELECT * FROM tablename WHERE columnname = 'value') TO STDOUT" > data.sql