diff --git a/xCAT-client/sbin/dumpxCATdb b/xCAT-client/sbin/dumpxCATdb index 77e84847b..2975b321f 100644 --- a/xCAT-client/sbin/dumpxCATdb +++ b/xCAT-client/sbin/dumpxCATdb @@ -33,6 +33,25 @@ use strict; my $rc = 0; my $cmd; &parse_args; +if ($::BINARY) { # not using xCAT to dump, using the database utility + my $DBname = xCAT::Utils->get_DBName; + if ($DBname eq "DB2") { + $rc=&DB2_bindump; + if ($rc == 0) { + xCAT::MsgUtils->message("I", "Backup Complete."); + } else { + xCAT::MsgUtils->message("I", "Backup Failed."); + } + exit $rc; + } else { + xCAT::MsgUtils->message("E", + "Binary dump (-b) is only supported for DB2"); + exit 1; + } +} + + +# Dump using xCAT utilities my @output = xCAT::Utils->runcmd("tabdump", 0); if ($::RUNCMD_RC != 0) { # error @@ -111,13 +130,14 @@ sub parse_args { my $msg; my $usagemsg = - " dumpxCATdb -h \n dumpxCATdb -v \n dumpxCATdb [-a] [-V] <-p> [path to dump directory]"; + " dumpxCATdb -h \n dumpxCATdb -v \n dumpxCATdb [-a] [-V] <-p> [path to dump directory] \n dumpxCATdb -b [-V] <-p> [path to dump directory]"; Getopt::Long::Configure("posix_default"); Getopt::Long::Configure("no_gnu_compat"); Getopt::Long::Configure("bundling"); if ( !GetOptions( 'a|all' => \$::ALL, + 'b|bin' => \$::BINARY, 'p|path=s' => \$::PATH, 'h|help' => \$::HELP, 'V|verbose' => \$::DUMPVERBOSE, @@ -160,3 +180,101 @@ sub parse_args } +#----------------------------------------------------------------------------- + +=head3 DB_bindump + + Uses the DB2 Database supplied dump utility to backup the database + +=cut + +#----------------------------------------------------------------------------- +sub DB2_bindump +{ + my $msg; + my $rc=0; + # check to see if they are setup to do an online dump + # Database has to have defined logretain RECOVERY and there + # must already been taken an offline backup. + my $cmd="db2 get database configuration for xcatdb > /tmp/db2output"; + $rc = &rundb2cmd($cmd); # must su to xcatdb + if ($rc != 0) + { + xCAT::MsgUtils->message("E", " $cmd error."); + return 1; + } + + # check to see if they setup log recover + $cmd = " egrep -i \"Log retain for recovery enabled\" /tmp/db2output"; + my @output=xCAT::Utils->runcmd($cmd, -1); + if ($::RUNCMD_RC != 0) { + xCAT::MsgUtils->message("E", "Log retain for recovery enabled (LOGRETAIN) = RECOVERY must be set to perform ONLINE Backups and one ONLINE backup must have been taken. See xCAT DB2 documentation. The section - Backup/Restore the database with DB2 Commands."); + return 1; + } else { # check to see if LOGRETAIN is ON + if (!grep(/ = RECOVERY/, @output)) { + xCAT::MsgUtils->message("E", "Log retain for recovery enabled (LOGRETAIN) = RECOVERY must be set to perform ONLINE Backups and one ONLINE backup must have been taken. See xCAT DB2 documentation. The section - Backup/Restore the database with DB2 Commands."); + return 1; + } + } + + # check to see if they have one backup + $cmd = " ls $::PATH"; + @output=xCAT::Utils->runcmd($cmd, -1); + if ($::RUNCMD_RC != 0) { + xCAT::MsgUtils->message("E", "One ONLINE backup must have been taken and exist in $::PATH. See xCAT DB2 documentation. The section - Backup/Restore the database with DB2 Commands."); + return 1; + } else { # check to see if LOGRETAIN is ON + if (!grep(/XCATDB/, @output)) { + xCAT::MsgUtils->message("E", "One ONLINE backup must have been taken and exist in $::PATH. See xCAT DB2 documentation. The section - Backup/Restore the database with DB2 Commands."); + return 1; + } + } + + # finally all checks ok, can take an ONLINE backup + # get password from cfgloc + + my $cmd="cat /etc/xcat/cfgloc"; + my $info=xCAT::Utils->runcmd($cmd, -1); + if ($::RUNCMD_RC != 0) { + xCAT::MsgUtils->message("E", "Cannot read /etc/xcat/cfgloc."); + return 1; + } + chomp($info); + my ($db,$inst,$pw) = split(/\|/, $info); + + my $cmd=" db2 backup db xcatdb user xcatdb using $pw ONLINE to $::PATH"; + $rc = &rundb2cmd($cmd); # must su to xcatdb + if ($rc != 0) + { + xCAT::MsgUtils->message("E", " $cmd error."); + return 1; + } + return 0; + +} +#----------------------------------------------------------------------------- + +=head3 rundb2cmd + + + Run a commmand as the xcatdb instance id + Input: command + +=cut +#----------------------------------------------------------------------------- +sub rundb2cmd +{ + my $orgcmd = shift; + my $rc = 0; + my $cmd = "\'"; + $cmd .= $orgcmd; + $cmd .= ' 2>&1'; + $cmd .= "\'"; + system("su - xcatdb -c $cmd"); + if ($? > 0) # error + { + $rc = $? >> 8; + } + return ($rc); +} +