7

あるサーバーでパーティション化されたテーブルの 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 スタッフのおかげで、最終的に答えにたどり着きました。下記参照。

4

3 に答える 3

3

http://bugs.mysql.com/bug.php?id=19557

また、クエリを実行している MySQL ユーザー ID には、ユーザー ID にファイル システムへの書き込みを許可する「DATA FILE」権限がないというエラー メッセージが表示されます。

つまり、オペレーティング システムのファイル権限ではなく、SQL 権限に関する権限の問題である可能性があります。

于 2008-12-01T22:43:17.680 に答える
2

これは SElinux の問題であることが判明しました。私のファイルシステムのアクセス許可はすべて問題ありませんでしたが、そのディスク パーティションにアクセスする MySQL に対して設定された上位レベルのポリシーがありました。

教訓: パーミッションの問題があり、所有権とファイルシステムのパーミッションが明らかに正しい場合は、SElinux を検討してください。

于 2008-12-09T19:43:02.763 に答える