文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  IMPORT TABLE 陳述式

15.2.6 IMPORT TABLE 陳述式

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 表格,名稱為 employeesmanagers 的表格匯出,並匯入到另一個伺服器的 hr 綱要中。此範例使用以下假設(若要在您自己的系統上執行類似的操作,請根據需要修改路徑名稱)

  • 對於匯出伺服器,export_basedir 代表其基本目錄,而其資料目錄為 export_basedir/data

  • 對於匯入伺服器,import_basedir 代表其基本目錄,而其資料目錄為 import_basedir/data

  • 表格檔案從匯出伺服器匯出到 /tmp/export 目錄,且此目錄是安全的(其他使用者無法存取)。

  • 匯入伺服器使用 /tmp/mysql-files 作為其 secure_file_priv 系統變數所命名的目錄。

若要從匯出伺服器匯出表格,請使用此程序

  1. 執行此語句以鎖定表格,確保一致的快照,以便在匯出期間無法修改表格

    mysql> FLUSH TABLES hr.employees, hr.managers WITH READ LOCK;

    在鎖定生效期間,表格仍然可以使用,但僅限於讀取存取。

  2. 在檔案系統層級,將 .sdi 和表格內容檔案從 hr 綱要目錄複製到安全的匯出目錄

    • .sdi 檔案位於 hr 綱要目錄中,但其基本名稱可能與表格名稱不完全相同。例如,employeesmanagers 表格的 .sdi 檔案可能分別命名為 employees_125.sdimanagers_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
  3. 解除鎖定表格

    mysql> UNLOCK TABLES;

若要將表格匯入到匯入伺服器,請使用此程序

  1. 匯入綱要必須存在。如有必要,請執行此語句來建立它

    mysql> CREATE SCHEMA hr;
  2. 在檔案系統層級,將 .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
  3. 透過執行 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 DIRECTORYINDEX DIRECTORY 表格選項,否則表格資料和索引檔案必須在匯入操作之前放置在匯入伺服器的綱要目錄中。在這種情況下,請在使用 IMPORT TABLE 語句之前,使用以下替代方案之一修改匯入程序

  • 將資料和索引檔案放在匯入伺服器主機上與匯出伺服器主機上相同的目錄中,並在匯入伺服器綱要目錄中建立指向這些檔案的符號連結。

  • 將資料和索引檔案放在與匯出伺服器主機不同的匯入伺服器主機目錄中,並在匯入伺服器綱要目錄中建立指向這些檔案的符號連結。此外,修改 .sdi 檔案以反映不同的檔案位置。

  • 將資料和索引檔案放在匯入伺服器主機上的綱要目錄中,並修改 .sdi 檔案以移除資料和索引目錄表格選項。

儲存在 .sdi 檔案中的任何定序 ID 必須參照匯出和匯入伺服器上的相同定序。

表格的觸發程序資訊不會序列化到表格 .sdi 檔案中,因此觸發程序不會透過匯入操作還原。

在執行 IMPORT TABLE 語句之前,可以對 .sdi 檔案進行一些編輯,而其他編輯則是有問題的,甚至可能會導致匯入操作失敗

  • 如果資料和索引檔案的位置在匯出和匯入伺服器之間有所不同,則需要變更資料目錄和索引目錄表格選項。

  • 如果要在匯入伺服器上匯入與匯出伺服器上不同的綱要中的表格,則需要變更綱要名稱。

  • 可能需要變更綱要和表格名稱,以適應匯出和匯入伺服器上檔案系統區分大小寫語意之間的差異,或 lower_case_table_names 設定中的差異。變更 .sdi 檔案中的表格名稱也可能需要重新命名表格檔案。

  • 在某些情況下,允許變更欄位定義。變更資料類型很可能會導致問題。