IMPORT TABLE FROM sdi_file [, sdi_file] ...
IMPORT TABLE
陳述式會根據 .sdi
(序列化字典資訊) 中繼資料檔案中包含的資訊匯入 MyISAM
資料表。IMPORT TABLE
需要 FILE
權限才能讀取 .sdi
和資料表內容檔案,以及需要 CREATE
權限才能建立資料表。
可以使用 mysqldump 從一個伺服器匯出資料表,以寫入 SQL 陳述式檔案,然後使用 mysql 將傾印檔案處理後匯入另一個伺服器。IMPORT TABLE
提供使用 「原始」 資料表檔案的更快替代方案。
在匯入之前,提供表格內容的檔案必須放置在匯入伺服器適當的結構描述目錄中,且 .sdi
檔案必須位於伺服器可存取的目錄中。例如,.sdi
檔案可以放置在由 secure_file_priv
系統變數指定的目錄中,或者(如果 secure_file_priv
為空)放置在伺服器資料目錄下的目錄中。
以下範例描述如何從一個伺服器的 hr
結構描述匯出名為 employees
和 managers
的 MyISAM
表格,並將其匯入另一個伺服器的 hr
結構描述。此範例使用以下假設(若要在您自己的系統上執行類似操作,請適當修改路徑名稱)
對於匯出伺服器,
export_basedir
代表其基礎目錄,而其資料目錄為
。export_basedir
/data對於匯入伺服器,
import_basedir
代表其基礎目錄,而其資料目錄為
。import_basedir
/data表格檔案從匯出伺服器匯出到
/tmp/export
目錄,且此目錄是安全的(其他使用者無法存取)。匯入伺服器使用
/tmp/mysql-files
作為其secure_file_priv
系統變數指定的目錄。
若要從匯出伺服器匯出表格,請使用以下程序
執行此語句以鎖定表格,使其在匯出期間無法修改,藉此確保一致的快照
mysql> FLUSH TABLES hr.employees, hr.managers WITH READ LOCK;
在鎖定生效期間,表格仍然可以使用,但僅限於讀取存取。
在檔案系統層級,將
.sdi
和表格內容檔案從hr
結構描述目錄複製到安全的匯出目錄.sdi
檔案位於hr
結構描述目錄中,但可能與表格名稱的基礎名稱不完全相同。例如,employees
和managers
表格的.sdi
檔案可能命名為employees_125.sdi
和managers_238.sdi
。對於
MyISAM
表格,內容檔案為其.MYD
資料檔案和.MYI
索引檔案。
給定這些檔案名稱,複製指令看起來會像這樣
$> cd export_basedir/data/hr $> cp employees_125.sdi /tmp/export $> cp managers_238.sdi /tmp/export $> cp employees.{MYD,MYI} /tmp/export $> cp managers.{MYD,MYI} /tmp/export
解除表格鎖定
mysql> UNLOCK TABLES;
若要將表格匯入到匯入伺服器,請使用以下程序
匯入結構描述必須存在。如有必要,請執行此語句來建立它
mysql> CREATE SCHEMA hr;
在檔案系統層級,將
.sdi
檔案複製到匯入伺服器的secure_file_priv
目錄/tmp/mysql-files
。此外,將表格內容檔案複製到hr
結構描述目錄$> cd /tmp/export $> cp employees_125.sdi /tmp/mysql-files $> cp managers_238.sdi /tmp/mysql-files $> cp employees.{MYD,MYI} import_basedir/data/hr $> cp managers.{MYD,MYI} import_basedir/data/hr
執行命名
.sdi
檔案的IMPORT TABLE
語句,以匯入表格mysql> IMPORT TABLE FROM '/tmp/mysql-files/employees.sdi', '/tmp/mysql-files/managers.sdi';
如果 secure_file_priv
系統變數為空,則 .sdi
檔案不必放置在匯入伺服器由該變數指定的目錄中;它可以位於伺服器可存取的任何目錄中,包括匯入表格的結構描述目錄。然而,如果將 .sdi
檔案放置在該目錄中,則可能會被覆寫;匯入操作會為表格建立新的 .sdi
檔案,如果操作對新檔案使用相同的檔案名稱,則會覆寫舊的 .sdi
檔案。
每個 sdi_file
值都必須是一個字串常值,用於命名表格的 .sdi
檔案,或是一個符合 .sdi
檔案的模式。如果字串是一個模式,則任何開頭的目錄路徑和 .sdi
檔案名稱後綴都必須逐字給定。模式字元僅允許出現在檔案名稱的基礎名稱部分
?
符號符合任何單一字元*
符號符合任何字元序列,包括沒有字元
使用模式,先前的 IMPORT TABLE
語句可以像這樣寫(假設 /tmp/mysql-files
目錄中沒有其他符合該模式的 .sdi
檔案)
IMPORT TABLE FROM '/tmp/mysql-files/*.sdi';
為了詮釋 .sdi
檔案路徑名稱的位置,伺服器會對 IMPORT TABLE
使用與 LOAD DATA
相同的伺服器端規則(也就是,非-LOCAL
規則)。請參閱第 15.2.9 節「LOAD DATA 語句」,特別注意用於詮釋相對路徑名稱的規則。
如果找不到 .sdi
或表格檔案,則 IMPORT TABLE
會失敗。在匯入表格後,伺服器會嘗試開啟它,並報告偵測到的任何問題作為警告。若要嘗試修復以更正任何回報的問題,請使用 REPAIR TABLE
。
IMPORT TABLE
不會寫入二進制日誌。
IMPORT TABLE
僅適用於非 TEMPORARY
MyISAM
表格。它不適用於使用交易式儲存引擎建立的表格、使用 CREATE TEMPORARY TABLE
建立的表格,或檢視。
匯入操作中使用的 .sdi
檔案必須在與匯入伺服器具有相同資料字典版本和 sdi 版本的伺服器上產生。產生伺服器的版本資訊可在 .sdi
檔案中找到
{
"mysqld_version_id":80019,
"dd_version":80017,
"sdi_version":80016,
...
}
若要判斷匯入伺服器的資料字典和 sdi 版本,您可以檢查匯入伺服器上最近建立的表格的 .sdi
檔案。
表格資料和索引檔案必須在匯入操作之前放置在匯入伺服器的結構描述目錄中,除非匯出伺服器上定義的表格使用 DATA DIRECTORY
或 INDEX DIRECTORY
表格選項。在這種情況下,請在使用 IMPORT TABLE
語句之前,使用以下其中一種替代方案修改匯入程序
將資料和索引檔案放置在匯入伺服器主機上與匯出伺服器主機上相同的目錄中,並在匯入伺服器結構描述目錄中建立指向這些檔案的符號連結。
將資料和索引檔案放置在匯入伺服器主機上與匯出伺服器主機上不同的目錄中,並在匯入伺服器結構描述目錄中建立指向這些檔案的符號連結。此外,修改
.sdi
檔案以反映不同的檔案位置。將資料和索引檔案放置在匯入伺服器主機上的結構描述目錄中,並修改
.sdi
檔案以移除資料和索引目錄表格選項。
儲存在 .sdi
檔案中的任何定序 ID 都必須參照匯出和匯入伺服器上相同的定序。
表格的觸發資訊不會序列化到表格 .sdi
檔案中,因此觸發器不會透過匯入操作還原。
在執行 IMPORT TABLE
語句之前,允許對 .sdi
檔案進行一些編輯,而其他編輯則存在問題或甚至可能導致匯入操作失敗
如果資料和索引檔案的位置在匯出和匯入伺服器之間不同,則需要變更資料目錄和索引目錄表格選項。
如果要在匯入伺服器上將表格匯入與匯出伺服器上不同的結構描述中,則需要變更結構描述名稱。
可能需要變更結構描述和表格名稱,以適應匯出和匯入伺服器上檔案系統區分大小寫語義的差異,或
lower_case_table_names
設定的差異。變更.sdi
檔案中的表格名稱也可能需要重新命名表格檔案。在某些情況下,允許變更資料行定義。變更資料類型可能會導致問題。