Сервис репликации данных#

Сервис репликации данных (далее – репликация) предназначен для взаимодействия между БД, схемами БД.

Важно

Для выполнения репликации на проектах, где есть несколько баз данных и файловых хранилищ, требуется доступ к каждому из них.

Репликация выполняет следующие функции:

  • настройка состава передаваемых данных;

  • частичный перенос данных с источника на приемник;

  • автоматический перенос данных с источника на приемник;

  • пересчет системы координат источника в систему координат приемника «на лету».

Репликация возможна между различными БД, между различными схемами БД в рамках одной БД.

Что такое репликация#

Принцип работы репликации основан на разделении ключей. Данные в каждом проекте ведутся в своем, не пересекающемся с другими проектами, диапазоне ключей. Например, в одной схеме БД ключ будет вида: 1765010000000001, а в другой 1765020000000001.

../../_images/replikacya1_2.png

Информацию о диапазоне ключей можно получить из БД, выполнив запрос в БД: select seq_prefix,project_name,scheme from regadm.m_projects.

../../_images/replikacya2_2.png

Данные выбранных типов выбираются из проекта только в своем диапазоне ключей. Если в данных проекта будет ключ, префикс которого отличается от установленного, то такие данные, как правило, не переносятся. Это сделано для возможности проводить обратную репликацию. В противном случае происходило бы зацикливание переноса. Если требуется перенести данные, ранее перенесенные с другого проекта, это можно сделать с использованием атрибута UseSourceKeyPrefix. (См. Пример переноса с переопределением префикса проекта источника)

Сервис репликации просматривает изменения в данных по таблице ревизий d_sys_revisions в схеме проекта, после нахождения изменения осуществляется перенос данных из источника на приемник.

В файле ревизий, расположенному по пути …\SchemaSync\data\SyncRevisionStory_Идентификатор.xml, для каждого типа фиксируется ревизия и список ключей перенесенных объектов. Таким образом, репликация находит только новые и измененные данные и производит частичный перенос.

Удалив файл SyncRevisionStory_Идентификатор.xml, мы получим сначала полный перенос указанных типов, затем, после создания файла ревизий будут переноситься только изменения.

Если необходимо обновить объекты только одного типа (вновь целиком перенести данные конкретного типа), то в этом случае в файле SyncRevisionStory_Идентификатор.xml удаляем одну секцию, описывающую этот тип, и перезапускаем репликацию.

../../_images/replikacya5.png

Настройка параметров подключения#

Перед первоначальной настройкой сервиса репликации, рекомендуется его выключить.

Для переноса данных между двумя схемами:

  1. Откройте файл .env.

  2. Выполните настройку для нескольких подключений при необходимости переноса с одной БД на другую:

ConnectionStrings__TargetConnId=Server=172.16.55.53;Port=5432;Database=vo_portal;User Id=postgres;Password=admin;ApplicationName=SchemaSync;
ConnectionStrings__SourceConnId=Server=172.16.55.53;Port=5432;Database=volgograd;User Id=postgres;Password=admin;ApplicationName=SchemaSync;

Ключи Source и Target должны быть указаны в настройках подключения к БД.

В этом случае DefaultConnection, Source и Target – это идентификаторы строк подключения, которые можно использовать при настройке схем в файле sync.cfg.

DefaultConnection используется для подключения по умолчанию, а можно указать подключение явно.

Конфигурирование репликации#

Ограничения в текущей реализации:

  • Переносятся только данные (без метаданных, структуры каталогов).

  • Реализован только онлайн перенос (необходимо одновременное подключение БД источника и приемника).

  • Структура БД (включая метаданные) источника и приемника должна быть одинаковыми. Если на приемнике отсутствует тип (или какое-то поле типа), в который необходимо перенести данные (аналогичный источнику), то такие данные не будут перенесены.

  • Из файлового хранилища переносится содержимое только тех файлов, у которых стартовая ревизия больше минимальной ревизии файлов из настроек пары источник-приемник.

  • При переносе данные «на лету» трансформируются в СК приемника, при этом у источника и приемника используется СК заданная в таблицах d_gis_srs.

Настройки переноса данных находятся в файле sync.cfg в каталоге сервиса репликации. С помощью этого файла настраивается из какого проекта в какой переносить данные, какие типы данных должны переноситься или какие типы исключать из общего переноса.

Если явно не указано подключение, то есть нет параметров SourceDbParamId, TargetDbParamId, то будет выбрано подключение по умолчанию, которым является DefaultConnection.

Аналогично для секции Template.

Настройка переноса#

Cодержится в секции SchemaSyncAssocWay. В примере ниже настроен перенос всех типов из проекта «схема1» на проект «схема2»:

