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-мережі.

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

Як встановити Postfix на CentOS Stream 10 і налаштувати сервер SMTP
18.03.2025
Як встановити Postfix на CentOS Stream 10 і налаштувати сервер SMTP
Встановлюємо Postfix на VPS/VDS або виділений сервер із ОС CentOS Stream 10 та налаштовуємо SMTP сервер.
Коронавірус 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 і налаштовуємо щоденне сканування сервера.