#!/bin/bash # ### BEGIN INIT INFO # Provides: mysql # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Should-Start: $network $time # Should-Stop: $network $time # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/ Stop MySQL Community Server daemon # Description: This service script facilitates startup and shutdown of # mysqld daemon throught its wrapper script mysqld_safe ### END INIT INFO # # Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA . /lib/lsb/init-functions . /usr/share/mysql/mysql-helpers cd / umask 077 # In case server is taking more to start or stop increase the timeout in defaults file STARTTIMEOUT=120 STOPTIMEOUT=600 [ -e /etc/default/mysql ] && . /etc/default/mysql || true VERSION=$(mysqld --version | grep mysqld | cut -d' ' -f4) get_mysql_option() { RESULT=$(my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1) if [ -z "$RESULT" ]; then RESULT="$3" fi echo $RESULT } fix_thp_setting() { THP_SETTING=$(get_mysql_option mysqld_safe thp-setting "") if [ ! -z "${THP_SETTING}" ]; then # Set whatever option is specified in config file echo "${THP_SETTING}" > /sys/kernel/mm/transparent_hugepage/defrag echo "${THP_SETTING}" > /sys/kernel/mm/transparent_hugepage/enabled fi } check_exit_status() { errcode=$1 if [ $errcode -gt 0 ]; then exit $errcode fi } get_running () { PIDFILE=$(get_mysql_option mysqld_safe pid-file "") MYSQLDATA=$(get_mysql_option mysqld datadir "/var/lib/mysql") if [ -z "$PIDFILE" ]; then PIDFILE=$(get_mysql_option mysqld pid-file "$MYSQLDATA/$(hostname).pid") fi case $PIDFILE in /*) ;; *) PIDFILE="$MYSQLDATA/$PIDFILE" ;; esac if [ -e "$PIDFILE" ] && [ -d "/proc/$(cat "$PIDFILE")" ]; then echo 1 else echo 0 fi } verify_server () { TIMEOUT=0 if [ "${1}" = "start" ]; then TIMEOUT=${STARTTIMEOUT} elif [ "${1}" = "stop" ]; then TIMEOUT=${STOPTIMEOUT} fi COUNT=0 while [ ${COUNT} -lt ${TIMEOUT} ]; do COUNT=$(( COUNT+1 )) echo -n . if [ "${1}" = "start" ] && [ "$(get_running)" = 1 ]; then if [ -z ${2} ]; then echo fi return 0 fi if [ "${1}" = "stop" ] && [ "$(get_running)" = 0 ]; then if [ -z ${2} ]; then echo fi return 0 fi sleep 1 done return 1 } case "$1" in 'start') if [ "$(get_running)" -eq 1 ]; then log_action_msg "Percona Server is already started" else MYSQLRUN=/var/run/mysqld MYSQLDATA=$(get_mysql_option mysqld datadir "/var/lib/mysql") MYSQLFILES=/var/lib/mysql-files MYSQLLOG=/var/log/mysql MYSQLKEYRING=/var/lib/mysql-keyring if [ ! -d ${MYSQLDATA} -a ! -L ${MYSQLDATA} ]; then install -d -m 0750 -omysql -gmysql ${MYSQLDATA} check_exit_status $? fi if [ ! -d ${MYSQLFILES} -a ! -L ${MYSQLFILES} ]; then install -d -m 0770 -omysql -gmysql ${MYSQLFILES} check_exit_status $? fi if [ ! -d ${MYSQLKEYRING} -a ! -L ${MYSQLKEYRING} ]; then install -d -m 0750 -omysql -gmysql ${MYSQLKEYRING} check_exit_status $? fi if [ ! "$(ls -A ${MYSQLDATA})" ] && [ -d ${MYSQLFILES} ] && [ -d ${MYSQLKEYRING} ]; then su - mysql -s /bin/bash -c "/usr/sbin/mysqld --initialize-insecure=on 2>&1 > /dev/null" check_exit_status $? su - mysql -s /bin/bash -c "/usr/sbin/mysqld --log_error_verbosity=2 2>&1 > /dev/null &" check_exit_status $? verify_server start no-newline mysql -e "INSTALL PLUGIN auth_socket SONAME 'auth_socket.so'" mysql -e "USE mysql; UPDATE user SET plugin='auth_socket' WHERE user='root'" mysqladmin shutdown fi if [ -x /usr/bin/mysql_ssl_rsa_setup -a ! -e "${MYSQLDATA}/server-key.pem" ]; then /usr/bin/mysql_ssl_rsa_setup --datadir="${MYSQLDATA}" --uid=mysql >/dev/null 2>&1 fi if [ ! -d ${MYSQLLOG} -a ! -L ${MYSQLLOG} ]; then install -d -m 0750 -omysql -gadm ${MYSQLLOG} check_exit_status $? install -m 0640 -omysql -gadm /dev/null ${MYSQLLOG}/error.log check_exit_status $? fi if [ ! -d "${MYSQLRUN}" -a ! -L "${MYSQLRUN}" ]; then install -d -m 0755 -omysql -gmysql ${MYSQLRUN} fi # Needed because of TokuDB fix_thp_setting su - mysql -s /bin/bash -c "mysqld_safe > /dev/null &" check_exit_status $? verify_server start retval=$? if [ "$retval" -eq 0 ]; then log_action_msg "Percona Server ${VERSION} is started" else log_action_msg "Percona Server ${VERSION} did not start. Please check logs for more details." exit $retval fi fi ;; 'stop') if [ "$(get_running)" -eq 1 ]; then killall -u mysql verify_server stop retval=$? if [ "$retval" -eq 0 ]; then log_action_msg "Percona Server ${VERSION} is stopped" else log_action_msg "Attempt to shutdown Percona Server ${VERSION} timed out" exit $retval fi else log_action_msg "Percona Server ${VERSION} is already stopped" fi ;; 'restart'|'reload'|'force-reload') log_action_msg "Stopping Percona Server ${VERSION}" $0 stop log_action_msg "Re-starting Percona Server ${VERSION}" $0 start ;; 'status') if [ "$(get_running)" -eq 1 ]; then log_action_msg "Percona Server ${VERSION} is running" else log_action_msg "Percona Server ${VERSION} is not running" exit 3 fi ;; *) echo "Usage: $SELF start|stop|restart|reload|force-reload|status" exit 1 ;; esac exit 0