The officially official Devuan Forum!

You are not logged in.

#1 2022-06-23 01:32:16

greenant
Member
Registered: 2022-05-04
Posts: 9  

SysVinit file for MySQL

Trying to get MySQL to start in Devuan Chimaera, noticed that the MYSQL distributed for bullseye no longer includes a SysVinit file.

This is a workaround using an older init file:

Add to

/etc/apt/sources.list.d/mysql.list

:

### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out entries below, but any other modifications may be lost.
# Use command 'dpkg-reconfigure mysql-apt-config' as root for modifications.
deb http://repo.mysql.com/apt/debian/ bullseye mysql-apt-config
deb http://repo.mysql.com/apt/debian/ bullseye mysql-8.0
deb http://repo.mysql.com/apt/debian/ bullseye mysql-tools
##deb http://repo.mysql.com/apt/debian/ bullseye mysql-tools-preview
deb-src http://repo.mysql.com/apt/debian/ bullseye mysql-8.0

Install with apt as usual

Add to

/etc/init.d/mysql

:

!/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) 2015, 2018, 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, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation.  The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# 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, version 2.0, 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-8.0/mysql-helpers
cd /
umask 077

# In case server is taking more to start or stop increase the timeout here
STARTTIMEOUT=180
STOPTIMEOUT=60

# We need to check that the binaries exist; When upgrading from community to commercial this
# script will be run after community is removed but before commercial is installed
VERSION="unknown"
if pathfind mysqld; then
        VERSION=$(mysqld --version | grep mysqld | cut -d' ' -f4)
fi

MYSQLRUN=/var/run/mysqld
MYSQLDATA=$(get_mysql_option mysqld datadir "/var/lib/mysql")
MYSQLFILES=/var/lib/mysql-files
MYSQLKEYRING=/var/lib/mysql-keyring
MYSQLLOG=/var/log/mysql

# Do a quick check that the user is allowed to access the pid file
MYSQLDATA=$(get_mysql_option mysqld datadir "/var/lib/mysql")
if [ -d "$MYSQLDATA" ] && [ ! -r "$MYSQLDATA" ];
then
        echo "Permission denied. Please run as root."
        exit 1
fi

case "$1" in
  'start')
        if [ "$(get_running)" -eq 1 ];
        then
                log_action_msg "A MySQL Server is already started"
        else
                verify_ready
                verify_database

                su - mysql -s /bin/bash -c "mysqld_safe > /dev/null &"
                verify_server start
                if [ "$?" -eq 0 ];
                then
                        log_action_msg "MySQL Community Server ${VERSION} is started"
                else
                        log_action_msg "MySQL Community Server ${VERSION} did not start. Please check logs for more details."
                fi
        fi
        ;;

  'stop')
        if [ "$(get_running)" -eq 1 ];
        then
               killall -u mysql
                verify_server stop
                if [ "$?" -eq 0 ];
                then
                        log_action_msg "MySQL Community Server ${VERSION} is stopped"
                else
                        log_action_msg "Attempt to shutdown MySQL Community Server ${VERSION} timed out"
                fi
        else
                log_action_msg "MySQL Community Server ${VERSION} is already stopped"
        fi
        ;;

  'restart'|'reload'|'force-reload')
        log_action_msg "Stopping MySQL Community Server ${VERSION}"
        $0 stop
        log_action_msg "Re-starting MySQL Community Server ${VERSION}"
        $0 start
        ;;

  'status')
        if [ "$(get_running)" -eq 1 ];
        then
                log_action_msg "MySQL Community Server ${VERSION} is running"
        else
                log_action_msg "MySQL Community Server ${VERSION} is not running"
                exit 3
        fi
        ;;

  *)
        echo "Usage: $SELF start|stop|restart|reload|force-reload|status"
        exit 1
        ;;
esac

exit 0

chmod +x the file and

update-rc.d mysql defaults

