Назад | Перейти на главную страницу

Graphite SQLite3 DatabaseError: база данных заблокирована

Выполняя первоначальную установку и настройку Graphite на CentOS 6.4 с использованием Apache mod_wsgi через стандартный пакет graphite-web rpm, я получаю следующее:DatabaseError: база данных заблокирована"сообщение:

mod_wsgi (pid=9009): Target WSGI script '/usr/share/graphite/graphite-web.wsgi' cannot be loaded as Python module.
mod_wsgi (pid=9009): Exception occurred processing WSGI script '/usr/share/graphite/graphite-web.wsgi'.
Traceback (most recent call last):
  File "/usr/share/graphite/graphite-web.wsgi", line 16, in <module>
    import graphite.metrics.search
  File "/usr/lib/python2.6/site-packages/graphite/metrics/search.py", line 6, in <module>
    from graphite.storage import is_pattern, match_entries
  File "/usr/lib/python2.6/site-packages/graphite/storage.py", line 7, in <module>
    from graphite.remote_storage import RemoteStore
  File "/usr/lib/python2.6/site-packages/graphite/remote_storage.py", line 8, in <module>
    from graphite.util import unpickle
  File "/usr/lib/python2.6/site-packages/graphite/util.py", line 82, in <module>
    defaultProfile.save()
  File "/usr/lib/python2.6/site-packages/django/db/models/base.py", line 460, in save
    self.save_base(using=using, force_insert=force_insert, force_update=force_update)
  File "/usr/lib/python2.6/site-packages/django/db/models/base.py", line 553, in save_base
    result = manager._insert(values, return_id=update_pk, using=using)
  File "/usr/lib/python2.6/site-packages/django/db/models/manager.py", line 195, in _insert
    return insert_query(self.model, values, **kwargs)
  File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 1436, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 791, in execute_sql
    cursor = super(SQLInsertCompiler, self).execute_sql(None)
  File "/usr/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql
    cursor.execute(sql, params)
  File "/usr/lib/python2.6/site-packages/django/db/backends/util.py", line 34, in execute
    return self.cursor.execute(sql, params)
  File "/usr/lib/python2.6/site-packages/django/db/backends/sqlite3/base.py", line 234, in execute
    return Database.Cursor.execute(self, query, params)
DatabaseError: database is locked

Я проверил, что файл БД ("/var/lib/graphite-web/graphite.db") доступен Apache пользователь, которому принадлежит httpd обработать.

Кроме того, я попытался перезапустить как httpd и угольный тайник процессы, упомянутые в эта ветка на github.

Список lsof показывает следующее:

# lsof | grep graphite.db
httpd      9006    apache   17u      REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db
httpd      9007    apache   17u      REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db
httpd      9008    apache   17u      REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db
httpd      9008    apache   22u      REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db
httpd      9009    apache   17u      REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db
httpd      9009    apache   22u      REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db
httpd      9010    apache   17ur     REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db
httpd      9010    apache   18u      REG              253,2      512     526174 /var/lib/graphite-web/graphite.db-journal
httpd      9010    apache   24ur     REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db
httpd      9011    apache   17u      REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db
httpd      9012    apache   17u      REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db
httpd      9013    apache   17u      REG              253,2    69632     526186 /var/lib/graphite-web/graphite.db

На мой взгляд, это должно быть связано с httpd, но я никуда не денусь.

Я продолжал и обнаружил, что перезапуск httpd волшебно работал.

Однако до сих пор неясно, почему мои предыдущие десятки попыток исправить ошибку с помощью перезапуска httpd потерпели неудачу. Я думал, что это могло быть состояние гонки между запуском apache + mod_wsgi и слишком ранним попаданием на графитную веб-страницу, но при последующих перезапусках я не смог воспроизвести блокировку. Дальнейшие попытки в различных состояниях (apache запущен, apache не работает, db принадлежит root и т. Д.) Не привели к воспроизведению ошибки. Действительно, на этом этапе я могу удалить graphite.db, повторно запустить с помощью «syncdb» и успешно просмотреть веб-страницу без перезапуска httpd. Графитовая веб-страница работает нормально во всех случаях.

Мое предложение, если вы застряли на этом:

  1. Завершите процесс httpd или apache.
  2. Удалите файл "graphite.db".
  3. Повторно запустите процесс syncdb как пользователь "apache" (или пользователя, владеющего процессом httpd).
  4. Запустите процесс httpd.
  5. Подождите 60+ секунд, прежде чем перейти на веб-страницу, затем попробуйте.

Это могло быть эквивалентом «махать мертвой курицей», но так я выбрался из беспорядка. Не стесняйтесь размещать здесь свой опыт.