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
を使用します。
エクスポートサーバーからテーブルをエクスポートするには、この手順を使用します:
-
エクスポート中に変更できないように、次のステートメントを実行してテーブルをロックし、一貫性のあるスナップショットを確認します:
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
インデックスファイルです。
これらのファイル名を指定すると、コピーコマンドは次のようになります:
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
-
テーブルのロックを解除します:
mysql> UNLOCK TABLES;
インポートサーバーにテーブルをインポートするには、次の手順を使用します:
-
インポートスキーマが存在する必要があります。 必要に応じて、次のステートメントを実行して作成します:
mysql> CREATE SCHEMA hr;
-
ファイルシステムレベルで、
.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
-
.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
ファイルのテーブル名を変更する場合は、テーブルファイルの名前も変更する必要があります。場合によっては、カラム定義の変更が許可されます。 データ型を変更すると、問題が発生する可能性があります。