Database
 sql >> база данни >  >> RDS >> Database

Проследяване на ниво колона и ред при репликация при сливане

В тази статия нека разгледаме опциите за проследяване на ниво ред и колона при репликация на сливане и как те се използват при откриване на конфликти по време на репликация на сливане.

Репликация при сливане: Репликацията при сливане се използва за репликиране на данни и по двата начина, т.е. от издателя към абоната и от абоната към издателя.

Първоначалната снимка на обектите се прави и се прилага към абонатите. Постепенните промени в данните и схемите се проследяват с помощта на тригери и се прилагат към абонатите, когато абонатът се синхронизира с издателя.

Конфликти:

При репликация със сливане и абонатът, и издателят са независими и данните могат да се променят на всеки възел.

Когато данните се променят както за издателя, така и за абоната в рамките на цикъла на репликация и когато абонатът се синхронизира с издателя, възниква конфликт. Агентът за сливане определя победителя от двете страни в зависимост от разрешаването на конфликта. По подразбиране победителят се определя от различни параметри, като абонамент за клиент или сървър, абонамент за изтегляне или натискане и др.

Откриване на конфликти:

Откриването на конфликт зависи от типа проследяване, което конфигурираме за статията.

  • Проследяване на ниво ред: Ако промените в данните са направени в която и да е колона на един и същ ред в двата края, това се счита за конфликт.
  • Проследяване на ниво колона: Ако промените в данните са направени в една и съща колона и в двата края, тази промяна се квалифицира като конфликт.

Резолвери:

Разрешителите прилагат данните за победител и в двата края, когато възникне конфликт.

По подразбиране, ако има конфликт между издателя и абоната, издателят винаги печели.

Ако възникне конфликт между двама абонати, победителят се определя от абоната клиент/сървър и абонаментите за изтегляне/натискане.

В допълнение към разделителя по подразбиране, има и няколко персонализирани разделители. Ще обсъдим персонализираните преобразуватели в следващите статии.

Конфигуриране на репликация при сливане с проследяване на ниво ред:

База данни на издателя:pub_db

База данни за абонати:sub_db

Нека създадем таблицата “TBL_EMP” и да я добавим към репликацията при сливане.

CREATE TABLE TBL_EMP
(EmpID INT, Emp_FName varchar(100),Emp_Lname varchar(100))

INSERT INTO TBL_EMP VALUES (1,'Jhon','P')

INSERT INTO TBL_EMP VALUES (2,'Alison','P')

INSERT INTO TBL_EMP VALUES (3,'Angela','P')

За да конфигурира репликацията при сливане, издателят трябва да бъде конфигуриран да използва локално разпространение или отдалечено разпространение.

След като дистрибуцията е конфигурирана, отидете до папката за репликация в SSMS и щракнете с десния бутон на мишката върху местните публикации.

Кликнете върху Напред и изберете базата данни за публикации, щракнете върху Напред и изберете репликацията за сливане, изберете 2008 или по-нова версия и добавете таблицата към репликацията.

Сега щракнете върху свойствата на статията и изберете свойствата на маркираната статия.

Изберете нивото на проследяване, което да бъде проследяване на ниво ред.

По подразбиране това ще бъде проследяването на ниво ред. Щракнете върху OK, Next, Next . Добавете филтър, ако искате да изпратите конкретни данни на абоната, в противен случай игнорирайте, активирайте Създаване моментна снимканезабавнота , конфигурирайте защитата на агента според вашите нужди, активирайте Създаване на публикация , посочете името на публикацията и щракнете върху Край .

След като се генерира първоначалната моментна снимка, добавете абоната.

Придвижете се до публикацията, която създавате в папката за репликация на издателя, щракнете с десния бутон и изберете Нов абонамент.

Кликнете върху Напред , изберете публикацията, щракнете върху Напред и изберете абонамента за изтегляне или натискане според вашите нужди. В този случай използвах push абонамент.

Изберете базата данни за абонаменти и щракнете върху Напред , конфигурирайте идентификационните данни за вход за агента за сливане и щракнете върху Напред .

Изберете графика на агента според вашите нужди. В този случай използвах Изпълнение само при поискване . Кликнете върху Напред , изберете Незабавно инициализиране и изберете клиент като тип абонамент, щракнете върху Напред , активирайте Създаване на абонамент , щракнете върху Напред и Край .

След като се приложи първоначалната моментна снимка, изпълнете изявлението по-долу на издателя, за да актуализирате записа.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 1

Сега в базата данни на абоната изпълнете изявлението по-долу, за да актуализирате фамилното име.

update TBL_EMP set Emp_Lname = 'A' where empid = 1

Сега същият ред беше променен както в базата данни на издателя, така и в базата данни на абонатите в рамките на същия цикъл на репликация.

