mysql安装后提供了一个perl的脚本:mysql_convert_table_format 它默认情况下可以将某个表或某个数据库的所有表转换为MyISAM的存储引擎,通过修改该脚本可以将默认修改的存储引擎改为我们需要的存储引擎,如Innodb。该脚本使用了DBI和DBD的perl模块,如果系统没有安装的话可以使用yum intall perl-DBI perl-DBD-mysql 命令来安装。本文介绍的不是mysql_convert_table_format工具的使用,而是我自己写的一个shell脚本,也可以完成批量转换表存储引擎的目的,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #!/bin/bash # File : convert_storage_engine.sh # Info : 批量转换表存储引擎,如果忽略-t参数 # 则转换指定数据库中的所有表。 # Arg1 : -d dbname # Arg2 : -t [tables] # Arg3 : -e engine type (myisam | innodb) # Author : Cooper # Site : http://salogs.com # Version : 2010.05.10 First Release User=root Pwd=dbpwd TmpFile="/dev/shm/table.tmp" MySQLBin="mysql -u$User -p$Pwd -e " function Usage() { echo "Useage:$0 -d dbname [-t table] -e engine_type" } # 检查用户输入的参数 if [ $# -eq 0 ] ;then Usage exit 1 fi # 获得命令行参数值,并作相应处理 while getopts t:d:e:h OPTION do case $OPTION in d) { # 检查数据库是否存在 DBName=$OPTARG DBExists=`$MySQLBin "show databases;" | grep $DBName` if [ "$DBExists" == "" ];then echo "$DBName database not exists!" exit 1 fi } ;; t) { # 检查表是否存在 TableName=$OPTARG TableExists=`$MySQLBin "use $DBName;show tables" | grep $TableName` if [ "$TableExists" == "" ];then echo "$TableName table not exists!" exit 1 fi } ;; e) EngineName=`echo $OPTARG | tr A-Z a-z ` if [ $EngineName != "innodb" ] && [ $EngineName != "myisam" ];then Usage exit 1 fi ;; \?|h) Usage exit 0 ;; esac done # 转换表 if [ "$TableName" != "" ];then { CurrentEngine=`$MySQLBin "use $DBName;show table status like \"$TableName\"\G"\ | grep Engine | awk '{print $2}'|tr A-Z a-z` if [ $CurrentEngine == $EngineName ];then echo "Current Table $Table is already of type $EngineName;Ignored" exit 0 fi $MySQLBin "use $DBName;alter table $TableName engine=$EngineName;" } else { $MySQLBin "use $DBName;show tables;" | sed 1d >$TmpFile while read Table do CurrentEngine=`$MySQLBin "use $DBName;show table status like '$Table'\G"\ | grep Engine | awk '{print $2}'| tr A-Z a-z` if [ $CurrentEngine == $EngineName ];then echo "Current Table $Table is already of type $EngineName;Ignored" continue fi $MySQLBin "use $DBName;alter table $Table engine=$EngineName;" done<$TmpFile } fi rm -rf $TmpFile |
注意:
1、由于Innodb不支持FULLTEXT索引,因此在转换表时要格外注意。
2、不要将系统表mysql转换为Innodb,如果这样做了的话,mysql绝对无法启动,需要使用mysql_install_db 命令重建系统表。
3、修改现网数据库需格外注意,转换表时会对表进行锁定。
原创文章,转载请注明: 转自 http://salogs.com
近期评论