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
綱要的 MyISAM
表格,名稱為 employees
和 managers
的表格匯出,並匯入到另一個伺服器的 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
透過執行
IMPORT TABLE
語句來匯入表格,該語句會指定.sdi
檔案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
檔案中的表格名稱也可能需要重新命名表格檔案。在某些情況下,允許變更欄位定義。變更資料類型很可能會導致問題。