Ошибка при обновлении до версии 6.2.2

Started by KonstantinM, August 10, 2026, 03:38:43 PM

Previous topic - Next topic

KonstantinM

Добрый день

Обновлялся с версии 6.1.2 до версии 6.2.2
Апгрейд базы до конца завершиться не может, возникает ошибка:


Upgrading from version 62.1 to 62.2
SQL query failed (58P01 ERROR:  could not access file "timescaledb-2.26.3": No such file or directory):
ALTER TABLE object_tools ADD applicable_classes integer
Rolling back last stage due to upgrade errors...
Database upgrade failed

Версия postgress при этом:
postgresql18-timescaledb-2.27.2-alt1.x86_64

т.е. версия timescale выше требуемой и проблем бы быть не должно. Или при апгрейде до 6.2.2 требуется именно 2.26.3?

Подскажите где ошибка или как обойти это ограничение?
ОС - Altlinux Server, 11.1
Спасибо!

Alex Kirhenshtein

Добрый день,

6.2.2 не требует TimescaleDB 2.26.3 — апгрейд вообще не привязан ни к какой конкретной версии расширения. Единственное требование во всей ветке 62.x — TimescaleDB не ниже 2.10, оно проверяется на более позднем шаге, где создаются continuous aggregates, и 2.27.2 его закрывает. Ошибка приходит не из NetXMS: PostgreSQL пытается загрузить библиотеку расширения timescaledb версии 2.26.3, потому что именно эта версия записана в каталоге базы, а на диске после обновления пакета осталась только 2.27.2. Пакет обновили, а расширение внутри базы — нет.

Почему упало именно здесь: ALTER TABLE object_tools ADD applicable_classes — первый DDL за весь апгрейд. Шаги с 61.36 до 62.1 только пишут строки в metadata и config, а на DDL PostgreSQL обязан загрузить код расширения, потому что timescaledb вешает на DDL свои event triggers. Сам шаг 62.1 → 62.2 к TimescaleDB отношения не имеет, object_tools — обычная таблица, не hypertable.

Сначала стоит убедиться, что картина именно такая:

psql -X -d netxms -c "SELECT extname, extversion FROM pg_extension WHERE extname='timescaledb'"
ls $(pg_config --pkglibdir)/timescaledb*

Если extversion показывает 2.26.3, а на диске лежит только timescaledb-2.27.2.so — причина в этом.

Порядок действий:

systemctl restart postgresql          # имя юнита зависит от сборки пакета
psql -X -d netxms                     # -X обязателен
ALTER EXTENSION timescaledb UPDATE;   # первой же командой в сессии
\dx timescaledb

Два момента, из-за которых это часто не проходит с первого раза: ALTER EXTENSION должен быть первой командой в сессии — после любого другого запроса библиотека старой версии уже пытается загрузиться, и апдейт падает с той же ошибкой (отсюда и -X, чтобы .psqlrc ничего не выполнил до этого). И выполнить его нужно в каждой базе, где установлено расширение, а не только в базе NetXMS.

Если ALTER EXTENSION всё же падает с той же ошибкой — поставить обратно пакет с 2.26.3, выполнить ALTER EXTENSION timescaledb UPDATE при живой старой библиотеке, затем снова обновить пакет до 2.27.2.

После этого повторить nxdbmgr upgrade. По состоянию базы: каждый шаг апгрейда выполняется в отдельной транзакции, DDL в PostgreSQL транзакционный, поэтому откат снял шаг 62.2 целиком — недоприменённых изменений не осталось, база консистентна и стоит на схеме 62.1. Повторный запуск безопасен, но dump перед ним сделать стоит.

Важное следствие: схема уже 62.1, а сервер требует точного совпадения версии схемы, поэтому сейчас не стартует ни 6.2.2 (ждёт 62.35), ни 6.1.2 (ждёт 61.36) — в логе будет "Your database has format version ...". Путь только вперёд, откат назад — это восстановление из бэкапа.

На то, что nxdbmgr показывает это состояние ошибкой, по которой причину не видно, завёл тикет: https://github.com/netxms/netxms/issues/3540. И отдельно на документацию, https://github.com/netxms/netxms-doc/issues/65 — в разделе про апгрейд про обновление расширения не сказано ничего.

И раз апгрейд всё равно не завершён: сегодня вышла 6.2.3, https://www.netxms.org/forum/announcements/netxms-6-2-patch-release-3/ — имеет смысл ставить сразу её. На эту ошибку она не влияет, шаг 62.1 → 62.2 в ней тот же самый, добавлены только шаги после него (схема 62.38 вместо 62.35).

Если extversion в базе окажется уже 2.27.2 — тогда картина другая, покажите вывод запроса и полный вывод nxdbmgr upgrade.

KonstantinM

Добрый день!

Спасибо за помощь, помогло! Выкладываю ниже вывод.

1. Upgrade до 6.2.2

