--- mysqlhotcopy.4.1.13 2006-01-02 21:42:42.688358407 -0800 +++ /usr/bin/mysqlhotcopy 2005-12-01 09:33:56.000000000 -0800 @@ -61,7 +61,7 @@ --addtodest don\'t rename target dir if it exists, just add files to it --keepold don\'t delete previous (now renamed) target when done --noindices don\'t include full index files in copy - --method=# method for copy (only "cp" currently supported) + --method=# method for copy ("cp" and "tar" are currently supported) -q, --quiet be silent except for errors --debug enable debug @@ -366,6 +366,12 @@ $rdb->{target} = "$tgt_dirname/$rdb->{src}"; } } + elsif ($opt{method} =~ /^tar\b/) + { + foreach my $rdb ( @db_desc ) { + $rdb->{target} = "$tgt_dirname"; + } + } else { die "Last argument ($tgt_dirname) is not a directory\n" @@ -421,6 +427,11 @@ ## assume it's there? ## ... } + elsif ($opt{method} =~ /^tar\b/) { + my $tar_dirpath = "$rdb->{target}"; + mkdir($tar_dirpath, 0750) or die "Can't create '$tar_dirpath': $!\n" + unless -d $tar_dirpath; + } else { mkdir($tgt_dirpath, 0750) or die "Can't create '$tgt_dirpath': $!\n" unless -d $tgt_dirpath; @@ -487,7 +498,11 @@ my @files = map { "$datadir/$rdb->{src}/$_" } @{$rdb->{files}}; next unless @files; - eval { copy_files($opt{method}, \@files, $rdb->{target}, $rdb->{raid_dirs} ); }; + if ( $opt{method} =~ /^tar\b/ ) { + eval { copy_files($opt{method}, \@files, $rdb->{target}, $rdb->{raid_dirs}, $rdb->{src} ); }; + } else { + eval { copy_files($opt{method}, \@files, $rdb->{target}, $rdb->{raid_dirs} ); }; + } push @failed, "$rdb->{src} -> $rdb->{target} failed: $@" if ( $@ ); @@ -580,7 +595,7 @@ # --- sub copy_files { - my ($method, $files, $target, $raid_dirs) = @_; + my ($method, $files, $target, $raid_dirs, $tar_src) = @_; my @cmd; print "Copying ".@$files." files...\n" unless $opt{quiet}; @@ -611,6 +626,24 @@ safe_system( $cp, @raid, "'$target'/$rd" ) if ( @raid ); } } + elsif ($method =~ /^tar\b/) # tar with optional flags + { + my $tar = $method; + + my @non_raid = map { "'$_'" } grep { ! m:/\d{2}/[^/]+$: } @$files; + + # add files to copy and the destination + if (@non_raid) { + my $cmd = $tar . " $target" . "/$tar_src.tgz " . "@non_raid"; + `$cmd`; + } + + foreach my $rd ( @$raid_dirs ) { + my @raid = map { "'$_'" } grep { m:$rd/: } @$files; + print "Tar method does not currently support RAID directories. RAID files:\n@raid" if ( @raid ); + } + } + else { die "Can't use unsupported method '$method'\n"; @@ -1136,3 +1169,5 @@ Martin Waite - Fix to handle database name that contains space. Paul DuBois - Remove end '/' from directory names + +Patrick Feliciano - Added support for "tar" method.