LOAD DATA
陳述式會將資料檔案載入表格。此陳述式可以載入位於伺服器主機上的檔案,或者,如果指定 LOCAL
關鍵字,則可以載入用戶端主機上的檔案。
LOAD DATA
的 LOCAL
版本有兩個潛在的安全性問題
由於
LOAD DATA LOCAL
是一個 SQL 陳述式,因此會在伺服器端進行剖析,並由 MySQL 伺服器起始將檔案從用戶端主機傳輸到伺服器主機,該伺服器會告知用戶端陳述式中命名的檔案。理論上,修補過的伺服器可以告知用戶端程式傳輸伺服器選擇的檔案,而不是陳述式中命名的檔案。此類伺服器可以存取用戶端使用者具有讀取權限的用戶端主機上的任何檔案。(事實上,修補過的伺服器可以回復任何陳述式的檔案傳輸請求,而不僅僅是LOAD DATA LOCAL
,因此更基本的問題是用戶端不應連線至不受信任的伺服器。)在用戶端從 Web 伺服器連線的 Web 環境中,使用者可以使用
LOAD DATA LOCAL
來讀取 Web 伺服器處理程序具有讀取權限的任何檔案(假設使用者可以針對 SQL 伺服器執行任何陳述式)。在此環境中,相對於 MySQL 伺服器的用戶端實際上是 Web 伺服器,而不是由連線至 Web 伺服器的使用者執行的遠端程式。
為了避免連線到不受信任的伺服器,客戶端可以使用 --ssl-mode=VERIFY_IDENTITY
選項和適當的 CA 憑證建立安全連線並驗證伺服器身分。要實作此層級的驗證,您必須先確保伺服器的 CA 憑證可可靠地提供給複本,否則會導致可用性問題。如需更多資訊,請參閱加密連線的命令選項。
為了避免 LOAD DATA
問題,除非已採取適當的客戶端預防措施,否則客戶端應避免使用 LOCAL
。
為了控制本機資料載入,MySQL 允許啟用或停用此功能。MySQL 也允許客戶端將本機資料載入操作限制於指定目錄中的檔案。
管理員和應用程式可以設定是否允許本機資料載入,如下所示:
在伺服器端
local_infile
系統變數控制伺服器端的LOCAL
功能。根據local_infile
設定,伺服器會拒絕或允許請求本機資料載入的客戶端進行載入。預設情況下,
local_infile
處於停用狀態。(這與先前版本的 MySQL 不同。)要使伺服器明確拒絕或允許LOAD DATA LOCAL
語法(無論客戶端程式和函式庫在建置時或執行時如何設定),請在停用或啟用local_infile
的情況下啟動 mysqld。local_infile
也可以在執行時設定。
在客戶端
ENABLED_LOCAL_INFILE
CMake 選項控制 MySQL 客戶端函式庫的編譯預設LOCAL
功能(請參閱第 2.8.7 節「MySQL 原始碼組態選項」)。因此,沒有進行明確安排的客戶端會根據在 MySQL 建置時指定的ENABLED_LOCAL_INFILE
設定停用或啟用LOCAL
功能。預設情況下,MySQL 二進位發行版本中的客戶端函式庫是以停用
ENABLED_LOCAL_INFILE
的方式編譯的。如果您從原始碼編譯 MySQL,請根據沒有進行明確安排的客戶端是否應停用或啟用LOCAL
功能,使用停用或啟用ENABLED_LOCAL_INFILE
的方式進行組態。對於使用 C API 的客戶端程式,本機資料載入功能由編譯到 MySQL 客戶端函式庫中的預設值決定。要明確啟用或停用它,請調用
mysql_options()
C API 函式來停用或啟用MYSQL_OPT_LOCAL_INFILE
選項。請參閱 mysql_options()。對於 mysql 客戶端,本機資料載入功能由編譯到 MySQL 客戶端函式庫中的預設值決定。要明確停用或啟用它,請使用
--local-infile=0
或--local-infile[=1]
選項。對於 mysqlimport 客戶端,預設情況下不使用本機資料載入。要明確停用或啟用它,請使用
--local=0
或--local[=1]
選項。如果您在 Perl 指令碼或其他從選項檔案中讀取
[client]
群組的程式中使用LOAD DATA LOCAL
,您可以將local-infile
選項設定新增至該群組。為了防止不理解此選項的程式發生問題,請使用loose-
前綴指定它。[client] loose-local-infile=0
或
[client] loose-local-infile=1
在所有情況下,客戶端成功使用
LOCAL
載入操作也需要伺服器允許本機載入。
如果在伺服器或客戶端停用 LOCAL
功能,嘗試發出 LOAD DATA LOCAL
語法的客戶端會收到以下錯誤訊息:
ERROR 3950 (42000): Loading local data is disabled; this must be
enabled on both the client and server side
MySQL 客戶端函式庫允許客戶端應用程式將本機資料載入操作限制於指定目錄中的檔案。某些 MySQL 客戶端程式會利用此功能。
使用 C API 的客戶端程式可以使用 mysql_options()
C API 函式的 MYSQL_OPT_LOCAL_INFILE
和 MYSQL_OPT_LOAD_DATA_LOCAL_DIR
選項來控制允許載入資料的檔案(請參閱 mysql_options())。
MYSQL_OPT_LOAD_DATA_LOCAL_DIR
的效果取決於是否啟用或停用 LOCAL
資料載入:
如果啟用
LOCAL
資料載入,無論是透過 MySQL 客戶端函式庫中的預設值,還是透過明確啟用MYSQL_OPT_LOCAL_INFILE
,MYSQL_OPT_LOAD_DATA_LOCAL_DIR
選項都無效。如果停用
LOCAL
資料載入,無論是透過 MySQL 客戶端函式庫中的預設值,還是透過明確停用MYSQL_OPT_LOCAL_INFILE
,可以使用MYSQL_OPT_LOAD_DATA_LOCAL_DIR
選項來指定本機載入檔案的允許目錄。在這種情況下,允許LOCAL
資料載入,但僅限於指定目錄中的檔案。對MYSQL_OPT_LOAD_DATA_LOCAL_DIR
值的解讀如下:如果值為空指標(預設值),則表示不指定任何目錄,因此不允許任何檔案進行
LOCAL
資料載入。如果值為目錄路徑名稱,則允許
LOCAL
資料載入,但僅限於命名目錄中的檔案。不論基礎檔案系統的大小寫敏感度如何,目錄路徑名稱與要載入檔案的路徑名稱之間的比較都是區分大小寫的。
MySQL 客戶端程式使用上述的 mysql_options()
選項,如下所示:
mysql 客戶端有一個
--load-data-local-dir
選項,該選項接受目錄路徑或空字串。mysql 使用選項值來設定MYSQL_OPT_LOAD_DATA_LOCAL_DIR
選項(空字串會將值設定為空指標)。--load-data-local-dir
的效果取決於是否啟用LOCAL
資料載入:如果啟用
LOCAL
資料載入,無論是透過 MySQL 客戶端函式庫中的預設值,還是透過指定--local-infile[=1]
,--load-data-local-dir
選項都會被忽略。如果停用
LOCAL
資料載入,無論是透過 MySQL 客戶端函式庫中的預設值,還是透過指定--local-infile=0
,--load-data-local-dir
選項都會生效。
當
--load-data-local-dir
生效時,選項值會指定本機資料檔案必須所在的目錄。不論基礎檔案系統的大小寫敏感度如何,目錄路徑名稱與要載入檔案的路徑名稱之間的比較都是區分大小寫的。如果選項值為空字串,則表示不指定任何目錄,因此不允許任何檔案進行本機資料載入。mysqlimport 會為其處理的每個檔案設定
MYSQL_OPT_LOAD_DATA_LOCAL_DIR
,使包含該檔案的目錄成為允許的本機載入目錄。對於對應於
LOAD DATA
語法的資料載入操作,mysqlbinlog 會從二進位日誌事件中提取檔案,將它們作為暫存檔案寫入本機檔案系統,並寫入LOAD DATA LOCAL
語法以使這些檔案被載入。預設情況下,mysqlbinlog 會將這些暫存檔案寫入作業系統特定的目錄。--local-load
選項可用於明確指定 mysqlbinlog 應準備本機暫存檔案的目錄。由於其他程序可能會將檔案寫入預設的系統特定目錄,因此建議使用
--local-load
選項來指定 mysqlbinlog 的資料檔案使用不同的目錄,然後在處理來自 mysqlbinlog 的輸出時,透過指定--load-data-local-dir
選項來指定相同的目錄給 mysql。
MySQL Shell 提供了許多工具來傾印表格、結構描述或伺服器實例,並將它們載入到其他實例中。當您使用這些工具處理資料時,MySQL Shell 提供了額外的功能,例如輸入預處理、多執行緒平行載入、檔案壓縮和解壓縮,以及處理對 Oracle Cloud Infrastructure Object Storage 儲存桶的存取。為了獲得最佳功能,請始終使用 MySQL Shell 的傾印和傾印載入工具的最新可用版本。
MySQL Shell 的資料上傳工具使用 LOAD DATA LOCAL INFILE
陳述式來上傳資料,因此目標伺服器實例上的 local_infile
系統變數必須設定為 ON
。您可以在上傳資料之前執行此操作,然後在之後再次移除。這些工具會安全地處理檔案傳輸請求,以應對本主題中討論的安全性考量。
MySQL Shell 包括以下傾印和傾印載入工具:
- 表格匯出工具
util.exportTable()
將 MySQL 關聯式表格匯出到資料檔案中,該檔案可以使用 MySQL Shell 的平行表格匯入工具上傳到 MySQL 伺服器實例,匯入到不同的應用程式,或用作邏輯備份。此工具具有預設選項和自訂選項,可以產生不同的輸出格式。
- 平行表格匯入工具
util.importTable()
將資料檔案匯入到 MySQL 關聯式表格中。資料檔案可以是 MySQL Shell 的表格匯出工具的輸出,或是工具的預設和自訂選項所支援的另一種格式。此工具可以在將資料新增到表格之前執行輸入預處理。它可以接受多個資料檔案以合併到單一關聯式表格中,並自動解壓縮壓縮檔案。
- 實例傾印工具
util.dumpInstance()
、結構描述傾印工具util.dumpSchemas()
和表格傾印工具util.dumpTables()
將實例、結構描述或表格匯出到一組傾印檔案,然後可以使用 MySQL Shell 的傾印載入工具將其上傳到 MySQL 實例。這些工具提供 Oracle Cloud Infrastructure Object Storage 串流、HeatWave Service 相容性檢查和修改,以及執行試執行以在繼續傾印之前識別問題的功能。
- 傾印載入工具
util.loadDump()
將使用 MySQL Shell 的實例、結構描述或表格傾印工具建立的傾印檔案匯入到 HeatWave Service DB 系統或 MySQL Server 實例中。此工具管理上傳過程,並提供來自遠端儲存的資料串流、表格或表格區塊的平行載入、進度狀態追蹤、恢復和重置功能,以及在傾印仍在進行時同時載入的選項。MySQL Shell 的平行表格匯入工具可以與傾印載入工具結合使用,以在將資料上傳到目標 MySQL 實例之前修改資料。
有關這些工具的詳細資訊,請參閱MySQL Shell 工具。