Loading scripts/mysqlhotcopy.sh +24 −75 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ WARNING: THIS PROGRAM IS STILL IN BETA. Comments/patches welcome. # Documentation continued at end of file my $VERSION = "1.22"; my $VERSION = "1.23"; my $opt_tmpdir = $ENV{TMPDIR} || "/tmp"; Loading Loading @@ -132,7 +132,6 @@ GetOptions( \%opt, # 'target' - destination directory of the copy # 'tables' - array-ref to list of tables in the db # 'files' - array-ref to list of files to be copied # (RAID files look like 'nn/name.MYD') # 'index' - array-ref to list of indexes to be copied # Loading Loading @@ -263,7 +262,6 @@ my $hc_locks = ""; my $hc_tables = ""; my $num_tables = 0; my $num_files = 0; my $raid_dir_regex = '[A-Za-z0-9]{2}'; foreach my $rdb ( @db_desc ) { my $db = $rdb->{src}; Loading Loading @@ -292,20 +290,12 @@ foreach my $rdb ( @db_desc ) { or die "Cannot open dir '$db_dir': $!"; my %db_files; my @raid_dir = (); while ( defined( my $name = readdir DBDIR ) ) { if ( $name =~ /^$raid_dir_regex$/ && -d "$db_dir/$name" ) { push @raid_dir, $name; } else { $db_files{$name} = $1 if ( $name =~ /(.+)\.\w+$/ ); } } closedir( DBDIR ); scan_raid_dir( \%db_files, $db_dir, @raid_dir ); unless( keys %db_files ) { warn "'$db' is an empty database\n"; } Loading Loading @@ -336,8 +326,6 @@ foreach my $rdb ( @db_desc ) { my @hc_tables = map { quote_names("$db.$_") } @dbh_tables; $rdb->{tables} = [ @hc_tables ]; $rdb->{raid_dirs} = [ get_raid_dirs( $rdb->{files} ) ]; $hc_locks .= ", " if ( length $hc_locks && @hc_tables ); $hc_locks .= join ", ", map { "$_ READ" } @hc_tables; $hc_tables .= ", " if ( length $hc_tables && @hc_tables ); Loading Loading @@ -411,9 +399,7 @@ if ($opt{method} =~ /^cp\b/) retire_directory( @existing ) if @existing && !$opt{addtodest}; foreach my $rdb ( @db_desc ) { foreach my $td ( '', @{$rdb->{raid_dirs}} ) { my $tgt_dirpath = "$rdb->{target}/$td"; my $tgt_dirpath = "$rdb->{target}"; # Remove trailing slashes (needed for Mac OS X) substr($tgt_dirpath, 1) =~ s|/+$||; if ( $opt{dryrun} ) { Loading @@ -433,7 +419,6 @@ foreach my $rdb ( @db_desc ) { } } } } ############################## # --- PERFORM THE HOT-COPY --- Loading Loading @@ -489,7 +474,7 @@ foreach my $rdb ( @db_desc ) my @files = map { "$datadir/$rdb->{src}/$_" } @{$rdb->{files}}; next unless @files; eval { copy_files($opt{method}, \@files, $rdb->{target}, $rdb->{raid_dirs} ); }; eval { copy_files($opt{method}, \@files, $rdb->{target}); }; push @failed, "$rdb->{src} -> $rdb->{target} failed: $@" if ( $@ ); Loading Loading @@ -582,7 +567,7 @@ exit 0; # --- sub copy_files { my ($method, $files, $target, $raid_dirs) = @_; my ($method, $files, $target) = @_; my @cmd; print "Copying ".@$files." files...\n" unless $opt{quiet}; Loading @@ -603,15 +588,8 @@ sub copy_files { # add recursive option for scp $cp.= " -r" if $^O =~ /m^(solaris|linux|freebsd|darwin)$/ && $method =~ /^scp\b/; my @non_raid = map { "'$_'" } grep { ! m:/$raid_dir_regex/[^/]+$: } @$files; # add files to copy and the destination directory safe_system( $cp, @non_raid, "'$target'" ) if (@non_raid); foreach my $rd ( @$raid_dirs ) { my @raid = map { "'$_'" } grep { m:$rd/: } @$files; safe_system( $cp, @raid, "'$target'/$rd" ) if ( @raid ); } # perform the actual copy safe_system( $cp, (map { "'$_'" } @$files), "'$target'" ); } else { Loading Loading @@ -789,35 +767,6 @@ sub get_row_hash { return $sth->fetchrow_hashref(); } sub scan_raid_dir { my ( $r_db_files, $data_dir, @raid_dir ) = @_; local(*RAID_DIR); foreach my $rd ( @raid_dir ) { opendir(RAID_DIR, "$data_dir/$rd" ) or die "Cannot open dir '$data_dir/$rd': $!"; while ( defined( my $name = readdir RAID_DIR ) ) { $r_db_files->{"$rd/$name"} = $1 if ( $name =~ /(.+)\.\w+$/ ); } closedir( RAID_DIR ); } } sub get_raid_dirs { my ( $r_files ) = @_; my %dirs = (); foreach my $f ( @$r_files ) { if ( $f =~ m:^($raid_dir_regex)/: ) { $dirs{$1} = 1; } } return sort keys %dirs; } sub get_list_of_tables { my ( $db ) = @_; Loading Loading
scripts/mysqlhotcopy.sh +24 −75 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ WARNING: THIS PROGRAM IS STILL IN BETA. Comments/patches welcome. # Documentation continued at end of file my $VERSION = "1.22"; my $VERSION = "1.23"; my $opt_tmpdir = $ENV{TMPDIR} || "/tmp"; Loading Loading @@ -132,7 +132,6 @@ GetOptions( \%opt, # 'target' - destination directory of the copy # 'tables' - array-ref to list of tables in the db # 'files' - array-ref to list of files to be copied # (RAID files look like 'nn/name.MYD') # 'index' - array-ref to list of indexes to be copied # Loading Loading @@ -263,7 +262,6 @@ my $hc_locks = ""; my $hc_tables = ""; my $num_tables = 0; my $num_files = 0; my $raid_dir_regex = '[A-Za-z0-9]{2}'; foreach my $rdb ( @db_desc ) { my $db = $rdb->{src}; Loading Loading @@ -292,20 +290,12 @@ foreach my $rdb ( @db_desc ) { or die "Cannot open dir '$db_dir': $!"; my %db_files; my @raid_dir = (); while ( defined( my $name = readdir DBDIR ) ) { if ( $name =~ /^$raid_dir_regex$/ && -d "$db_dir/$name" ) { push @raid_dir, $name; } else { $db_files{$name} = $1 if ( $name =~ /(.+)\.\w+$/ ); } } closedir( DBDIR ); scan_raid_dir( \%db_files, $db_dir, @raid_dir ); unless( keys %db_files ) { warn "'$db' is an empty database\n"; } Loading Loading @@ -336,8 +326,6 @@ foreach my $rdb ( @db_desc ) { my @hc_tables = map { quote_names("$db.$_") } @dbh_tables; $rdb->{tables} = [ @hc_tables ]; $rdb->{raid_dirs} = [ get_raid_dirs( $rdb->{files} ) ]; $hc_locks .= ", " if ( length $hc_locks && @hc_tables ); $hc_locks .= join ", ", map { "$_ READ" } @hc_tables; $hc_tables .= ", " if ( length $hc_tables && @hc_tables ); Loading Loading @@ -411,9 +399,7 @@ if ($opt{method} =~ /^cp\b/) retire_directory( @existing ) if @existing && !$opt{addtodest}; foreach my $rdb ( @db_desc ) { foreach my $td ( '', @{$rdb->{raid_dirs}} ) { my $tgt_dirpath = "$rdb->{target}/$td"; my $tgt_dirpath = "$rdb->{target}"; # Remove trailing slashes (needed for Mac OS X) substr($tgt_dirpath, 1) =~ s|/+$||; if ( $opt{dryrun} ) { Loading @@ -433,7 +419,6 @@ foreach my $rdb ( @db_desc ) { } } } } ############################## # --- PERFORM THE HOT-COPY --- Loading Loading @@ -489,7 +474,7 @@ foreach my $rdb ( @db_desc ) my @files = map { "$datadir/$rdb->{src}/$_" } @{$rdb->{files}}; next unless @files; eval { copy_files($opt{method}, \@files, $rdb->{target}, $rdb->{raid_dirs} ); }; eval { copy_files($opt{method}, \@files, $rdb->{target}); }; push @failed, "$rdb->{src} -> $rdb->{target} failed: $@" if ( $@ ); Loading Loading @@ -582,7 +567,7 @@ exit 0; # --- sub copy_files { my ($method, $files, $target, $raid_dirs) = @_; my ($method, $files, $target) = @_; my @cmd; print "Copying ".@$files." files...\n" unless $opt{quiet}; Loading @@ -603,15 +588,8 @@ sub copy_files { # add recursive option for scp $cp.= " -r" if $^O =~ /m^(solaris|linux|freebsd|darwin)$/ && $method =~ /^scp\b/; my @non_raid = map { "'$_'" } grep { ! m:/$raid_dir_regex/[^/]+$: } @$files; # add files to copy and the destination directory safe_system( $cp, @non_raid, "'$target'" ) if (@non_raid); foreach my $rd ( @$raid_dirs ) { my @raid = map { "'$_'" } grep { m:$rd/: } @$files; safe_system( $cp, @raid, "'$target'/$rd" ) if ( @raid ); } # perform the actual copy safe_system( $cp, (map { "'$_'" } @$files), "'$target'" ); } else { Loading Loading @@ -789,35 +767,6 @@ sub get_row_hash { return $sth->fetchrow_hashref(); } sub scan_raid_dir { my ( $r_db_files, $data_dir, @raid_dir ) = @_; local(*RAID_DIR); foreach my $rd ( @raid_dir ) { opendir(RAID_DIR, "$data_dir/$rd" ) or die "Cannot open dir '$data_dir/$rd': $!"; while ( defined( my $name = readdir RAID_DIR ) ) { $r_db_files->{"$rd/$name"} = $1 if ( $name =~ /(.+)\.\w+$/ ); } closedir( RAID_DIR ); } } sub get_raid_dirs { my ( $r_files ) = @_; my %dirs = (); foreach my $f ( @$r_files ) { if ( $f =~ m:^($raid_dir_regex)/: ) { $dirs{$1} = 1; } } return sort keys %dirs; } sub get_list_of_tables { my ( $db ) = @_; Loading