前不久有一个Linux系统管理员向笔者求援。他说她们在Linux操作系统上布署了一个Oracle10G的数据库系统。如今她们借助数据库系统中的数据泵工具从系统中备份数据。她们希望每晚把这个备份文件复制到一个特定的地方。到这一步为止都没有问题。并且她们希望在复制的过程中,就能借助变量名对这个备份文件进行命名。如按礼拜几的不同,分别命名为1backup.dmp,2backup.dmp等等。后面的1、2就表示礼拜几的意思。如此设置的话,一个礼拜一个轮回。到下个礼拜一的话,新的备份文件都会把旧的备份文件替换掉。这么的话,备份文件所占用的硬碟空间也就不会无限制的降低起来。
笔者对于她们为何不直接采用Oracle提供的备份工具制订备份策略对数据库进行备份倍感不解。不过要实现前面这个借助变量来给文件命名的话,还是可以实现的。笔者依据她们企业的需求,给这个系统管理员详尽的论述了实现方式。
一、文件创建时间与系统时间的关系。
在借助变量来命名文件名子的时侯(如时间变量),须要注意一个问题,就是文件的创建时间与系统时间的关系。如前面这个需求,假如某个文件是在礼拜一创建的,而在礼拜二时复制这个文件。这么此时文件的名子应当为多少呢?是按文件的创建时间来命名,还是按复制的时间来命名的。倘若从前面这个需求来看,借助文件的创建时间来命名愈发的合理。由于这个创建时间才真正彰显了数据库的备份时间。
二、相关命令参数解析。
假如要把一个文件复制到另外一个地方,同时借助时间变量对其进行重命名的话,这么可以借助如下的命令来实现cpmydb.log"(date%w)"mydb.log。这个命令的意思就是把mydb.log复制到一个特定的位置(当前目录下),并对此进行重新命名。命名的规则就是在原先的文件变量后面加上一个时间参数linux文件通配重命名,这儿采用的是礼拜的时间变量。
"(date%w)"这个参数就是截取礼拜几的时间变量。注意,这儿的时间是根据文件的创建时间来的,而不是参考文件复制的时间。也就是说,假如这个文件的创建时间是礼拜三,而复制时间是礼拜四的话,这么这个变量的值就为3,而不是4。由于文件的创建时间为3。笔者曾经刚开始接触Linux操作系统的时侯,时常犯这个错误。希望笔者这个过来人常犯的错误,就能造成你们的提防。
另外前面这个时间参数,必需要用双冒号括上去。不过不那么做的话,这么系统都会提示这个命令有错误。这是一个句型上的错误。所以若果系统管理员在批处理程序中使用这个命令的话,这么最好还能进行预先测试。由于这种句型错误的话,即使再老到的系统管理员,一不留神就容易犯。实践是检验真理的惟一标准,这句话是不会错的。
还有一个小细节就是"(date%w)"与"(date+%w)"有区别吗?这个既有区别,又可以说没有。这主要是看用在哪些场合了。假如用在CP命令中,则中间加不加(+)减号,是一样的。并且linux文件通配重命名,在其他一些命令场合中,必需要加入中间这个减号。否则的话,系统会提示错误。如下边笔者要提到的ECHO命令,就有这方面的要求。
三、利用Echo命令来进行测试。
假如系统管理员对于自己编撰的命令参数不怎样肯定的话,这么就可以借助echo命令来进行测试。Echo命令可以显示环境变量的值,也可以显示个别特定变量的值。虽然这种变量就是系统中的环境变量。如右图所示。借助echo$(date+%w)就可以显示当日系统时间。这个命令只显示礼拜几。
假如使用这个命令的话,跟cp命令中最终的时间参数还是有一点差距,主要彰显在以下这几个方面。
首先,要借助echo命令来显示系统变量值的时侯,必须在变量后面加上$符号。倘若加上这个符号,系统还会觉得这是一个环境变量,或则由环境变量转换过来的一个变量。倘若不加这个符号的话,则操作系统会难以辨识,也就不能否正常显示这个变量的值了。
其次linux makefile虚拟主机 linux,在这个变量中,中间必须加入+号。如上图所示,倘若不加入这个+号的话,则操作系统都会提示错误,说%w是一个无效的参数。并且在cp命令中,则没有这个强制的限制。在中间加不加这个减号,都还能达到同样的疗效。不过为了提升参数的确切性,最好你们还是根据这个echo命令可以认可的格式下。由于echo命令可以认可的格式,则在其他命令中是通用的。相反,其他命令中可以用的格是,在echo等命令上不一定通用。所以为了提升编撰的脚本程序的移植性,最好还能采用通用的变量书写形式。