Question

I moved my bin-logs to a different folder:

log-bin = /storage/mysql/bin-log
log-bin-index = /storage/mysql/bin-log.index

When I try to start mysqld I get this:

/usr/libexec/mysqld: File '/storage/mysql/bin-log.index' not found (Errcode: 13)

Permissions for the files and directory are fine, sudo -u mysql touch /storage/mysql/bin-log.index is working fine and there is no apparmor installed.

Any ideas what could cause this?

Was it helpful?

Solution

SELinux was installed and it didn't allow access to those files.

Disabling it solves the problem.

OTHER TIPS

Based on this documentation from Red Hat: Chapter 3. SELinux Contexts and man page reading:

I want to have logfiles in /var/log/mysql instead of /var/log/mariadb and leave SELinux enabled.

The newly created log directory /var/log/mysql will by default be unaccessible to MySQL server due to SELinux.

So:

grep for string setroubleshoot in /var/log/ and run the indicated sealert commands to find details on the actual SELinux problem you observe.

For example:

sealert -l 141804b3-9ae5-4484-be0b-741fc558ff6d
SELinux is preventing /usr/libexec/mysqld from 'read, write' accesses on the file bin_hull03.index.

*****  Plugin catchall (100. confidence) suggests   **************************

If you believe that mysqld should be allowed read write access on the bin_hull03.index file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'mysqld' --raw | audit2allow -M my-mysqld
# semodule -i my-mysqld.pp


Additional Information:
...

This is not necessarily helpful in this case.

Use ls -lZ to find out what the context of /var/log/mysql is relative to /var/log/mariadb:

# ls -lZ /var/log/mysql /var/log/mariadb
drwxrwx---. root mysql unconfined_u:object_r:var_log_t:s0 mysql
drwxr-x---. mysql mysql system_u:object_r:mysqld_log_t:s0 mariadb

Now adapt the file context of the tree /var/log/mysql.

Check what its supposed value is by retrieving the context for /var/log/mariadb from the SELinux config database:

# semanage fcontext --list | egrep '/var/log/(mysql|mariadb)'
/var/log/mysql.*       regular file  system_u:object_r:mysqld_log_t:s0 
/var/log/mysql(/.*)?   all files     system_u:object_r:mysqld_log_t:s0

Add an entry to the SELinux settings database to define the context of the new file tree:

# semanage fcontext --add -s system_u -t mysqld_log_t  '/var/log/mysql(/.*)?'
semanage fcontext --list | egrep '/var/log/(mysql|mariadb)'
/var/log/mysql.*        regular file   system_u:object_r:mysqld_log_t:s0 
/var/log/mariadb(/.*)?  all files      system_u:object_r:mysqld_log_t:s0 
/var/log/mysql(/.*)?    all files      system_u:object_r:mysqld_log_t:s

Set SELinux attributes recursively on the new file tree itself:

restorecon -r -F /var/log/mysql/

This gives what we want:

# ls -lZR /var/log/mysql/
/var/log/mysql/:
drwxrwx---. root  mysql system_u:object_r:mysqld_log_t:s0 binary
drwxrwx---. root  mysql system_u:object_r:mysqld_log_t:s0 general
-rw-rw----. mysql mysql system_u:object_r:mysqld_log_t:s0 mysqld_safe_log.err
drwxrwx---. root  mysql system_u:object_r:mysqld_log_t:s0 relay
-rw-rw----. mysql mysql system_u:object_r:mysqld_log_t:s0 server.err
drwxrwx---. root  mysql system_u:object_r:mysqld_log_t:s0 slow

/var/log/mysql/binary:
-rw-rw----. mysql mysql system_u:object_r:mysqld_log_t:s0 bin_hull03.000001
-rw-rw----. mysql mysql system_u:object_r:mysqld_log_t:s0 bin_hull03.000002
-rw-rw----. mysql mysql system_u:object_r:mysqld_log_t:s0 bin_hull03.index

/var/log/mysql/general:

/var/log/mysql/relay:

/var/log/mysql/slow:
Licensed under: CC-BY-SA with attribution
Not affiliated with dba.stackexchange
scroll top