MySQL MyISAM Engine 轉換成 InnoDB

标签: InnoDB MyISAM MySQL | 发表时间:2012-12-15 10:50 | 作者:appleboy
出处:http://blog.wu-boy.com

如果對於 InnoDB 不了解的讀者們,可以參考作者之前寫的 MySQL 預設儲存引擎: InnoDB 介紹,最近開始把原本 MySQL 5.1 預設 MyISAM Table 全部轉換成 InnoDB,MySQL 5.5 版本開始預設的儲存引擎就是 InnoDB,InnoDB 現在也非常完整,也支援 Full Text (5.6.4 開始支援)。作者在轉換過程其實蠻順利的,步驟也不是很複雜,只要按底下步驟,就可以順利轉換。

備份原本資料庫

為了避免資料庫被玩壞,轉換之前一定要做好備份,也或者先在別台機器實驗,備份 MySQL MyISAM 非常簡單,如果你是安裝 Windows 版的 MySQL,透過像是 Appserv 或 xampp 懶人包,其實可以找到 MySQL 底下有個 data 目錄,將這目錄直接備份即可。如果是 Linux 也是一樣,備份 /var/lib/mysql,最後提供 MySQL 指令備份,透過 mysqldump 就可以了

$ mysqldump -u root -p database_name > db_name.sql

轉換 MyISAM tabe to InnoDB

直接用 vim 或編輯器打開上面指令所備份的 .sql 檔案,將

ENGINE=MyISAM

改成

ENGINE=InnoDB ROW_FORMAT=COMPRESSED

存檔後,再透過底下指令將資料存回到指定資料庫

$ mysql -u root -p database_name < db_name.sql

完成後可以透過 phpMyAdmin 檢查看看是不是全部的都已經轉換成 InnoDB。

新增 FOREIGN KEY

最後設定 InooDB 好用的 FOREIGN KEY,FOREIGN KEY 可以綁定 parent table 跟 child table 多個 key 值,可以指定,當刪除 parent table 資料時,連帶 child table 也一起刪除或者是改成 Default value,轉換之前有一點非常要注意的是,FOREIGN KEY 的欄位格式需要一致,也就是如果 parent 欄位是 int(11) 那 child 的欄位就必須一樣,否則會無法設定 FOREIGN KEY,另外如果原本的資料庫非常大,也許會存在有些 child key 沒對應到 parent key,原因就是刪除了 parent row,但是忘記刪除相關 table 資料,所以務必寫程式將那些冗員刪除。

利用 ALTER 指令來增加 FOREIGN KEY

ALTER TABLE tbl_name ADD FOREIGN KEY (index_name) REFERENCES tbl_name (index_col_name) ON DELETE reference_option ON UPDATE reference_option;

reference_option 可以是 CASCADE, SET NULL, RESTRICT, NO ACTION 或 SET DEFAULT。舉個例子,建立 users 跟 uses_groups 資料表,users 內有 id auto increament key,uses_groups 則是有 user_id 欄位來對應,所以透過底下可以設定該 FOREIGN KEY

ALTER TABLE uses_groups REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE;

經過上述步驟,相信大家都可以輕鬆轉換,如果遇到什麼問題,可以在此篇留言。或者可以參考 gslin 大神寫的 把大量的 MyISAM table 換成 InnoDB

Related View

相关 [mysql myisam engine] 推荐:

MySQL MyISAM Engine 轉換成 InnoDB

- - 小惡魔 - 電腦技術 - 工作筆記 - AppleBOY
如果對於 InnoDB 不了解的讀者們,可以參考作者之前寫的 MySQL 預設儲存引擎: InnoDB 介紹,最近開始把原本 MySQL 5.1 預設 MyISAM Table 全部轉換成 InnoDB,MySQL 5.5 版本開始預設的儲存引擎就是 InnoDB,InnoDB 現在也非常完整,也支援 Full Text (5.6.4 開始支援).

MySQL MyISAM/InnoDB高并发优化经验

- jinbiaozhao - 服务器运维与网站架构|Linux运维|互联网研究
最近做的一个应用,功能要求非常简单,就是 key/value 形式的存储,简单的 INSERT/SELECT,没有任何复杂查询,唯一的问题是量非常大,如果目前投入使用,初期的单表 insert 频率约 20Hz(次/秒,我喜欢这个单位,让我想起国内交流电是 50Hz),但我估计以后会有 500Hz+ 的峰值.

MySQL 對 MyISAM、InnoDB 使用 Optimize Table

- - Tsung's Blog
系統用久了, 自然就會有不連續的碎片(fragmented)產生, 以前 Dos 使用 defrag, Windows 使用磁碟重組, 而 MySQL 則是使用 Optimize table.. 以往都是使用: 使用 PHP 對所有 MySQL Database 做 Optimize / Repair 的動作 - 這裡面的那隻程式來跑..

MySQL存储引擎--MyISAM与InnoDB区别

- - CSDN博客互联网推荐文章
MyISAM 和InnoDB 讲解   InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定. 基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持. MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能.

查看 MySQL 支援哪些 Storage Engine

- - Tsung's Blog
MySQL 支援的 Storage Engine 很多, 如下述:. 查看 MySQL 支援哪些 Storage Engine. MySQL 系統能夠使用的 Storage Engine 有哪些呢?. 可以使用 SHOW ENGINES 來查看, 有出現 "Support: Yes" 的, 就是可以使用的..

MySQL存储引擎MyISAM与InnoDB的主要区别对比

- timo - 服务器运维与网站架构|Linux运维|互联网研究
本文整理了Mysql 两大常用的存储引擎MyISAM,InnoDB的六大常见区别,来源于Mysql手册以及互联网的资料. InnoDB与Myisam的六大区别. MyISAM InnoDB 构 成上的区别: 每个MyISAM在磁盘上存储成三个文件. 第一个 文件的名字以表的名字开始,扩展名指出文件类型.

InnoDB还是MyISAM 再谈MySQL存储引擎的选择

- - OurMySQL
   两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用.    我作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,但是从我目前运维的数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是我的首选.

MySQL两种引擎Myisam,innodb单表大小的限制

- - 操作系统 - ITeye博客
MySQL两种引擎Myisam,innodb单表大小的限制. MySQL单表大小的限制在目前的技术环境中,由所在主机的OS上面的文件系统来界定而不是由MySQL数据库本身来决定了. 在老版本的MySQL 3.22中,MySQL单表大小为4GB,当时的MySQL的存储引擎还是MYISAM存储引擎. 但是,当出现MyISAM存储引擎之后,也就是从MySQL 3.23开始,MySQL单表最大限制就已经扩大到了64TB了(官方文档显示).

mysql存储引擎:InnoDB和MyISAM的差别/优劣评价/评测/性能测试

- - CSDN博客数据库推荐文章
InnoDB和MyISAM简介. MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键.

浅析App Engine

- - 搜索研发部官方博客
在国内外,云计算正在大步的走向商业化的道路,也得到了越来越多公司的重视. 其中平台即服务(Platform-as-a-Service  PaaS)已经称为业界探讨云计算的热点方式之一,采用PaaS模式来构建应用运行平台App Engine是一种重要的实现方式. 本文主要是对App Engine的背景、特点、需求等进行分析整理,并据此对业界主要的App Engine进行了调研分析.