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 хвилин.

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

Хостинг Хутір тепер у Telegram: чат з підтримкою, бот, канал
04.05.2020
Хостинг Хутір тепер у Telegram: чат з підтримкою, бот, канал
Шановні користувачі! Тепер ми у Telegram! Чат з підтримкою, бот для відправки повідомлень особистого кабінету і канал.
Графік роботи та обробки платежів під час травневих свят
29.04.2020
Графік роботи та обробки платежів під час травневих свят
Шановні користувачі Хостинг Хутору! Ознайомтесь з графіком обробки банківських переказів на час травневих свят.
Google Chrome незабаром почне блокувати небезпечні HTTP-завантаження
03.03.2020
Google Chrome незабаром почне блокувати небезпечні HTTP-завантаження
Спочатку браузер Chrome буде лише попереджати, але у наступних релізах вже блокувати небезпечні завантаження по HTTP.
З 13 січня діє тільки новий стандарт банківських рахунків IBAN!
13.01.2020
З 13 січня діє тільки новий стандарт банківських рахунків IBAN!
З сьогоднішнього дня код банку (МФО) та розрахунковий рахунок в Україні замінить номер банківського рахунку за стандартом IBAN.

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

Коронавірус 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.

Популярні домени