<SchemaSyncAssocWay>
<Online Id="id1" SourceSchema="схема1" SourceFileStorageMinRevision="0" ContinueExecOnException="true"
TargetSchema="схема2"  Flags="Regenerate"/>
</SchemaSyncAssocWay>

Для явного указания строки подключения используются параметры:

  • SourceDbParamId – параметр подключения к источнику;

  • TargetDbParamId – параметр подключения к приемнику.

Если какая-то одна или обе настройки не заданы, то вместо нее будет взята секция с ключом DefaultConnection.

<SchemaSyncAssocWay>
<Online Id="id1" SourceSchema="схема1" SourceFileStorageMinRevision="0" ContinueExecOnException="true" SourceDbParamId="ConnId1" TargetSchema="схема2"
Flags="Regenerate"/>
</SchemaSyncAssocWay>

В выше приведенном примере для первой секции Online, перенос будет осуществляться для схемы «схема1» с явно заданной строкой подключения ConnId1, а для схемы «схема2» будет использоваться строка подключения DefaultConnection.

Если в настройке указан флаг Flags= "Regenerate" – это значит, что для этой секции будет сгенерирован полный перечень типов данных, включающих все их поля. Если этот флаг не указан, то секция остается без изменений.

Пример описания одного алиаса с указанием полей

<Table Id="UrbanStatusGD" SyncLevel="AllRecords" AutoProperties="Custom">
  <Property Id="Code" />
  <Property Id="Name" />
  <Property Id="Note" />
  <Property Id="TypeDirectory" />
  ...
</Table>

Пример переноса определенных алиасов

<Online Id="id1"
         SourceSchema="схема1"
         SourceDbParamId="Source2uray"
  SourceFileStorageMinRevision="0"
         TargetSchema="схема2"
         TargetDbParamId="ConnId2
         IgnoreTables="RecycleBinTable">
<Table Id="DocApplication" AutoProperties="All"></Table>
<Table Id="DocRS" AutoProperties="All"></Table>
<Table Id="DocRV" AutoProperties="All"></Table>
<Table Id="WfServiceRS" AutoProperties="All"></Table>
<Table Id="WfServiceRV" AutoProperties="All"></Table>
</Online>
</SchemaSyncAssocWay>

Возможные варианты для SyncLevel:

  • AllRecords (значение по умолчанию) – перенос всех записей таблицы;

  • DependValues – частичный перенос, переносятся только те записи, на которые ссылаются другие переносимые данные;

  • Ignore – не переносить данные из таблицы. При этом из переноса исключаются поля других таблиц, ссылающихся на данную таблицу.

Возможные варианты для AutoProperties:

  • Custom (значение по умолчанию) – переносятся поля и связи указанные в конфигурации;

  • ValueFields – переносить только простые поля;

  • LookupFields – ссылочные поля;

  • Relation – связи;

  • Role – роли;

  • GeoInfo – признак того, что необходимо перенести геометрию объекта;

  • Fields = ValueFields LookupFields;

  • All = ValueFields LookupFields Relation Role GeoInfo.

Флаги AutoProperties можно комбинировать в любом порядке.

Пример переноса с фильтром

<Table Id="UrbanRedLineBoundPPM" AutoProperties="All" SyncLevel="DependValues">
                  <Filter aliasPath="InfoSetKey.Doc.DocRelMOGisogd.Alias" value="tumenmr"/>
              </Table>

Где aliasPath указывает путь от объекта указанного в Table Id до конечного поля, на основании которого необходимо осуществлять фильтрацию.

В примере выше значение InfoSetKey.Doc.DocRelMOGisogd.Alias можно разложить на составные части следующим образом:

  • InfoSetKey – поле связи объекта [Красные линии площадные (UrbanRedLineBoundPPM)] с [Набором Данных (DmdInfoset)];

  • Doc – поле связи «Документ, определяющий статус данных» объекта [Набора данных (DmdInfoSet)] с документом из представления [Документы (DocAllDocView)];

  • DocRelMOGisogd – поле связи «Муниципальное образование» документа из представления [Документы (DocAllDocView)] со справочником [Муниципальное образование (DocRefMOGisogd)];

  • Alias – поле «Псевдоним» в справочнике [Муниципальное образование (DocRefMOGisogd)].

Вариации глубины вложенности связей могут быть любыми. Например, для объекта с алиасом А имеющего связь с B, который имеет связь с С.

Возможен как вариант aliasPath="Поле_в_А", так и вариант aliasPath="Связь_А_с_B.Связь_B_с_C.Поле_в_С".

Настройка с фильтром будет переносить те объекты, для которых выполняется условие фильтра. При использовании фильтра всегда должен быть использован SyncLevel="DependValues", иначе фильтр будет проигнорирован.

