WordPress Error establishing a database connection is frequently faced problem. In our previous guides, we pointed to properly configure my.cnf, that is adding [mysqld_safe]
stanza at the end of my.cnf
file with socket, PID. For newer versions of MYSQL, we written guide for Percona MySQL to auto-restart. Newer Ubuntu, Debian installations do not automatically create the required debian-sys-maint user
for restart. In that installation guide, we tried address it. However, still MySQL may fail to auto restart after a crash! Here is one fallback way to autostart MySQL after a crash.
Autostart MySQL After a Crash : Reasons of Failure
Unfortunately, MySQL may start to fail depending on the error the crash happened!. In the above paragraph, we described one type of errors in configuration and absense of the required user to execute the work.
Corrupt MySQL binary can cause the MySQL server to fail. Ownership and permissions of the MySQL files such as binaries, logs may get itself changed during a version upgrade, which may lead to errors. The /tmp directory
should be checked for permission, space. Lack of disk space, not enough memory may fail the automatic restart process. A badly coded WordPress plugin may create odd situation. Self hosted analytics plugins may invite trouble.
---
Autostart MySQL After a Crash : Fallback Bash Script and Cron
Depending upon your situation, a fallback bash script and cron job to execute the script may act as additional layer for peace when chance to manually check the site too longer! You’ll notice during upgrades that Percona identifies ownself as :
1 2 3 | percona-server-client-x.y percona-server-common-x.y percona-server-server-x.y |
That often create confusion during complete removal (for re-installation). However, general purpose command :
1 | /etc/init.d/mysql status |
… works for all kind of MySQL forks. Compare the difference after running the above and below commands :
1 | service mysql status |
If you run :
1 | ls -l /etc/rc2.d | grep mysql |
You’ll get response like below :
1 | lrwxrwxrwx 1 root root 15 May 28 2017 S03mysql -> ../init.d/mysql |
This symlink to MySQL’s init script in the /etc/rc2.d
directory. The S script under the default runlevel directory for the service, init will start the service when the server will be rebooted. Manual reboot of server from mobile devices can be an emergency life-saver in acute emergencies.
Now run these commands :
1 | ps -ef | grep mysql |
You’ll get output something like :
1 2 | root 29795 1 0 17:18 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe mysql 30182 29795 0 17:18 ? 00:00:04 /usr/sbin/mysqld |
The number beside the username is PID. mysqld_safe
and mysqld. mysqld_safe
has process IDs 29795 and 30182 respectively. We can kill them to emulate crash :
1 2 | sudo kill -9 29795 sudo kill -9 30182 |
Now, if you run :
1 | /etc/init.d/mysql status |
You’ll get MySQL is stopped..
message. Of course you can get rid of test crash to normal situation by the command :
1 2 | service mysql restart # /etc/init.d/mysql restart |
You can check by running :
1 | sudo systemctl status mysql.service |
Now if we create a bash script named safe.sh
kept on my GitHub repo and then make it executable :
1 | chmod +x safe.sh |
Then, executing the script should restart MySQL after simulating crash :
1 | sh safe.sh |
It will brutally start MySQL. If a service does not exist, we can start by adding and entry on cron (sudo crontab -e
), like for example service named nothing.service
(it is every minute checking for example) :
1 | * * * * * /bin/systemctl status nothing.service > /dev/null || /bin/systemctl start nothing.service |
Instead of nothing.service
, using mysql.service
should start MySQL. Easy way to remember cron :
1 | 1 2 3 4 5 /root/script.sh |
Where :
1 -> Minute (0-59)
2 -> Hours (0-23)
3 -> Day (0-31)
4 -> Month (0-12 [12 == December])
5 -> Day of the week(0-7 [7 or 0 == sunday])
/root/script.sh – Script with path
If that normal restart fails then try that bash script :
1 | * * * * * /bin/systemctl status mysql.service > /dev/null || /root/safe.sh |
If the /bin/systemctl status mysql.service ||
logic fails then you need another bash script to curl, cut, grep “eroor database” like keyword from home page and fire it. Now various methods will be timed in a way that no method keeps server down for more than 30 minutes.