mysql опция конфигурации файла инициализации, дающая файл не найден

11

Я хочу, чтобы скрипт SQL запускался при запуске mysql, но я не могу заставить его работать в Ubuntu 11.10.

Я добавил опцию « init-file » в файл конфигурации mysql:

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

Но когда я перезапускаю mysql, происходит сбой с ошибкой « Файл не найден »:

> 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

Но файл, безусловно, существует и доступен для чтения:

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

Есть идеи как решить это? Это странность Ubuntu или я сделал что-то глупое?


Информация:

Я использую Ubuntu 11.10 и MySQL 5.1.

> mysqld --version
mysqld  Ver 5.1.58-1ubuntu1 for debian-linux-gnu on x86_64 ((Ubuntu))
Том
источник
Какой выход file /etc/mysql/mysqlinit.sql?
кванты
file /etc/mysql/mysqlinit.sqlдает "/etc/mysql/mysqlinit.sql: текст ASCII, без разделителей строк"
Том
Чтобы сузить проблему, просто попробуйте переместить ее в /tmpпапку, чтобы увидеть, что происходит. Вы используете AppArmor?
кванты
Я попытался использовать init-файл, /tmpно не повезло. Да, я думаю, что Ubuntu использует AppArmor.
Том
1
Если это так, попробуйте остановить AppArmor и посмотреть, исчезнет ли ошибка.
кванты

Ответы:

14

Спасибо @quanta, проблема была действительно apparmor.

Чтобы исправить проблему:

Отредактируйте файл mysql apparmor:

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

Включите папку, в которой находится ваш init-файл с расширением * .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,
}

А затем заставьте AppArmor перезагрузить профили.

# sudo /etc/init.d/apparmor reload

Затем перезагрузите MySQL:

sudo /etc/init.d/mysql restart

Теперь init-файл исполняется. Ура!

Том
источник