Фильтр добавляет проекты в перенос, а не накладывает ограничение на уже переносимые. Если объекты, описанные в настройке, будут требоваться и по ссылкам, и по фильтру, то будут перенесены как первые, так и вторые.

При настройке переноса с фильтром можно использовать переменные.

Пример переноса с переопределением префикса проекта источника

<Online Id="MO-REGION" SourceSchema="tumenmr" TargetSchema="etalon" IgnoreTables="RecycleBinTable;ReportTemplateTable" UseSourceKeyPrefix="100116">
              <Table Id="DocRS" SyncLevel="AllRecords" AutoProperties="Custom">
                      <Property Id="GisogdNumReg" />
                      <Property Id="GisogdDateRegDoc" />
              </Table>
      </Online>

Если необходимо перенести данные, ранее перенесенные с другого проекта (например, вернуть объекты региона с МО обратно на регион), то можно переопределить префикс ключа, с которым будут браться объекты к переносу. Сделать это можно используя атрибут UseSourceKeyPrefix. Без использования этого атрибута будут перенесены только данные, имеющие префикс ключа проекта источника (родные на схеме источника).

При настройке переноса с переопределением префикса ключа источника можно использовать переменные.

Пример переноса геометрии

<Online Id="GO-GO_ZU" SourceSchema="kazan"
                SourceFileStorageMinRevision="0"
                ContinueExecOnException="true"
                SourceDbParamId="SourceConnId"
                TargetSchema="kazan"
                TargetDbParamId="TargetConnId">

        <Table Id="GknParcel" AutoProperties="All" SyncSpatial="true"/>
        <Table Id="Oopt" AutoProperties="All" SyncSpatial="true"/>
        <Table Id="ZORWaterProtectionZone" AutoProperties="All"  SyncSpatial="true"/>
        <Table Id="CultObjProtArea" AutoProperties="All"  SyncSpatial="true"/>
        <Table Id="CultObjSecurArea" AutoProperties="All" SyncSpatial="true"/>
</Online>

где SyncSpatial – это перенос геометрии. При значении true геометрия переносится, а при false геометрия переноситься не будет.

Перенос файлов в файловое хранилище и из него#

  • SourceFileStorageMinRevision – ревизия файлов, выше которой содержимое файлов переносится из файлового хранилища источника для пары источник-приемник. Значение по умолчанию 0.

  • ContinueExecOnException – настройка поведения репликации на конкретной паре источник-приемник в случае исключительных ситуаций. Значение по умолчанию true.

При значении true: все исключительные ситуации (как и раньше) локализуются в рамках одной записи-одной таблицы, т.е. репликация не останавливается и продолжает для данной пары источник-приемник переносить другие записи этой же таблицы, на которой возникла исключительная ситуация, и других таблиц.

При значении false: при любой исключительной ситуации репликация останавливается для данной пары источник-приемник, однако все записи, которые успели перенестись на приемник сохраняются (не откатываются).

Важно

Для выполнения репликации файлов необходима доступность порта, на котором работает файловое хранилище.

Основные сценарии использования репликации файлов

  1. При переносе файлов с содержимым в ФХ из БД источника в БД приемника со своим ФХ: содержимое файлов переносится в ФХ приемника, с учетом настройки минимальной ревизии для пары источник-приемник.

  2. При переносе файлов с содержимым в ФХ из БД источника в БД приемника без ФХ: содержимое файлов переносится в БД приемника, с учетом настройки минимальной ревизии для пары источник-приемник.

  3. При переносе файлов с содержимым в ФХ из БД источника в БД приемника с тем же ФХ, что у приемника, например, при переносе в рамках одной БД, но в разные схемы: содержимое файлов не переносится, так как доступ к ним из разных БД (схем) проходит через одно ФХ.

Репликация файлов между разными сетевыми контурами

Чтобы организовать репликацию между разными контурами, нужно задать IP-адрес для ФХ, с которого служба репликации будет забирать файлы.

Для этого в файле sync.cfg укажите IP в параметрах SourceFileStorageUrl и TargetFileStorageUrl:

<Online Id="id1" SourceSchema="схема1"
SourceFileStorageUrl="http://ip:порт/file" TargetFileStorageUrl="http://ip:порт/file"
SourceFileStorageMinRevision="0"
ContinueExecOnException="true" TargetSchema="схема2"
Flags="Regenerate"/>

Исключения

Важно

