a coder
a coder

Reputation: 7639

Unknown/unsupported storage engine: InnoDB

I'm setting up a replication server and when I try to start the mysql service for the first time, it fails:

[root@ravioli mysql]# service mysqld start
MySQL Daemon failed to start.
Starting mysqld:                                           [FAILED]
[root@ravioli mysql]# tail /var/log/mysqld.log 
151013 13:41:27 [ERROR] Plugin 'InnoDB' init function returned error.
151013 13:41:27 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
/usr/libexec/mysqld: File '/databases/mysql/mysql_slow_queries.log' not found (Errcode: 13)
151013 13:41:27 [ERROR] Could not use /databases/mysql/mysql_slow_queries.log for logging (error 13). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.
151013 13:41:27 [ERROR] Unknown/unsupported storage engine: InnoDB
151013 13:41:27 [ERROR] Aborting

151013 13:41:27 [Note] /usr/libexec/mysqld: Shutdown complete

151013 13:41:27 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

I confirmed that user mysql sees and is able to write to /databases/mysql/mysql_slow_queries.log.

Then I checked getenforce and see it is set to Enforcing.

How do I configure MySQL to play nicely with SELinux?

Upvotes: 20

Views: 66707

Answers (3)

Christopher Kikoti
Christopher Kikoti

Reputation: 2703

This can happen when your database is corrupted. You can fix this by deleting your entire database storage and starting again.

All I needed was to delete two files which are:

`ib_logfile0`

and

`ib_logfile1`

Then going back to start mysql and my database started without errors and was empty.

You may also need to delete other associated files such as: ibdata1, performance_schema/, undo001, undo002

Upvotes: 47

Anders B
Anders B

Reputation: 3457

This resolved my problem:

sudo apt-get remove --purge mysql-server mysql-client mysql-common
sudo apt-get autoremove
sudo apt-get autoclean

sudo rm /var/lib/mysql/ib_logfile0
sudo rm /var/lib/mysql/ib_logfile1

sudo apt-get install mysql-server

Upvotes: 3

a coder
a coder

Reputation: 7639

Ok this was actually much easier than expected.

By default SELinux is Enforcing, which prevents unexpected writes on the filesystem. I just needed to tell SELinux that it's OK for MySQL to write to a non-standard directory. To wit:

[root@ravioli]# semanage fcontext -a -t mysqld_db_t "/databases/mysql(/.*)?"
-bash: semanage: command not found.

Derp. To install semanage, use this:

yum install policycoreutils-python

Now run the command again. This may take a few moments...

[root@ravioli]# semanage fcontext -a -t mysqld_db_t "/databases/mysql(/.*)?"

Check to see that SELinux is configured for this new directory by looking at this config file:

[root@ravioli]#  grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local

/databases/mysql(/.*)?    system_u:object_r:mysqld_db_t:s0

Additional directories can be added, for instance if you have a dedicated tmp directory somewhere.

[root@ravioli]# semanage fcontext -a -t mysqld_db_t "/databases/mysql_tmp(/.*)?"

Check the config again:

[root@ravioli]# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local

/databases/mysql(/.*)?    system_u:object_r:mysqld_db_t:s0
/databases/mysql_tmp(/.*)?    system_u:object_r:mysqld_db_t:s0

Finally, update the permissions using restorecron

restorecon -R -v /www/databases/mysql/

and in my setup,

restorecon -R -v /www/databases/mysql_tmp/

Now issue:

service mysqld start

Bene.

Starting mysqld:         [  OK  ]

Upvotes: 2

Related Questions