首先上运行效果,有个直观认识:
简要说明:从src/include/catalog目录下的pg_*.h toasting.h indexing.h中获取所有已经使用的oid,最后将2--FistBootstrapObjectId-1(即10000-1)之间的未使用的id打印出来。其中涉及管道符使用,正则表达式,更有许多有用的linux小命令,譬如grep(egrep),sed,tr,sort,uniq,awk,都是一些常用的命令(所以对于初学者这个shell学习价值还蛮高)。
逐行简单解释如下:
#一堆注释,自己阅读,有助于英文提升! AWK="awk"#定义变量awk #GetFirstBootstrapObjectIdfromaccess/transam.h FIRSTOBJECTID=`grep'#define[]*FirstBootstrapObjectId'../access/transam.h|$AWK'{print$3}'` exportFIRSTOBJECTID#从../access/transam.h文件中找到FirstBootstrapObjectId并取到它的值 #thispart(downtotheuniqstep)shouldmatchtheduplicate_oidsscript #note:weexcludeBKI_BOOTSTRAPrelationssincetheyareexpectedtohave #matchingDATAlinesinpg_class.handpg_type.h #将CATALOG(.*BKI_BOOTSTRAP这一行去掉是因为在pg_class.h和pg_type.h中DATA行肯定会匹配到这些OID catpg_*.htoasting.hindexing.h|\#从这些文件中查找 egrep-v-e'^CATALOG\(.*BKI_BOOTSTRAP'|\#去除CATALOG开头后面接(BKI_BOOTSTRAP的行 sed-n-e's/^DATA(insert*OID*=*\([0-9][0-9]*\).*$/\1/p'\ -e's/^CATALOG([^,]*,*\([0-9][0-9]*\).*BKI_ROWTYPE_OID(\([0-9][0-9]*\)).*$/\1,\2/p'\ -e's/^CATALOG([^,*\([0-9][0-9]*\).*$/\1/p'\ -e's/^DECLARE_INDEX([^,*\([0-9][0-9]*\).*$/\1/p'\ -e's/^DECLARE_UNIQUE_INDEX([^,*\([0-9][0-9]*\).*$/\1/p'\ -e's/^DECLARE_TOAST([^,*\([0-9][0-9]*\),*\([0-9][0-9]*\).*$/\1,\2/p'|\ #根据正则表达式匹配,并将行替换为oid(,oid)形式,其他无关字符去掉 tr',''\n'|\#将,替换为换行符 sort-n|\#对结果按数值排序 uniq|\#去掉临近的重复行 $AWK'#以下将上述内容使用awk用漂亮的方式显示出来(单独的直接显示,连续的用x-y方式,有多漂亮。。。) BEGIN{ last=0; } /^[0-9]/{ if($1>last+1){ if($1>last+2){ printlast+1,"-",$1-1; }else{ printlast+1; } } last=$1; } END{ printlast+1,ENVIRON["FIRSTOBJECTID"]-1;
cat至结尾部分可以通过一步一步执行进行调试理解:
请逐一对使用到的linux命令进行学习,然后才能比较容易、深刻的理解!
要想进一步了解pg关于oid的源码(很有必要),请移步参考中德哥网易博客!
参考: