CentOS
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
nano /etc/yum.repos.d/mariadb.repo
yum clean all
rpm --import [https://supplychain.mariadb.com/MariaDB-Server-GPG-KEY](https://supplychain.mariadb.com/MariaDB-Server-GPG-KEY)
yum install mariadb-server
Старая версия (10.9.5)
curl -LsS -O https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
bash mariadb_repo_setup --mariadb-server-version=10.9.5
yum install mariadb-server
systemctl enable mysqld.service
systemctl start mysqld.service
nano /etc/my.cnf.d/server.cnf
nano /etc/my.cnf.d/mysql-clients.cnf
Проверить какие параметры включил mysql/mariadb mariadbd --print-defaults
Локальный коннект
mysql -u USER -p MYPASSWORD
Удаленный коннект
mysql -u USER -p MYPASSWORD -h 44.55.66.77
mysql -V
mysql -u root -p
Команда для первичной настройки безопасности у MySQL и MariaDB одинакова, но действия по ней и в ней отличаются
mysql_secure_installation
# или
mariadb-secure-installation
❌ Если ошибка:
Table 'mysql.user' doesn't exist:ERROR
или подобная по другой таблице скорее всего стоят БД старой mysql, которые не под новую версию. Нужно выполнить апгрейд до новой версии
mysql_upgrade -u root
# Если их и в самом деле не существует, то
mysql_install_db
# И после опять запустить secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
... skipping.
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n
... skipping.
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] n
... skipping.
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
# Первоначальная настройка безопасности для MySQL
# Меняем пароль root для mysql и включаем вход по паролю
mysql
> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MYPASSWORD';
> exit
# Выполняем скрипт для увеличения безопасности
mysql_secure_installation
# Возвращаемся к использованию метода аунтефикации по-умолчанию
mysql -u root -p
> ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;
Настроить порт и чтобы можно было коннектиться извне (по-умолчанию только 127.0.0.1)
nano /etc/mysql/my.cnf
# или
nano /etc/my.cnf
# или для MariaDB
nano /etc/mysql/mariadb.cnf
# или
nano /etc/my.cnf.d/mariadb-server.cnf
[client]
port = 3306
[mysqld]
bind-address = 0.0.0.0
port = 3306
# Время сессии. 60 секунд на случай сбоя соединения - вполне достаточно.
wait_timeout = 60
# запретим серверу получать и разрешать имя хоста клиента (немного ускоряет работу)
skip-name-resolve
Либо root либо создаем отдельного пользователя с минимальными правами, например, для logrotate
mysql -u root -p
# Для root
# Смотрим имеет ли права подключения root через unix socket
SELECT user,plugin FROM mysql.user WHERE user='root';
# Если нет
ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket;
FLUSH PRIVILEGES;
# Для отдельного пользователя с минимальными правами
CREATE USER 'logrotate'@'localhost' IDENTIFIED VIA unix_socket;
GRANT RELOAD ON *.* TO 'logrotate'@'localhost';
FLUSH PRIVILEGES;
Бэкап Экспортируем все БД, данные и сжимаем их в один файл
/usr/bin/mysqldump -uroot -hlocalhost -p'O]Qqz$(l,H_&' --all-databases --skip_ssl | /usr/bin/gzip -c > /mnt/`date "+%Y-%m-%d"`.gz
Экспорт всех БД, данных и сжатие их в разные файлы - одна БД - один файл
for i in `mysql -uroot -p'password' -e'show databases;' | grep -v information_schema | grep -v Database`;
do
/usr/bin/mysqldump -uroot -p'password' $i | /usr/bin/gzip -c > /backup/mysql/`date +%Y-%m-%d`-$i.sql.gz;
done
Экспорт всех БД в разные файлы с проверкой успешности
for i in `mysql -uroot -p'password' -e'show databases;' | grep -v information_schema | grep -v Database`;
do
/usr/bin/mysqldump -uroot -p'password' $i | /usr/bin/gzip -c > /backup/mysql/`date +%Y-%m-%d`-$i.sql.gz;
if [ "$?" != "0" ]; then
echo "Error: Dump DB $i"
else
echo "Successful: Dump DB $i"
fi
done
MYSQL_PWD=`cat /etc/psa/.psa.shadow` /usr/bin/mysqldump -uadmin -hlocalhost --all-databases --routines --triggers | /usr/bin/gzip -c > /mnt/`date "+%Y-%m-%d"`.gz
# Проверка успешности (если небольшой)
# вывод в консоль
gunzip < 2024-03-07.gz
# вывод в файл
gunzip < 2024-03-07.gz > 1.sql
# Восстановление из бэкапа
gunzip < mysql_sy-jenkins_2023.08.29.gz | mysql -uroot -hlocalhost -p'O]Qqz$(l,H_&'
# Если нужно, создаем БД (если только данные, без создания самих баз)
create database zabbix character set utf8mb4 collate utf8mb4_bin;
# Создаем пользователя zabbix с паролем password. Или можно создать его позже, если SQL-данные с созданием баз
create user zabbix@localhost identified by 'password';
grant all privileges on zabbix.* to zabbix@localhost;
# Разрешаем создавать хранимые функции, если нужно
set global log_bin_trust_function_creators = 1;
# Импортируем на хост сервера Zabbix исходную схему и данные. Нужно будет ввести пароль от юзера zabbix
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -u zabbix -p MYPASSWORD
mysql
# Отключаем параметр log_bin_trust_function_creators после импорта схемы базы данных
set global log_bin_trust_function_creators = 0;
exit
https://support.plesk.com/hc/en-us/articles/12388091703703--How-to-upgrade-MySQL-5-5-to-5-6-5-7-or-MariaDB-5-5-to-10-x-on-Linux Смотрим на https://mariadb.org/ последнюю стабильную версию и обновляем на нее
⚠️ CentOS 7: апгрейд выше 11.4.3 невозможен Вендор не собирает RPM для el7 начиная с 11.4.4 и 11.5+ (включая 11.8 LTS). SRPM 11.8.6 не публикуется (archive.mariadb.org/mariadb-11.8.6/srpms/ пуст). plesk installer add --components mariadb108 тоже ругается — компонента нет. Чтобы поставить 11.8 — миграция OS на AlmaLinux/Rocky 9.
⚠️ Остановка mariadb на Plesk-хосте: monit обходит systemd plesk-watchdog настраивает monit, который независимо от systemd перезапускает mariadbd через ~1.5 мин после systemctl stop и шлёт алерт-почту. systemctl mask не спасает — monit запускает бинарь напрямую. Перед обслуживанием БД снимаем с мониторинга:
WD=/usr/local/psa/admin/sbin/modules/watchdog/wd
"$WD" --unmonit-service=mysql # снять с мониторинга monit
systemctl stop mariadb
# ... maintenance: dump / tar /var/lib/mysql / upgrade ...
systemctl start mariadb
"$WD" --monit-service=mysql # вернуть мониторинг
В monit summary сервис называется mysql, не mariadb. Проверка: "$WD" --service-monit-status=mysql.
Пример обновления с 10.2.44 на 11.3.2
mysql --version
# или
mysqld --version
systemctl stop mariadb.service
# Бэкапим все БД, триггеры, хранимые процедуры
# Для mysql
MYSQL_PWD=`cat /etc/psa/.psa.shadow` /usr/bin/mysqldump -uadmin -hlocalhost --all-databases --routines --triggers | /usr/bin/gzip -c > /mnt/`date "+%Y-%m-%d"`.gz
# Для mariadb
MYSQL_PWD=`cat /etc/psa/.psa.shadow` /usr/bin/mariadb-dump -uadmin -hlocalhost --skip_ssl --all-databases --routines --triggers | /usr/bin/gzip -c > /mnt/`date "+%Y-%m-%d"`.gz
systemctl stop mysql.service
# Удаляем дополнительный пакет mariadb-bench, если он установлен
rpm -e --nodeps mariadb-bench
# На всякий случай копируем каталог базы и файл конфига
mkdir -p /var/lib/mysql_backup/20240307_2244
cp -v -a /var/lib/mysql/ /var/lib/mysql_backup/20240307_2244/
cp /etc/my.cnf /var/lib/mysql_backup/20240307_2244/
cp -R /etc/my.cnf.d/ /var/lib/mysql_backup/20250721_0005/
# Проверяем установлен ли пакет mariadb-server
rpm -q --whatprovides mariadb-server
# Если установлен, удаляем
rpm -e --nodeps `rpm -q --whatprovides mariadb-server`
# Удостоверяемся, что plesk обновлен до последней версии или до версии, которая поддерживает новый mysql
# Добавляем репозиторий версии 11.3.2
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=11.3.2
# Для версии 11.7.2 по сути тоже самое
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=11.7.2
yum clean all
yum install MariaDB-client MariaDB-server MariaDB-compat MariaDB-shared
# На 11.7.2 вместо MariaDB-compat ставим пакет MariaDB-client-compat
# Приводим конфиг-файл в соответствие с новыми требованиями
sed -i 's/bind-address = ::ffff:127.0.0.1/bind-address = 127.0.0.1/g' /etc/my.cnf
systemctl restart mariadb
systemctl restart mysql
journalctl -xeu mariadb
# Обновляем базы данных MySQL в соответствие с новой версией
MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql_upgrade -uadmin
systemctl restart mariadb
systemctl restart mysql
# Смотрим журнал - уже все норм
journalctl -xeu mariadb
# Обновляем версию пакета внутри Plesk
# Эта команда (одна) ниже дополнительно для 11.7.2
plesk bin service_node --update local
plesk sbin packagemng -sdf
mysql --version
# Запаковываем копию БД и копируем бэкап
tar -czpf mysql_20240307_2244.tar.gz mysql/
rmf mysql
mv /mnt/2024-03-07.gz /var/lib/mysql_backup/20240307_2244/backup_mysql_2024-03-07.sql.gz
Пример обновление с 11.4.5 на 11.8.5 LTS
mysql -V
# Бэкапим все БД, триггеры, хранимые процедуры в один файл или в отдельный для каждой БД (смотри скрипт выше). Можно и без пароля, если включен доступ по unix socket. Проверяем
# mysql -u root
/usr/bin/mariadb-dump -uroot -p'password' --skip_ssl --all-databases --routines --triggers | /usr/bin/gzip -c > /mnt/`date "+%Y-%m-%d"`.gz
systemctl stop mariadb.service
# Копируем также конфиги на всякий случай
mkdir mysql/config
cp /etc/my.cnf mysql/config/
cp -R /etc/my.cnf.d/ mysql/config/
# Обновляем
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=11.8
yum update MariaDB-server MariaDB-client MariaDB-compat MariaDB-shared
# Стартуем, фиксим системные таблицы (если нужно) и помечаем, что таблицы все готовы к работе с новой версией
systemctl start mariadb
systemctl status mariadb
mariadb-upgrade
systemctl restart mariadb
systemctl status mariadb
mysql -V
# Для проверки выполняем команду SQL: смотрим версию, смотрим таблицы
mysql -u root -e "SELECT VERSION(); SHOW DATABASES;"
# Список всех баз
> SHOW DATABASES;
# Кодировка БД
SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = "redmine_production";
# Кодировка конкретного поля
SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_schema = "redmine_production" AND table_name = "issues" AND column_name = "description";
# Создать базу данных
> create database market_report_v2;
# Список пользователей
> SELECT user FROM mysql.user;
# Список активных пользователей
> SELECT SUBSTRING_INDEX(host, ':', 1) AS host_short, GROUP_CONCAT(DISTINCT user) AS users, COUNT(*) AS threads FROM information_schema.processlist GROUP BY host_short ORDER BY COUNT(*), host_short;
# Просмотреть переменные mysql
> SHOW VARIABLES LIKE '%character%';
# Просмотреть переменные содержащие слово character (% - любой символ)
> SHOW VARIABLES LIKE '%character%';
# Изменить пароль пользователя zabbix в mysql на пароль New-Password-Here
ALTER USER 'userName'@'localhost' IDENTIFIED BY 'New-Password-Here';
FLUSH PRIVILEGES;
# Установить переменную
> SET names utf8
ALL PRIVILEGES все, кроме GRANT; USAGE PRIVILEGES никаких привилегий; SELECT делать выборки из таблиц; INSERT вставлять данные в таблицу; UPDATE обновлять данные в таблице; DELETE удалять данные из таблицы; FILE разрешает читать файлы на сервере; CREATE создавать таблицы или базы данных; ALTER изменять структуру таблиц; INDEX создавать индексы для таблиц; DROP удалять таблицы; EVENT обработка событий; TRIGGER создание триггеров.
GRANT изменять права пользователей; SUPER суперпользователь; PROCESS получение информации о состоянии MySQL; RELOAD позволяет перезагружать таблицы привилегий; SHUTDOWN позволяет отключать или перезапускать БД; SHOW DATABASES просмотр списка баз данных; LOCK TABLES блокирование таблиц при использовании SELECT; REFERENCES создание внешних ключей для связывания таблиц; CREATE USER создание пользователей;
# Просмотреть права пользователя MySQL
SHOW GRANTS FOR 'USER'@'localhost';
SHOW GRANTS FOR 'USER'@'%';
# Предоставление прав
# К БД
GRANT SELECT ON test_db.* TO 'test_user'@'localhost';
# К конкретной таблице в БД
GRANT SELECT ON `test_db`.`table_users` TO 'test_user'@'localhost';
# К конкретной таблице в БД, но только определенные действия с определенными полями
GRANT SELECT (id, user_name), UPDATE (user_name) ON `test_db`.`table_users` TO 'test_user'@'localhost';
# Все обычные действия, кроме полных прав к конкретной БД и всем ее таблицам
GRANT SELECT, INSERT, UPDATE, DELETE ON `some_db`.* TO 'some_user'@'somehost' WITH GRANT OPTION;
# Предоставить все права для пользователя parser с любого хоста на базу marker_report_v2 и все ее таблицы
grant all privileges on market_report_v2.* to 'parser'@'%';
# Предоставить все права для пользователя с любого хоста без выполнения команды создания пользователя
grant all privileges on *.* to zbx_admin@'%' identified by 'MYPASSWORD'
# Отозвать права
REVOKE SELECT ON `somedb`.* FROM 'someuser'@'somehost';
REVOKE ALL PRIVILEGES ON `somedb`.* FROM 'someuser'@'somehost';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'someuser'@'somehost';
Создать пользователя с доступом ко всем базам (нужно для коннекта к MySQL извне - root блочит по-умолчанию)
CREATE USER 'zbx_admin'@'localhost' IDENTIFIED BY 'MYPASSWORD';
GRANT ALL PRIVILEGES ON *.* TO 'zbx_admin'@'localhost' WITH GRANT OPTION;
CREATE USER 'zbx_admin'@'%' IDENTIFIED BY 'MYPASSWORD';
GRANT ALL PRIVILEGES ON *.* TO 'zbx_admin'@'%' WITH GRANT OPTION;
⚠️ Сообщение о малом буфере
MySQL: Buffer pool utilization is too low (less than 50% for 5m)
Решение: Смотрим /etc/my.cnf /etc/my.cnf.d/...), ищем в рабочем конфиге innodb_buffer_pool_size и уменьшаем
Для mariadb на sy-jenkins
nano /etc/my.cnf.d/server.cnf
innodb_buffer_pool_size = 1G
⚠️ MySQL занимает много места Решение:
du -sh /var/www/zabbix/zbx_env/var/lib/mysql
du -sh /var/www/zabbix/zbx_env/var/lib/mysql/zabbix
ls -lS /var/www/zabbix/zbx_env/var/lib/mysql
ls -lS /var/www/zabbix/zbx_env/var/lib/mysql/zabbix
mysql-server:
...
command
- --binlog-expire-logs-seconds=259200
PURGE BINARY LOGS BEFORE NOW();
docker-compose rm -s zabbix-server
docker-compose rm -s mysql-server
docker-compose up -d mysql-server
docker-compose up -d zabbix-server
Оптимизация базы
Zabbix
use zabbix;
show tables;
show table status like "history" \G
select table_name, data_length, data_free, table_schema from information_schema.tables order by data_free desc;
select table_name, data_length, data_free from information_schema.tables where table_schema='zabbix' order by data_free desc;
select table_name, round(data_length/1024/1024), round(data_free/1024/1024) from information_schema.tables where table_schema='zabbix' order by data_free desc;
Просмотр неактивных итемов в наиболее обычно больших таблицах
SELECT count(itemid) AS history FROM history WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
SELECT count(itemid) AS history_uint FROM history_uint WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
SELECT count(itemid) AS history_str FROM history_str WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
SELECT count(itemid) AS history_text FROM history_text WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
SELECT count(itemid) AS history_log FROM history_log WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
SELECT count(itemid) AS trends FROM trends WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
SELECT count(itemid) AS trends_uint FROM trends_uint WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
Удаление неактивных итемов в этих же обычно больших таблицах
DELETE FROM history WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
DELETE FROM history_uint WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
DELETE FROM history_str WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
DELETE FROM history_text WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
DELETE FROM history_log WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
DELETE FROM trends WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
DELETE FROM trends_uint WHERE itemid NOT IN (SELECT itemid FROM items WHERE status='0');
Оптимизация таблиц (сильно оптимизируется history_text, но могут быть и другие)
Для таблиц INNODB не обращаем внимание на месседж
Table does not support optimize, doing recreate + analyze instead
Он просто сообщает, что таблица на ISAM, а INNODB, поэтому в OPTIMIZE не умею, но умею в аналогичные действия с recreate и analyze instead. По сути записывает все данные на диск и убирает таблицу и воссоздает ее заново. При этом важно помнить, что нужно достаточно места на диске для данных, иначе может случиться косяк.
OPTIMIZE TABLE history;
OPTIMIZE TABLE history_uint;
OPTIMIZE TABLE history_str;
OPTIMIZE TABLE history_text;
OPTIMIZE TABLE history_log;
OPTIMIZE TABLE trends;
OPTIMIZE TABLE trends_uint;
Ошибки
mariadb-dump: Got error: 2026: "TLS/SSL error: SSL is required, but the server does not support it" when trying to connect
При замене команды mysqldump на mariadb-dump возникает эта ошибка. Нужно просто добавить ключ в команду:
--skip_ssl
Краш БД, Mysql не запускается
[mysqld]
innodb_force_recovery = 1
и далее до 6 уровня.
| Режим | Описание |
| 0 | Режим по умолчанию, пока InnoDB работает нормально. Запись транзакций разрешена с помощью innodb_force_recovery<=4. |
| 1 | (SRV_FORCE_IGNORE_CORRUPT) позволяет серверу продолжать работу, даже если обнаружены поврежденные страницы. Это достигается путем повторного восстановления на основе журнала, игнорируя определенные ошибки, такие как отсутствие файлов данных или повреждение страниц данных. Любой журнал повторного использования затронутых файлов или страниц будет пропущен. Вы можете облегчить сброс таблиц, заставив оператор SELECT * FROM table_name перепрыгнуть через поврежденные индексы и страницы. |
| 2 | (SRV_FORCE_NO_BACKGROUND) останавливает запуск главного потока, предотвращая сбой, возникающий во время очистки. Никакая очистка не будет проводиться, поэтому журналы отмены будут продолжать расти. |
| 3 | (SRV_FORCE_NO_TRX_UNDO) не откатывает транзакции DML после восстановления после сбоя. Не влияет на откат активных в настоящее время транзакций DML. Также предотвратит запуск некоторых отменяющих фоновых задач. Эти задачи могут привести к блокировке ожидания из-за восстановленных неполных транзакций, откат которых предотвращается. |
| 4 | (SRV_FORCE_NO_DDL_UNDO) не откатывает транзакции после восстановления после сбоя. Не влияет на откат действующих в настоящее время транзакций. Также предотвратит запуск некоторых отменяющих фоновых задач. Эти задачи могут привести к блокировке ожидания из-за восстановленных неполных транзакций, откат которых предотвращается. |
| 5 | (SRV_FORCE_NO_UNDO_LOG_SCAN) рассматривает неполные транзакции как совершенные и не рассматривает их отменить журналы при старте. Любой журнал DDL для таблиц InnoDB будет по существу игнорироваться InnoDB, но сервер запустится |
| 6 | (SRV_FORCE_NO_LOG_REDO) не выполняет перемотку журнала вперёд в рамках восстановления. Запуск запросов, требующих индексов, скорее всего, завершится неудачей при активном этом режиме. Однако, если дамп таблицы по-прежнему вызывает сбой, вы можете попробовать использовать a SELECT * FROM tab ORDER BY primary_key DESC чтобы сбросить всю часть данных после поврежденной части. |
Обратите также внимание, что XtraDB (<= МарияДБ 10.2.6) по умолчанию приведет к сбою сервера при обнаружении поврежденных данных в однотабличном пространстве таблиц. Такое поведение можно изменить - см innodb_corrupt_table_action системная переменная.
Один из вариантов сброса дампа по каждой базе
mysql -uroot -p'O]Qqz$(l,H_&' -e' show databases;' | grep -v information_schema | grep -v Database; do /usr/bin/mysqldump -uroot -p'O]Qqz$(l,H_&' i.sql.gz; doneМожно попробовать через SQL
$ SELECT * FROM quux INTO OUTFILE '/root/quux.sql';
Если есть доступ и можно записывать изменения. Методы check table и repair table не работают на БД с INNODB, только на ISAM. А вот optimize table все еще работает.
Утилита mysqlcheck с ключами —repair и –repair –all-databases не работает также на базам с движком INNODB. Самое дурное здесь то, что если просто были повреждены индексы, то база ложится и простым способом ее не восстановить.
Как вариант, не проверял, попробовать
mysqlcheck yourdatabase -p --optimize
или
mysqlcheck -u root -p --auto-repair --optimize --all-databases
https://github.com/major/MySQLTuner-perl Простая программа, анализирует текущее состояние, предлагает оптимизации. Проста в использовании perl mysqltuner.pl perl mysqltuner.pl --cvefile cve.csv