Commit 956e5086 authored by Max Kanat-Alexander's avatar Max Kanat-Alexander

Bug 605663: For MySQL, use information_schema instead of SHOW TABLE STATUS

to get table information during checksetup, because it's much faster. This also bumps our MySQL requirement to 5.0.15. r=mkanat, a=mkanat (module owner)
parent 509189f0
...@@ -479,14 +479,16 @@ use constant INSTALLATION_MODE_NON_INTERACTIVE => 1; ...@@ -479,14 +479,16 @@ use constant INSTALLATION_MODE_NON_INTERACTIVE => 1;
# Data about what we require for different databases. # Data about what we require for different databases.
use constant DB_MODULE => { use constant DB_MODULE => {
'mysql' => {db => 'Bugzilla::DB::Mysql', db_version => '4.1.2', # MySQL 5.0.15 was the first production 5.0.x release.
'mysql' => {db => 'Bugzilla::DB::Mysql', db_version => '5.0.15',
dbd => { dbd => {
package => 'DBD-mysql', package => 'DBD-mysql',
module => 'DBD::mysql', module => 'DBD::mysql',
# Disallow development versions # Disallow development versions
blacklist => ['_'], blacklist => ['_'],
# For UTF-8 support # For UTF-8 support. 4.001 makes sure that blobs aren't
version => '4.00', # marked as UTF-8.
version => '4.001',
}, },
name => 'MySQL'}, name => 'MySQL'},
'pg' => {db => 'Bugzilla::DB::Pg', db_version => '8.03.0000', 'pg' => {db => 'Bugzilla::DB::Pg', db_version => '8.03.0000',
......
...@@ -320,27 +320,6 @@ sub bz_setup_database { ...@@ -320,27 +320,6 @@ sub bz_setup_database {
} }
my %table_status = @{ $self->selectcol_arrayref("SHOW TABLE STATUS",
{Columns=>[1,2]}) };
my @isam_tables;
foreach my $name (keys %table_status) {
push(@isam_tables, $name) if (defined($table_status{$name}) && $table_status{$name} eq "ISAM");
}
if(scalar(@isam_tables)) {
print "One or more of the tables in your existing MySQL database are\n"
. "of type ISAM. ISAM tables are deprecated in MySQL 3.23 and\n"
. "don't support more than 16 indexes per table, which \n"
. "Bugzilla needs.\n Converting your ISAM tables to type"
. " MyISAM:\n\n";
foreach my $table (@isam_tables) {
print "Converting table $table... ";
$self->do("ALTER TABLE $table TYPE = MYISAM");
print "done.\n";
}
print "\nISAM->MyISAM table conversion done.\n\n";
}
my ($sd_index_deleted, $longdescs_index_deleted); my ($sd_index_deleted, $longdescs_index_deleted);
my @tables = $self->bz_table_list_real(); my @tables = $self->bz_table_list_real();
# We want to convert tables to InnoDB, but it's possible that they have # We want to convert tables to InnoDB, but it's possible that they have
...@@ -370,27 +349,25 @@ sub bz_setup_database { ...@@ -370,27 +349,25 @@ sub bz_setup_database {
} }
# Upgrade tables from MyISAM to InnoDB # Upgrade tables from MyISAM to InnoDB
my @myisam_tables; my $db_name = Bugzilla->localconfig->{db_name};
foreach my $name (keys %table_status) { my $myisam_tables = $self->selectcol_arrayref(
if (defined($table_status{$name}) 'SELECT TABLE_NAME FROM information_schema.TABLES
&& $table_status{$name} =~ /^MYISAM$/i WHERE TABLE_SCHEMA = ? AND ENGINE = ?',
&& !grep($_ eq $name, Bugzilla::DB::Schema::Mysql::MYISAM_TABLES)) undef, $db_name, 'MyISAM');
{ foreach my $should_be_myisam (Bugzilla::DB::Schema::Mysql::MYISAM_TABLES) {
push(@myisam_tables, $name) ; @$myisam_tables = grep { $_ ne $should_be_myisam } @$myisam_tables;
}
} }
if (scalar @myisam_tables) {
if (scalar @$myisam_tables) {
print "Bugzilla now uses the InnoDB storage engine in MySQL for", print "Bugzilla now uses the InnoDB storage engine in MySQL for",
" most tables.\nConverting tables to InnoDB:\n"; " most tables.\nConverting tables to InnoDB:\n";
foreach my $table (@myisam_tables) { foreach my $table (@$myisam_tables) {
print "Converting table $table... "; print "Converting table $table... ";
$self->do("ALTER TABLE $table ENGINE = InnoDB"); $self->do("ALTER TABLE $table ENGINE = InnoDB");
print "done.\n"; print "done.\n";
} }
} }
$self->_after_table_status(\@tables);
# Versions of Bugzilla before the existence of Bugzilla::DB::Schema did # Versions of Bugzilla before the existence of Bugzilla::DB::Schema did
# not provide explicit names for the table indexes. This means # not provide explicit names for the table indexes. This means
# that our upgrades will not be reliable, because we look for the name # that our upgrades will not be reliable, because we look for the name
...@@ -647,8 +624,11 @@ sub bz_setup_database { ...@@ -647,8 +624,11 @@ sub bz_setup_database {
# 2005-09-24 - bugreport@peshkin.net, bug 307602 # 2005-09-24 - bugreport@peshkin.net, bug 307602
# Make sure that default 4G table limit is overridden # Make sure that default 4G table limit is overridden
my $row = $self->selectrow_hashref("SHOW TABLE STATUS LIKE 'attach_data'"); my $attach_data_create = $self->selectrow_array(
if ($$row{'Create_options'} !~ /MAX_ROWS/i) { 'SELECT CREATE_OPTIONS FROM information_schema.TABLES
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?',
undef, $db_name, 'attach_data');
if ($attach_data_create !~ /MAX_ROWS/i) {
print "Converting attach_data maximum size to 100G...\n"; print "Converting attach_data maximum size to 100G...\n";
$self->do("ALTER TABLE attach_data $self->do("ALTER TABLE attach_data
AVG_ROW_LENGTH=1000000, AVG_ROW_LENGTH=1000000,
...@@ -660,12 +640,15 @@ sub bz_setup_database { ...@@ -660,12 +640,15 @@ sub bz_setup_database {
# partial-conversion situations can happen, and this handles anything # partial-conversion situations can happen, and this handles anything
# that could come up (including having the DB charset be utf8 but not # that could come up (including having the DB charset be utf8 but not
# the table charsets. # the table charsets.
my $utf_table_status = #
$self->selectall_arrayref("SHOW TABLE STATUS", {Slice=>{}}); # TABLE_COLLATION IS NOT NULL prevents us from trying to convert views.
$self->_after_table_status([map($_->{Name}, @$utf_table_status)]); my $non_utf8_tables = $self->selectrow_array(
my @non_utf8_tables = grep(defined($_->{Collation}) && $_->{Collation} !~ /^utf8/, @$utf_table_status); "SELECT 1 FROM information_schema.TABLES
WHERE TABLE_SCHEMA = ? AND TABLE_COLLATION IS NOT NULL
AND TABLE_COLLATION NOT LIKE 'utf8%'
LIMIT 1", undef, $db_name);
if (Bugzilla->params->{'utf8'} && scalar @non_utf8_tables) { if (Bugzilla->params->{'utf8'} && $non_utf8_tables) {
print "\n", install_string('mysql_utf8_conversion'); print "\n", install_string('mysql_utf8_conversion');
if (!Bugzilla->installation_answers->{NO_PAUSE}) { if (!Bugzilla->installation_answers->{NO_PAUSE}) {
...@@ -839,19 +822,6 @@ sub _fix_defaults { ...@@ -839,19 +822,6 @@ sub _fix_defaults {
} }
} }
# There is a bug in MySQL 4.1.0 - 4.1.15 that makes certain SELECT
# statements fail after a SHOW TABLE STATUS:
# http://bugs.mysql.com/bug.php?id=13535
# This is a workaround, a dummy SELECT to reset the LAST_INSERT_ID.
sub _after_table_status {
my ($self, $tables) = @_;
if (grep($_ eq 'bugs', @$tables)
&& $self->bz_column_info_real("bugs", "bug_id"))
{
$self->do('SELECT 1 FROM bugs WHERE bug_id IS NULL');
}
}
sub _alter_db_charset_to_utf8 { sub _alter_db_charset_to_utf8 {
my $self = shift; my $self = shift;
my $db_name = Bugzilla->localconfig->{db_name}; my $db_name = Bugzilla->localconfig->{db_name};
......
Markdown is supported
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