我使用pg_dump创建数据库的仅模式存档文件。我希望通过省略转储中的一组分区表中的一个来减小此文件的大小(并减少还原时间)。
例如,数据库中有以下分区表(按日期)。我只想保留最后一个。
awp_partition.awp_text_search_history_201209
awp_partition.awp_text_search_history_201210
awp_partition.awp_text_search_history_201211
awp_partition.awp_text_search_history_201212
plus hundreds more...
我创建了一个pg_dump命令(在bash脚本中调用),用于排除所有这些表,除了使用负前瞻正则表达式的最新表:
pg_dump -h 11.111.11.11 -p 5432 -U username -F c -s \
-T 'awp_partition.awp_text_search_history_(?!201212)\d{6}' \
dbname > /home/me/tmp/prod3.backup
但是,当我运行此命令时,所有表都将从转储文件中排除。
我尝试使用表包含和排除参数的组合,但尝试排除所有表,同时包含一个 - 与排除模式匹配 - 导致整个转储失败。
我使用Postgres regexp_matches()函数测试了我的正则表达式,并且它正确匹配了我预期的表。但是,根据文档: pg_dump documentation
仅转储匹配表的表(或视图或序列或外表)。通过写多个-t开关可以选择多个表。此外,table参数根据psql' s \ d命令使用的相同规则被解释为模式(请参阅模式),因此也可以通过在模式中编写通配符来选择多个表。使用通配符时,如果需要,请小心引用模式以防止shell扩展通配符;
相关文档psql patterns documentation
高级用户可以使用正则表达式表示法(如字符类),例如[0-9]来匹配任何数字。所有正则表达式特殊字符都按照第9.7.3节的规定工作,除了。作为如上所述的分隔符,*被转换为正则表达式表示法。 ,?翻译为。,和字面匹配的$。你可以通过写作来模仿这些模式字符吗? for。,(R + |)表示R ,或(R |)表示R? $不需要作为正则表达式字符,因为模式必须与整个名称匹配,这与正则表达式的通常解释不同(换句话说,$会自动附加到您的模式)。如果您不希望锚定模式,请在开头和/或结尾写下*。请注意,在双引号内,所有正则表达式特殊字符都会失去其特殊含义并按字面匹配。此外,正则表达式特殊字符在运算符名称模式(即\ do的参数)中按字面匹配。
我意识到此操作可能不支持否定前瞻操作符的语法。
看起来我需要改变我的模式匹配策略,并且我正在努力想出一种方法来使用psql \ d模式排除除了其中一个表之外的所有表。有什么想法吗?
答案 0 :(得分:0)
您是否尝试过像这样将正则表达式内部翻过来?
awp_partition.awp_text_search_history_(201209|201210|201211)