Если при возникновении следующих исключительных ситуаций для текущей пары источник-приемник настройка ContinueExecOnException = "false", то вся репликация для данной пары останавливается и в БД приемника остаются те записи, которые успели перенестись до возникновения этой исключительной ситуации, т.е. они не откатываются. В логах будут появляться сообщения с режимом Error.

  1. Если при переносе файлов с содержимом в ФХ из БД источника в БД приемника со своим ФХ одно или оба ФХ не работают: файлы с содержимым в ФХ источника не переносятся. В этом случае в логах будет Error.

  2. Если при переносе файлов с содержимом в ФХ из БД источника в БД приемника со своим ФХ содержимое файла в ФХ источника не найдено: сами файлы переносятся без содержимого, а в лог пишется сообщения с режимом Warning.

Использование шаблонов#

Секция Template предназначена для задания шаблона репликации с нескольких конфигураций проектов МР и ГО

Интерпретация секции Template:

  • Флаг Use= "Mr2Reg Go2Reg" указывает, какие схемы и куда должны переноситься.

  • Mr2Reg – проекты, развернутые на основе шаблона «Муниципальный район», переносятся в проекты, развернутые на основе шаблона «Регион».

  • Go2Reg – проекты, развернутые на основе шаблона «Городской округ», переносятся в проекты, развернутые на основе шаблона «Регион».

Описание настройки Template:

<SchemaSyncAssocWay>
  <Online Id="id1" SourceSchema="схема1"
                   SourceDbParamId="SourceConnId"
                   TargetSchema="схема2"
                   TargetDbParamId=" TargetConnId" Flags="Regenerate"/>
  <Template Id="all" Use="Mr2Reg Go2Reg">
    <Online Id="gen" SourceDbParamId="SourceConnId" Flags="Regenerate"
                     IgnoreTables="RecycleBinTable" />
</Template>
</SchemaSyncAssocWay>

В секции Template для источника будет использована строка подключения с идентификатором SourceConnId, а для приемника будет взято значение по умолчанию, которым является DefaultConnection.

После обработки файла конфигурации, результирующие настройки с которыми запустилось приложение, запишутся в файл sync.cfg.gen. Если есть потребность тонкой настройки репликации, то можно внести изменения в сгенерированный файл и итог разместить в файле настроек sync.cfg.

Сейчас в файле настройки sync.cfg секция SchemaSyncAssocWay может одновременно (а может и по отдельности) содержать описание как Template, так и Online секций. Если присутствуют обе, то первыми переносятся Online, а затем Template секции. Если будет встречено повторное описание репликации из «схемы 1» в «схему 2», то оно будет проигнорировано.

В итоге, при желании можно настроить репликацию для нескольких проектов через Online, а по остальным оставить репликацию по умолчанию через Template.

Шаблоны репликации также можно использовать:

При настройке репликации с фильтром для указания схемы

В качестве значения фильтра можно использовать переменные @SourceSchema@ и @TargetSchema@, которые при выполнении репликации будут заменены на алиасы схемы источника или приемника соответственно:

<Table Id="UrbanRedLineBoundPPM" AutoProperties="All" SyncLevel="DependValues">
          <Filter aliasPath="InfoSetKey.Doc.DocRelMOGisogd.Alias" value="@TargetSchema@"/>
        </Table>

При настройке репликации с переопределением префикса ключа источника

В качестве значения префикса ключа можно использовать переменные @SourceSchemaKeyPrefix@ и @TargetSchemaKeyPrefix@, которые при выполнении репликации будут заменены на префиксы ключей схемы проекта источника или приемника соотвественно:

<Online Id="MO-REGION" SourceSchema="tumenmr" TargetSchema="etalon" IgnoreTables="RecycleBinTable;ReportTemplateTable" UseSourceKeyPrefix="@TargetSchemaKeyPrefix@">
        <Table Id="DocRS" SyncLevel="AllRecords" AutoProperties="Custom">
            <Property Id="GisogdNumReg" />
            <Property Id="GisogdDateRegDoc" />
        </Table>
    </Online>

Настройка отключения переноса физических таблиц#

В некоторых случаях могут возникать задачи по отключению переноса целых массивов данных, ввиду их объемов и отсутствия необходимости, например таблица корзины удаленных объектов.

Для этого у Online есть тэг IgnoreTables="" в котором можно перечислять алиасы метаданных, тех физических таблиц, данные из которых переносить не требуется. В качестве разделителя между несколькими таблицами следует использовать символ «;».

Например:

<Online Id="gen" SourceDbParamId="SourceConnId" IgnoreTables="RecycleBinTable;DocFileRelation" />

Функционал игнорирования переноса физических таблиц допускает добавление в список физических таблиц, хранящих логические типы и таблицы связей.

Настройка отключения переноса логических типов#

Также присутствует возможность настройки отключения переноса логических типов. Для этого следует добавить блок Table с алиасом соответствующего логического типа и SyncLevel="Ignore".

Например:

<Table Id="UrbanStatusGD" SyncLevel="Ignore"/>

