#!/bin/bash

RED='\033[41m'
GREEN='\033[32m'
NC='\033[0m'
description="start"
SQL_PASS_UNAME="/tmp/sqlConfing.cnf"

if [ $(pgrep mysql | wc -l) -ne 1 ]; then
    echo -e "${BROWN}\nMySQL недоступен. Проверьте состояние сервиса.${NC}"
    exit 1
else
    read -p "Введите имя пользователя MySQL: " sqluname
    read -sp "Введите пароль пользователя MySQL: " sqlpasswd
    printf "[client]\nuser = $sqluname\npassword = $sqlpasswd" > $SQL_PASS_UNAME; echo -e "\n"
    if ! mysql --defaults-extra-file=$SQL_PASS_UNAME -Nse ';'; then
        echo -e "${BROWN}\nВведен неверный пользователь или пароль.${NC}"
        exit 1
    fi
fi

echo -e "${GREEN}Проверка и анализ таблиц утилитой mysqlcheck${NC}"
mysqlcheck --defaults-extra-file=$SQL_PASS_UNAME --all-databases --check-upgrade \
&& success=true || success=false;
`$success` && echo "Ошибок не обнаружено." || echo "Сверьтесь с документацией и исправьте ошибки!"
 ! `$success` && exit 1;

echo -e "${GREEN}Проверка наличия секционированных таблиц:${NC}"
description=`mysql --defaults-extra-file=$SQL_PASS_UNAME -e "SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';"`
if [[ $description ]]; then
  echo $description
  echo "Секционированных таблиц быть не должно. Измените таблицы!" && exit 1
else
  echo "Ошибок не обнаружено."
fi

echo -e "${GREEN}Проверка имен таблиц совпадающих с названием системных таблиц MySQL 8.0:${NC}"
description=`mysql --defaults-extra-file=$SQL_PASS_UNAME -e "SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE LOWER(TABLE_SCHEMA) = 'mysql' and LOWER(TABLE_NAME) IN ('catalogs', 'character_sets',
'check_constraints', 'collations', 'column_statistics', 'column_type_elements', 'columns', 'dd_properties', 'events', 'foreign_key_column_usage', 'foreign_keys', 'index_column_usage', 'index_partitions', 'index_stats',
'indexes', 'parameter_type_elements', 'parameters', 'resource_groups', 'routines', 'schemata', 'st_spatial_reference_systems', 'table_partition_values', 'table_partitions', 'table_stats', 'tables', 'tablespace_files',
'tablespaces', 'triggers', 'view_routine_usage', 'view_table_usage');"`
if [[ $description ]]; then
  echo $description
  echo "Найдены совпадающие имена таблиц. Удалите их или переименуйте!" && exit 1
else 
  echo "Ошибок не обнаружено."
fi

echo -e "${GREEN}Проверка длины имени внешнего ключа${NC}"
description=`mysql --defaults-extra-file=$SQL_PASS_UNAME -e "SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN  (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1), INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1)
FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN WHERE LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);"`
if [[ $description ]]; then
  echo $description
  echo "Длина имен внешних ключей не должна превышать 64 символа!" && exit 1
else
  echo "Ошибок не обнаружено."
fi

echo -e "${GREEN}Поиск разбитых на разделы таблиц с механизмом хранения InnoDB${NC}"
description=`mysql --defaults-extra-file=$SQL_PASS_UNAME -e "SELECT DISTINCT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';"`
if [[ $description ]]; then
  echo $description
  echo "Ошибка! Найдены разделения таблиц с механизмом хранения InnoDB" && exit 1
else
  echo "Ошибок не обнаружено."
fi

uppertable=`mysql --defaults-extra-file=$SQL_PASS_UNAME -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != LOWER(TABLE_NAME) AND TABLE_TYPE = 'BASE TABLE';"`
upperschema=`mysql --defaults-extra-file=$SQL_PASS_UNAME -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME != LOWER(SCHEMA_NAME);"`
echo -e "${GREEN}Проверка наличия таблиц с uppercase именем TABLE_NAME${NC}"
if [[ $uppertable ]]; then
  echo -e "${RED}Найдены TABLE_NAME в верхнем регистре. Перед обновлением убедитесь, что настройка lower_case_table_names не равна 1!!!!${NC}"
  echo $uppertable
  exit 1
else
  echo "Ошибок не обнаружено."
fi
echo -e "${GREEN}Проверка наличия таблиц с uppercase именем SCHEMA_NAME${NC}"
if [[ $upperschema ]]; then
  echo -e "${RED}Найдены SCHEMA_NAME в верхнем регистре. Перед обновлением убедитесь, что настройка lower_case_table_names не равна 1!!!!${NC}"
  echo $upperschema
  exit 1
else
  echo "Ошибок не обнаружено."
fi

echo -e "${GREEN}Проверка deprecated mode NO_AUTO_CREATE_USER в sql_mode${NC}"
description=`mysql --defaults-extra-file=$SQL_PASS_UNAME -e "SELECT @@sql_mode;"`
result=`expr match "$description" '.*\(NO_AUTO_CREATE_USER\)'`
if [[ $result ]]; then
  echo -e "${RED}Найден deprecated параметр NO_AUTO_CREATE_USER. Удалите его из myconfd и перезапустите mysql!!!!${NC}" && exit 1
else
  echo "Ошибок нет"
fi

used_space=0;
available_space=$(df -Pm /tmp/ | tail -1 | awk '{print $4}')
mysql --defaults-extra-file=$SQL_PASS_UNAME -Nse "show databases" | grep "artixcs\|documents" > /tmp/sql_check_db_list.txt
while read database; do used_space_one_db=$(du -sm /var/lib/mysql/$database | awk '{print $1}');
 used_space=$(($used_space+used_space_one_db)); done < /tmp/sql_check_db_list.txt
if (($used_space > $available_space)); then  
  echo -e "${RED}Размер баз данных больше, чем доступно места на жестком диске.${NC}"
  echo -e "${RED}Есть вероятность, что не хватит места для копирования данных.${NC}"
else
  echo -e "${GREEN}Свободного места на диске достаточно для копирования данных.${NC}";
fi

rm $SQL_PASS_UNAME
rm -r /tmp/sql_check_db_list.txt
