存储引擎是每一个mysql数据库必须有的一个类型,不同的类型是不一样的的,特别是对不同数据存储有一些不同了,下面我们来看看shell批量修改MySQL存储引擎类型2种方法.
MySQL存储引擎类型有哪些
MyISAM管理非事务表,提供高速检索,以及全文搜索能力。
Memory存储引擎提供”内存中”表,MERGE存储引擎允许集合将被树立统一的MyISAM表做为一个单表。非事务表。可把多个myisam表构建为一个虚拟表,使得对这些表的查询仿佛在一个表上进行,提高了查询速度和修复效率,并节省了磁盘空间。
InnoDB,BDB存储引擎提供事务安全表
EXAMPLE存储引擎是一个”存根”引擎,它不做什么。可以用这个引擎创建表,但没有数据被存储其中或从其中检索,这个引擎的目的是服务。针对开发人员。
NDB Cluster是被Mysql Cluster用来实现分割多台计算机上的表的存储引擎,只被LINUX,SOLARIS,Mac os支持.
ARCHIVE存储引起被用来无索引地,非常小的覆盖存储的大量数据.
CSV存储引擎把数据以逗号的格式存储在文本文件中。
BLACKHOLE存储引擎把数据存在远程数据库中,在5.1中他只和Mysql一起工作,使用Mysql C client API,在未来的分发版中,我们想要让它使用其他驱动器或客户端连接方法里连接到另外的数据源.
MyISAM类型的表在磁盘上存储成三个文件
*.frm文件存储表定义
*.MYD(mydata)文件存储表中数据
*.MYI(myindex)文件存储表上建立的索引。
InnoDB类型的表提供提交,回滚,崩溃恢复能力的存储引擎,行级锁,可以与其他Mysql表混合起来,甚至在同一个查询中也可以混用.
为处理巨大数据量时的最大性能设计.
批量修改MySQL存储引擎类型方法
一、shell脚本实现法,代码如下:
- #/bin/bash
- DB=test
- USER=root
- PASSWD=test
- HOST=192.168.0.11
- MYSQL_BIN=/usr/local/mysql/bin
- S_ENGINE=MyISAM
- D_ENGINE=DBDcluster
- #echo"EnterMySQLbinpath:"
- #readMYSQL_BIN
- #echo"EnterHost:"
- #readHOST
- #echo"EnterUesr:"
- #readUSER
- #echo"EnterPassword:"
- #readPASSWD
- #echo"EnterDBname:"
- #readDB
- #echo"Entertheoriginalengine:"
- #readS_ENGINE
- #echo"Enterthenewengine:"
- #readD_ENGINE
- $MYSQL_BIN/mysql-h$HOST-u$USER-p$PASSWD$DB-e"selectTABLE_NAMEfrominformation_schema.TABLESwhereTABLE_SCHEMA='"$DB"'andENGINE='"$S_ENGINE"';"|grep-v"TABLE_NAME">tables.txt
- fort_namein`cattables.txt`
- do
- echo"Startingconverttable$t_name......"
- sleep1
- $MYSQL_BIN/mysql-h$HOST-u$USER-p$PASSWD$DB-e"altertable$t_nameengine='"$D_ENGINE"'"
- if[$?-eq0]--phpfensi.com
- then
- echo"Converttable$t_nameended.">>con_table.log
- sleep1
- else
- echo"Convertfailed!">>con_table.log
- fi
- done
喜欢交互式的就把echo 、read那段的注释去掉,可以根据提示进行更改。也可以根据自己的需要把DB、user、password、host等信息修改后直接运行。该方法的原理就是循环调用alter table 表名 engine=NDBcluster的语句。该方法还有一个变种:
首先利用mysql内部的系统表得出要执行的sql语句:
SELECT CONCAT('ALTER TABLE ',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE table_schema="db_name" AND ENGINE="myisam";
将以上结果输出到文件,然后执行该SQL语句的文件,执行完后,可以通过下面的语句确认下:
SELECT CONCAT(table_name,' ', engine) FROM information_schema.tables WHERE table_schema="db_name";
方法二、利用存储过程批量修改,代码如下:
- DELIMITER$$
- DROPPROCEDUREIFEXISTS`t_girl`.`sp_alter_db_engine`$$
- CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_alter_db_engine`(
- INf_db_namevarchar(255),INf_engine_namevarchar(255))
- BEGIN
- --Getthetotalnumberoftables.
- declarecnt1intdefault0;
- declareiint;
- seti=0;
- selectcount(1)frominformation_schema.tableswheretable_schema=f_db_nameintocnt1;
- whilei<cnt1
- do
- set@stmt=concat('select@tbname:=table_namefrominformation_schema.tableswheretable_schema=''',f_db_name,'''orderbytable_namedesclimit',i,',1into@tbname');
- prepares1from@stmt;--phpfensi.com
- executes1;
- deallocateprepares1;
- set@stmt='';
- set@tbname=concat(f_db_name,'.',@tbname);
- callsp_alter_table_engine(@tbname,f_engine_name);
- seti=i+1;
- endwhile;
- END$$
- DELIMITER;
调用方法如下代码:
call sp_alter_db_engine('baigan_cs','innodb');
前表一个是库名,后面是要改成的引擎类型.