破解 ibdata1 會破壞只有 MyISAM 表的數據庫嗎?
我犯了一個錯誤。
我有一個巨大的 MyISAM 表數據庫,我正在轉換它
$$ a copy of $$到 InnoDB。我這樣做之前沒有設置
innodb_file_per_table=1
。 我知道安全收縮ibdata1
需要對所有數據庫進行核對,然後從 SQL 轉儲中重新載入。但是,如果我不再關心我的 InnoDB 表,我可以在
ibdata1
不破壞僅包含 MyISAM 表的原始數據庫的情況下刪除該文件嗎?刪除它並從 SQL 轉儲中重新載入它是可能的,但由於數據庫的大小接近 250GB,它需要的時間比我想要的要長得多。$ mysql --version mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (i686) using readline 5.1 $ cat /etc/issue Red Hat Enterprise Linux Server release 6.5 (Santiago)
由於您使用的是 MySQL 5.1.73,因此您可以放心地刪除 ibdata1 文件。
首先,讓我們看看 ibdata1 內部(圖片由 Percona CTO Vadim Tkachenko 創建)
STEP 01 : 確保沒有 InnoDB
執行以下
SELECT table_schema,table_name, (data_length+index_length)/POWER(1024,3) table_sizegb FROM information_schema.tables WHERE engine='InnoDB' AND table_schema NOT IN ('information_schema','performance_schema','mysql');
如果你什麼都沒得到,你可以繼續。
如果你確實得到了一些東西,要麼刪除這些表,將它們轉換為 MyISAM,要麼 mysqldump 它們稍後重新載入。
假設datadir是
/var/lib/mysql
步驟 02:配置innodb_file_per_table
你應該把它添加到`my.cnf
[mysqld] innodb_file_per_table=ON
這將允許將來
CREATE TABLEs
在您想要.ibd
文件的位置步驟 03:從 InnoDB 中刷新所有內容
SET GLOBAL innodb_fast_shutdown = 0;
步驟 04:關閉 mysql
service mysql stop
STEP 05 : 刪除 ibdata 和重做日誌
cd /var/lib/mysql rm -rf ibdata1 rm -rf ib_logfile0 rm -rf ib_logfile1
步驟 06:啟動 mysql
service mysql start
這將重新生成
ibdata1
,ib_logfile0
和ib_logfile1
注意:MyISAM 表完全不受影響。為什麼 ?
假設您
mytable
在mydb
數據庫中有一個表。該表的文件如下:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.MYD
/var/lib/mysql/mydb/mytable.MYI
InnoDB 文件 ibdata1 通常位於
/var/lib/mysql
. 因此,所有 MyISAM 表都安全地隱藏在各自的數據庫文件夾中。僅適用於 MyISAM 使用者的 CAVEAT
如果您確定永遠不會使用 InnoDB,則可以將此參數添加到
my.cnf
[mysqld] skip-innodb
這樣,當你在 中啟動 mysqld 時
STEP 06
,程序不會重新生成ibdata1
,ib_logfile0
和ib_logfile1
.MySQL 5.6/5.7 使用者注意事項
在 MySQL 5.6 中,
mysql
模式 (/var/lib/mysql/mysql
) 中有 5 個表是 InnoDB。MySQL 5.7 有 19 個。只需執行此查詢即可查看這些表是什麼
SELECT table_name FROM information_schema.tables WHERE engine='InnoDB' and table_schema='mysql';
請參閱我的舊文章InnoDB: Error: Table “mysql”.“innodb_table_stats” not found after upgrade to mysql 5.6 and the MySQL Documentation。
在這種情況下,您將 mysqldump
mysql
模式,刪除 InnoDB 文件,然後手動.ibd
刪除/var/lib/mysql/mysql
. 然後,mysql
從該轉儲重新載入架構。