2008-12-01 14 views
7

這讓我有點瘋狂:我在一臺服務器上執行了分區表的mysqldump,將生成的SQL轉儲移至另一臺服務器,並嘗試運行插入。它失敗了,但我很難弄清楚爲什麼。谷歌和MySQL論壇和文檔沒有太大的幫助。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)) */; 

的錯誤是:

ERROR 1(HY000):能否」牛逼創建/寫入文件 '/opt/data/data2/idx_foo/my_precious_table#P#p0#SP#foo0.MYI'(ERRCODE:13)

「無法創建/寫入文件」 看着像權限問題但對目標文件夾的權限看起來如此:

drwxrwxrwx 2 mysql mysql 4096 Dec 1 16:24 data_foo 
drwxrwxrwx 2 mysql mysql 4096 Dec 1 16:25 idx_foo 

對於踢,我試着chowning根:根和我自己。這並沒有解決這個問題。

源MySQL服務器版本是5.1.22-rc-log。目標服務器是5.1.29-rc-community。兩者都在最近的CentOS安裝中運行。

編輯:多一點研究表明Errcode 13實際上是一個權限錯誤。但是我怎麼能在rwxrwxrwx上得到?

編輯:比爾卡爾文的出色建議沒有出來。我以root用戶身份工作,並設置了所有權限標誌。

編輯:創建表,而對於個別分區指定數據目錄的作品 - 但我需要把這些分區不是在此MySQL實例在默認情況下把表的一個更大的磁盤上。我不能在表級別指定DATA/INDEX DIRECTORY - 這在我使用的MySQL版本(5.1.29-rc-community)中不合法。

編輯:最後遇到了答案,這要歸功於MySQL郵件列表和內部IT人員。見下文。

+1

確定路徑正確嗎? – 2008-12-01 22:26:56

+0

是的。我已經不止一次地檢查過。 – bradheintz 2008-12-01 22:50:59

回答

2

事實證明,這是一個SElinux問題 - 我的所有文件系統權限都很好,但是存在針對訪問該磁盤分區的MySQL的更高級別的策略集。教程:如果您有權限問題,但所有權和文件系統權限顯然是正確的,請查看SElinux。

3

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

您還將收到運行查詢 MySQL的用戶ID的錯誤消息 沒有「數據文件」的權限 ,允許用戶ID寫入 文件系統。

換句話說,它可能是與SQL權限有關的權限問題,而不是操作系統文件權限。

+0

謝謝。我以root用戶身份運行,並且快速檢查USER表顯示我擁有所有權限(包括File_priv)設置爲true。另外,FILE特權(不存在一個稱爲DATA FILE的特性)允許您使用LOAD DATA INFILE和SELECT ... INTO OUTFILE語句 - 從表創建中分離問題。 – bradheintz 2008-12-01 22:53:49

4

Ubuntu的窺視的AppArmor設置爲MySQL

vi /etc/apparmor.d/usr.sbin.mysql 

這應該解決的權限問題。對於快速測試,你甚至可以嘗試

/etc/init.d/apparmor stop 

但是不要忘記重新啓動服務。

這花了我一些時間弄清楚。在閱讀「SELinux」後,很明顯我忘記了Ubuntu上的這種新型保護。