Mysql

破解 ibdata1 會破壞只有 MyISAM 表的數據庫嗎?

  • June 23, 2016

我犯了一個錯誤。

我有一個巨大的 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 創建)

InnoDB 管道

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_logfile0ib_logfile1

注意:MyISAM 表完全不受影響。為什麼 ?

假設您mytablemydb數據庫中有一個表。

該表的文件如下:

  • /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_logfile0ib_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

在這種情況下,您將 mysqldumpmysql模式,刪除 InnoDB 文件,然後手動.ibd刪除/var/lib/mysql/mysql. 然後,mysql從該轉儲重新載入架構。

引用自:https://dba.stackexchange.com/questions/141849