在DBA的工作中,我们经常需要批量产生大量的类似的命令,例如:
TRUNCATE TABLE WT.ABC;
TRUNCATE TABLE WT.DEFGH;
TRUNCATE TABLE WT.XYZ;
仔细观察上面的规律,你会很容易发现规律:除了表名不同,一行命令的其余部分是写死的。我们可以把表的名字放在一个文本文件里面,一行是一个表的名字:
ABC
DEFGH
XYZ
这样我们可以使用Perl/Python等脚本按行读取这个文件的内容,然后拼凑出我们需要的命令。我经常使用的perl脚本模板如下:
#!/usr/bin/perl
use strict;
use warnings;
if($#ARGV != 0) {
print "Usage: p.pl filename\n";
exit;
}
my $filename = $ARGV[0];
open(TXTFILE, '<', $filename)
or die "Could not open file '$filename' $!";
my $line;
while (<TXTFILE>) {
chomp;
next if /--/;
$line = $_;
$line =~ s/^\s+//;
$line =~ s/\s+$//;
print "TRUNCATE TABLE WT.$line\n";
# print "expdp username/password directory=dpump tables=WT.$line dumpfile=WT.$line.dmp logfile=expdp.WT.$line.log parallel=32\n";
}
即使你不懂perl,稍微花费几分钟就可以读懂它的大致内容,就是你在命令行下输入一个参数作为文件名,这个脚本就会打开这个文件,按行读出来。如果这一行里面包含--,则视为这一行被注释掉了,就跳过。 然后用print命令拼凑出你需要的任意命令。
假设你的这个脚本叫p.pl,你的包含表名的文件叫做tab.txt,则可以执行:
./p.pl tab.txt
大家可以快速做一下实验。你可以使用which perl命令,拿到你所在的Linux服务器上perl程序所在的路径,修改一下第一行。