Съгласно опцията за проследяване, която задаваме, т.е. проследяване на ниво ред, промяната се счита за конфликт и ще бъде регистрирана в таблиците за конфликти, когато агентът за сливане се изпълни.

Придвижете се до публикацията, която сте създали, и разгънете публикацията, за да видите абонаментите. Щракнете с десния бутон върху абонамента, изберете Преглед на състоянието на синхронизиране и щракнете върху Старт.

След като агентът за сливане работи успешно, отидете при абоната и проверете данните, като използвате изявлението по-долу.

use sub_db
select * from TBL_EMP  where empid = 1 

Виждаме, че промяната от издателя е спечелила, а промяната от абоната е загубила.

Информацията за конфликти се съхранява в таблиците за конфликти и може да се види в инструмента за преглед на конфликти.

Придвижете се до издателя, щракнете с десния бутон върху него и изберете Преглед на конфликтите.

Изберете таблицата за конфликти и щракнете върху OK, за да видите подробности.

Промяна на нивото на проследяване

Сега нека променим нивото на проследяване на проследяване на ниво колона. Придвижете се до публикацията, щракнете с десния бутон върху нея и изберете Свойства на издателя. Щракнете върху Статии, изберете таблицата, щракнете върху Свойства на статия, задайте свойства на маркираната статия в таблицата, изберете Проследяване на ниво колона, щракнете върху OK, щракнете върху OK и след това щракнете върху Маркиране за повторно инициализиране.

Това ще маркира всички абонати за повторно инициализиране, тъй като променяме съществуващото ниво на проследяване на ново.

Придвижете се до публикацията, щракнете с десния бутон върху публикацията и щракнете върху Преглед на състоянието на агента за моментна снимка , щракнете върху Старт за генериране на нова моментна снимка. Има и други начини за генериране на моментна снимка.

Сега изпълнете изявлението по-долу срещу издателя, за да актуализирате запис.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 2

Сега изпълнете изявлението по-долу срещу базата данни на абоната, за да актуализирате фамилното име.

update TBL_EMP set Emp_Lname = 'A' where empid = 2

Стартирайте ръчно агента за сливане. Все още виждам конфликта в записа, въпреки че актуализирахме две различни колони и зададохме нивото на проследяване на ниво колона.

Можем да видим подробностите в инструмента за преглед на конфликти. Промяната на съществуващото ниво на проследяване не работи. И така, преконфигурирах публикацията, зададох нивото на проследяване на проследяване на ниво колона, преди да генерирам първоначалната моментна снимка. Беше създадена моментна снимка и беше добавен абонат към публикацията.

След като първоначалната моментна снимка бъде приложена към абоната, изпълнете следните оператори в базата данни на издателя.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 3

Изпълнете следния оператор в базата данни за абонати.

update TBL_EMP set Emp_Lname = 'A' where empid = 3

Стартирайте ръчно агента за сливане. Сега, в базата данни за абонати, потърсете таблицата TBL_EMP.

Актуализацията от издателя и абоната не се квалифицира като конфликт, тъй като и двете са в различни колони, а нивото на проследяване е зададено на проследяване на ниво колона. В таблиците за конфликти не се регистрира конфликт, актуализациите както на издателя, така и на абоната в различни колони не се губят.

Нека актуализираме същата колона за издателя и абоната.

Изпълнете следния оператор срещу базата данни на издателя.

use pub_db
update TBL_EMP set Emp_Lname = 'B' where empid = 1

Изпълнете следния оператор срещу базата данни на абонатите.

use sub_db
update TBL_EMP set Emp_Lname = 'C' where empid = 1

Стартирайте агента за сливане и потърсете таблицата TBL_EMP на абоната. Актуализацията на абоната се губи и конфликтът се регистрира.

Ефективност:

Може да има излишни разходи при проследяването на ниво колона в сравнение с проследяването на ниво ред, когато има огромни актуализации. Но в моя случай не забелязах разлика във времето на синхронизация както за проследяването на ниво ред, така и на ниво колона в случай на големи актуализации, тъй като таблицата може да е проста по структура (т.е. много малко колони) и както на абоната, така и на издател са на същия екземпляр на SQL сървър.

Бележки:

  • По подразбиране това винаги е проследяване на ниво ред, когато е конфигурирана репликация при сливане.
  • Опцията за ниво на проследяване зависи от таблица. Така че можете да имате ниво на ред в една таблица и ниво на колона в друга таблица.
  • Тези опции помагат само когато се открие конфликт въз основа на актуализация, а не за разрешаването му.
  • Преконфигурирайте публикацията, ако промяната на съществуващото ниво на проследяване не работи.
  • Задайте ниво на проследяване според нуждите на вашия бизнес.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-близкото съвпадение, част 1

  2. Свързване на Delphi към Salesforce.com

  3. Архивиране само на база данни в WHM

  4. RDBMS срещу NoSQL

  5. Форматиране на данни в Power BI Desktop Visualizations