Opcja konfiguracji pliku inicjującego mysql podająca błąd nie znaleziono pliku

11

Chcę mieć skrypt SQL uruchamiany przy każdym uruchomieniu mysql, ale nie mogę go uruchomić w Ubuntu 11.10.

Dodałem opcję „ init-file ” do pliku konfiguracyjnego mysql:

> sudo emacs -nw /etc/mysql/my.cnf
...
[mysqld]
init-file=/etc/mysql/mysqlinit.sql
...

Ale po ponownym uruchomieniu mysql kończy się niepowodzeniem z błędem „ Nie znaleziono pliku ”:

> tail /var/log/mysql/error.log
111111  7:41:06 [ERROR] /usr/sbin/mysqld: File '/etc/mysql/mysqlinit.sql' not found (Errcode: 13)
111111  7:41:06 [ERROR] Aborting

Ale plik z pewnością istnieje i można go odczytać:

> ls -l /etc/mysql/mysqlinit.sql
-rwxr-xr-x 1 mysql mysql 30 2011-11-09 05:06 /etc/mysql/mysqlinit.sql

Wszelkie pomysły, jak to rozwiązać? Czy to dziwność Ubuntu, czy zrobiłem coś głupiego?


Informacje:

Używam Ubuntu 11.10 i MySQL 5.1.

> mysqld --version
mysqld  Ver 5.1.58-1ubuntu1 for debian-linux-gnu on x86_64 ((Ubuntu))
Tomek
źródło
Jaka jest wydajność file /etc/mysql/mysqlinit.sql?
kwanty
file /etc/mysql/mysqlinit.sqldaje „/etc/mysql/mysqlinit.sql: tekst ASCII, bez terminatorów linii”
Tom
Aby zawęzić problem, po prostu spróbuj przenieść go do /tmpfolderu, aby zobaczyć, co się stanie. Czy korzystasz z AppArmor?
kwanty
Próbowałem użyć pliku init, /tmpale bez powodzenia. Tak, myślę, że Ubuntu używa AppArmor.
Tom
1
Jeśli tak, spróbuj zatrzymać AppArmor i sprawdź, czy błąd nie zniknie.
kwanty

Odpowiedzi:

14

Dzięki @quanta, problem był naprawdę przerażający.

Aby rozwiązać problem:

Edytuj plik aplikacji mysql:

sudo emacs -nw /etc/apparmor.d/usr.sbin.mysqld

Dołącz folder, w którym znajduje się plik init, z rozszerzeniem * .sql:

...
/usr/sbin/mysqld {
    /var/log/mysql.log rw,
    /var/log/mysql.err rw,
    ;/var/lib/mysql/ r,
    /var/lib/mysql/** rwk,
    /var/log/mysql/ r,
    /var/log/mysql/* rw,
    /{,var/}run/mysqld/mysqld.pid w,
    /{,var/}run/mysqld/mysqld.sock w,

    /sys/devices/system/cpu/ r,

    # I added to allow my init-file script to run
    /etc/mysql/*.sql r,
}

A następnie spraw, aby AppArmor ponownie załadował profile.

# sudo /etc/init.d/apparmor reload

Następnie ponownie załaduj mysql:

sudo /etc/init.d/mysql restart

Teraz plik inicjujący zostaje wykonany. Tak!

Tomek
źródło