在 mysql-5.7 中,即使 innodb_file_per_table 處於關閉狀態,也會創建 InnoDB 文件
我們在 ubuntu 16.04 中安裝了 mysql 5.7,我們大吃一驚,因為數據庫是單獨儲存在每個文件夾中的,即使參數 innodb_file_per_table 為 0。
我們決定將 innodb_file_per_table 更改為 0,因為有超過 6000 個數據庫,每個數據庫中有 40 個表。實際上,我們必須遷移到此解決方案,因為目前使用 innodb_file_per_table=ON 的解決方案導致太多性能問題,經常在錯誤日誌中出現“打開的文件過多”。
在目前伺服器中,我們無法進行簡單的備份(轉儲),因為 mysql-server-5.6 在 –all-databases 參數中崩潰。
我們認為,如果我們使用 innodb_file_per_table=OFF 配置新的 mysql-server-5.7,我們將獲得更好的性能..
歡迎任何建議/幫助。
無論您將innodb_file_per_table配置為(0 或 1),仍然會出現以下情況
- MySQL 創建一個數據庫文件夾
- MySQL
.frm
在數據庫文件夾中創建每個表例子
您的數據庫目錄 ( datadir ) 是
/var/lib/mysql
您執行以下命令
CREATE DATABASE IF NOT EXISTS mydb; USE mydb CREATE TABLE tb1 (a INT NOT NULL) ENGINE=InnoDB; CREATE TABLE tb2 LIKE tb1;
- 你得到
/var/lib/mysql/mydb
- 你得到
/var/lib/mysql/mydb/tb1.frm
- 你得到
/var/lib/mysql/mydb/tb1.ibd
- 你得到
/var/lib/mysql/mydb/tb2.frm
- 你得到
/var/lib/mysql/mydb/tb2.ibd
- 你得到
/var/lib/mysql/mydb
- 你得到
/var/lib/mysql/mydb/tb1.frm
- 你得到
/var/lib/mysql/mydb/tb2.frm
主要區別在於,新創建的表的數據和索引塊最終位於系統表空間文件中,即
ibdata1
當它為 0 時。僅作為圖文參考,請注意 Percona 對 InnoDB 的看法
你的問題
將innodb_file_per_table更改為 0 不會使目前創建的表僅遷移到 ibdata1。您必須手動將這些表移動到
ibdata1
.這不會緩解
too many open files
問題。為什麼 ?無論儲存引擎如何,mysqld 總是通過首先檢查表
.frm
文件來檢查表是否存在。然後,mysqld 程序將根據儲存引擎引用表的完整性。對於 InnoDB,然後檢查 InnoDB 表的數據字典。
打開兩個文件句柄
- 一個文件句柄
.frm
.ibd
訪問表時的一個文件句柄如果將表和索引數據從文件移動
.ibd
到ibdata1
文件中,您會得到這個
- 一個文件句柄
.frm
ibdata1
訪問表時的一個文件句柄所有文件句柄都會堆積在裡面,
ibdata1
而不是單獨的文件。還想把桌子搬進去
ibdata1
嗎?雖然我非常不鼓勵這樣做,但有可能
在我給你的例子中,為了在將innodb_file_per_table
ibdata1
設置為 0 後移動一個表,只需執行這個USE mydb ALTER TABLE tb1 ENGINE=InnoDB; ALTER TABLE tb2 ENGINE=InnoDB;
這將重新創建表,並將數據和索引遷移到
ibdata1
. 如果您願意這樣做 240,000 次(6000 X 40),請成為我的客人。你可以從這裡做什麼?
您可以設置 MySQL 複製並在從屬設備上執行備份
您執行以下操作
STOP SLAVE;
- 在 Slave 上執行 mysqldump
--single-transaction
START SLAVE;
要麼
STOP SLAVE;
SET GLOBAL innodb_fast_shutdown = 0;
- 關閉 mysqld
- 製作實體副本
datadir
- 啟動 mysqld
START SLAVE;
試一試 !!!