В тази статия нека разгледаме опциите за проследяване на ниво ред и колона при репликация на сливане и как те се използват при откриване на конфликти по време на репликация на сливане.
Репликация при сливане: Репликацията при сливане се използва за репликиране на данни и по двата начина, т.е. от издателя към абоната и от абоната към издателя.
Първоначалната снимка на обектите се прави и се прилага към абонатите. Постепенните промени в данните и схемите се проследяват с помощта на тригери и се прилагат към абонатите, когато абонатът се синхронизира с издателя.
Конфликти:
При репликация със сливане и абонатът, и издателят са независими и данните могат да се променят на всеки възел.
Когато данните се променят както за издателя, така и за абоната в рамките на цикъла на репликация и когато абонатът се синхронизира с издателя, възниква конфликт. Агентът за сливане определя победителя от двете страни в зависимост от разрешаването на конфликта. По подразбиране победителят се определя от различни параметри, като абонамент за клиент или сървър, абонамент за изтегляне или натискане и др.
Откриване на конфликти:
Откриването на конфликт зависи от типа проследяване, което конфигурираме за статията.
- Проследяване на ниво ред: Ако промените в данните са направени в която и да е колона на един и същ ред в двата края, това се счита за конфликт.
- Проследяване на ниво колона: Ако промените в данните са направени в една и съща колона и в двата края, тази промяна се квалифицира като конфликт.
Резолвери:
Разрешителите прилагат данните за победител и в двата края, когато възникне конфликт.
По подразбиране, ако има конфликт между издателя и абоната, издателят винаги печели.
Ако възникне конфликт между двама абонати, победителят се определя от абоната клиент/сървър и абонаментите за изтегляне/натискане.
В допълнение към разделителя по подразбиране, има и няколко персонализирани разделители. Ще обсъдим персонализираните преобразуватели в следващите статии.
Конфигуриране на репликация при сливане с проследяване на ниво ред:
База данни на издателя: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 сървър.
Бележки:
- По подразбиране това винаги е проследяване на ниво ред, когато е конфигурирана репликация при сливане.
- Опцията за ниво на проследяване зависи от таблица. Така че можете да имате ниво на ред в една таблица и ниво на колона в друга таблица.
- Тези опции помагат само когато се открие конфликт въз основа на актуализация, а не за разрешаването му.
- Преконфигурирайте публикацията, ако промяната на съществуващото ниво на проследяване не работи.
- Задайте ниво на проследяване според нуждите на вашия бизнес.