Mysql

在 mysql-5.7 中,即使 innodb_file_per_table 處於關閉狀態,也會創建 InnoDB 文件

  • May 10, 2016

我們在 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;

innodb_file_per_table為 1

  • 你得到/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

innodb_file_per_table為 0時

  • 你得到/var/lib/mysql/mydb
  • 你得到/var/lib/mysql/mydb/tb1.frm
  • 你得到/var/lib/mysql/mydb/tb2.frm

主要區別在於,新創建的表的數據和索引塊最終位於系統表空間文件中,即ibdata1當它為 0 時。

僅作為圖文參考,請注意 Percona 對 InnoDB 的看法

InnoDB 管道

你的問題

將innodb_file_per_table更改為 0 不會使目前創建的表僅遷移到 ibdata1。您必須手動將這些表移動到ibdata1.

這不會緩解too many open files問題。為什麼 ?

無論儲存引擎如何,mysqld 總是通過首先檢查表.frm文件來檢查表是否存在。然後,mysqld 程序將根據儲存引擎引用表的完整性。

對於 InnoDB,然後檢查 InnoDB 表的數據字典。

打開兩個文件句柄

  • 一個文件句柄.frm
  • .ibd訪問表時的一個文件句柄

如果將表和索引數據從文件移動.ibdibdata1文件中,您會得到這個

  • 一個文件句柄.frm
  • ibdata1訪問表時的一個文件句柄

所有文件句柄都會堆積在裡面,ibdata1而不是單獨的文件。

還想把桌子搬進去ibdata1嗎?

雖然我非常不鼓勵這樣做,但有可能

在我給你的例子中,為了在將innodb_file_per_tableibdata1設置為 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;

試一試 !!!

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