Подняли ЛЭРС Учёт в докере. Хотелось бы использовать Postgre вместо MSSql.
Есть ли способ перенести существующую БД (всё: объекты, настройки, пользователей, данные) из MSSql в Postgre?
Файл Lers.Server.xml
выглядит так:
<configuration>
<network>
<listenPort>10000</listenPort>
<listenAddress></listenAddress>
</network>
<dataBase>
<sqlServer>(local)\LERS</sqlServer>
<dataBaseName>LERS</dataBaseName>
</dataBase>
</configuration>
Секции connectionString
нет.
Что делать?
Похоже, используется метод входа, который только для локальных подключений. Если утилита такое поддерживает, то было бы хорошо. Однако, Windows, в которой установлен сервер ЛЭРС с БД, имеет архитектуру x86.
Можно ли получить утилиту переноса для архитектуры x86?
Вот для 32-битных
https://update1.lers.ru/tools/sqls2pg-win-x86.zip
Нужна строка подключения для локального сервера. Вроде, должно быть Data Source=(local)\LERS; Initial Database=LERS; Integrated Security=true
Пробую запускать утилиту, получаю ошибку:
То же самое, если Integrated Security=true"
(Сервер на этой машине, естественно, работает без проблем).
Как описано в соответствующей статье на сайте разработчика SQL Server - компании Microsoft, посвященной данной ошибке, одним из решений является добавление “;TrustServerCertificate=true” в строку подключения для принудительного доверия сертификата без проверки. Попробуйте данный вариант.
Выскакивает, например, такая (либо другая) ошибка. От версии postgresql что-нибудь зависит? (В докер ДБ ставилась из последнего имиджа).
Или я не полностью очистил БД перед заливкой?
В статьей к утилите переноса явно описано:
В итоге у вас должно получиться:
- База данных LERS на SQL Server и строка подключения из исходного сервера.
- Пустая база данных LERS на Postgres и строка подключения из нового сервера.
Если у вас была заполненная БД Postgres перед запуском переноса, значит вы действовали в разрез со статьей. Вы можете пересоздать пустую БД Postgres, удалив старую заполненную БД и переустановив ЛЭРС УЧЕТ с подключением к рассматриваемому серверу Postgres, чтобы создалась новая пустая БД Postgres на данном сервер, подключение к которой вы уже будете использовать в утилите для переноса данных, как это собственно описано в статье по данной утилите.
Если я запускаю ЛЭРС в докере в первый раз (подключаемый том для БД — чистый), создаётся ли пустая база ЛЭРС?
Если да и это та самая БД, в которую можно переливать утилитой, то всё равно получались ошибки…
Версия постгрес имеет значение?
На сколько я понимаю, вы установили ЛЭРС УЧЕТ в Docker вместе с Postgres внутри одного контейнера. При таком варианте после запуска Сервера ЛЭРС УЧЕТ создается пустая БД.
Версия Postgres не должна влиять на работу, если она удовлетворяет требованиям, во всяком случае у нас нет информации об обратном. На данный момент поддерживается Postgres версии 13 и выше.
Попробуйте установить в контейнер Postgres версии 13, запустив после этого Сервер, чтобы создалась пустая БД, после чего повторите операцию переноса. Сообщите результат.
Да, мы взяли версию ЛЭРС для докера (только в двух контейнерах, естественно: в одном контейнере работает БД, в другом — сервер ЛЭРС). Перед каждой попыткой я сносил все файлы в подключаемом томе для БД (где файлы БД записываются), чтобы ЛЭРС заново пересоздавал чистую БД.
В первый раз я взял latest образ постгрес (это была 16-я версия). Вчера пробовал 14-ю версию (окошко с ошибкой в предыдущем ответе как раз с неё). В обоих случаях ошибка одинакова.
Сейчас взял образ с версией 13.15. На этот раз появились несколько другие ошибки:
Что бы это значило?
Это значит, что при переносе данных таблицы интеграторов возникла попытка добавления дубликата записи. Здесь два варианта:
- У вас таблица интеграторов целевой БД Postgres уже содержала переносимые данные, в результате при повторном переносе этих же данных они уже считаются дубликатом.
- У вас в таблице интеграторов исходной БД SQL Server по непонятной причине присутствуют дублирующие записи, из-за чего при переносе дубликатов возникает описанная ошибка.
Думаю у вас скорее второй вариант и там судя по всему всего одна дублирующая запись. В данном случае, чтобы устранить проблему, необходимо удалить дублирующие записи в таблице интеграторов “WaterTotals” исходной БД SQL Server после чего повторить процедуру переноса. Если самостоятельно найти дубликаты не получается, вы можете прислать нам резервную копию исходной БД SQL Server. Мы проанализируем ее и сообщим имена точек учета и метки времени записей с дубликатами, после чего вы сможете удалить их самостоятельно в режиме Ручного ввода таблицы с данными ЛЭРС УЧЕТ.
Пока перенесли БД на MSSQL в докере…
Дело в том, что у Postgres и SQL Server разные способы округления и хранения даты и времени. И если у SQL Server значения в таблице разные, то при сохранении в Postgres они могут стать одинаковыми, и в этом случае как раз возникает такая ошибка.
Она выводится только как предупреждение, так что база данных должна была быть перенесена, просто часть данных могла быть утеряна.
Интересно, что на более новых версия выдаётся Invalid Message. Попробуем найти причину.
Да, именно так (Invalid Message) выдавалось. По виду, вроде как всё перенеслось, но я не был уверен… Кстати, там ведь значения параметров не входят в ключ (время — id точки учёта), не должно было ругаться.
Ладно, пока остаёмся на MSSQL.
В PK_WaterTotals ключ MeasurePointId + DateTime, так что дубликат ключа вполне возможен. Судя по всему, потеряно только несколько десятков записей интеграторов по воде. Если это некритично, вы можете использовать перенесённую базу Postgres.