Pen*_*m10 245 mysql sql innodb
我知道我可以单独发出一个alter table来将表存储从MyISAM更改为InnoDB.
我想知道是否有办法快速将所有这些更改为InnoDB?
小智 527
运行此SQL语句(在MySQL客户端,phpMyAdmin或其中),以检索数据库中的所有MyISAM表.
name_of_your_db
用您的数据库名称替换变量的值.
SET @DATABASE_NAME = 'name_of_your_db';
SELECT CONCAT('ALTER TABLE `', 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;
Run Code Online (Sandbox Code Playgroud)
然后,复制输出并作为新的SQL查询运行.
Gaj*_*ang 162
// 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);
}
?>
Run Code Online (Sandbox Code Playgroud)
小智 54
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';
Run Code Online (Sandbox Code Playgroud)
奇迹般有效.
这将为您提供可以批量运行的alter query的所有表的列表
Vij*_*dan 23
在下面的脚本中,将<username>,<password>和<schema>替换为您的特定数据.
要显示可以复制粘贴到mysql客户端会话的语句,请键入以下内容:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
Run Code Online (Sandbox Code Playgroud)
要简单地执行更改,请使用以下命令:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
| mysql -u <username> --password=<password> -D <schema>
Run Code Online (Sandbox Code Playgroud)
信用:这是本文中概述的变体.
小智 21
一条线:
mysql -u root -p dbName -e
"show table status where Engine='MyISAM';" | awk
'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}' |
mysql -u root -p dbName
Run Code Online (Sandbox Code Playgroud)
小智 20
在phpMyAdmin中将其用作sql查询
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM';
Run Code Online (Sandbox Code Playgroud)
Hen*_*ann 17
您可以在mysql命令行工具中执行此语句:
echo "SELECT concat('ALTER TABLE `',TABLE_NAME,'` ENGINE=InnoDB;')
FROM Information_schema.TABLES
WHERE ENGINE != 'InnoDB' AND TABLE_TYPE='BASE TABLE'
AND TABLE_SCHEMA='name-of-database'" | mysql > convert.sql
Run Code Online (Sandbox Code Playgroud)
您可能需要使用以下命令指定用户名和密码:mysql -u username -p结果是一个sql脚本,您可以将其重新导入mysql:
mysql name-of-database < convert.sql
Run Code Online (Sandbox Code Playgroud)
在上面的语句和命令行中替换"name-of-database".
Sac*_*une 10
这很简单只有两步就是复制和粘贴:
步骤1.
SET @DATABASE_NAME = 'name_of_your_db';
SELECT CONCAT('ALTER TABLE `', 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;
Run Code Online (Sandbox Code Playgroud)
(将所有结果复制并粘贴到sql选项卡中)
步骤2 :(将所有结果复制到sql选项卡中)并粘贴到该行的下方
开始交易;
承诺;
例如.开始交易;
ALTER TABLE admin_files
ENGINE = InnoDB;
承诺;
它还没有被提及,所以我会为后人写它:
如果您在数据库服务器之间迁移(或者有其他原因要转储并重新加载您的dta),您只需修改输出mysqldump
:
mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;
Run Code Online (Sandbox Code Playgroud)
然后再次加载:
mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql
Run Code Online (Sandbox Code Playgroud)
(另外,在我有限的经验中,这可能比更改表'live'要快得多.它可能取决于数据和索引的类型.)
这是Django用户的一种方法:
from django.core.management.base import BaseCommand
from django.db import connections
class Command(BaseCommand):
def handle(self, database="default", *args, **options):
cursor = connections[database].cursor()
cursor.execute("SHOW TABLE STATUS");
for row in cursor.fetchall():
if row[1] != "InnoDB":
print "Converting %s" % row[0],
result = cursor.execute("ALTER TABLE %s ENGINE=INNODB" % row[0])
print result
Run Code Online (Sandbox Code Playgroud)
在文件夹管理/命令下将其添加到您的应用程序/然后您可以使用manage.py命令转换所有表:
python manage.py convert_to_innodb
Run Code Online (Sandbox Code Playgroud)
要为所有非系统模式中的所有表生成ALTER语句,请按这些模式/表排序,运行以下命令:
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'innodb', 'sys', 'tmp')
AND `ENGINE` = 'MyISAM'
AND `TABLE_TYPE` = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, table_name DESC;
Run Code Online (Sandbox Code Playgroud)
之后,通过客户端运行这些查询以执行更改.
小智 7
只是测试了另一种(简单?)方法,并为我工作。
只需将数据库导出为 .sql 文件,然后使用 gedit 或记事本进行编辑即可;
替换ENGINE=MyISAM
为ENGINE=INNODB
并保存编辑的文件
完成的数量或更换应该是您的桌子的数量
将其导入MySQL(phpMyAdmin或命令行)
瞧!
从mysql内部,您可以使用文本编辑器进行搜索/替换:
SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Run Code Online (Sandbox Code Playgroud)
注意:你或许应该忽略INFORMATION_SCHEMA和MySQL,因为"mysql和INFORMATION_SCHEMA数据库,实现一些MySQL的内部,依然使用MyISAM特别的,你不能切换授权表中使用InnoDB." (http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html)
在任何情况下,请注意要忽略并运行的表:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Run Code Online (Sandbox Code Playgroud)
现在只需将该列表复制/粘贴到文本编辑器中并搜索/替换"|" 用"ALTER TABLE"等
然后你会有一个这样的列表,你可以简单地粘贴到你的mysql终端:
ALTER TABLE arth_commentmeta ENGINE=Innodb;
ALTER TABLE arth_comments ENGINE=Innodb;
ALTER TABLE arth_links ENGINE=Innodb;
ALTER TABLE arth_options ENGINE=Innodb;
ALTER TABLE arth_postmeta ENGINE=Innodb;
ALTER TABLE arth_posts ENGINE=Innodb;
ALTER TABLE arth_term_relationships ENGINE=Innodb;
ALTER TABLE arth_term_taxonomy ENGINE=Innodb;
ALTER TABLE arth_terms ENGINE=Innodb;
ALTER TABLE arth_usermeta ENGINE=Innodb;
Run Code Online (Sandbox Code Playgroud)
如果你的文本编辑器不能轻易做到这一点,这里是另一个解决方案,从linux终端获取一个类似的列表(你可以粘贴到mysql)只为数据库的一个前缀:
mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
Run Code Online (Sandbox Code Playgroud)
小智 5
一个普通的MySQL版本。
您可以简单地启动mysql可执行文件,使用数据库并复制粘贴查询。
这会将当前数据库中的所有MyISAM表转换为INNODB表。
DROP PROCEDURE IF EXISTS convertToInnodb;
DELIMITER //
CREATE PROCEDURE convertToInnodb()
BEGIN
mainloop: LOOP
SELECT TABLE_NAME INTO @convertTable FROM information_schema.TABLES
WHERE `TABLE_SCHEMA` LIKE DATABASE()
AND `ENGINE` LIKE 'MyISAM' ORDER BY TABLE_NAME LIMIT 1;
IF @convertTable IS NULL THEN
LEAVE mainloop;
END IF;
SET @sqltext := CONCAT('ALTER TABLE `', DATABASE(), '`.`', @convertTable, '` ENGINE = INNODB');
PREPARE convertTables FROM @sqltext;
EXECUTE convertTables;
DEALLOCATE PREPARE convertTables;
SET @convertTable = NULL;
END LOOP mainloop;
END//
DELIMITER ;
CALL convertToInnodb();
DROP PROCEDURE IF EXISTS convertToInnodb;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
231571 次 |
最近记录: |