我知道我可以单独发出一个alter表,将表存储从MyISAM更改为InnoDB。
我想知道是否有一种方法可以快速将它们全部更改为InnoDB?
我知道我可以单独发出一个alter表,将表存储从MyISAM更改为InnoDB。
我想知道是否有一种方法可以快速将它们全部更改为InnoDB?
当前回答
试试这个shell脚本
DBENGINE='InnoDB' ;
DBUSER='your_db_user' ;
DBNAME='your_db_name' ;
DBHOST='your_db_host'
DBPASS='your_db_pass' ;
mysqldump --add-drop-table -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME > mtest.sql; mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "SHOW TABLES;" | while read TABLE ; do mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "ALTER TABLE $TABLE ENGINE=$DBENGINE;" ; done
其他回答
<?php
// connect your database here first
//
// Actual code starts here
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_database_name'
AND ENGINE = 'MyISAM'";
$rs = mysql_query($sql);
while($row = mysql_fetch_array($rs))
{
$tbl = $row[0];
$sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
mysql_query($sql);
}
?>
这很简单。只有两步。
复制,粘贴并运行: SET @DATABASE_NAME = ' name_your_db '; SELECT CONCAT('ALTER TABLE ", table_name, ' ENGINE=InnoDB;') AS sql_statements FROM information_schema。TABLE AS tb WHERE ' ENGINE ' = 'MyISAM' AND ' TABLE_TYPE ' = 'BASE TABLE'
(复制粘贴所有结果在SQL选项卡)
将所有结果复制到SQL选项卡并在下面一行中粘贴。 开始事务; 提交;
例如:
START TRANSACTION;
ALTER TABLE `admin_files` ENGINE=InnoDB;
COMMIT;
对这个util脚本的一些修复
SET @DATABASE_NAME = 'Integradb';
SELECT CONCAT('ALTER TABLE ', table_schema, '.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables AS tb
WHERE table_schema = @DATABASE_NAME
AND `ENGINE` = 'MyISAM'
AND `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;
只是测试了另一种(简单的?)方法,对我来说很有效。
只需导出您的DB为.sql文件,编辑它与gedit或记事本;
将ENGINE=MyISAM替换为ENGINE=INNODB并保存已编辑的文件
编号或替换完成应该是你的表的编号
导入到MySQL (phpMyAdmin或命令行)
瞧!
在我的例子中,我从一个默认MyISAM的MySQL实例迁移到一个默认InnoDB的MariaDB实例。
根据MariaDB迁移文件。
在旧服务器上运行:
mysqldump -u root -p --skip-create-options --all-databases > migration.sql
——skip-create-options确保数据库服务器在加载数据时使用默认存储引擎,而不是MyISAM。
mysql -u root -p < migration.sql
这抛出了一个关于创建mysql.db的错误,但现在一切都很好了:)