2012-01-23 12:20:16 +01:00
#!/bin/bash
#
# This file is included by /etc/mysql/debian-start
#
2016-10-09 23:39:01 +03:00
## Check MyISAM and Aria unclosed tables.
2012-01-23 12:20:16 +01:00
# - Requires the server to be up.
2020-07-11 12:12:34 +03:00
# - Is supposed to run silently in background.
2012-01-23 12:20:16 +01:00
function check_for_crashed_tables( ) {
set -e
set -u
# But do it in the background to not stall the boot process.
2022-12-12 16:23:30 +11:00
logger -p daemon.info -i -t" $0 " "Triggering myisam-recover for all MyISAM tables and aria-recover for all Aria tables"
2012-01-23 12:20:16 +01:00
# Checking for $? is unreliable so the size of the output is checked.
# Some table handlers like HEAP do not support CHECK TABLE.
2020-06-14 14:25:15 +03:00
tempfile = $( mktemp)
2016-10-09 23:39:01 +03:00
# We have to use xargs in this case, because a for loop barfs on the
# spaces in the thing to be looped over.
2022-12-12 16:23:30 +11:00
# If a crashed table is encountered, the "mariadb" command will return with a status different from 0
2016-10-09 23:39:01 +03:00
set +e
2022-12-12 16:23:30 +11:00
LC_ALL = C $MARIADB --skip-column-names --batch -e '
2012-01-23 12:20:16 +01:00
select concat( '\' 'select count(*) into @discard from `' \' ' ,
2020-07-11 12:12:34 +03:00
TABLE_SCHEMA, '\' '`.`' \' ', TABLE_NAME, ' \' '`' \' ' )
2016-10-09 23:39:01 +03:00
from information_schema.TABLES where TABLE_SCHEMA<>'\' 'INFORMATION_SCHEMA' \' ' and TABLE_SCHEMA<>' \' 'PERFORMANCE_SCHEMA' \' ' and ( ENGINE=' \' 'MyISAM' \' ' or ENGINE=' \' 'Aria' \' ' )' | \
2022-12-15 08:48:34 +11:00
xargs -i ${ MARIADB } --skip-column-names --silent --batch \
2022-12-12 16:23:30 +11:00
--force -e "{}" & >" ${ tempfile } "
2016-10-09 23:39:01 +03:00
set -e
if [ -s " $tempfile " ] ; then
2012-01-23 12:20:16 +01:00
(
/bin/echo -e "\n" \
"Improperly closed tables are also reported if clients are accessing\n" \
"the tables *now*. A list of current connections is below.\n" ;
$MYADMIN processlist status
2022-12-12 16:23:30 +11:00
) >> " ${ tempfile } "
2012-01-23 12:20:16 +01:00
# Check for presence as a dependency on mailx would require an MTA.
2020-07-11 12:12:34 +03:00
if [ -x /usr/bin/mailx ] ; then
2022-12-12 16:23:30 +11:00
mailx -e -s" $MYCHECK_SUBJECT " $MYCHECK_RCPT < " $tempfile "
2012-01-23 12:20:16 +01:00
fi
2022-12-12 16:23:30 +11:00
( echo " $MYCHECK_SUBJECT " ; cat " ${ tempfile } " ) | logger -p daemon.warn -i -t" $0 "
2012-01-23 12:20:16 +01:00
fi
2022-12-12 16:23:30 +11:00
rm " ${ tempfile } "
2012-01-23 12:20:16 +01:00
}
## Check for tables needing an upgrade.
# - Requires the server to be up.
2020-07-11 12:12:34 +03:00
# - Is supposed to run silently in background.
2012-01-23 12:20:16 +01:00
function upgrade_system_tables_if_necessary( ) {
set -e
set -u
2022-12-12 16:23:30 +11:00
logger -p daemon.info -i -t" $0 " "Upgrading MySQL tables if necessary."
2012-01-23 12:20:16 +01:00
# Filter all "duplicate column", "duplicate key" and "unknown column"
# errors as the script is designed to be idempotent.
LC_ALL = C $MYUPGRADE \
2>& 1 \
2018-11-24 14:13:41 +01:00
| egrep -v '^(1|@had|ERROR (1051|1054|1060|1061|1146|1347|1348))' \
2022-12-12 16:23:30 +11:00
| logger -p daemon.warn -i -t" $0 "
2012-01-23 12:20:16 +01:00
}
## Check for the presence of both, root accounts with and without password.
# This might have been caused by a bug related to mysql_install_db (#418672).
function check_root_accounts( ) {
set -e
set -u
2020-07-11 12:12:34 +03:00
2022-12-12 16:23:30 +11:00
logger -p daemon.info -i -t" $0 " "Checking for insecure root accounts."
2012-01-23 12:20:16 +01:00
2022-12-15 08:48:34 +11:00
ret = $( echo "SELECT count(*) FROM mysql.user WHERE user='root' and password='' and plugin in ('', 'mysql_native_password', 'mysql_old_password');" | $MARIADB --skip-column-names )
2012-01-23 12:20:16 +01:00
if [ " $ret " -ne "0" ] ; then
2022-12-12 16:23:30 +11:00
logger -p daemon.warn -i -t" $0 " " WARNING: mysql.user contains $ret root accounts without password! "
2012-01-23 12:20:16 +01:00
fi
}