Basic tests OK, starts and status reported properly

Offline

#2 2022-06-23 02:27:11

ralph.ronnquist
Administrator
From: Clifton Hill, Victoria, AUS
Registered: 2016-11-30
Posts: 1,106  

Re: SysVinit file for MySQL

Isn't it called mariadb in chimaera?

Offline

#3 2022-06-23 17:14:21

Marjorie
Member
From: Teignmouth, UK
Registered: 2019-06-09
Posts: 219  

Re: SysVinit file for MySQL

Indeed. And package mariadb-server-10.5 on Chimaera provides an /etc/init.d/mariadb init script:

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          mariadb
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $named $time
# Should-Stop:       $network $named $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop the mysql database server daemon
# Description:       Controls the main MariaDB database server daemon "mariadbd"
#                    and its wrapper script "mysqld_safe".
### END INIT INFO
#
set -e
set -u
${DEBIAN_SCRIPT_DEBUG:+ set -v -x}

test -x /usr/sbin/mariadbd || exit 0

. /lib/lsb/init-functions

SELF=$(cd $(dirname $0); pwd -P)/$(basename $0)

MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"

# priority can be overridden and "-s" adds output to stderr
ERR_LOGGER="logger -p daemon.err -t /etc/init.d/mariadb -i"

if [ -f /etc/default/mysql ]; then
  . /etc/default/mysql
fi

# Also source default/mariadb in case the installation was upgraded from
# packages originally installed from MariaDB.org repositories, which have
# had support for reading /etc/default/mariadb since March 2016.
if [ -f /etc/default/mariadb ]; then
  . /etc/default/mariadb
fi

# Safeguard (relative paths, core dumps..)
cd /
umask 077

# mysqladmin likes to read /root/.my.cnf. This is usually not what I want
# as many admins e.g. only store a password without a username there and
# so break my scripts.
export HOME=/etc/mysql/

## Fetch a particular option from mysql's invocation.
#
# Usage: void mariadbd_get_param option
mariadbd_get_param() {
  /usr/sbin/mariadbd --print-defaults \
    | tr " " "\n" \
    | grep -- "--$1" \
    | tail -n 1 \
    | cut -d= -f2
}

## Do some sanity checks before even trying to start mariadbd.
sanity_checks() {
  # check for config file
  if [ ! -r /etc/mysql/my.cnf ]; then
    log_warning_msg "$0: WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz"
    echo                "WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz" | $ERR_LOGGER
  fi

  # check for diskspace shortage
  datadir=`mariadbd_get_param datadir`
  if LC_ALL=C BLOCKSIZE= df --portability $datadir/. | tail -n 1 | awk '{ exit ($4>4096) }'; then
    log_failure_msg "$0: ERROR: The partition with $datadir is too full!"
    echo                "ERROR: The partition with $datadir is too full!" | $ERR_LOGGER
    exit 1
  fi
}

## Checks if there is a server running and if so if it is accessible.
#
# check_alive insists on a pingable server
# check_dead also fails if there is a lost mariadbd in the process list
#
# Usage: boolean mariadbd_status [check_alive|check_dead] [warn|nowarn]
mariadbd_status () {
  ping_output=`$MYADMIN ping 2>&1`; ping_alive=$(( ! $? ))

  ps_alive=0
  pidfile=`mariadbd_get_param pid-file`
  if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi

  if [ "$1" = "check_alive"  -a  $ping_alive = 1 ] ||
     [ "$1" = "check_dead"   -a  $ping_alive = 0  -a  $ps_alive = 0 ]; then
    return 0 # EXIT_SUCCESS
  else
    if [ "$2" = "warn" ]; then
      echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug
    fi
  return 1 # EXIT_FAILURE
  fi
}

#
# main()
#

