MySQL - 從系統表空間更改為每個表的文件
我正在處理的 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 失敗。最後,我決定備份我的數據並嘗試一些不同的東西,如果一切都出錯了,可以選擇重新安裝所有東西。這就是我所做的: -
- 將我的數據備份為獨立 (sql) 文件和項目文件夾。
- 停止伺服器並編輯 /etc/mysql/my.cnf 以包含“innodb_file_per_table = 1”
- 刪除了 ibdata1、ib_logfile0 和 ib_logfile1,以及我所有的數據
- 重新啟動了伺服器
- 從自包含文件重新載入我的數據
到目前為止,SQL 腳本和 Python 程序按預期搜尋和操作數據,一切看起來都很好。磁碟上佔用的總空間現在剛剛超過 20GB,而 ibdata1 已從超過 40GB 縮小到 17MB。
顯然我還不夠專業,無法向其他人推薦這個,但這對我有用。歡迎其他評論…