MySQL 8.0.21中新的數據文件位置一致性

做者:Kevin Lewis 譯:徐軼韜mysql

在MySQL 8.0中建立常規表空間時,能夠選擇建立關聯數據文件的目錄。sql

CREATE TABLESPACE tablespace_name ADD DATAFILE ‘/my/table/space/dir’;數據庫

InnoDB必須知道該目錄。目錄由如下變量定義:datadir,  innodb_data_home_dir,  innodb_undo_directory   和  innodb_directories微信

啓動時,InnoDB會首先搜索已知目錄中的表空間數據文件,以後再進行恢復。因爲表空間目錄沒有存儲在MySQL 8.0的重作日誌中,恢復時須要依賴已知目錄來查找和打開數據文件。spa

限制ADD DATAFILE路徑能夠使用戶跟蹤全部數據。用戶能夠指定數據的位置,而且數據不會丟失。.net

到MySQL 8.0.21爲止,能夠爲隱式建立的file-per-table表空間指定任何目錄:日誌

CREATE TABLE table_name ({column_specs}) DATA DIRECTORY ‘/my/unknown/dir’;orm

執行此操做時,MySQL數據字典會知道數據文件的位置,但必需要等到數據字典恢復後才能找到這意味着這些數據文件不可恢復。崩潰後,若是重作日誌包含對這些文件的更改,則必須將這些數據文件目錄添加到–innodb-directories,MySQL纔可以啓動。若是因爲表空間還沒有打開而沒法應用重作日誌,則恢復啓動將失敗。get

所以,MySQL 8.0.21要求每一個隱式的file-per-table數據文件都在一個已知目錄中建立,就像普通表空間同樣。該規則僅適用於新的隱式表空間。it

那麼現有數據庫呢?若是隱式數據文件位於未知目錄中,是否將阻止升級到8.0.21?不,不會。

當InnoDB 8.0.21啓動,在數據字典中找到未知目錄中的數據文件時,它將警告寫入錯誤日誌。而後,用戶能夠將這些目錄添加到–innodb-directories設置中。下次啓動InnoDB時,用戶的全部數據將可恢復。若是用戶缺失目錄,則會將另外一條消息寫入錯誤日誌。

這項新規則有幾個小影響:

1.能夠使用TRUNCATE TABLE截斷隱式file-per-table表空間。這將隱式建立一個新的空表空間來替換舊的表空間。若是舊錶空間是現有數據庫的一部分,而且其目錄未知,則不會在相同的未知目錄中建立新表空間。它將在默認目錄中爲隱式表空間建立。也就是說,它是在datadir下以該模式命名的目錄中建立。若是發生這種狀況,會將如下警告消息寫入錯誤日誌:

「The DATA DIRECTORY location must be in a known directory. The DATA DIRECTORY location will be ignored and the file will be put into the default datadir location.」

2.選擇惟一的撤消目錄時,該目錄不該用於常規表空間(常規表空間或隱式表空間)。MySQL 8.0.21不容許在其中建立常規或隱式表空間。但以前能夠在惟一的撤消目錄中建立非撤消表空間。若是使用先前的MySQL版本在惟一的撤銷目錄中建立了一些非撤消表空間,升級到MySQL 8.0.21後,InnoDB會容許它存在。

DATA DIRECTORY子句對隱式表空間目錄的新限制旨在幫助確保數據庫是徹底可恢復的。它隻影響新的表空間,不影響現有的表空間。所以,它不阻止從舊版本的MySQL升級

感謝您關注「MySQL解決方案工程師」!


本文分享自微信公衆號 - MySQL解決方案工程師(mysqlse)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索