Настройка числа переносимых объектов#

Для ускорения работы репликации и сокращения числа переносимых объектов рекомендуется для типов данных, не требующих полного переноса всех объектов, всегда ставить флаг SyncLevel="DependValues".

Например, чтобы перенести только Земельные участки, связанные с документами Разрешение на строительство и Разрешение на ввод, не перенося их все, следует использовать конфигурацию вида:

<Table Id="DocRS" AutoProperties="All"/>
<Table Id="DocRV" AutoProperties="All"/>
<Table Id="GknParcel" AutoProperties="All" SyncLevel="DependValues"/>

Важно

Рекомендуется выставлять SyncLevel="DependValues" для всех справочников и их значений, так как они не несут никакой пользы в отрыве от объектов, в полях которых используются.

Примеры репликации#

Общая схема работы сервиса репликации документов ГИСОГД на примере региона Сахалинская область и муниципального образования Южно-Сахалинск выглядит следующим образом:

../../_images/shema_replik.PNG

Где:

  • шаг 1 – перенос пространственных объектов из Системы МО в Систему региона на схему МО;

  • шаг 2 – перенос пространственных объектов со схемы МО на схему региона, для дальнейшей передачи в ГИСОГД;

  • шаг 3 – перенос документов ГИСОГД, зарегистрированных на регионе, в Систему МО, на которое он распространяет свое действие;

Важно

Обратите внимание на <Filter aliasPath= "DocRelMOGisogd.Alias" value= "@TargetSchema@"/> также перенос файлов

  • шаг 4 – перенос документов ГИСОГД, зарегистрированных в регионе, из Системы МО, на которое он распространяет свое действие, на схему МО Системы региона.

Важно

Обратите внимание на UseSourceKeyPrefix= "@TargetSchemaKeyPrefix@", обеспечивающий репликацию данных «чужого проекта» для нашего МО, можно указывать явно ключ проекта UseSourceKeyPrefix= "172501".

Пример развертывания схемы ГО из системы ГО в системе региона#

Пример развертывания схемы рассмотрим на проекте kazan.

В проекте-источнике необходимо проверить ключи систем координат и геосерверов.

  1. Подключитесь к БД источнику и на проекте выполните запросы:

select distinct geoserver_key,srs_key from kazan.d_gis_layer;

В результате должно получиться два ключа: геосервера и СК.

../../_images/key.png

Проверьте, что в базе-приёмнике в таблицах существуют данные с такими ключами:

    select * from regadm.d_gis_geoserver where key=2;
select * from regadm.d_gis_srs where key=3;

Если данных нет, то добавьте записи с соответствующими ключами (можно выполнить добавление геосервера и ск в Конфигураторе):

    --Добавление геосервера
insert into regadm.d_Gis_geoserver(key,display_name,description,url,login,password,wms_features_limit)
values(2, 'Имя ГС','Описание','http://172.16.55.51:8080/geoserver', 'admin','geoserver',0);

--Добавление системы координат
insert into regadm.d_Gis_srs(key,code,wkt,proj4,display_name)
values(3,
'EPSG:161','PROJCS["unnamed",GEOGCS["Krassovsky, 1942",DATUM["unknown",SPHEROID["krass",6378245,298.3],TOWGS84[23.57,-140.95,-79.8,0,0.35,0.79,-0.22]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],   PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",49.033333333333],PARAMETER["scale_factor",1],PARAMETER["false_easting",1300000],PARAMETER["false_northing",-5709414.7] ,UNIT["Meter",1]]',
'+proj=tmerc +lat_0=0 +lon_0=49.033333333333 +k=1 +x_0=1300000 +y_0=-5709414.70 +ellps=krass +towgs84=23.57,-140.95,-79.8,0,0.35,0.79,-0.22 +units=m +no_defs',
'EPSG:16_1');

В случае когда записи с такими ключами есть, но информация в них отличается от базы источника, выполните заливку проекта и после этого приведите ключи в соответствие.

  1. Запустите снятие копии схемы с помощью утилиты pg_dump:

pg_dump -U postgres -p 5432 -d kazan_v4 -h 185.104.106.92 -n kazan -Fp -b -EUTF8  -v -f kazan.pgdmp 2>export.log

Если не нужны логирующие таблицы и бинарные файлы, добавьте в команду --exclude-table-data="*.l_*" --exclude-table-data="*.d_file_content".

После снятие копии проверьте файл export.log на наличие ошибок. Если ошибок нет, то проверьте на базе-приёмнике, что нет схемы kazan. Если есть, то удаляем и создаем заново:

Drop schema kazan cascade;
Create schema kazan;
  1. Запустите команду раскатки дампа. Если в базе проектов несколько, укажите нужный: -n kazan:

