From aaa558f7ea01bff46a686426c942fa4a2d2cdd69 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 22 Apr 2017 21:36:01 +0000 Subject: [PATCH 1/2] New command in dbstructure.php to convert all tables from MyISAM to InnoDB --- include/dbstructure.php | 43 ++++++++++++++++++++++++++++++++--------- mod/admin.php | 2 +- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/include/dbstructure.php b/include/dbstructure.php index 0d5c10f98..e5d29fa08 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -7,13 +7,38 @@ require_once("include/text.php"); define('NEW_UPDATE_ROUTINE_VERSION', 1170); +/* + * Converts all tables from MyISAM to InnoDB + */ +function convert_to_innodb() { + global $db; + + $r = q("SELECT `TABLE_NAME` FROM `information_schema`.`tables` WHERE `engine` = 'MyISAM' AND `table_schema` = '%s'", + dbesc($db->database_name())); + + if (!dbm::is_result($r)) { + echo t('There are no tables on MyISAM.')."\n"; + return; + } + + foreach ($r AS $table) { + $sql = sprintf("ALTER TABLE `%s` engine=InnoDB;", dbesc($table['TABLE_NAME'])); + echo $sql."\n"; + + $result = @$db->q($sql); + if (!dbm::is_result($result)) { + print_update_error($db, $sql); + } + } +} + /* * send the email and do what is needed to do on update fails * * @param update_id (int) number of failed update * @param error_message (str) error message */ -function update_fail($update_id, $error_message){ +function update_fail($update_id, $error_message) { //send the administrators an e-mail $admin_mail_list = "'".implode("','", array_map(dbesc, explode(",", str_replace(" ", "", $a->config['admin_email']))))."'"; $adminlist = q("SELECT uid, language, email FROM user WHERE email IN (%s)", @@ -95,10 +120,6 @@ function table_structure($table) { if (dbm::is_result($indexes)) foreach ($indexes AS $index) { - if ($index["Index_type"] == "FULLTEXT") { - continue; - } - if ($index['Key_name'] != 'PRIMARY' && $index['Non_unique'] == '0' && !isset($indexdata[$index["Key_name"]])) { $indexdata[$index["Key_name"]] = array('UNIQUE'); } @@ -460,7 +481,7 @@ function db_field_command($parameters, $create = true) { if ($parameters["not null"]) $fieldstruct .= " NOT NULL"; - if (isset($parameters["default"])){ + if (isset($parameters["default"])) { if (strpos(strtolower($parameters["type"]),"int")!==false) { $fieldstruct .= " DEFAULT ".$parameters["default"]; } else { @@ -487,7 +508,7 @@ function db_create_table($name, $fields, $verbose, $action, $indexes=null) { $primary_keys = array(); foreach ($fields AS $fieldname => $field) { $sql_rows[] = "`".dbesc($fieldname)."` ".db_field_command($field); - if (x($field,'primary') and $field['primary']!=''){ + if (x($field,'primary') and $field['primary']!='') { $primary_keys[] = $fieldname; } } @@ -1691,7 +1712,7 @@ function db_definition() { function dbstructure_run(&$argv, &$argc) { global $a, $db; - if (is_null($a)){ + if (is_null($a)) { $a = new App; } @@ -1730,6 +1751,9 @@ function dbstructure_run(&$argv, &$argc) { case "dumpsql": print_structure(db_definition()); return; + case "innodb": + convert_to_innodb(); + return; } } @@ -1741,11 +1765,12 @@ function dbstructure_run(&$argv, &$argc) { echo "dryrun show database update schema queries without running them\n"; echo "update update database schema\n"; echo "dumpsql dump database schema\n"; + echo "innodb convert all tables from MyISAM to InnoDB\n"; return; } -if (array_search(__file__,get_included_files())===0){ +if (array_search(__file__,get_included_files())===0) { dbstructure_run($_SERVER["argv"],$_SERVER["argc"]); killme(); } diff --git a/mod/admin.php b/mod/admin.php index c57e7f354..c86c0db91 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -447,7 +447,7 @@ function admin_page_summary(App $a) { $warningtext = array(); if (dbm::is_result($r)) { $showwarning = true; - $warningtext[] = sprintf(t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See here for a guide that may be helpful converting the table engines. You may also use the convert_innodb.sql in the /util directory of your Friendica installation.
'), 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); + $warningtext[] = sprintf(t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See here for a guide that may be helpful converting the table engines. You may also use the command php include/dbstructure.php innodb of your Friendica installation for an automatic conversion.
'), 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); } // MySQL >= 5.7.4 doesn't support the IGNORE keyword in ALTER TABLE statements if ((version_compare($db->server_info(), '5.7.4') >= 0) AND From 2628ff91f4574870c84aeb6b6e356765e879fc4e Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 22 Apr 2017 21:55:16 +0000 Subject: [PATCH 2/2] Call it "toinnodb" --- include/dbstructure.php | 4 ++-- mod/admin.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/dbstructure.php b/include/dbstructure.php index e5d29fa08..fe44cc764 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -1751,7 +1751,7 @@ function dbstructure_run(&$argv, &$argc) { case "dumpsql": print_structure(db_definition()); return; - case "innodb": + case "toinnodb": convert_to_innodb(); return; } @@ -1765,7 +1765,7 @@ function dbstructure_run(&$argv, &$argc) { echo "dryrun show database update schema queries without running them\n"; echo "update update database schema\n"; echo "dumpsql dump database schema\n"; - echo "innodb convert all tables from MyISAM to InnoDB\n"; + echo "toinnodb convert all tables from MyISAM to InnoDB\n"; return; } diff --git a/mod/admin.php b/mod/admin.php index c86c0db91..6be08f45a 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -447,7 +447,7 @@ function admin_page_summary(App $a) { $warningtext = array(); if (dbm::is_result($r)) { $showwarning = true; - $warningtext[] = sprintf(t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See here for a guide that may be helpful converting the table engines. You may also use the command php include/dbstructure.php innodb of your Friendica installation for an automatic conversion.
'), 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); + $warningtext[] = sprintf(t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See here for a guide that may be helpful converting the table engines. You may also use the command php include/dbstructure.php toinnodb of your Friendica installation for an automatic conversion.
'), 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); } // MySQL >= 5.7.4 doesn't support the IGNORE keyword in ALTER TABLE statements if ((version_compare($db->server_info(), '5.7.4') >= 0) AND