Несколько дней назад мы столкнулись с некоторыми серьезными проблемами при установке MySQL: MySQL продолжает открывать временные файлы (нормальное поведение), но эти файлы никогда не выпускаются. Следствием этого является то, что в конечном итоге дисковое пространство исчерпывается, и нам приходится перезапускать службу и очищать / tmp вручную.
Используя lsof, мы видим что-то вроде этого:
mysqld 16866 mysql 5u REG 8,3 0 692 /tmp/ibyWJylQ (deleted)
mysqld 16866 mysql 6u REG 8,3 0 707 /tmp/ibf5adsT (deleted)
mysqld 16866 mysql 7u REG 8,3 0 728 /tmp/ibGjPRyW (deleted)
mysqld 16866 mysql 8u REG 8,3 0 5678 /tmp/ibMQDLMZ (deleted)
mysqld 16866 mysql 13u REG 8,3 0 5679 /tmp/ibQAnM42 (deleted)
Возможно, это не связано, но когда мы выключаем сервер, файлы, наконец, освобождаются, и мы можем видеть следующие предупреждения в журнале MySQL:
121029 7:44:27 [Warning] /usr/local/mysql/bin/mysqld: Forcing close of thread 1333 user: 'xxx'
121029 7:44:27 [Warning] /usr/local/mysql/bin/mysqld: Forcing close of thread 1156 user: 'yyy'
121029 7:44:27 [Warning] /usr/local/mysql/bin/mysqld: Forcing close of thread 1151 user: 'zzz'
где «xxx», «yyy» и «zzz» - разные пользователи mysql (и единственные 3 пользователя с активными подключениями к базе данных).
У нас есть несколько теорий:
В ОС есть проблема, из-за которой обработчики файлов остаются открытыми. Возможно ли, что операция «удаления» ОС блокирует потоки до завершения работы? Это может объяснить предупреждение при завершении работы и тот факт, что файлы окончательно удаляются, когда процесс завершается.
До сих пор наборы данных были настолько малы, что временные файлы были относительно небольшими, и было достаточно времени, чтобы освободить дескрипторы файлов, не занимая места на диске.
Мы используем Mysql 5.5 на RHEL 6.2 с ядром по умолчанию.
Что ж ... Это не совсем решение, но я считаю это концом исследования.
Похоже, это ошибка MySQL. Мы нашли это через эта ошибка это кажется дубликатом вот этот
В качестве обходного пути, чтобы избежать создания такого большого количества временных файлов, мы увеличили binlog_cache_size до разумного для нас значения (после небольшого тестирования приложения и проверки размера файлов с помощью lsof). Если вы хотите узнать больше, вы можете найти статья о других вариантах решения этой проблемы.
Надеюсь, это кому-то поможет;)
Для справки есть еще одна очень похожая ошибка: http://bugs.mysql.com/bug.php?id=66237. И это даже кажется не исправленным в 5.5.