Хитрости квотирования MySQL.
Каждую базу MySQL хранит в отдельном каталоге внутри datadir.
MySQL работает под своим пользователем и соответственно создает файлы баз под им же. Соответственно квотирование в данном случае не возможно. Необходимо заставить его создавать файлы баз, влaдельцем которых будет конкретный квотируемый пользователь. Сделать это можно выставив бит SUID (4000) на каталог базы.
Для начала:
в ядре:
options SUIDDIR
в /etc/fstab:
добавляем в список опций suiddir
В MySQL создаем базу. Находим каталог базы в datadir. По умолчанию он будет mysql:mysql.
Меняем владельца:
chown sql-user databasedir
теперь наш каталог sql-user:mysql
Меняем права:
chmod 4070 databasedir
Такая настройка заставит систему создавать файлы от имени владельца каталога (sql-user) причем сам пользователь не будет иметь к нему доступа. К нему будет иметь полный доступ MySQL (от группы mysql).
Теперь мы можем использовать квоты как для обычных файлов.
При превышении квот MySQL будет генерить ошибку full disk что является нормальным явлением и корректно отрабатывается MySQL, хотя сопровождается некоторыми проблемами: при запросе на добавление в базу, превысившую квоты, запрос повисает, повисают также последующие запросы, которые можно снять только их убийством или освобождением дополнительного места на диске. При дефолтных настройках это сразу вызовет проблему, так как такие запросы займут все сетевые соединения. Поэтому необходимо ОБЯЗАТЕЛЬНО
ограничить максимальное количество подключений одного пользователя MySQL. В /etc/my.cnf:
max_connections = 500 (всего коннектов)
max_user_connections = 30 (максимум для одного пользователя)
Также возможно следующие - MySQL может пометить как поврежденные при останове сервера или когда временные файлы займут слишком много места на диске (второе судя по мануалам, не проверял). Лечится репаиром соотвествующих таблиц.
Убить повисшие процессы может только root базы если они достигли max_user_connections.
Не работает с таблицами innodb, так последние хранятся в одном месте независимо от базы.
Коментируйте. |