pg_restore -U postgres -h 172.16.55.58 -p 5432 -d qaisogd -v kazan.pgdmp 2> imp.log

После заливки проверяем файл imp.log на наличие ошибок (появится в директории, из которой запускается команда заливки, там же и дамп kazan.pgdmp).

  1. Зарегистрируйте проект в таблице regadm.m_projects. Проверьте, что записи там нет:

Select * from regadm.m_projects where scheme='kazan';

Если записи нет, то выполняем перенос из базы источника записи:

4.1. Выполняем на базе-источнике:

select 'insert into regadm.m_projects(project_name,scheme,seq_prefix,seq_change,project_state,activity_status,conf_name) values('''||project_name||''','''||scheme||''','||seq_prefix||',''true'',2,2,'''||conf_name||''');'
from regadm.m_projects where scheme in('kazan');

4.2. Результат запроса выполняем на приёмнике. Пример:

insert into regadm.m_projects(project_name,scheme,seq_prefix,seq_change,project_state,activity_status,conf_name) values('Казань','kazan',100001,'true',2,2,'IsogdGO');
  1. Если геосервер и СК добавлялись вручную, в Конфигураторе, то необходимо добавить нужные ключи в таблицы:

    5.1. Установите нужный ключ СК:

    update kazan.d_gis_view_settings set srs_key=33
    update kazan.d_gis_layer set srs_key=33
    

    5.2. Установите связь слоёв проекта с нужным ключом геосервера:

    update kazan.d_gis_layer set geoserver_key=2
    
  2. Установите связь проекта и системы координат. Добавьте mbr.

    6.1. Найдите ключ проекта на базе-приёмнике:

    Select Key from regadm.m_projects where scheme='kazan'; --например 55
    

    6.2. Найдите ключ системы координат из запроса на базе-приёмнике:

    select distinct geoserver_key,srs_key from kazan.d_gis_layer; --например 33
    

    6.3. С базы-источника также получите значение mbr:

    Select mbr from regadm.m_project_srs_mbr where project_key=( Select Key from regadm.m_projects where scheme='kazan');
    

    6.4. Проверьте на базе-приёмнике, что нет записи:

    Select * from regadm.m_project_srs_mbr where project_key=55 and srs_key=33;
    

    6.5. Если запрос ничего не вернул, то на базе-приёмнике добавьте запись:

    insert into regadm.m_project_srs_mbr(srs_key,project_key,mbr)
    values(33,55,'{"MaxX": 1490000.0, "MaxY": 370000.0, "MinX": 1440000.0, "MinY": 305000.0}');
    
  3. Добавьте права для учетной записи для работы с этим проектом.

Для примера проект kazan и пользователь Isogdadmin. Используем скрипт:

do
$$
declare
        c integer;
        id_val text;
        username_val text:='isog';
        project_val text:='kazan';
begin
        select "Id" into id_val from regadm."AspNetUsers" where "UserName"=username_val;
        if id_val is not null then
                select count(*) into c
                        from regadm."AspNetUserClaims"
                where "UserId"=id_val
                        and "ClaimType"='ias:role'
                        and "ClaimValue"=project_val||'.ias:project-user';
                if c=0 then
                        insert into regadm."AspNetUserClaims"("ClaimType","ClaimValue","UserId") values('ias:role',project_val||'.ias:project-user',id_val);
                end if;
                select count(*) into c
                        from regadm."AspNetUserClaims"
                where "UserId"=id_val
                        and "ClaimType"='ias:role'
                        and "ClaimValue"=project_val||'.ias:project-administrator';
                if c=0 then
                        insert into regadm."AspNetUserClaims"("ClaimType","ClaimValue","UserId") values('ias:role',project_val||'.ias:project-administrator',id_val);
                end if;
        else
                raise exception 'Пользователь не найден';
        end if;
end$$;

Перезапустите службу основного приложения.

  1. Добавьте роли из эталона на проект.

Для переноса ролей из эталона на проект можно воспользоваться скриптом из эталона …\GeoMeta\Шаблон эталонных проектов\templates\AppServer\ProjectConfigurations\isogd_go\TemplateData\Role\10001_trole.sql.

В скрипте замените %SCHEMA% на имя нужной схемы.

  1. Создайте системные роли (если их ранее не было, необходимости выполнять, для базы в который уже были схемы, нет):

do
$$
declare
        c integer;
        rec record;
        roles record;
        userId text;
        tSQL text;
        roleId text;
        roleName text;
        toRole text:='gradAdmin';
        roleInfo jsonb:='[    {"name": "ias:gkn:importer", "description": "Импортер данных ГКН"},
                                {"name": "ias:gkn:exporter", "description": "Экспортер данных ГКН"},
                                {"name": "ias:uzin:registrator", "description": "Регистрация и ведение реестров договоров аренды"},
                                {"name": "ias:isogd:reg", "description": "Размещение в ИСОГД"},
                                {"name": "ias:isogd:cancelreg", "description": "Отмена размещение документа в ИСОГД"},
                                {"name": "ias:isogd:submitinfo", "description": "Предоставление сведений из ИСОГД"},
                                {"name": "ias:tab:exporter", "description": "Экспортер tab-файлов"},
                                {"name": "ias:tp:importer", "description": "Импортер данных технического плана"},
                                {"name": "ias:webimporter", "description": "Импорт данных через web-импортер"}
                        ]'::jsonb;
begin
        select "Id" into userId from regadm."AspNetUsers" where "UserName"=toRole;
        if userId is null then
                raise exception 'Пользователь не найден';
        end if;
        for rec in(select scheme from regadm.m_projects)
        loop
                raise info '%',rec.scheme;
                for roles in(select * from jsonb_array_elements(roleInfo))
                loop
                        roleName=roles.value->>'name';
                        select count(*),max("Id") into c,roleId
                                from regadm."AspNetRoles"
                        where "Scope"=rec.scheme
                                and "Name"=roleName;
                        if c=0 then
                                roleId:=uuid_generate_v4();
                                tSQL:='insert into regadm."AspNetRoles"("Description","IsSystem","Discriminator","Name","NormalizedName","ConcurrencyStamp","Scope","Id")
                                        values('''||(roles.value->>'description')||''',true,''ApplicationRole'',
                                                '''||(roles.value->>'name')||''',
                                                '''||upper(roles.value->>'name')||''',
                                                '''||uuid_generate_v4()||''',
                                                '''||rec.scheme||''',
                                                '''||roleId||''')';
                                execute tSQL;
                        end if;
--чтобы привязать к пользователю роли
                        /*select count(*) into c
                                from regadm."AspNetUserClaims"
                        where "ClaimType"='ias:role'
                                and "ClaimValue"=rec.scheme||'.'||roleName
                                and "UserId"=userId;
                        if c=0 then
                                insert into regadm."AspNetUserClaims"("ClaimType","ClaimValue","UserId")
                                        values('ias:role',rec.scheme||'.'||roleName,userId);
                        end if;*/
                end loop;
        end loop;
end$$;
  1. Увеличьте значение сиквенса seq_prefix (последовательность расположена в схеме regadm). Значение устанавливается командой:

select setval('regadm.seq_prefix',55555)

Примечание

Этот пункт необходимо выполнить обязательно, иначе есть вероятность повторения ключа для следующего созданного проекта.

  1. В разделе «Геосетки» в Конфигураторе нажмите Применить на GeoServer. Выполните перенос geoserver или выберите «Сбросить Geoserver до стартовых настроек проекта».

Правила формирования списка справочных значений на проектах, где есть реплицированные данные#

На проектах с реплицированными данными для формирования списка справочных значений для фильтрации применяется следующий алгоритм:

На рисунках приведены примеры выбора справочного значения. Проект 1 считать за текущий.

  1. Если алиасы справочного значения текущего проекта, т.е. проекта куда реплицировались данные, и реплицированного проекта совпадают, то приоритетнее справочное значение текущего проекта. Справочное значение текущего проекта будет доступно для выбора при фильтрации в панели представления.

Пример 1:

../../_images/exempl11.png
  1. Если алиасы справочных значений реплицированных проектов совпадают и на текущем проекте нет такого алиаса, то приоритетнее будет первое попавшиеся справочное значение. Оставшиеся справочные значения не будут отражаться для выбора при фильтрации в панели представления.

Пример 2:

../../_images/exempl22.png
  1. Если алиасы справочных значений на текущем и реплицированном проекте не совпадают, то оба справочных значения будут доступны для выбора при фильтрации в панели представления.

Пример 3:

../../_images/exempl33.png
  1. Если у справочного значения нет алиаса, то данное справочное значение будет доступно для выбора при фильтрации в панели представления.

Пример 4:

../../_images/exempl44.png

Возможные проблемы#

Сообщение в логах: «В базе в системных таблицах не найдено описание системы координат '34002'»#

Причина

Не было СК (34002) на БД приемнике (должно быть и на источнике и на приемнике).

Решение

Запустить скрипт:

-- Описание:
-- Восстановление описания систем координат в служебной таблице PostGis на основе данных Гис-конфигуратора


DROP TRIGGER trg_d_gis_srs ON regadm.d_gis_srs;

CREATE TRIGGER trg_d_gis_srs
  BEFORE INSERT OR UPDATE
  ON regadm.d_gis_srs
  FOR EACH ROW
  EXECUTE PROCEDURE regadm.f_d_gis_srs();

CREATE OR REPLACE FUNCTION regadm.f_d_gis_srs()
  RETURNS trigger AS
$BODY$
        DECLARE
         tsrid bigint;
               BEGIN
                 if(trim(NEW.code) is not null and upper(trim(NEW.code)) like 'EPSG:%') then
        tsrid:=regexp_replace(NEW.code,'EPSG:(\d+)','\1');
        if not exists(select 1 from public.spatial_ref_sys where srid=tsrid) then
      insert into public.spatial_ref_sys(srid,auth_name,auth_srid,srtext,proj4text) values(tsrid,NEW.code,tsrid,NEW.wkt,NEW.proj4);
                      else
                            update public.spatial_ref_sys
          set auth_name=NEW.code,
        srtext=coalesce(NEW.wkt,srtext),
        proj4text=coalesce(NEW.proj4,proj4text)
          where srid=tsrid;
        end if;
          end if;
  return NEW;
        END;
        $BODY$
  LANGUAGE plpgsql;

update regadm.d_gis_srs
set display_name=display_name;

В реестре приемника «Наборы данных» после переноса отсутствует геометрия#

Для корректного переноса геометрии наборов данных рекомендуется отключить ссылочные поля в файле sync.cfg.

Поля можно указать вручную, например:

<Table Id="DmdInfoSet" SyncLevel="AllRecords" AutoProperties="Custom">
<Property Id="Name"/>
</Table>

Можно указать для настройки AutoProperties значение ValueFields, которая включит перенос всех простых полей:

<Table Id="DmdInfoSet" SyncLevel="AllRecords" AutoProperties="ValueFields"></Table>

Документ не переносится из региональной схемы в МР и не попадает в список переносимых объектов при диагностике репликации#

Данная ситуация может происходить из-за отсутствия записей в одной из лог-таблиц участвующих в переносе.

Выявить проблему можно следующим образом:

  1. Выполните запрос к «не-лог-таблицам» на получение документов, которые нужно перенести в нужную схему:

select dd.key, dd.gisogd_num_reg_table, ds.alias from СХЕМА_РЕГИОНА.d_document dd
join СХЕМА_РЕГИОНА.d_ref_document_type dt on dt.key = dd.document_type_key and dt.alias = 'АЛИАС_ТИПА_ДОКУМЕНТА' and dt.sys_status = 0
join СХЕМА_РЕГИОНА.D_REL_DOCUMENT_DIRECTORY morel on morel.doc = dd.key and morel.sys_status = 0
join СХЕМА_РЕГИОНА.d_ref_directory_simple ds on ds.key = morel.ref_directory_simple and ds.sys_status = 0
join СХЕМА_РЕГИОНА.d_ref_type_directory dst on ds.directory_type_key = dst.key
and dst.alias = 'DocRefMOGisogd'
and dst.sys_status = 0where dd.sys_status = 0
and dd.gisogd_num_reg_table is not null and ds.alias in ('СХЕМА_МО')

После выполнения запроса запись нужного документа возвращается. При желании к запросу можно добавить условие по ключу документа where dd.key = КЛЮЧ_ДОКУМЕНТА.

  1. Замените все таблицы в запросе выше на их лог-таблицы:

select dd.key, dd.gisogd_num_reg_table, ds.alias from СХЕМА_РЕГИОНА.l_d_document dd
join СХЕМА_РЕГИОНА.l_d_ref_document_type dt on dt.key = dd.document_type_key and dt.alias = 'АЛИАС_ТИПА_ДОКУМЕНТА' and dt.sys_status = 0
join СХЕМА_РЕГИОНА.l_D_REL_DOCUMENT_DIRECTORY morel on morel.doc = dd.key and morel.sys_status = 0
join СХЕМА_РЕГИОНА.l_d_ref_directory_simple ds on ds.key = morel.ref_directory_simple and ds.sys_status = 0
join СХЕМА_РЕГИОНА.l_d_ref_type_directory dst on ds.directory_type_key = dst.key
and dst.alias = 'DocRefMOGisogd'
and dst.sys_status = 0where dd.sys_status = 0
and dd.gisogd_num_reg_table is not null and ds.alias in ('СХЕМА_МО')

После выполнения запроса запись не возвращается. Это значит, что один или несколько из join-ов этому препятствует и данные в его таблице не удовлетворяют критериям JOIN либо отсутствуют.

  1. Последовательно замените l-таблицы в запросе на обычные, начиная снизу вверх. При обнаружении таблицы, при замене которой запрос начинает возвращать записи, необходимо проверить эту таблицу на соответствие всем требованиям.