2008-12-01 13 views
7

To powoduje, że jestem szalony: Zrobiłem mysqldump tabeli partycjonowanej na jednym serwerze, przeniosłem wynikowy zrzut SQL na inny serwer i próbowałem uruchomić insert. Zawodzi, ale mam problem z ustaleniem, dlaczego. Google i fora i dokumenty MySQL nie były pomocne.Problem z licencjami MySQL - nie powinien być problemem.

upadającego kwerendy wygląda następująco (obcięty na zwięzłość i przejrzystość, nazwy zmienione w celu ochrony niewinnych):

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)) */; 

Błąd jest:

BŁĄD 1 (HY000): Czy” t tworzyć/zapis do pliku '/opt/data/data2/idx_foo/my_precious_table#P#p0#SP#foo0.MYI' (Errcode: 13)

"nie można utworzyć/zapisu do pliku" wyglądał jak problem z uprawnieniami do mnie, ale uprawnienia do folderów docelowych wyglądać tak:

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

dla zabawy, próbowałem Chowning root: root i siebie. To nie rozwiązało problemu.

Źródłowy serwer MySQL to wersja 5.1.22-rc-log. Serwer docelowy to społeczność 5.1.29-rc. Oba działają na ostatnich instalacjach CentOS.

Edytuj: Trochę więcej badań pokazuje, że Errcode 13 jest w rzeczywistości błędem uprawnień. Ale jak mogę to uzyskać na rwxrwxrwx?

Edytuj: Doskonała sugestia Billa Karwina nie zniknęła. Pracuję jako użytkownik root i mam ustawione wszystkie flagi uprawnień.

Edit: tworzenia tabeli bez określania katalogów danych dla poszczególnych partycji działa - ale muszę umieścić te partycje na dysku większego niż ten, na którym ta instancja MySQL stawia tabele domyślnie. I nie mogę po prostu podać DATA/INDEX DIRECTORY na poziomie tabeli - to nie jest legalne w wersji MySQL, której używam (5.1.29-rc-community).

Edytuj: Wreszcie udało się znaleźć odpowiedź, dzięki liście mailingowej MySQL i wewnętrznemu personelowi IT. Zobacz poniżej.

+1

Czy na pewno ścieżka jest poprawna? –

+0

Tak. Sprawdziłem to więcej niż jeden raz. – bradheintz

Odpowiedz

2

Okazało się, że jest to kwestia SElinux - wszystkie moje uprawnienia do systemu plików były w porządku, ale istniał wyższy poziom zasad przeciwko MySQL uzyskując dostęp do tej partycji dysku.

Lekcja: Gdy masz problem z uprawnieniami, ale prawa własności i systemu plików są oczywiście poprawne, spójrz na SElinux.

+1

Szybko dochodzę do wniosku, że pierwszą rzeczą, którą należy zrobić w systemie Linux, jest 'setenforce 0'. –

3

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

będzie też komunikat o błędzie użytkownika ID MySQL uruchomiony zapytanie nie posiada „plik danych” przywileje które pozwala identyfikator użytkownika napisać do systemu plików.

Innymi słowy, może to być problem z uprawnieniami w odniesieniu do uprawnień SQL, a nie uprawnień do plików systemu operacyjnego.

+0

Dzięki. Pracuję jako root, a szybkie sprawdzenie tabeli USER pokazuje, że mam wszystkie uprawnienia (w tym File_priv) ustawione na true. Ponadto uprawnienie FILE (nie ma nazwy o nazwie DATA FILE) umożliwia użycie instrukcji LOAD DATA INFILE i SELECT ... INTO OUTFILE - oddzielny problem od utworzenia tabeli. – bradheintz

+0

Od 5.1 dokumentów: http://dev.mysql.com/doc/refman/5.1/en/privileges-provided.html – bradheintz

+0

Okey dokey, dobrze jest wykluczyć taką możliwość. Ale nie jestem pewien, co jeszcze zasugerować. –

4

Na Ubuntu zajrzeć do apparmor ustawień dla mysql

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

To powinno rozwiązać problemy z uprawnieniami. Aby przeprowadzić szybki test, można nawet wypróbować:

Ale nie zapomnij ponownie uruchomić usługi.

Zajęło mi to trochę czasu, aby dowiedzieć się. I po przeczytaniu "SELinux" było jasne, że zapomniałem o tym nowym rodzaju ochrony w Ubuntu.

Powiązane problemy