[root@AltTEST data]# psql -U postgres -X -d netxms_db -c "SELECT extname, extversion FROM pg_extension WHERE extname='timescaledb'"
Password for user postgres:
ERROR:  could not access file "timescaledb-2.26.3": No such file or directory


[root@AltTEST data]# ls $(pg_config --pkglibdir)/timescaledb*
/usr/lib64/pgsql/timescaledb-2.27.2.so  /usr/lib64/pgsql/timescaledb.so  /usr/lib64/pgsql/timescaledb-tsl-2.27.2.so


[root@AltTEST data]# systemctl restart postgresql
[root@AltTEST data]# psql -X -d netxms_db -U postgres
Password for user postgres:
psql (18.4)
Type "help" for help.

netxms_db=# ALTER EXTENSION timescaledb UPDATE;
ALTER EXTENSION
netxms_db=# \dx timescaledb
                                                       List of installed extensions
    Name     | Version | Default version | Schema |                                      Description
-------------+---------+-----------------+--------+---------------------------------------------------------------------------------------
 timescaledb | 2.27.2  | 2.27.2          | public | Enables scalable inserts and complex queries for time-series data (Community Edition)
(1 row)

netxms_db=#


[root@AltTEST data]# nxdbmgr upgrade
NetXMS Database Manager Version 6.2.2 Build 6.2-614-gfd28d43d5e

INFO: Server module WEBAPI skipped
Upgrading database...
Upgrading from version 62.1 to 62.2
Upgrading from version 62.2 to 62.3
Upgrading from version 62.3 to 62.4
Upgrading from version 62.4 to 62.5
Upgrading from version 62.5 to 62.6
Upgrading from version 62.6 to 62.7
Upgrading from version 62.7 to 62.8
Upgrading from version 62.8 to 62.9
Upgrading from version 62.9 to 62.10
Upgrading from version 62.10 to 62.11
Upgrading from version 62.11 to 62.12
Upgrading from version 62.12 to 62.13
Upgrading from version 62.13 to 62.14
Upgrading from version 62.14 to 62.15
Upgrading from version 62.15 to 62.16
Upgrading from version 62.16 to 62.17
Upgrading from version 62.17 to 62.18
Upgrading from version 62.18 to 62.19
Upgrading from version 62.19 to 62.20
WARNING:  column type "character varying" used for "service_name" does not follow best practices
HINT:  Use datatype TEXT instead.
WARNING:  column type "character varying" used for "scope_name" does not follow best practices
HINT:  Use datatype TEXT instead.
WARNING:  column type "character varying" used for "severity_text" does not follow best practices
HINT:  Use datatype TEXT instead.
WARNING:  column type "character varying" used for "trace_id" does not follow best practices
HINT:  Use datatype TEXT instead.
WARNING:  column type "character varying" used for "span_id" does not follow best practices
HINT:  Use datatype TEXT instead.
Upgrading from version 62.20 to 62.21
Upgrading from version 62.21 to 62.22
Upgrading from version 62.22 to 62.23
Upgrading from version 62.23 to 62.24
Upgrading from version 62.24 to 62.25
Upgrading from version 62.25 to 62.26
Upgrading from version 62.26 to 62.27
Upgrading from version 62.27 to 62.28
Upgrading from version 62.28 to 62.29
Upgrading from version 62.29 to 62.30
Upgrading from version 62.30 to 62.31
Upgrading from version 62.31 to 62.32
Upgrading from version 62.32 to 62.33
Upgrading from version 62.33 to 62.34
Upgrading from version 62.34 to 62.35
Database upgrade succeeded

После чего всё запустилось и работает! Ещё раз спасибо!

2. Обновление до 6.2.3

Собрать не удалось, в какой то момент при сборке появляется ошибка. Вывод консольный ниже:

make[5]: Leaving directory '/home/admin/netxms-6.2.3/src/server/tools/scripts'
make[5]: Entering directory '/home/admin/netxms-6.2.3/src/server/tools'
  CXX      nddload/nddload-nddload.o
  CXXLD    nddload/nddload
ld: /usr/local/lib/libnxdb.so.62: undefined reference to `__wcsupr(wchar_t*)'
ld: /usr/local/lib/libnxdb.so.62: undefined reference to `wcslwr(wchar_t*)'
collect2: error: ld returned 1 exit status
make[5]: *** [Makefile:691: nddload/nddload] Error 1
make[5]: Leaving directory '/home/admin/netxms-6.2.3/src/server/tools'
make[4]: *** [Makefile:1010: all-recursive] Error 1
make[4]: Leaving directory '/home/admin/netxms-6.2.3/src/server/tools'
make[3]: *** [Makefile:491: all-recursive] Error 1
make[3]: Leaving directory '/home/admin/netxms-6.2.3/src/server'
make[2]: *** [Makefile:494: all-recursive] Error 1
make[2]: Leaving directory '/home/admin/netxms-6.2.3/src'
make[1]: *** [Makefile:546: all-recursive] Error 1
make[1]: Leaving directory '/home/admin/netxms-6.2.3'
make: *** [Makefile:478: all] Error 2


