Для ownCloud 10 начните с применения изменений схемы, предоставленных установленным ядром и приложениями, а затем проверьте, какие запросы к базе данных действительно работают медленно. Не добавляйте индексы вслепую и не предполагайте, что команда Nextcloud db:add-missing-indicesявляется поддерживаемой командой восстановления ownCloud 10: в текущем справочнике OCC для ownCloud Server 10.15 она не описана. Индексы могут ускорить чтение с совпадениями, но каждый добавленный индекс потребляет место в памяти и увеличивает нагрузку на операции вставки, обновления и удаления.
Этот подход подходит администратору, у которого медленно работает страница ownCloud, отображается список файлов или работает приложение, и который имеет доступ к серверу и базе данных. Если медленная работа наблюдается на всем экземпляре или он работает на SQLite с несколькими активными пользователями, проверьте общую конфигурацию базы данных и развертывания, прежде чем рассматривать индексы как причину проблемы.
Выберите изменение, соответствующее имеющимся доказательствам.
Индекс базы данных — это вспомогательная структура, которая помогает базе данных находить строки без сканирования всей таблицы. ownCloud и его приложения определяют таблицы, столбцы и индексы как часть своей схемы. Обновления ядра и приложений могут включать миграцию схемы, которая создает или корректирует эти индексы. Поэтому поддержание актуальности схемы приложения является самым безопасным первым шагом.
Прежде чем что-либо менять, учитывайте следующие особенности:
- Предупреждение администратора или известная проблема обновления: запустите стандартную процедуру обновления ownCloud и просмотрите ее результаты. Миграция обновления — это поддерживаемый способ внесения изменений в схему, предоставляемых ownCloud или приложением.
- Один из известных медленных запросов с неэффективным планом выполнения: попросите администратора базы данных проверить запрос и план. Целевой индекс может помочь, но предлагаемые столбцы и порядок должны соответствовать запросу и определению таблицы.
- Медленная загрузка, блокировки или высокая конкуренция: проверьте транзакции, задержку хранилища, емкость базы данных и блокировки файлов. Сами по себе эти симптомы не доказывают отсутствие индекса.
- Для небольших многопользовательских установок SQLite рассмотрите возможность миграции на MySQL/MariaDB или PostgreSQL. ownCloud описывает SQLite как подходящий инструмент для тестирования и небольших однопользовательских рабочих нагрузок, в то время как для многопользовательских развертываний в производственной среде следует использовать поддерживаемую серверную базу данных.
Индекс не является универсальным переключателем скорости. Увеличение количества индексов может улучшить выборочные поиски, но при этом увеличить размер базы данных и задержку записи. Результат зависит от структуры запроса, размера таблицы, распределения данных, механизма базы данных и состояния кэша.
Подготовьте безопасное окно для проведения технического обслуживания.
- Запишите точные версии и базу данных. Из каталога установки ownCloud запустите команду
sudo -u www-data ./occ status. Запишите версию ownCloud, версии установленных приложений, тип базы данных и префикс таблиц из файла config/config.php. Замените www-dataна учетную запись веб-сервера в вашем дистрибутиве. - Зафиксируйте медленную работу. Обратите внимание на затронутый экран или приложение, приблизительное время и повторяется ли задержка. Просмотрите журналы ownCloud и диагностику медленных запросов вашей базы данных. Включайте ведение журнала запросов только в соответствии с рекомендациями поставщика вашей базы данных, поскольку журналы могут содержать конфиденциальные значения SQL и быстро увеличиваться в размере.
- Создайте резервную копию базы данных и конфигурации. Используйте метод резервного копирования, обеспечивающий согласованность данных с базой данных, и убедитесь, что резервная копия доступна для чтения. В документации ownCloud по резервному копированию
mysqldump --single-transactionв качестве примера используются базы данных, совместимые с MySQL; адаптируйте значения хоста, пользователя и базы данных к вашей конфигурации. Не добавляйте пароль к базе данных непосредственно в историю командной оболочки или список процессов. - Вносите изменения в расписание ответственно. Обновление схемы или создание индекса может задействовать дисковый ввод-вывод, процессор и блокировки. При интенсивной или масштабной установке сообщите пользователям о временном окне и отслеживайте нагрузку на базу данных. Используйте режим обслуживания ownCloud только тогда, когда этого требует соответствующая процедура обновления или обслуживания; не включайте его вместо резервного копирования.
Сначала примените обновления схемы, управляемые ownCloud.
Если ожидается обновление ядра или приложений ownCloud, используйте описанный в документации процесс обновления для вашего метода установки. В обычной установке Linux команда OCC запускается от имени пользователя HTTP из корневого каталога ownCloud. При следовании инструкциям по ручному обновлению команда выглядит следующим образом:
sudo -u www-data ./occ upgrade
Не запускайте это для установки, файлы которой были обновлены лишь частично. Сначала подготовьте соответствующие файлы релиза и следуйте официальным инструкциям по обновлению для этого релиза. Для развертывания в Docker используйте документированный вызов OCC контейнера, а не путь к хосту, указывающий на другую среду PHP.
Прочитайте полный вывод команды и журналы. Успешное выполнение команды должно завершиться без сообщения о неудачной миграции; это не гарантирует исправление всех медленных запросов. Если обновление сообщает об ошибке миграции, остановите выполнение и исследуйте эту ошибку, вместо того чтобы многократно запускать команду или редактировать таблицы схемы вручную. При необходимости миграции приложения обратитесь к документации по обновлению ownCloud для конкретной версии и к сопровождающему приложения.
В справочнике ownCloud 10.15 OCC перечислены команды базы данных, такие как db:convert-type, db:convert-mysql-charset, и db:restore-default-row-format, но отсутствует команда db:add-missing-indices. Поскольку доступность команд может различаться в зависимости от версии и установленного кода, вы можете проверить свой экземпляр с помощью sudo -u www-data ./occ list dbили sudo -u www-data ./occ help db:add-missing-indices. Если последний сообщает о неизвестной команде, не копируйте команду из руководства Nextcloud в ownCloud. Проверьте документацию для вашей конкретной версии ownCloud и используйте поддерживаемый путь обновления или миграции приложения.
В каких случаях целесообразно использовать ручной указатель?
Ручной SQL-запрос — это опция администратора базы данных для решения проверенной проблемы с запросом, а не стандартная оптимизация ownCloud. Сначала определите точный медленный запрос и запустите инструмент проверки плана выполнения, например, EXPLAINдля MySQL/MariaDB или PostgreSQL. Убедитесь, что план не сканирует излишне большое количество строк и не игнорируется ли существующий индекс. Префикс таблиц ownCloud можно настроить, поэтому никогда не предполагайте, что имена таблиц начинаются с oc_.
Перед созданием индекса сравните предлагаемые столбцы с фильтрами, соединениями и порядком сортировки запроса. Порядок столбцов в составном индексе имеет значение; дублирование существующего индекса может увеличить стоимость без улучшения плана выполнения. Попросите администратора базы данных учесть особенности работы версий базы данных, поддержку создания индексов в режиме онлайн или одновременно, запас дискового пространства, влияние блокировок и процедуру отката. Эти детали зависят от используемого механизма и версии, поэтому не существует единого безопасного SQL-запроса для каждой установки ownCloud 10.
Не изменяйте таблицы ownCloud и не удаляйте индексы только потому, что имя кажется избыточным. Такие изменения могут конфликтовать с последующей миграцией ядра или приложения и могут нарушить работу функции, использующей другой запрос, отличный от того, который вы проверяли. Ведите письменный учет любых изменений схемы, внесенных вручную, и убедитесь, что их можно воссоздать после восстановления или миграции. Если отсутствующий индекс является дефектом схемы продукта, отдавайте предпочтение поддерживаемому патчу ownCloud или релизу приложения.
Сравните альтернативы на уровне базы данных
Если в плане уже используется соответствующий индекс, добавление еще одного вряд ли устранит задержку, вызванную в другом месте. Сравните эти варианты с наблюдаемым узким местом:
- MySQL или MariaDB: распространенный вариант для развертываний, администраторы которых уже используют эти движки. Перед изменением настроек сервера проверьте объем памяти буферного пула, задержку диска, соединения и планы медленных запросов.
- PostgreSQL: поддерживаемая альтернатива ownCloud 10, если правильно настроены PHP-коннектор к базе данных и развертывание. Планы запросов и инструменты для обслуживания индексов отличаются от MySQL, поэтому используйте рекомендации, специфичные для PostgreSQL.
- SQLite: прост в использовании для тестирования или небольших задач с одним пользователем, но не является выбором по умолчанию для одновременной многопользовательской рабочей нагрузки в производственной среде. Настройка индексов не позволяет снять ограничения на параллельную обработку данных.
Смена движка базы данных — это проект миграции, а не быстрая корректировка индексов. ownCloud поддерживает occ db:convert-typeконвертацию; ознакомьтесь с его предварительными требованиями, сделайте резервную копию и протестируйте конвертированный экземпляр, прежде чем рекомендовать его пользователям.
Проверьте результат и остановитесь, если доказательства противоречат ему.
Повторите то же действие пользователя в сопоставимых условиях и сравните продолжительность запроса, план выполнения, количество просмотренных строк, операции ввода-вывода базы данных и нагрузку на сервер. Убедитесь, что соответствующая страница или приложение ownCloud завершаются нормально и что в журналах отсутствуют ошибки базы данных или миграции. Более быстрый результат по одному запросу не доказывает общего улучшения; сравните несколько репрезентативных запросов и учтите наличие «горячих» кэшей.
Если тот же запрос по-прежнему выполняется медленно при использовании соответствующего индекса, проверьте блокировки, хранилище, задержку сети, количество рабочих процессов PHP и ограничения ресурсов базы данных. Если план запроса или структура таблицы неясны, остановитесь перед выполнением DDL вручную и попросите администратора базы данных или представителя службы поддержки ownCloud проверить их. Надежным результатом будет схема, соответствующая установленной версии ownCloud и измеренным запросам, без неотслеживаемых изменений индексов.
Официальные ссылки