1#!@PERL_PATH@ 2# Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. 3# 4# This program is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; version 2 of the License. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program; if not, write to the Free Software 15# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA 16 17# Convert given tables in a database to MYISAM 18 19use DBI; 20use Getopt::Long; 21 22$opt_help=$opt_version=$opt_verbose=$opt_force=0; 23$opt_user=$opt_database=$opt_password=undef; 24$opt_host="localhost"; 25$opt_socket=""; 26$opt_engine="MYISAM"; 27$opt_port=0; 28$exit_status=0; 29 30GetOptions( 31 "e|engine|type=s" => \$opt_engine, 32 "f|force" => \$opt_force, 33 "help|?" => \$opt_help, 34 "h|host=s" => \$opt_host, 35 "p|password=s" => \$opt_password, 36 "u|user=s" => \$opt_user, 37 "v|verbose" => \$opt_verbose, 38 "V|version" => \$opt_version, 39 "S|socket=s" => \$opt_socket, 40 "P|port=i" => \$opt_port 41) || usage(0); 42 43usage($opt_version) if ($#ARGV < 0 || $opt_help || $opt_version); 44 45$opt_database=shift(@ARGV); 46 47if (grep { /^$opt_engine$/i } qw(HEAP MEMORY BLACKHOLE)) 48{ 49 print "Converting to '$opt_engine' would delete your data; aborting\n"; 50 exit(1); 51} 52 53$connect_opt=""; 54if ($opt_port) 55{ 56 $connect_opt.= ";port=$opt_port"; 57} 58if (length($opt_socket)) 59{ 60 $connect_opt.=";mariadb_socket=$opt_socket"; 61} 62 63$dbh = DBI->connect("DBI:MariaDB:$opt_database:${opt_host}$connect_opt", 64 $opt_user, 65 $opt_password, 66 { PrintError => 0}) 67 || die "Can't connect to database $opt_database: $DBI::errstr\n"; 68 69my @tables; 70 71push(@ARGV, "%") if(!@ARGV); 72 73foreach $pattern (@ARGV) 74{ 75 my ($sth,$row); 76 $sth=$dbh->prepare("SHOW TABLES LIKE ?"); 77 $rv= $sth->execute($pattern); 78 if(!int($rv)) 79 { 80 warn "Can't get tables matching '$pattern' from $opt_database; $DBI::errstr\n"; 81 exit(1) unless $opt_force; 82 } 83 while (($row = $sth->fetchrow_arrayref)) 84 { 85 push(@tables, $row->[0]); 86 } 87 $sth->finish; 88} 89 90print "Converting tables:\n" if ($opt_verbose); 91foreach $table (@tables) 92{ 93 my ($sth,$row); 94 95 # Check if table is already converted 96 $sth=$dbh->prepare("show table status like '$table'"); 97 if ($sth->execute && ($row = $sth->fetchrow_arrayref)) 98 { 99 if (uc($row->[1]) eq uc($opt_engine)) 100 { 101 print "$table already uses the '$opt_engine' engine; Ignored\n"; 102 next; 103 } 104 } 105 print "converting $table\n" if ($opt_verbose); 106 $table=~ s/`/``/g; 107 if (!$dbh->do("ALTER TABLE `$table` ENGINE=$opt_engine")) 108 { 109 print STDERR "Can't convert $table: Error $DBI::errstr\n"; 110 exit(1) if (!$opt_force); 111 $exit_status=1; 112 } 113} 114 115$dbh->disconnect; 116exit($exit_status); 117 118 119sub usage 120{ 121 my($version)=shift; 122 print "$0 version 1.1\n"; 123 exit(0) if ($version); 124 125 print <<EOF; 126 127Conversion of a MariaDB tables to other storage engines 128 129 Usage: $0 database [table[ table ...]] 130 If no tables has been specifed, all tables in the database will be converted. 131 You can also use wildcards, ie "my%" 132 133 The following options are available: 134 135-f, --force 136 Continue even if there is some error. 137 138-?, --help 139 Shows this help 140 141-e, --engine=ENGINE 142 Converts tables to the given storage engine (Default: $opt_engine) 143 144-h, --host=HOST 145 Host name where the database server is located. (Default: $opt_host) 146 147-p, --password=PASSWORD 148 Password for the current user. 149 150-P, --port=PORT 151 TCP/IP port to connect to if host is not "localhost". 152 153-S, --socket=SOCKET 154 Socket to connect with. 155 156-u, --user=USER 157 User name to log into the SQL server. 158 159-v, --verbose 160 This is a test specific option that is only used when debugging a test. 161 Print more information about what is going on. 162 163-V, --version 164 Shows the version of this program. 165EOF 166 exit(1); 167} 168