case "${1:-''}" in

  'start')
  sanity_checks;
  # Start daemon
  log_daemon_msg "Starting MariaDB database server" "mariadbd"
  if mariadbd_status check_alive nowarn; then
   log_progress_msg "already running"
   log_end_msg 0
  else
    # Could be removed during boot
    test -e /run/mysqld || install -m 755 -o mysql -g root -d /run/mysqld

    # Start MariaDB!
    /usr/bin/mysqld_safe "${@:2}" 2>&1 >/dev/null | $ERR_LOGGER &

    for i in $(seq 1 "${MYSQLD_STARTUP_TIMEOUT:-30}"); do
      sleep 1
      if mariadbd_status check_alive nowarn ; then break; fi
      log_progress_msg "."
    done
    if mariadbd_status check_alive warn; then
      log_end_msg 0
      # Now start mysqlcheck or whatever the admin wants.
      output=$(/etc/mysql/debian-start)
      if [ -n "$output" ]; then
        log_action_msg "$output"
      fi
    else
      log_end_msg 1
      log_failure_msg "Please take a look at the syslog"
    fi
  fi
  ;;

  'stop')
  # * As a passwordless mysqladmin (e.g. via ~/.my.cnf) must be possible
  # at least for cron, we can rely on it here, too. (although we have
  # to specify it explicit as e.g. sudo environments points to the normal
  # users home and not /root)
  log_daemon_msg "Stopping MariaDB database server" "mariadbd"
  if ! mariadbd_status check_dead nowarn; then
    set +e
    shutdown_out=`$MYADMIN shutdown 2>&1`; r=$?
    set -e
    if [ "$r" -ne 0 ]; then
      log_end_msg 1
      [ "$VERBOSE" != "no" ] && log_failure_msg "Error: $shutdown_out"
      log_daemon_msg "Killing MariaDB database server by signal" "mariadbd"
      killall -15 mariadbd
      server_down=
      for i in `seq 1 600`; do
        sleep 1
        if mariadbd_status check_dead nowarn; then server_down=1; break; fi
      done
      if test -z "$server_down"; then killall -9 mariadbd; fi
    fi
  fi

  if ! mariadbd_status check_dead warn; then
    log_end_msg 1
    log_failure_msg "Please stop MariaDB manually and read /usr/share/doc/mariadb-server-10.5/README.Debian.gz!"
    exit -1
  else
    log_end_msg 0
  fi
  ;;

  'restart')
  set +e; $SELF stop; set -e
  shift
  $SELF start "${@}"
  ;;

  'reload'|'force-reload')
  log_daemon_msg "Reloading MariaDB database server" "mariadbd"
  $MYADMIN reload
  log_end_msg 0
  ;;

  'status')
  if mariadbd_status check_alive nowarn; then
    log_action_msg "$($MYADMIN version)"
  else
    log_action_msg "MariaDB is stopped."
    exit 3
  fi
  ;;

  'bootstrap')
	# Bootstrap the cluster, start the first node
	# that initiates the cluster
	log_daemon_msg "Bootstrapping the cluster" "mariadbd"
	$SELF start "${@:2}" --wsrep-new-cluster
	;;

  *)
  echo "Usage: $SELF start|stop|restart|reload|force-reload|status"
  exit 1
  ;;
esac

Offline

#4 2022-06-23 19:27:06

xinomilo
Unknown
Registered: 2017-07-02
Posts: 315  

Re: SysVinit file for MySQL

ralph.ronnquist wrote:

Isn't it called mariadb in chimaera?

no, mariadb is a fork of mysql. 2 different products. you can see OP is using external repo specifically for mysql.

Offline

#5 2022-06-23 22:45:21

ralph.ronnquist
Administrator
From: Clifton Hill, Victoria, AUS
Registered: 2016-11-30
Posts: 1,106  

Re: SysVinit file for MySQL

True. And the OP may also have their good reasons for not using mariadb, which is the "product line" that is supported within the Devuan context (well, Debian context really, since it's not forked).

Offline

Board footer