End*_*oop 9 regex postgresql pg-dump
我使用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...
Run Code Online (Sandbox Code Playgroud)
我创建了一个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
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此命令时,所有表都从转储文件中排除.
我尝试使用表包含和排除参数的组合,但尝试排除所有表,同时包括一个 - 与排除模式匹配 - 导致整个转储失败.
我使用Postgres regexp_matches()函数测试了我的正则表达式,它正确匹配了我预期的表.但是,基于文档: pg_dump文档
仅转储匹配表的表(或视图或序列或外表).通过写多个-t开关可以选择多个表.此外,table参数根据psql的\ d命令使用的相同规则解释为模式(请参阅模式),因此也可以通过在模式中编写通配符来选择多个表.使用通配符时,如果需要,请小心引用模式以防止shell扩展通配符;
高级用户可以使用正则表达式表示法(例如字符类),例如[0-9]来匹配任何数字.所有正则表达式特殊字符都按照第9.7.3节的规定工作,除了.它被视为如上所述的分隔符,*被转换为正则表达式表示法.,?翻译为.,和字面匹配的$.你可以通过写作来模仿这些模式字符吗?对于R,(R + |),对于R,(R |).$不需要作为正则表达式字符,因为模式必须与整个名称匹配,这与正则表达式的通常解释不同(换句话说,$会自动附加到您的模式).如果您不希望锚定模式,请在开头和/或结尾写入*.请注意,在双引号内,所有正则表达式特殊字符都会失去其特殊含义并按字面匹配.此外,正则表达式特殊字符在运算符名称模式(即\ do的参数)中按字面匹配.
我意识到在此操作中可能不支持负向前瞻操作符的语法.
看起来我需要改变我的模式匹配策略,而我正在努力想办法用psql\d模式排除除了其中一个表之外的所有表.有任何想法吗?
您是否尝试过像这样将正则表达式翻过来?
awp_partition.awp_text_search_history_(201209|201210|201211)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4569 次 |
最近记录: |