あるサーバーでパーティション化されたテーブルの mysqldump を実行し、結果の SQL ダンプを別のサーバーに移動して、挿入を実行しようとしました。失敗しますが、その理由を理解するのに苦労しています。Google と MySQL のフォーラムとドキュメントはあまり役に立ちませんでした。
失敗したクエリは次のようになります (簡潔さと明確さのために省略されています。無実を保護するために名前が変更されています)。
CREATE TABLE `my_precious_table` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`somedata` varchar(20) NOT NULL,
`aTimeStamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`,`aTimeStamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='/opt/data/data2/data_foo/' INDEX DIRECTORY='/opt/data/data2/idx_foo/'
/*!50100 PARTITION BY RANGE (year(aTimeStamp)) SUBPARTITION BY HASH ( TO_DAYS(aTimeStamp))
(PARTITION p0 VALUES LESS THAN (2007) (SUBPARTITION foo0 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM),
PARTITION p1 VALUES LESS THAN (2008) (SUBPARTITION foo1 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM),
PARTITION p2 VALUES LESS THAN (2009) (SUBPARTITION foo2 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM),
PARTITION p3 VALUES LESS THAN MAXVALUE (SUBPARTITION foo3 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM)) */;
エラーは次のとおりです。
エラー 1 (HY000): ファイル '/opt/data/data2/idx_foo/my_precious_table#P#p0#SP#foo0.MYI' を作成/書き込みできません (エラーコード: 13)
「ファイルを作成/書き込みできません」は権限の問題のように見えましたが、ターゲットフォルダーの権限は次のようになります。
drwxrwxrwx 2 mysql mysql 4096 Dec 1 16:24 data_foo
drwxrwxrwx 2 mysql mysql 4096 Dec 1 16:25 idx_foo
念のため、root:root と自分自身にチャウニングしてみました。これで問題は解決しませんでした。
ソース MySQL サーバーはバージョン 5.1.22-rc-log です。宛先サーバーは 5.1.29-rc-community です。どちらも最近の CentOS インストールで実行されています。
編集: もう少し調査すると、Errcode 13 は実際には権限エラーであることがわかります。しかし、どうすればそれを手に入れることができrwxrwxrwx
ますか?
編集: Bill Karwin の優れた提案はうまくいきませんでした。私は root ユーザーとして作業しており、すべての特権フラグが設定されています。
編集: 個々のパーティションのデータ ディレクトリを指定せずにテーブルを作成すると機能しますが、これらのパーティションを、この MySQL インスタンスがデフォルトでテーブルを配置するディスクよりも大きなディスクに配置する必要があります。また、テーブル レベルで DATA/INDEX DIRECTORY を指定することはできません。これは、使用している MySQL のバージョン (5.1.29-rc-community) では合法ではありません。
編集: MySQL メーリング リストと内部 IT スタッフのおかげで、最終的に答えにたどり着きました。下記参照。