Ошибка субд lost synchronization with server
Ошибка СУБД в 1С: причины возникновения и решение
При нарушении целостности файловой системы сервера баз данных PostgreSQL, последний выдает “Ошибка СУБД” 1С, и часто сопровождается текстом, типа “ERROR: invalid page header in block ХХХХХ of relation base/ХХХХХ/ХХХХХ”.
Причиной подобных исключений может служить разрушенная файловая система и нарушение логической целостности всей базы данных, произошедшие в результате некорректного завершения работы ОС.
Выводимую 1С “Ошибка СУБД” на самом деле надо начинать исправлять не в 1С, а с проверки файловой системы. Полный алгоритм восстановления будет приблизительно следующий:
- Исправление ошибок файловой системы;
- Выявление неисправных таблиц СУБД и их ремонт;
- Проверка и исправление ошибок на уровне 1С в конфигураторе.
Если “Ошибка СУБД” в 1С произошла после некорректного завершения работы ОС, начинаем с команд Chkdsk в Windows и fsck в Linux. Это позволит устранить ошибки на уровне файловой системы.
Затем надо выяснить в каких таблицах БД PostgreSQL возникает ошибка “ERROR: invalid page header in block…”. Для этого обращаемся к логам или пытаемся снять дамп базы данных, например подключившись к СУБД утилитой pgAdmin. Если возникает ошибка “Ошибка СУБД” в 1С, наверняка найдется хотя бы 1 испорченная таблица. В моем случае ошибка возникла при дампе public._enum332.
Для того, чтобы восстановить сломанную таблицу, выполним 3 запроса:
Далее снова пытаемся снять дамп базы данных, пока база не выгрузится без ошибок.
Следующим этапом исправления ошибки СУБД в 1С будет Тестирование и исправление базы в конфигураторе 1С. Для этого запускаем испорченную БД в конфигураторе. Через пункт Администрирование – Тестирование и исправление ИБ пробуем восстановить логическую целостность нашей базы. Обратите внимание, на галочки, выбранные на изображении.
При большом количестве ошибок СУБД, 1С потребуется помощь программиста или грамотного пользователя 1С помимо системного администратора, поэтому будьте готовы к привлечению подобных специалистов.
На этом процедуру исправления ошибки PostgreSQL “ERROR: invalid page header in block…” при работе с 1С можно считать законченной, однако стоит отметить несколько пунктов, которые позволят не допустить возникновение ошибки СУБД в 1С:
- Регулярное резервное копирование БД автоматическими средствами без участия человека;
- Использование источника бесперебойного питания с контроллером управления, корректно выключающего сервер при низком заряде батарей;
- Регулярное обслуживание серверов.
Записки IT специалиста
Технический блог специалистов ООО»Интерфейс»
- Главная
- Типовые ошибки установки сервера 1С:Предприятие и PostgreSQL на платформе Linux.
Типовые ошибки установки сервера 1С:Предприятие и PostgreSQL на платформе Linux.
- Автор: Уваров А.С.
- 22.05.2014
Связка сервера 1С:Предприятие и PostgreSQL вторая по популярности среди установок 1С и самое используемое решение на платформе Linux. В отличии внедрений на базе Windows и MSSQL, где трудно сделать так, чтобы не заработало, внедрения на базе Linux таят множество подводных камней для неопытного администратора. Часто бывает так, что вроде бы все сделано правильно, но ошибка следует за ошибкой. Сегодня мы рассмотрим самые типовые из них.
Общая информация
Перед тем, как начинать искать ошибки установки и, вообще, приступать к внедрению серверной версии 1С:Предприятия было бы неплохо освежить представление как это работает:
В небольших внедрениях сервер 1С и сервер СУБД обычно совмещают на одном физическом сервере, что немного сужает круг возможных ошибок. В нашем случае будет рассматриваться ситуация, когда сервера разнесены по разным машинам. В нашей тестовой лаборатории мы развернули следующую схему:
В нашем распоряжении имеются два сервера под управлением Ubuntu 12.04 x64, на одном из них установлен сервер 1С:Предприятие версии 8.3, на другом PostgreSQL 9.04 от Ethersoft, а также клиент под управлением Windows. Напоминаем, что клиент работает только с сервером 1С, который, в свою очередь, формирует необходимые запросы к серверу СУБД. Никаких запросов от клиента к серверу управления базами данных не происходит.
Сервер баз данных не обнаружен
ВАЖНО: пользователь «postgres» не прошёл проверку подлинности (Ident)
Данная ошибка возникает при разнесении серверов по разным ПК из-за неправильно настроеной проверки подлинности в локальной сети. Для устранения откройте /var/lib/pgsql/data/pg_hba.conf, найдите строку:
и приведите ее к виду:
где 192.168.31.0/24 — диапазон вашей локальной сети. Если такой строки нет, ее следует создать в секции IPv4 local connections.
Сервер баз данных не обнаружен
could not translate host name «NAME» to address: Temporary failure in name resolution
На первый взгляд ошибка понятна: клиент не может разрешить имя сервера СУБД, типичная ошибка для небольших сетей, где отсутствует локальный DNS-сервер. В качестве решения добавляют запись в файл hosts на клиенте, что не дает никакого результата.
А теперь вспоминаем, о чем было сказано несколько раньше. Клиентом сервера СУБД является сервер 1С, но никак не клиентский ПК, следовательно запись нужно добавлять на сервере 1С:Предприятие в файл /etc/hosts на платформе Linux или в C:WindowsSystem32driversetchosts на платформе Windows.
Аналогичная ошибка будет возникать, если вы забыли добавить запись типа A для сервера СУБД на локальном DNS-сервере.
Ошибка при выполнении операции с информационной базой
server_addr=NAME descr=11001(0x00002AF9): Этот хост неизвестен.
Как и прошлая, эта ошибка связана с неправильным разрешением клиентом имени сервера. На этот раз именно клиентским ПК. В качестве решения добавляем в файл /etc/hosts на платформе Linux или в C:WindowsSystem32driversetchosts на платформе Windows запись вида:
где указываете адрес и имя вашего сервера 1С:Предприятия. В случае использования локального DNS следует добавить A-запись для сервера 1С.
Ошибка СУБД: DATABASE не пригоден для использования
Гораздо более серьезная ошибка, которая говорит о том, что вы установили несовместимую с 1С:Предприятие версию PostgreSQL или допустили грубые ошибки при установке, например не установили все необходимые зависимости, в частности библиотеку libICU.
Если вы имеете достаточный опыт администрирования Linux систем, то можете попробовать доустановить необходимые библиотеки и заново инициализировать кластер СУБД. В противном случае PostgreSQL лучше переустановить, не забыв удалить содержимое папки /var/lib/pgsql.
Также данная ошибка может возникать при использовании сборок 9.1.x и 9.2.x Postgre@Etersoft, подробности смотрите ниже.
Ошибка СУБД:
ERROR: could not load library «/usr/lib/x86_64-linux-gnu/postgresql/fasttrun.so»
Довольно специфичная ошибка, характерная для сборок 9.1.x и 9.2.x Postgre@Etersoft, также может приводить предыдущей ошибке. Причина кроется в неисправленной ошибке в библиотеке fasttrun.so. Решение — откатиться на сборку 9.0.x Postgre@Etersoft.
Ошибка СУБД
ERROR: type «mvarchar» does not exist at character 31
Возникает если база данных была создана без помощи системы 1С:Предприятия. Помните, для работы с 1С базы данных следует создавать только с использованием инструментов платформы 1С: через консоль Администрирование серверов 1С Предприятия
или через средство запуска 1С.
Сервер баз данных не обнаружен
ВАЖНО: пользователь «postgres» не прошёл проверку подлинности (по паролю)
Очень простая ошибка. Неправильно указан пароль суперпользователя СУБД postgres. Вариантов решения два: вспомнить пароль или изменить его. Во втором случае вам нужно будет изменить пароль в свойствах всех существующих информационных баз через оснастку Администрирование серверов 1С Предприятия.
Сервер баз данных не обнаружен
FATAL: database «NAME» does not exist
Еще одна очень простая ошибка. Смысл ее сводится к тому, что указанная БД не существует. Чаще всего возникает из-за ошибки в указании имени базы. Следует помнить, что информационная база 1С в кластере и база данных СУБД — две разные сущности и могут иметь различные имена. Также следует помнить, что Linux системы чувствительны к регистру и для них unf83 и UNF83 два разных имени.
Методика выявления длительной транзакции, которая привела к значительному расходу tempdb
Описание проблемы
К таким транзакциям стоит относиться подозрительно и стараться их не допускать.
Проблемы, к которым могут приводить длительные транзакции, в первую очередь связаны с избыточным потреблением каких-либо ресурсов: избыточные блокировки, избыточное потребление tempdb при работе с MS SQL Server.
Информацию по типичным причинам избыточных блокировок вы сможете найти в статье «Типичные причины избыточных блокировок и методы оптимизации».
В этой методике будет рассмотрена ещё одно достаточно неприятное проявление — избыточное потребление места в tempdb при работе с MS SQL Server.
Методика выявления длительной транзакции, которая привела к значительному расходу tempdb
1 — Зафиксировать значительное потребление tempdb
В целом объем свободного места можно оценить даже простейшим запросом
Для оперативной реакции на рост объема tempdb можно использовать «Инциденты и генерацию оповещений в ЦКК».
2 — Найти номер транзакции в MS SQL Server Management Studio
Для всех систем, работающих с использованием Технологической Платформы 1С в режиме совместимости с версией 8.3. (и старше) эффективно будет выполнение запроса:
Первые две колонки — номер сессии с СУБД и длительность транзакции.
Если длительность транзакции значительная, то транзакция, скорее всего, та, которую мы искали.
На практике редко бывает (может быть, у вас было по-другому?), что одновременно будет выполняться множество именно длительных транзакций, относящихся к различным операциям.
В этом запросе вы не получите объем места, использованный транзакцией, но по длительности транзакции (косвенный признак) получается идентифицировать виновника в 99% случаев.
Запоминаем номер session_id
Если проблема совсем критичная, а пользователи не могут больше работать, то нужно будет на СУБД выполнить kill 123, где 123 — номер session_idНо это на совсем крайний случай. В этом случае в технологическом журнале будет зафиксировано исключение и событие EXCP. Такая ситуация, например, выглядит так (пример искусственный, но всё же)
В этом примере можно увидеть искомую транзакцию
Есть более «полный» запрос, который также позволит получить нужный номер транзакции, особенно, если система работает в режиме совместимости с 8.2.
Однако, приведенный ниже запрос может выполняться несколько десятков секунд (будьте к этому готовы): DECLARE @curr_date as DATETIME
Если вы не стали рисковать и отменять транзакцию (вдруг выполняется очень важная операция?), расследуем дальше.
3 — Находим код, выполнение которого привело к длительному выполнению в транзакции
Открываем консоль администрирования кластера серверов.
Переходим на закладку сеансы.
Нас интересуют две колонки:
— Соединение с СУБД
Запоминаем номер сеанса.
Обратите внимание, что session_id = Соединение с СУБД.
Опять же, если будет очень плохо, можно завершить сеанс.
В технологическом журнале это будет выглядеть так:
Но удаление сеанса — на крайний случай.
4 — Выясняем, что делает этот сеанс
Открываем журнал регистрации, отбираем по номеру сеанса, смотрим, что сеанс делает.
Если не понятно, что делает сеанс (а он ещё работает) быстро настраиваем технологический журнал по этому сеансу
Копировать в буфер обмена Здесь 321 — это номер сеанса.
В технологическом журнале нас интересуют в первую очередь стеки на встроенном языке.
5 — Воспроизводим и разбираем проблему
Необходимо повторять где-то на копии ровно эту операцию.
На копии нас интересует запрос и его план, при выполнении которого потребовался большой объем данных в СУБД.
Для этого достаточно настроить журнал
и пройти операцию один раз под отладкой, отслеживая объем в tempdb.
UWSGI Flask SQLAlchemy прерывистые ошибки PostgreSQL с «WARNING: транзакция уже выполняется»
В моем приложении UWSGI Flask я получаю прерывистые ошибки, такие как следующие :
- DatabaseError: (psycopg2.DatabaseError) error with no message from the libpq
- ResourceClosedError: This result object does not return rows. It has been closed automatically.
- NoSuchColumnError: «Could not locate column in row for column ‘my_table.my_column_name_that_exists'»
- DatabaseError: (psycopg2.DatabaseError) insufficient data in «D» message. lost synchronization with server: got message type «2», length 740303471
В моем журнале postgresql я вижу: WARNING: there is already a transaction in progress
Обновление веб-страницы в flask обычно устраняет ошибку.
Вот шаги, которые я предпринимаю, чтобы воспроизвести ошибку:
- остановите приложение
- sudo service postgresql restart
- запустить приложение
- перейдите на веб-страницу в приложении my flask, которое выполняет несколько одновременных запросов
- ожидаемое поведение: ошибки базы данных не регистрируются
- фактическое поведение: одна или несколько из перечисленных выше ошибок происходят
Я попытался увеличить многословность ведения журнала postgresql и то, что кажется неуместным разделением виртуальных транзакций, например, ниже показаны все записи журнала с виртуальной транзакцией 2/53 и соответствует указанным выше ошибкам:
1 Ответ
Эти ошибки являются симптомами неправильного совместного использования подключений к базе данных несколькими потоками или процессами.
По умолчанию uwsgi разветвляет процесс после создания приложения в wsgi-файле. Если при создании приложения создаются соединения с базой данных, которые могут быть использованы повторно, вы, скорее всего, получите разветвленные процессы с поврежденным состоянием базы данных. Чтобы решить эту проблему в uwsgi есть варианты:
- не создавайте подключения к базе данных до тех пор, пока приложение не будет создано, OR
- вызовите uwsgi с параметром —lazy-apps , который изменяет uwsgi на fork перед созданием приложения
В режиме lazy-apps есть негативные последствия для производительности (см. preforking vs lazy-apps vs lazy), поэтому лучше избегать использования базы данных во время создания приложения.
Спасибо univerio за объяснение этого в комментариях.
Похожие вопросы:
Мое приложение flask выглядит так. myapp.py from flask import Flask app = Flask(__name__) @app.route(/) def hello(): return Hello World! if __name__ == __main__: app.run(‘0.0.0.0’) Моя настройка.
Я использую SQLAlchemy с Flask, как показано здесь: http://flask.pocoo.org/docs/patterns/sqlalchemy / У меня есть набор тестов Selenium, который сначала работает с Firefox, а затем с Chrome. Перед.
После того, как я долго играл с Django, я попробую немного Flask с SQLAlchemy, и я должен сказать, что мне это очень нравится. Однако есть кое что чего я не понимаю: У меня есть небольшое приложение.
Я использую PostgreSQL и Flas-SQLAlchemy расширение для Flask. # app.py app = Flask(__name__) app.config[‘SQLALCHEMY_POOL_SIZE’] = 20 db = SQLAlchemy(app) # views.py user = User(***).
Я строю API с Flask. Если у меня есть, например, маршрут Flask, как этот: @app.route(‘/api/tasks’, methods=[‘GET’]) @auth.login_required def tasks(): tasks = g.user.tasks task_list = [] for t in.
Я использую настройку с nginx, uwsgi и SQLAlchemy. Недавно я переключился с SQLObject, и теперь я вижу странные случайные ошибки с SQLAlchemy. Например: sqlalchemy.exc.ResourceClosedError: This.
Я боролся с постоянной ошибкой в моем приложении Flask: OperationalError: (_mysql_exceptions.OperationalError) (2006, ‘MySQL server has gone away’) Я использую экземпляр сервера mySQL и модуль.
TL; DR Edit: у меня не было правильных разрешений на папку. Все работает нормально, когда я запускаю flask через source venv/bin/activate && python run.py . from flask import Flask from.
Я запускаю PostgreSQL 9.3 и SQLAlchemy 0.8.2 и испытываю утечку подключений к базе данных. После развертывания приложение потребляет около 240 соединений. В течение следующих 30 часов это число.
Я пытаюсь настроить приложение webserver с помощью uWSGI + Nginx, которое запускает приложение Flask с использованием SQLAlchemy для связи с базой данных Postgres. Когда я делаю запросы к webserver.
Соединение с сервером баз данных разорвано администратором или Неопознанная ошибка HRESULT=80004005
Я думаю каждый хоть раз, но сталкивался с ошибкой 1С Соединение с сервером баз данных разорвано администратором Microsoft SQL Server Native Client 10.0: Неопознанная ошибка HRESULT=80004005
Вот некоторые способы, которые помогут решить данную проблему:
1. Проверить конфигурацию на наличие некорректной информации (мусора). Для этого следует выполнить команду “Проверка конфигурации” с установленным флажком “Проверка логической целостности конфигурации”. При выявлении проблем будет выдано сообщение. Некорректная информация при этом будет удалена автоматически, однако следует обеспечить доступность для изменения корневого объекта конфигурации (напимер, при работе с хранилищем его следует захватить).
2. Если Ваша конфигурация находится на поддержке, следует подобным образом проверить конфигурацию поставщика. Для этого в настройке поддержки следует сохранить конфигурацию поставщика в cf файл, загрузить его в новую базу и выполнить описанную в пункте 1 процедуру. В случае, если было получено сообщение об исправлении, значит конфигурация поставщика содержит некорректную информацию. В этом случае следует снять Вашу конфигурацию с поддержки и заново поставить путем объединения со свежим релизом конфигурации поставщика. В настоящее время все релизы выпускаемые 1С проходят проверку и выпускаются без данной проблемы.
3. Также с этой ситуацией пересекается следующая ситуация:
10007066 Запись данных, содержащих колонки типа ХранилищеЗначения
Проблема:
При использовании СУБД MS SQL SERVER при записи объекта базы данных, содержащего несколько колонок типа ХранилищеЗначения, данные для которых получены из файлов, может происходить ошибка
Ошибка СУБД:Microsoft OLE DB Provider for SQL Server: String data length mismatchHRESULT=80004005и аварийное завершение работы программы.
Включив технологический журнал на время загрузки, можно определить таблицу, в которой содержатся такие хранилища. Найдите средствами MS SQL Server Query Analizer в этой таблице колонки типа image. Для каждой колонки типа image выполните запрос вида:
S_elect top 10 DATALENGTH(_Fld4044)
from _InfoReg4038
order by DATALENGTH(_Fld4044) desc
Нюансы: обратите внимание, что ”Стандартные проверки” платформой (chdbfl, в конфигураторе) упорно говорят, что с базой все ОК.
Суть проблемы: важно, что под это сообщение об ошибке могут подпадать разные причины, но у них есть общая часть для 1С – это не достаточно оперативной памяти. А еще точнее неэффектиное использование ресурсов памяти. Отсюда косвенные способы победить проблему: путем рестарта сервера (на некотрое время становиться больше доступной памяти) или перейти на 64-разрядный сервер приложений.
1С:Предприятие 8.2. Лицензия на сервер (x86-64)
По опыту проблема связана с хранением данных в реквизите хранилище значений либо наличием в таблице config двоичных данных БОЛЬШЕ 120 mb.
Обобщенные рекомендации, если рекомендации от 1С не помогли (проделать следующие действия в указанном порядке):
1. Выключить все фоновый задачи у всех баз
В 8.1.11 появился переключатель “запрет на фоновые задания” в
момент создания базы.
Готов пояснить, фоновые задания сами по себе не зло, но регламентные процедуры
с полнотекстовым поиском – вещь в себе – и память она может через какое время
съедать ресурсы rphost.exe, что на другие операции не останеться, и просто
базу блокировать
т.е. другими словами, после первого шага уже можно проверять – возможно проблема “уйдет”.
2. Перезапустить сервер
Второй шаг является частным случаем для вашего случая и после него тоже
есть смысл проверять работоспособность. Однако поскольку существуют утечки памяти http://www.gilev.ru/1c/memleak, то через некоторое время после рестарта пролема может вернуться.
3) делаем бэкап средствами sql
Делать резервное копирование рекомендую при любых действиях, когда может потребоваться “возврат” к предыдущему состоянию данных
4) снимаем базу с поддержки, выгружаем cf
убиваем в менеджмент консоли базе данных в таблице config запись более 120Мб, делаем “загрузить конфигурацию” (не объединение) убиваем в менеджмент консоли базе данных в таблице config запись более 120Мб, делаем “загрузить конфигурацию” (не объединение)
вот пример работоспособности этого приема
http://partners.v8.1c.ru/forum/thread.jsp?id=543293
1. Открыть конфигратор;
2. Снял конфигурацию с поддержки, ПРИ ЭТОМ КОНФИГУРАЦИЮ НЕ СОХРАНЯЛ!
3. Далее Сохранить конфигурацию в файл (не сохраняя измененной конфигурации);
4. В SQL для требуемой базы выполнил следующую команду:
DELETE FROM dbo.Config WHERE DataSize > 125829120
5. Загрузить сохраненную конфигурацию обратно.
Взято с http://www.forum.mista.ru/topic.php?id=465608
можно попробовать и более радикальный шаг здесь:
удаляем (в менеджмент консоли) в базе данных таблицу “config”
D_rop TABLE [dbo].[Config]
5) делаем “загрузить конфигурацию” (не объединение) из cf
после этого проверяем, проблема уходит.
6) Ошибка :»Соединение с сервером баз данных разорвано администратором
Microsoft OLE DB Provider for SQL Server: Неопознанная ошибка
HRESULT=80004005″
Имеем : 1C 8.1.13.41 УПП 1.2.19.21 на MS SQL 2005 SP3 на Win2003 Server Enterprise на компе 4Gb физ. памяти (SQL настроен на Max Memory 2Gb)
Решение в моем случае:
Виндовс по-умолчанию 2Гб берет себе, а 2 отдает нам. SQL почти всю остальную память поедал (в настройках стоит 2Gb) и оставлял для всех остальных только 128Мб физ. памяти(как и положено SQL- он не должен забирать ВСЁ, должен 128 оставить). Ошибка 1С начала проявляться после перехода на релиз 1.2.21.1. Да, действительно, в релизе 1.2.19.1 в файле dbo.Config не было записей больше 120Мб. А вот после обновления на 1.2.21.1 такая запись (примерно 135мб )появляется. При снятии с поддержки запись исчезает сама, и ничего удалять не приходится. При постановке на поддержку -снова появляется. Я так понял, что это и есть конфигурация поставщика.
Если SQL оставляет всего 128, а надо целых 135, то вывод- надо дать рабочим процессам живую физическую память. Moжно урезать SQL. А можно винды. Установив в boot.ini ключ /3GB я тем самым отдал виндам 1Gb, а всему остальному 3Gb, а не 2/2 как по умолчанию. После перезагрузки — все ОК.
У Вас есть свое решение!? оставьте его в комментариях)