Browse Source

mariadb: Init script improvements

Update init script so other user/group can be used. Also make sure that
init script can actually create an empty database instead of forcing the
user to do it by hand. Other new feature is taking care of migration
of the database when upgrading the database.

Signed-off-by: Michal Hrusecky <michal.hrusecky@turris.com>
lilik-openwrt-22.03
Michal Hrusecky 3 years ago
committed by Rosen Penev
parent
commit
1be35284bb
2 changed files with 77 additions and 16 deletions
  1. +10
    -2
      utils/mariadb/files/mysqld.config
  2. +67
    -14
      utils/mariadb/files/mysqld.init

+ 10
- 2
utils/mariadb/files/mysqld.config View File

@ -1,5 +1,13 @@
config mysqld 'general' config mysqld 'general'
option enabled '0' # 0 - disabled, 1 - enabled
option options '--syslog' # Options passed to mysqld_safe
# Unless enable, MariaDB will not start without this
option enabled '0'
# User to run MariaDB as
option user 'mariadb'
# Group to run MariaDB
option group 'mariadb'
# If there is now database, create an empty one automatically
option init '1'
# If upgrading old database, run mysql_upgrade during restart
option upgrade '1'

+ 67
- 14
utils/mariadb/files/mysqld.init View File

@ -9,8 +9,6 @@ STOP=10
USE_PROCD=1 USE_PROCD=1
NAME=mysqld NAME=mysqld
my_user="mariadb"
my_group="mariadb"
LOGGER="/usr/bin/logger -p user.err -s -t $NAME --" LOGGER="/usr/bin/logger -p user.err -s -t $NAME --"
[ -x "$LOGGER" ] || LOGGER="echo" [ -x "$LOGGER" ] || LOGGER="echo"
@ -70,14 +68,19 @@ start_service() {
conf=/etc/mysql/my.cnf conf=/etc/mysql/my.cnf
logdir=/var/log/mysql logdir=/var/log/mysql
rundir=/var/run/mysqld rundir=/var/run/mysqld
version="$(mysqld --version | sed -n 's|.*Ver[[:blank:]]*\([0-9.]*\)-.*|\1|p')"
hint="please fix your server configuration in /etc/mysql/"
# Few basic checks
if [ ! -x "$MYSQLD" ]; then if [ ! -x "$MYSQLD" ]; then
$LOGGER "$MYSQLD is missing" $LOGGER "$MYSQLD is missing"
exit 1 exit 1
fi fi
if [ -z "$version" ]; then
$LOGGER "Can't get MariaDB version, something is seriously wrong"
exit 1
fi
if [ ! -r "$conf" ]; then if [ ! -r "$conf" ]; then
$LOGGER "$conf cannot be read" $LOGGER "$conf cannot be read"
exit 1 exit 1
@ -88,34 +91,50 @@ start_service() {
exit 0 exit 0
fi fi
# Get various config options
config_load "$NAME" config_load "$NAME"
config_get my_user general user "mariadb"
config_get my_group general group "mariadb"
config_get_bool enabled general enabled 0 config_get_bool enabled general enabled 0
config_get_bool init_db general init 1
config_get_bool autoupgrade general upgrade 1
config_get options general options
# shellcheck disable=SC2154 # shellcheck disable=SC2154
if [ "$enabled" -eq 0 ]; then if [ "$enabled" -eq 0 ]; then
$LOGGER "service not enabled in /etc/config/$NAME" $LOGGER "service not enabled in /etc/config/$NAME"
exit 1 exit 1
fi fi
config_get options general options
datadir="$(mysqld_get_param datadir)" datadir="$(mysqld_get_param datadir)"
tmpdir="$(mysqld_get_param tmpdir)" tmpdir="$(mysqld_get_param tmpdir)"
sockdir="$(dirname "$(mysqld_get_param socket)")"
# Make sure we have a working database in datadir
if [ ! -f "$datadir/mysql/tables_priv.MAD" ]; then if [ ! -f "$datadir/mysql/tables_priv.MAD" ]; then
args="--force" args="--force"
basedir="$(mysqld_get_param basedir)" basedir="$(mysqld_get_param basedir)"
[ -n "$basedir" ] && args="$args --basedir=$basedir" [ -n "$basedir" ] && args="$args --basedir=$basedir"
$LOGGER "Cannot detect privileges table. You might need to run"
$LOGGER "'mysql_install_db \"$args\"'"
$LOGGER "to initialize the system tables."
$LOGGER "Then hand it ower to MariaDB user"
$LOGGER "'chown -Rh \"$my_user:$my_group\" \"$datadir\"'"
# shellcheck disable=SC2154
if [ "$init_db" -gt 0 ]; then
# shellcheck disable=SC2154
mysql_install_db $args --skip-name-resolve --skip-test-db --datadir="$datadir" || exit 1
echo "$version" > "$datadir"/.version
chown -Rh "$my_user:$my_group" "$datadir"
else
$LOGGER "Cannot detect privileges table. You might need to run"
$LOGGER "'mysql_install_db \"$args\"'"
$LOGGER "to initialize the system tables."
$LOGGER "Then hand it ower to MariaDB user"
# shellcheck disable=SC2154
$LOGGER "'chown -Rh \"$my_user:$my_group\" \"$datadir\"'"
exit 1 exit 1
fi
fi fi
for i in "$logdir" "$rundir" "$tmpdir" "$datadir"; do
# Make sure all required directories exists and have correct rights
for i in "$logdir" "$rundir" "$sockdir"; do
opts="-m 0750" opts="-m 0750"
if ! [ -e "$i" ]; then if ! [ -e "$i" ]; then
# $rundir needs to be accessible for # $rundir needs to be accessible for
@ -125,10 +144,44 @@ start_service() {
fi fi
# shellcheck disable=SC2086 # shellcheck disable=SC2086
mkdir -p $opts "$i" mkdir -p $opts "$i"
[ -d "$i" ] && chown -Rh "$my_user:$my_group" "$i"
fi fi
# shellcheck disable=SC2154
[ -d "$i" ] && chown -Rh "$my_user:$my_group" "$i"
done done
# Migration from old versions
# shellcheck disable=SC2154
if [ "$(cat "$datadir"/.version 2> /dev/null)" \!= "$version" ] && [ "$autoupgrade" -gt 0 ]; then
# Start upgrade instance without credentials
sudo -u "$my_user" mysqld --skip-networking --skip-grant-tables --socket=/tmp/mysql_upgrade.sock &
PID="$!"
i=0
# Wait for upgrade instance of db to start
while [ "$i" -lt 15 ] && test \! -S /tmp/mysql_upgrade.sock; do
sleep 1
i="$((i + 1))"
done
[ -S /tmp/mysql_upgrade.sock ] || {
$LOGGER "Failed to start upgrading instance of MariaDB."
exit 1
}
# Upgrade the database
mysql_upgrade --upgrade-system-tables --socket=/tmp/mysql_upgrade.sock
echo "$version" > "$datadir"/.version
# Stop the upgrade instance
kill "$PID"
i=0
while [ "$i" -lt 60 ] && grep -q mysql "/proc/$PID/cmdline"; do
sleep 1
[ "$i" -lt 30 ] || kill "$PID"
i="$((i + 1))"
done
# Use force
if grep -q mysql "/proc/$PID/cmdline"; then
kill -9 "$PID"
fi
fi
# Start daemon # Start daemon
procd_open_instance procd_open_instance


Loading…
Cancel
Save