MySQL 8.0 リファレンスマニュアル


13.2.5 IMPORT TABLE ステートメント

IMPORT TABLE FROM sdi_file [, sdi_file] ...

IMPORT TABLE ステートメントは、.sdi (シリアライズディクショナリ情報) メタデータファイルに含まれる情報に基づいて MyISAM テーブルをインポートします。 IMPORT TABLE には、.sdi およびテーブルコンテンツファイルを読み取るための FILE 権限と、作成するテーブルに対する CREATE 権限が必要です。

mysqldump を使用してあるサーバーからテーブルをエクスポートし、SQL ステートメントのファイルを書き込み、mysql を使用して別のサーバーにインポートしてダンプファイルを処理できます。 IMPORT TABLE は、raw テーブルファイルを使用して、より高速な代替方法を提供します。

インポートする前に、テーブルの内容を提供するファイルをインポートサーバーの適切なスキーマディレクトリに配置し、.sdi ファイルをサーバーからアクセス可能なディレクトリに配置する必要があります。 たとえば、.sdi ファイルは、secure_file_priv システム変数で指定されたディレクトリ、または (secure_file_priv が空の場合は) サーバーデータディレクトリの下のディレクトリに配置できます。

次の例では、employees および managers という名前の MyISAM テーブルをあるサーバーの hr スキーマからエクスポートし、別のサーバーの hr スキーマにインポートする方法について説明します。 この例では、次の前提を使用しています (独自のシステムで同様の操作を実行するには、必要に応じてパス名を変更します):

  • エクスポートサーバーの場合、export_basedir はベースディレクトリを表し、そのデータディレクトリは export_basedir/data です。

  • インポートサーバーの場合、import_basedir はベースディレクトリを表し、そのデータディレクトリは import_basedir/data です。

  • テーブルファイルはエクスポートサーバーから/tmp/export ディレクトリにエクスポートされ、このディレクトリはセキュアです (他のユーザーはアクセスできません)。

  • インポートサーバーは、secure_file_priv システム変数で指定されたディレクトリとして/tmp/mysql-files を使用します。

エクスポートサーバーからテーブルをエクスポートするには、この手順を使用します:

  1. エクスポート中に変更できないように、次のステートメントを実行してテーブルをロックし、一貫性のあるスナップショットを確認します:

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

    ロックが有効な間は、テーブルは引き続き使用できますが、読取りアクセスにのみ使用できます。

  2. ファイルシステムレベルで、.sdi およびテーブルコンテンツファイルを hr スキーマディレクトリからセキュアエクスポートディレクトリにコピーします:

    • .sdi ファイルは hr スキーマディレクトリにありますが、テーブル名とまったく同じベース名を持っていない可能性があります。 たとえば、employees テーブルおよび managers テーブルの .sdi ファイルには、employees_125.sdi および managers_238.sdi という名前が付けられます。

    • MyISAM テーブルの場合、コンテンツファイルはその .MYD データファイルおよび .MYI インデックスファイルです。

    これらのファイル名を指定すると、コピーコマンドは次のようになります:

    shell> cd export_basedir/data/hr
    shell> cp employees_125.sdi /tmp/export
    shell> cp managers_238.sdi /tmp/export
    shell> cp employees.{MYD,MYI} /tmp/export
    shell> cp managers.{MYD,MYI} /tmp/export
  3. テーブルのロックを解除します:

    mysql> UNLOCK TABLES;

インポートサーバーにテーブルをインポートするには、次の手順を使用します:

  1. インポートスキーマが存在する必要があります。 必要に応じて、次のステートメントを実行して作成します:

    mysql> CREATE SCHEMA hr;
  2. ファイルシステムレベルで、.sdi ファイルをインポートサーバーの secure_file_priv ディレクトリ/tmp/mysql-files にコピーします。 また、テーブルコンテンツファイルを hr スキーマディレクトリにコピーします:

    shell> cd /tmp/export
    shell> cp employees_125.sdi /tmp/mysql-files
    shell> cp managers_238.sdi /tmp/mysql-files
    shell> cp employees.{MYD,MYI} import_basedir/data/hr
    shell> cp managers.{MYD,MYI} import_basedir/data/hr
  3. .sdi ファイルを指定する IMPORT TABLE ステートメントを実行して、テーブルをインポートします:

    mysql> IMPORT TABLE FROM
           '/tmp/mysql-files/employees.sdi',
           '/tmp/mysql-files/managers.sdi';

.sdi ファイルは、その変数が空の場合、secure_file_priv システム変数で指定されたインポートサーバーディレクトリに配置する必要はありません。インポートされたテーブルのスキーマディレクトリを含め、サーバーからアクセス可能な任意のディレクトリに配置できます。 ただし、.sdi ファイルがそのディレクトリに配置されている場合は、リライトされる可能性があります。インポート操作では、テーブルに対して新しい .sdi ファイルが作成され、操作で新しいファイルに同じファイル名が使用されている場合は古い .sdi ファイルが上書きされます。

sdi_file 値は、テーブルの .sdi ファイルを指定する文字列リテラルであるか、.sdi ファイルと一致するパターンである必要があります。 文字列がパターンの場合は、先頭のディレクトリパスおよび .sdi ファイル名の接尾辞を文字どおりに指定する必要があります。 パターン文字は、ファイル名のベース名部分でのみ使用できます:

  • ? は任意の 1 文字に一致します

  • * は、文字を含まない任意の文字シーケンスに一致

パターンを使用すると、前の IMPORT TABLE ステートメントが次のように記述されている可能性があります (/tmp/mysql-files ディレクトリにパターンに一致する他の .sdi ファイルが含まれていないことを前提としています):

IMPORT TABLE FROM '/tmp/mysql-files/*.sdi';

.sdi ファイルパス名の場所を解釈するために、サーバーは LOAD DATA のサーバー側ルールと同じルール (LOCAL 以外のルール) を IMPORT TABLE に使用します。 セクション13.2.7「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 ファイルにシリアライズされないため、インポート操作によってトリガーはリストアされません。

.sdi ファイルの一部の編集は IMPORT TABLE ステートメントの実行前に許可されますが、その他の編集は問題があるか、インポート操作が失敗する可能性があります:

  • データディレクトリおよびインデックスディレクトリテーブルオプションの変更は、データファイルとインデックスファイルの場所がエクスポートサーバーとインポートサーバーで異なる場合に必要です。

  • エクスポートサーバーとは異なるインポートサーバーのスキーマにテーブルをインポートするには、スキーマ名を変更する必要があります。

  • エクスポートサーバーとインポートサーバーでのファイルシステムの大/小文字の区別セマンティクスの違いや、lower_case_table_names 設定の違いに対応するために、スキーマ名とテーブル名の変更が必要になる場合があります。 .sdi ファイルのテーブル名を変更する場合は、テーブルファイルの名前も変更する必要があります。

  • 場合によっては、カラム定義の変更が許可されます。 データ型を変更すると、問題が発生する可能性があります。


関連キーワード:  ステートメント, テーブル, TABLE, サーバー, CREATE, ディレクトリ, DROP, IMPORT, スキーマ, tmp