存儲(chǔ)引擎是每一個(gè)mysql數(shù)據(jù)庫(kù)必須有的一個(gè)類型,不同的類型是不一樣的的,特別是對(duì)不同數(shù)據(jù)存儲(chǔ)有一些不同了,下面我們來(lái)看看shell批量修改MySQL存儲(chǔ)引擎類型2種方法.
MySQL存儲(chǔ)引擎類型有哪些
MyISAM管理非事務(wù)表,提供高速檢索,以及全文搜索能力。
Memory存儲(chǔ)引擎提供”內(nèi)存中”表,MERGE存儲(chǔ)引擎允許集合將被樹立統(tǒng)一的MyISAM表做為一個(gè)單表。非事務(wù)表。可把多個(gè)myisam表構(gòu)建為一個(gè)虛擬表,使得對(duì)這些表的查詢仿佛在一個(gè)表上進(jìn)行,提高了查詢速度和修復(fù)效率,并節(jié)省了磁盤空間。
InnoDB,BDB存儲(chǔ)引擎提供事務(wù)安全表
EXAMPLE存儲(chǔ)引擎是一個(gè)”存根”引擎,它不做什么。可以用這個(gè)引擎創(chuàng)建表,但沒(méi)有數(shù)據(jù)被存儲(chǔ)其中或從其中檢索,這個(gè)引擎的目的是服務(wù)。針對(duì)開發(fā)人員。
NDB Cluster是被Mysql Cluster用來(lái)實(shí)現(xiàn)分割多臺(tái)計(jì)算機(jī)上的表的存儲(chǔ)引擎,只被LINUX,SOLARIS,Mac os支持.
ARCHIVE存儲(chǔ)引起被用來(lái)無(wú)索引地,非常小的覆蓋存儲(chǔ)的大量數(shù)據(jù).
CSV存儲(chǔ)引擎把數(shù)據(jù)以逗號(hào)的格式存儲(chǔ)在文本文件中。
BLACKHOLE存儲(chǔ)引擎把數(shù)據(jù)存在遠(yuǎn)程數(shù)據(jù)庫(kù)中,在5.1中他只和Mysql一起工作,使用Mysql C client API,在未來(lái)的分發(fā)版中,我們想要讓它使用其他驅(qū)動(dòng)器或客戶端連接方法里連接到另外的數(shù)據(jù)源.
MyISAM類型的表在磁盤上存儲(chǔ)成三個(gè)文件
*.frm文件存儲(chǔ)表定義
*.MYD(mydata)文件存儲(chǔ)表中數(shù)據(jù)
*.MYI(myindex)文件存儲(chǔ)表上建立的索引。
InnoDB類型的表提供提交,回滾,崩潰恢復(fù)能力的存儲(chǔ)引擎,行級(jí)鎖,可以與其他Mysql表混合起來(lái),甚至在同一個(gè)查詢中也可以混用.
為處理巨大數(shù)據(jù)量時(shí)的最大性能設(shè)計(jì).
批量修改MySQL存儲(chǔ)引擎類型方法
一、shell腳本實(shí)現(xiàn)法,代碼如下:
- #/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 "Enter MySQL bin path:"
- #read MYSQL_BIN
- #echo "Enter Host:"
- #read HOST
- #echo "Enter Uesr:"
- #read USER
- #echo "Enter Password:"
- #read PASSWD
- #echo "Enter DB name :"
- #read DB
- #echo "Enter the original engine:"
- #read S_ENGINE
- #echo "Enter the new engine:"
- #read D_ENGINE
- $MYSQL_BIN/mysql -h$HOST -u$USER -p$PASSWD $DB -e "select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='"$DB"' and ENGINE='"$S_ENGINE"';" | grep -v "TABLE_NAME" >tables.txt
- for t_name in `cat tables.txt`
- do
- echo "Starting convert table $t_name......"
- sleep 1
- $MYSQL_BIN/mysql -h$HOST -u$USER -p$PASSWD $DB -e "alter table $t_name engine='"$D_ENGINE"'"
- if [ $? -eq 0 ] --Vevb.com
- then
- echo "Convert table $t_name ended." >>con_table.log
- sleep 1
- else
- echo "Convert failed!" >> con_table.log
- fi
- done
喜歡交互式的就把echo 、read那段的注釋去掉,可以根據(jù)提示進(jìn)行更改。也可以根據(jù)自己的需要把DB、user、password、host等信息修改后直接運(yùn)行。該方法的原理就是循環(huán)調(diào)用alter table 表名 engine=NDBcluster的語(yǔ)句。該方法還有一個(gè)變種:
首先利用mysql內(nèi)部的系統(tǒng)表得出要執(zhí)行的sql語(yǔ)句:
SELECT CONCAT('ALTER TABLE ',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE table_schema="db_name" AND ENGINE="myisam";
將以上結(jié)果輸出到文件,然后執(zhí)行該SQL語(yǔ)句的文件,執(zhí)行完后,可以通過(guò)下面的語(yǔ)句確認(rèn)下:
SELECT CONCAT(table_name,' ', engine) FROM information_schema.tables WHERE table_schema="db_name";
方法二、利用存儲(chǔ)過(guò)程批量修改,代碼如下:
- DELIMITER $$
- DROP PROCEDURE IF EXISTS `t_girl`.`sp_alter_db_engine`$$
- CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_alter_db_engine`(
- IN f_db_name varchar(255), IN f_engine_name varchar(255))
- BEGIN
- -- Get the total number of tables.
- declare cnt1 int default 0;
- declare i int;
- set i = 0;
- select count(1) from information_schema.tables where table_schema = f_db_name into cnt1;
- while i < cnt1
- do
- set @stmt = concat('select @tbname:=table_name from information_schema.tables where table_schema=''',f_db_name,''' order by table_name desc limit ',i,',1 into @tbname');
- prepare s1 from @stmt; --Vevb.com
- execute s1;
- deallocate prepare s1;
- set @stmt = '';
- set @tbname = concat(f_db_name,'.',@tbname);
- call sp_alter_table_engine(@tbname,f_engine_name);
- set i = i + 1;
- end while;
- END$$
- DELIMITER ;
調(diào)用方法如下代碼:
call sp_alter_db_engine('baigan_cs','innodb');
前表一個(gè)是庫(kù)名,后面是要改成的引擎類型.
新聞熱點(diǎn)
疑難解答
圖片精選