shell批量修改MySQL儲存引擎類型2種方法

來源:互聯網
上載者:User

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 "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 ]
    then
        echo "Convert table $t_name ended." >>con_table.log
        sleep 1
    else
        echo "Convert failed!" >> 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 $$
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;
      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 ;

調用方法:

 代碼如下 複製代碼

call sp_alter_db_engine('baigan_cs','innodb');

前表一個是庫名,後面是要改成的引擎類型。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.