До этого на том же сервере собирал 6.1.2 и 6.2.2 - не было проблем. 6.2.2 собралось, успешно обновилось и работает.




Alex Kirhenshtein

Это не регрессия сборки 6.2.3. Линковщик берёт libnxdb не из дерева сборки, а из /usr/local/lib — ту, что осталась от установленной 6.2.2. Путь в самой ошибке это и показывает: /usr/local/lib/libnxdb.so.62, а не /home/admin/netxms-6.2.3/src/db/libnxdb/.libs/.

Самое простое — запустить make install вместо make. Установка рекурсивная: каждый каталог сначала собирается и тут же устанавливается, и src/db проходит задолго до src/server/tools. К моменту линковки nddload в /usr/local/lib лежит уже libnxdb от 6.2.3, и подстановка срабатывает правильно. Отдельный make ломается именно потому, что ничего не устанавливает и файл от 6.2.2 остаётся на месте до самого конца.

Что происходит:

В 6.2.3 бэкпортнут фикс https://github.com/netxms/netxms/issues/3483 — case folding для Unicode стал locale-independent и считается по таблицам Unicode, а не через towupper/towlower из libc. Вместе с этим из libnetxms убраны собственные wcsupr/wcslwr, вместо них nx_wcsupr/nx_wcslwr. Сами wcsupr/wcslwr — расширения MSVC, ни в C, ни в POSIX их нет и в glibc не было никогда, поэтому NetXMS всегда собирал свои реализации, а libnxdb на них ссылалась. В 6.2.3 libnetxms их больше не экспортирует.

soname у всей ветки 6.2.x один — .so.62, он считается из major.minor и от patch-версии не зависит. Поэтому файл от 6.2.2 называется ровно так же, как собираемый сейчас, и подменяет его молча. При сборке 6.1.2 и 6.2.2 набор экспортируемых символов совпадал, и подмена ни на что не влияла — поэтому вы её не видели. В 6.2.3 символы исчезли, и старая libnxdb перестала линковаться.

Откуда в поиске берётся /usr/local/lib: configure добавляет -L/usr/local/lib, если такой каталог существует. Он существует, потому что там установлена 6.2.2.

Почему упало именно на nddload, хотя netxmsd собрался: netxmsd передаёт libnxdb явным путём в дереве сборки. У nddload и остальных утилит из src/server/tools libnxdb в списке нет — она приходит только как зависимость libnxsrv, и её приходится искать, а поиск попадает в /usr/local/lib. nddload — первая программа в этом каталоге по порядку сборки. Сами библиотеки собрались нормально потому, что shared library линкуется с неразрешёнными символами, а программа — нет.

Порядок:

systemctl stop netxmsd                 # имя юнита зависит от сборки
cd /home/admin/netxms-6.2.3
make install
ldconfig
nxdbmgr upgrade                        # 6.2.3 это схема 62.38, сейчас база на 62.35
systemctl start netxmsd

Важная деталь: make install перезаписывает установленную 6.2.2 по ходу дела, а не одним шагом в конце. Поэтому сервер лучше остановить заранее, и если сборка упадёт где-то дальше, установка останется наполовину обновлённой. Если хочется сначала довести до конца обычный make, старые библиотеки придётся убрать из /usr/local/lib руками — libnetxms.*, libnx*.*, libethernetip.*, libipfix.*

Проверить, что дело именно в этом, если понадобится:

nm -D -u /usr/local/lib/libnxdb.so.62 | c++filt | grep -E 'wcsupr|wcslwr'
nm -D -u /home/admin/netxms-6.2.3/src/db/libnxdb/.libs/libnxdb.so.62 | c++filt | grep -E 'wcsupr|wcslwr'

У установленной сейчас должно быть __wcsupr(wchar_t*) и wcslwr(wchar_t*), у свежесобранной — nx_wcsupr(wchar_t*) и nx_wcslwr(wchar_t*).

Каталог /usr/local/lib/netxms (dbdrv, ndd, субагенты) трогать не нужно, make install перезапишет его содержимое. Если в нём остались модули от версий старше 6.2.2, которых в 6.2.3 уже нет, они там и останутся, и при загрузке будут падать с такой же ошибкой про неразрешённый символ — уже в рантайме, в лог сервера.

На то, что утилиты из src/server/tools линкуются с установленной библиотекой вместо собранной, завёл тикет: https://github.com/netxms/netxms/issues/3548

KonstantinM

Всё получилось, ровно так как вы и написали. Вариант с make install конечно, более привлекателен )

В конечном итоге:

[root@AltTEST netxms-6.2.3]# nxdbmgr upgrade
NetXMS Database Manager Version 6.2.3 Build 6.2-694-g766c57382a

INFO: Server module WEBAPI skipped
Upgrading database...
Upgrading from version 62.35 to 62.36
Upgrading from version 62.36 to 62.37
Upgrading from version 62.37 to 62.38
Database upgrade succeeded


Большое спасибо за помощь!