30.01.2012

MySQL квоти - реалізація квот на бази даних MySQL

MySQL квоти - реалізація квот на бази даних MySQL

Здебільшого використовується два формати таблиць даних MySQL - це InnoDB і MyISAM. Таблиці MyISAM зберігаються в індивідуальних файлах, тому їх обмежити просто, але ось всі таблиці InnoDB всіх баз, за замовчуванням зберігаються в загальних файлах для всіх таблиць даного типу.

InnoDB і MyISAM

Щоб розділити таблиці InnoDB на індивідуальні для кожної таблиці файли, включаємо в конфіги mysql сервера my.cnf опцію innodb_file_per_table в секції [mysqld]:

[mysqld]
...
innodb_file_per_table

В такому випадку, таблиці InnoDB і MyISAM будуть розташовуватися в індивідуальних директоріях для кожної бази - MyISAM в .MYD і .MYI, InnoDB - в .ibd. Щоб розрізняти, яка база якому користувачеві належить, бази створюємо по імені групи користувача виду:

bduser_basename
bduser - локальна група користувача, який створює базу
basename - приставка, яку може змінювати користувач, щоб відрізнити різні бази одного і того ж локального користувача.

Бази у нас будуть зберігатися в /var/lib/mysql, таким чином по крону будемо міняти групу файлів баз, які належать одному користувачеві - для цього пишемо простий скрипт:

for bd in `find /var/lib/mysql -type d`
do
 chown -R mysql:`echo $bd |cut -d'/' -f5 |cut -d'_' -f1` $bd
done

Але тут виникає одна серйозна проблема - при перевищенні ліміту, сервер mysql не може писати в базу і створювати таблиці, тому в пам'яті росте безліч процесів INSERT, CREATE і UPDATE, які не можуть виконуватися. Щоб такого не було, необхідно користувачам, які перевищили квоту, заборонити виконувати ці операції, а якщо вони базу зменшать, відповідно назад дозволити. Таким чином, пишемо скрипт, який буде перевіряти квоти і забороняти / дозволяти операції INSERT, CREATE, UPDATE залежно від квоти:

export MYSQL_PWD=passWord # Тут у нас пароль адміністратора mysql
update='0'
for user in `cat /var/log/mysqlquota` # /var/lod/mysqlquota - список заблокованих
do
    baduser=`quota -q -g $user 2>/dev/null |head -n1 |cut -d' ' -f5`
    if [ "$baduser" != "$user" ]
    then
        for base in `echo "SELECT db FROM db WHERE db LIKE \"$user\_%\"" |mysql -uroot mysql -bs`
        do
            echo "UPDATE db SET Insert_priv='Y', Create_priv='Y', Update_priv='Y' WHERE Db='$base';" |mysql mysql -bs
            update='1'
        done
    fi.
done
echo -n >/var/log/mysqlquota
for home in `find /var/lib/mysql/ -type d |cut -d'/' -f5 |cut -d'_' -f1`
do
        if id -g $home >/dev/null 2>/dev/null # перевіряємо існування групи користувача в системі
        then
            for user in `quota -q -g $home 2>/dev/null |head -n1 |cut -d' ' -f5`
            do
              echo $user >>/var/log/mysqlquota
              for base in `echo "SELECT db FROM db WHERE db LIKE \"$user\_%\"" |mysql -uroot mysql -bs`
              do
                echo "UPDATE db SET Insert_priv='N', Create_priv='N', Update_priv='N' WHERE Db='$base';" |mysql -uroot mysql -bs
                update='1'
              done
            done
        fi
done
if [ "$update" = '1' ]
then
    echo "FLUSH PRIVILEGES;" |mysql -uroot mysql -bs
fi

Таким чином, можна поєднати встановлення прав і перевірку квот в один скрипт і запускати його за допомогою crontab, наприклад, раз в 5 хвилин.

Останні новини

Знижка на всі домени України до 21.10.2022!
14.10.2022
Знижка на всі домени України до 21.10.2022!
Шановні користувачі! Цілий тиждень у нас знижка -15% на реєстрацію всіх українських доменів за промокодом defendersday22!
Подорожчання низки українських доменів UA ccTLD!
28.09.2022
Подорожчання низки українських доменів UA ccTLD!
Шановні користувачі! З 1 жовтня 2022 року на нас чекає подорожчання низки українських доменів - in.ua, od.ua, mk.ua!
Важливі зміни у роботі низки українських доменів!
09.03.2022
Важливі зміни у роботі низки українських доменів!
Шановні користувачі! У деяких українських доменних зонах збільшено термін періоду Redemption з 30 до 60 днів.
Подорожчання виділених IP-адрес (IPv4) у Німеччині!
09.08.2021
Подорожчання виділених IP-адрес (IPv4) у Німеччині!
Шановні користувачі! У Німеччині істотно подорожчали додаткові виділені IP-адреси (IPv4) та IP-мережі.

Останні записи з блогу

Коронавірус Coronavirus (COVID-19) та кібершахраї в мережі Інтернет
02.03.2020
Коронавірус Coronavirus (COVID-19) та кібершахраї в мережі Інтернет
Паніку навколо коронавірусу COVID-19 використовують у мережі Інтернет кібершахраї - фішинг, продаж масок, вакцин і тестів.
Не відправляється пошта - перевіряємо чи не блокує провайдер 25 порт
11.01.2020
Не відправляється пошта - перевіряємо чи не блокує провайдер 25 порт
Перевіряємо чи блокує провайдер 25 порт за допомогою командного рядка в ОС Windows. Як відправляти пошту якщо 25 порт заблокований.
Як встановити Clam AntiVirus (ClamAV) на VPS або сервер з ОС CentOS
11.11.2019
Як встановити Clam AntiVirus (ClamAV) на VPS або сервер з ОС CentOS
Встановлюємо Clam AntiVirus (ClamAV) на VPS / VDS або виділений сервер з ОС CentOS і налаштовуємо щоденне сканування сервера.
ISPmanager більше не підтримує резервне копіювання на Яндекс.Диск
20.10.2019
ISPmanager більше не підтримує резервне копіювання на Яндекс.Диск
Протягом тижня Яндекс.Диск зникне зі списку сховища для резервного копіювання в панелі ISPmanager та інших продуктах ISPsystem.