Mysql

MySQL - 從系統表空間更改為每個表的文件

  • April 7, 2015

我正在處理的 MySQL 數據庫將 InnoDB 表和索引儲存在系統表空間中,現在 > 20Gb。幾年前,我管理了一個 MySQL 數據庫,該數據庫使用每個表的文件,並展望未來,這似乎是要走的路。文件說這可以通過在 my.cnf 中設置“inno_file_per_table = 1”來完成。顯然我需要備份數據並將其重新載入到單獨的表中,但我看到的過程並不那麼清楚。除了我的數據庫模式之外,還有一些用於 information_schema、mysql 和性能模式的模式,我懷疑這些模式也屬於這個等式。MySQL 在 Mint Linux 下執行,雖然我已經在 Windows 下看到了這個問題的答案,但我對將其轉換為 Linux 作業系統並不是 100% 有信心。實現這種變化的最佳方法是什麼。

謝謝

第1步

將選項添加到my.cnf

[mysqld]
innodb_file_per_table = 1

第2步

如果您正在執行 MySQL 5.6,請登錄到 mysql 並執行

mysql> SET GLOBAL innodb_file_per_table = 1;

如果您沒有執行 MySQL 5.6,請重新啟動 mysqld

# service mysql restart

第 3 步

編寫腳本來創建 NULL ALTER TABLE 命令

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"

SQL="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')"
SQL="${SQL} FROM information_schema.tables WHERE engine='InnoDB'"
SQL="${SQL} ORDER BY (data_length+index_length)"
mysql ${MYSQL_CONN} -ANe"${SQL}" > Extract_InnoDB_From_ibdata1.sql

第四步

查看腳本

less Extract_InnoDB_From_ibdata1.sql

如果你對它沒問題,然後執行它

mysql ${MYSQL_CONN} < Extract_InnoDB_From_ibdata1.sql

警告

這不會縮小 ibdata1。它只是從中提取所有 InnoDB 表。由於表本身,ibdata1 將不再超過 20GB。

如果要收縮ibdata1,請參考我的文章How do I shrink the innodb file ibdata1 without dumping all databases?

試一試 !!!

我想在嘗試任何事情之前備份所有數據,但由於 mysql 和 performance_schema 數據庫而反復出現問題 -轉儲 MySQL 中的所有數據庫 - mysql 和 performance_schema 失敗。最後,我決定備份我的數據並嘗試一些不同的東西,如果一切都出錯了,可以選擇重新安裝所有東西。這就是我所做的: -

  1. 將我的數據備份為獨立 (sql) 文件和項目文件夾。
  2. 停止伺服器並編輯 /etc/mysql/my.cnf 以包含“innodb_file_per_table = 1”
  3. 刪除了 ibdata1、ib_logfile0 和 ib_logfile1,以及我所有的數據
  4. 重新啟動了伺服器
  5. 從自包含文件重新載入我的數據

到目前為止,SQL 腳本和 Python 程序按預期搜尋和操作數據,一切看起來都很好。磁碟上佔用的總空間現在剛剛超過 20GB,而 ibdata1 已從超過 40GB 縮小到 17MB。

顯然我還不夠專業,無法向其他人推薦這個,但這對我有用。歡迎其他評論…

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