Skip to content
Snippets Groups Projects
Commit ccf58cd7 authored by Andy Yates's avatar Andy Yates
Browse files

Modified to support views.

parent de4bc296
No related branches found
No related tags found
No related merge requests found
......@@ -10,6 +10,7 @@ use File::Spec::Functions
use Getopt::Long;
use IO::File;
use Sys::Hostname;
use Tie::File;
my $start_time = time();
......@@ -20,7 +21,7 @@ sub short_usage {
Usage:
$0 --pass=XXX \\
$indent [--noflush] [--nocheck] \\
$indent [--noopt] [--noinndob] [--views] [--force] \\
$indent [--noopt] [--noinndob] [--skip_views] [--force] \\
$indent [--only_tables=XXX,YYY | --skip_tables=XXX,YYY] \\
$indent [--help] input_file\
......@@ -36,7 +37,7 @@ sub long_usage {
Usage:
$0 --pass=XXX \\
$indent [--noflush] [--nocheck] \\
$indent [--noopt] [--noinndob] [--views] [--force] \\
$indent [--noopt] [--noinndob] [--skipviews] [--force] \\
$indent [--only_tables=XXX,YYY | --skip_tables=XXX,YYY] \\
$indent [--help] input_file\
......@@ -80,8 +81,9 @@ Command line switches:
Skip the copy of any InnoDB table encountered. Default
is to include and fail when InnoDB seen.
--views (Optional)
Include 'view' tables in any copy. Default is to skip.
--skip_views (Optional)
Exclude 'view' tables in any copy. Default is to process
them.
--force (Optional)
Ordinarily, the script refuses to overwrite an
......@@ -154,7 +156,7 @@ my $opt_flush = 1; # Flush by default.
my $opt_check = 1; # Check tables by default.
my $opt_optimize = 1; # Optimize the tables by default.
my $opt_force = 0; # Do not reuse existing staging directory by default.
my $opt_views = 0; # Skip views by default
my $opt_skip_views = 0; # Process views by default
my $opt_innodb = 1; # Don't skip InnoDB by default
if ( !GetOptions( 'pass=s' => \$opt_password,
......@@ -165,7 +167,7 @@ if ( !GetOptions( 'pass=s' => \$opt_password,
'only_tables=s' => \$opt_only_tables,
'skip_tables=s' => \$opt_skip_tables,
'innodb!' => \$opt_innodb,
'views!' => \$opt_views,
'skip_views!' => \$opt_skip_views,
'help' => \$opt_help )
|| ( !defined($opt_password) && !defined($opt_help) ) )
{
......@@ -461,6 +463,7 @@ foreach my $spec (@todo) {
}
my @tables;
my @views;
my $table_sth = $source_dbh->prepare('SHOW TABLE STATUS');
......@@ -496,9 +499,14 @@ foreach my $spec (@todo) {
$source_db, $table ) );
}
}
} elsif ( !$opt_views ) {
warn( sprintf( "SKIPPING view '%s'\n", $table ) );
next;
} else {
if ( $opt_skip_views ) {
warn( sprintf( "SKIPPING view '%s'\n", $table ) );
next;
}
else {
push(@views, $table);
}
}
push( @tables, $table );
......@@ -619,6 +627,45 @@ foreach my $spec (@todo) {
$staging_dir );
next;
}
##------------------------------------------------------------------##
## VIEW REPAIR ##
##------------------------------------------------------------------##
print( '-' x 36, ' VIEW REPAIR ', '-' x 37, "\n" );
if($opt_skip_views) {
print 'SKIPPING VIEWS...', "\n";
}
else {
print 'PROCESSING VIEWS...', "\n";
if($source_db eq $target_db) {
print("Source and target names (${source_db}) are the same; views do not need repairing\n");
}
else {
my $ok = 1;
foreach my $current_view (@views) {
print "Processing $current_view\n";
my $view_frm_loc = catfile($staging_dir, "${current_view}.frm");
if(tie my @view_frm, 'Tie::File', $view_frm_loc) {
for (@view_frm) {
s/`$source_db`/`$target_db`/g;
}
untie @view_frm;
}
else {
warn(sprintf(q{Cannot tie file '%s' for VIEW repair. Error}, $view_frm_loc));
$ok = 0;
next;
}
}
if(!$ok) {
$spec->{status} =
sprintf(q{FAILED: view cleanup failed (cleanup of view frm files in '%s' may be needed},
$staging_dir);
}
}
}
##------------------------------------------------------------------##
## CHECK ##
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment