#!/usr/bin/env php 1) { db_switch_remote_to_main(); print_or_log($installer, "NOTE: Repairing Tables for Main Database\n"); } else { print_or_log($installer, "NOTE: Repairing Tables for Local Database\n"); } if (cacti_sizeof($skip_tables)) { foreach($skip_tables as $table) { if (!db_table_exists($table)) { print_or_log($installer, "ERROR: Skip Table $table does not Exist. Can not continue.\n\n"); display_help(); exit; } } } $convert = $innodb ? 'InnoDB' : ''; if ($utf8) { $convert .= (strlen($convert) ? ' and ' : '') . ' utf8'; } print_or_log($installer, "Converting Database Tables to $convert with less than '$size' Records\n"); if ($innodb) { $engines = db_fetch_assoc('SHOW ENGINES'); foreach($engines as $engine) { if (strtolower($engine['Engine']) == 'innodb' && strtolower($engine['Support'] == 'off')) { print_or_log($installer, "InnoDB Engine is not enabled\n"); exit; } } $file_per_table = db_fetch_row("show global variables like 'innodb_file_per_table'"); if (strtolower($file_per_table['Value']) != 'on') { print_or_log($installer, 'innodb_file_per_table not enabled'); exit; } } if (strlen($table_name)) { $tables = db_fetch_assoc('SHOW TABLE STATUS LIKE \''.$table_name .'\''); } else { $tables = db_fetch_assoc('SHOW TABLE STATUS'); } if (cacti_sizeof($tables)) { foreach($tables AS $table) { $canConvert = $rebuild; $canInnoDB = false; if (!$canConvert && $innodb) { $canConvert = $table['Engine'] == 'MyISAM'; $canInnoDB = true; } if (in_array($table['Name'], $skip_tables)) { $canInnoDB = false; } if (!$canConvert && $utf8) { $canConvert = $table['Collation'] != 'utf8mb4_unicode_ci'; } if (!$canConvert && $latin) { $canConvert = $table['Collation'] != 'latin1'; } if ($dynamic && $table['Row_format'] == 'Compact') { $canConvert = true; } if ($canConvert) { if ($table['Rows'] < $size || $force) { print_or_log($installer, "Converting Table -> '" . $table['Name'] . "'"); $sql = ''; if ($utf8) { $sql .= ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci'; } elseif ($latin) { $sql .= ' CONVERT TO CHARACTER SET latin1'; } if ($innodb && $canInnoDB) { $sql .= (strlen($sql) ? ',' : '') . ' ENGINE=Innodb'; } $status = db_execute('ALTER TABLE `' . $table['Name'] . '`' . ($dynamic ? ' ROW_FORMAT=Dynamic, ':'') . $sql); if ($status === false) { print_or_log($installer, ' Failed' . PHP_EOL); record_log($installer, "FATAL: Conversion of Table '" . $table['Name'] . "' Failed. Command: 'ALTER TABLE `" . $table['Name'] . "` $sql'"); } else { print_or_log($installer, ' Successful' . PHP_EOL); } } else { print_or_log($installer, "Skipping Table -> '" . $table['Name'] . " too many rows '" . $table['Rows'] . "'" . PHP_EOL); } } else { print_or_log($installer, "Skipping Table -> '" . $table['Name'] . "'" . PHP_EOL); } } } function print_or_log($installer, $text) { if ($installer) { log_install_and_file(POLLER_VERBOSITY_MEDIUM, rtrim($text), 'CONVERT', true); } else { print $text; } } function record_log($installer, $text) { if ($installer) { log_install_and_file(POLLER_VERBOSITY_MEDIUM, rtrim($text), 'CONVERT', true); } else { cacti_log($text, false, 'CONVERT'); } } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Database Conversion Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print "\nusage: convert_tables.php [--debug] [--innodb] [--utf8] [--latin1] [--table=N] [--size=N] [--rebuild] [--dynamic]\n\n"; print "A utility to convert a Cacti Database from MyISAM to the InnoDB table format.\n"; print "MEMORY tables are not converted to InnoDB in this process.\n\n"; print "Required (one or more):\n"; print "-i | --innodb - Convert any MyISAM tables to InnoDB\n"; print "-u | --utf8 - Convert any non-UTF8 tables to utf8mb4_unicode_ci\n"; print "-l | --latin1 - Convert any non-latin1 tables to latin1\n\n"; print "Optional:\n"; print "-t | --table=S - The name of a single table to change\n"; print "-n | --skip-innodb=\"table1 table2 ...\" - Skip converting tables to InnoDB\n"; print "-s | --size=N - The largest table size in records to convert. Default is 1,000,000 rows.\n"; print "-r | --rebuild - Will compress/optimize existing InnoDB tables if found\n"; print " --dynamic - Convert a table to Dynamic row format if available\n"; print " --local - Perform the action on the Remote Data Collector if run from there\n"; print "-f | --force - Proceed with conversion regardless of table size\n\n"; print "-d | --debug - Display verbose output during execution\n\n"; }