Tùy chọn cấu hình init-file mysql không tìm thấy tệp


11

Tôi muốn có một tập lệnh SQL chạy bất cứ khi nào mysql khởi động nhưng tôi không thể làm cho nó hoạt động trong Ubuntu 11.10.

Tôi đã thêm tùy chọn " init-file " vào tệp cấu hình mysql:

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

Nhưng khi tôi khởi động lại mysql, nó không thành công với lỗi " Không tìm thấy tệp ":

> 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

Nhưng tập tin chắc chắn tồn tại và có thể đọc được:

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

Bất kỳ ý tưởng làm thế nào để giải quyết điều này? Đây có phải là một sự kỳ quặc của Ubuntu hay tôi đã làm điều gì đó ngớ ngẩn?


Thông tin:

Tôi đang chạy Ubuntu 11.10 và MySQL 5.1.

> mysqld --version
mysqld  Ver 5.1.58-1ubuntu1 for debian-linux-gnu on x86_64 ((Ubuntu))

Đầu ra của là file /etc/mysql/mysqlinit.sqlgì?
lượng tử

file /etc/mysql/mysqlinit.sqlđưa ra "/etc/mysql/mysqlinit.sql: văn bản ASCII, không có dấu kết thúc dòng"
Tom

Để thu hẹp vấn đề, chỉ cần cố gắng di chuyển nó vào /tmpthư mục để xem điều gì xảy ra. Bạn đang chạy AppArmor?
lượng tử

Tôi đã thử sử dụng một tập tin init /tmpnhưng không có may mắn. Vâng, tôi nghĩ Ubuntu sử dụng AppArmor.
Tom

1
Nếu vậy, hãy thử dừng AppArmor và xem lỗi có biến mất không.
lượng tử

Câu trả lời:


14

Cảm ơn @quanta, vấn đề thực sự là apparmor.

Để khắc phục sự cố:

Chỉnh sửa tập tin apparmor mysql:

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

Bao gồm thư mục nơi tệp init của bạn sống với phần mở rộng * .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,
}

Và sau đó làm cho AppArmor tải lại hồ sơ.

# sudo /etc/init.d/apparmor reload

Sau đó tải lại mysql:

sudo /etc/init.d/mysql restart

Bây giờ tập tin init được thực thi. Yay!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.