Вы находитесь на странице: 1из 17

Лабораторная работа

Тема работы: РЕПЛИКАЦИЯ


ТРАНЗАКЦИЙ
Цель работы: синхронизация обмена
данными между удаленными серверами
БД.
Задание
1. Организовать сеть с использованием виртуальных машин.
2. Настроить разрешения на удаленные подключения к двум SQL Server.
3. Реализовать репликацию моментальных снимков и транзакция для
тестовых БД.
4. Исследовать возможности и особенности выполнения репликации в
разных режимах.

Ход работы
Репликация в графическом режиме
1. Необходимо настроить распространителя.
Это может быть отдельный сервер \экземпляр, так и экземпляр с базой
данной публикации или подписчика. Рекомендую выбирать отдельный
сервер с установленным экземпляром MS SQL или экземпляр с базой данной
подписчика. Распространитель может использоваться для нескольких
издателей и подписчиков.
На объекте «Репликация» в контекстном меню выбираем настройка
Распространиетеля (Configure Distribution)

Далее выбираем, что указанный сервер будет Издателем:


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

В следующем окне указываем название базы данных распространителя,


рекомендуется оставить по умолчание - distribution.
После данных диалоговых окон необходим еще раз проверить введенную
информаци и нажать кнопку "Finish" – распространитель настроен.
2. После этого надо в свойства распространителя добавить наш сервер
издателя и указать пароль доступа к распространителю:

2)Следующий шаг — настройка публикации.

Выбираем на объекте MS SQL сервера Replication пункт меню новая


публикация:
добавляем наш ранее настроенный сервер Распространителя

в следующем окне указываем пароль доступа к распространителю,


указанный в п.1.

Выбираем базу данных для репликации:


выбираем тип репликации, у нас репликация транзакций (Transactional
publication)

Далее выбираем стать для публикации, т.е выбираем объекты базы данных
для репликации, на примере выбраны таблицы схемы Person и
таблица databaselog, а также процедура. В таблицах можно выбрать
репликацию отдельных полей, т.е которые нам нужны, далее можно указать
свойства отдельных статей, кнопка Article Properties. 

В окне выбора фильтров, укажем фильтр на таблицу DatabaseLog ='Person'


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

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


затем указываем имя публикации и создаем публикацию. После этого у
разделе репликации появится наша публикация:

3)Настройка подписчика.
На подписчике выбираем объект сервере репликация -> подписчики

Выбираем нашу публикацию, указываем сервер и после этого отобразятся


доступные публикации
Выбираем тип репликации:

На примере выбрана репликация с расположением агентов на подписчиках,


т.е Pull репликация, образно говоря каждый подписчик «тянет» на себя
транзакции с распространителя.

Указываем базу данных, куда будет идти репликация, или создаем новую
базу данных:
Репликацию можно настраивать как на существующую базу данных, так и на
новую базу данных, с сохранением или удалением данных. Эти параметры
указываются при настройки статей.

В следующем окне указываем учетную запись для доступа к


распространителю, далее указываем тип запуска агента

На примере указана тип запуска постоянно, т.е проверка новых транзакций


будет постоянна.

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

После этого за репликацией можно наблюдать ч помощью «Монитора


Репликации»

Данное средство помогает отслеживает работу репликации, отображать


ошибки и состояние агентов.

Так же после создание репликация, создаются три джоба с примерно такими


именами:

Данные джобы отвечают за:

1. Создание моментального снимка - категория задания Repl-Snapshot


2. Чтение журнала транзакций - категория задания Repl-LogReader
3. Агент распространения транзакций — категория задания Repl-
Distribution

Это основные агенты, которые отвечают в репликации за передачу данных.

Так же репликация создает дополнительные задания ( см. выше указанный


список), которые необходимы для обслуживания репликации.
Репликация с помощью хранимых процедур
Реализовать в БД репликацию, включающую вертикальную и
горизонтальную фрагментацию данных таблиц. Выполнить модификацию
данных, иллюстрирующую работу репликации.
Содержание отчета:
— скрипты для создания объектов репликации;
— операторы модификации данных для тестирования репликации,
наборы данных в таблицах.

Издателем, подписчиком и распространителем могут быть как различные


SQL-сервера, так и один и тот же. Организуем репликацию на одном и том
же сервере:
1. Создание БД для публикации и подписки:

use master
go
create database main
go
create database node
go

2. Создание и заполнение таблиц в БД издателя:


Выполнить скрипт Torg_firm.

3. Создание распространителя (назначение сервера в качестве


распространителя)
Используем СХП sp_adddistributor, процедура должна вызываться на
распространителе в базе данных master, единственным обязательным
параметром является имя сервера (на сервере должен быть запущен Агент
SQL Server — команда Запустить из контекстного меню одноименного узла
в обозревателе объектов Management Studio):
use master
go
exec sp_adddistributor 'HP-LADA'
go 
СХП sp_dropdistributor удаляет распространитель (выполняется на
распространителе в любой базе данных, за исключением базы данных
распространителя), а СХП sp_helpdistributor выводит сведения о
распространителе (выполняется на издателе)[23].

4. Создание базы данных распространителя


Используем СХП sp_adddistributiondb, единственным обязательным
параметром является имя БД, процедура должна вызываться на
распространителе в базе данных master (если БД не существует, она
создается, иначе помечается как БД распространителя и в ней создаются
системные таблицы):
use master
go
exec sp_adddistributiondb 'distr'
go
 
СХП sp_changedistributiondb изменяет БД распространителя.[24]
5. Настройку издателя на использование БД распространителя
Реализует СХП sp_adddistpublisher, обязательными параметрами являются
имя издателя и имя БД распространителя, процедура должна вызываться на
распространителе в любой БД (перед ее вызовом должны быть
выполнены sp_adddistributor и sp_adddistributiondb):
exec
sp_adddistpublisher @publisher = 'HP-LADA', @distribution_db = 'distr'
go 

6. Настройка параметров реплицируемой БД


Осуществляет СХП sp_replicationdboption, вызываемая на издателе или
подписчике в любой БД, обязательными параметрами являются имя БД,
имя и значение свойства, для репликации слиянием значение
параметра @optname устанавливается в'merge publish', для других — как
показано ниже:
use main
exec sp_replicationdboption @dbname = 'main', @optname = 'publish',
@value = 'true'
go 
7. Создание моментального снимка для публикации транзакций
реализует СХП sp_addpublication, процедура вызывается на издателе в
публикуемой БД, единственным обязательным параметром является имя
публикации (здесь предполагается, что публикация предназначена для
репликации в БД на сервере в филиале, куда будут передаваться
сведения, про заказы молока и сметаны):
use main
exec sp_addpublication @publication = 'Replica', @repl_freq = 'continuous',
@allow_sync_tran = 'true'--userdefine
go 
Параметр @repl_freq имеет значение 'continuous' по умолчанию, которое
говорит о том, что реплицироваться будут изменения, выполненные всеми
транзакциями, попавшими в журнал.
Параметр @allow_sync_tran разрешает для создаваемой публикации
немедленно обновляемые подписки. Параметр @status определяет
доступность публикации для подписчиков 'activ'eили'inactive' (по
умолчанию).
8. Создание агента моментального снимка для публикации
Выполняет СХП sp_addpublication_snapshot, вызываемая на издателе в
публикуемой БД, единственным обязательным является имя публикации:
use main
go
exec sp_addpublication_snapshot @publication = 'Replica', @frequency_type = 1
go 
Параметр @frequency_type может принимать значения 1 — однократно, 4
— ежедневно (по умолчанию), 8 — еженедельно, 16 — ежемесячно и др.
Параметр @frequency_interval позволяет дополнительно указать день
недели, рабочий/выходной день и др.
9. Создание статей
реализует СХП sp_addarticle, вызываемая на издателе в публикуемой БД, в
качестве параметров процедуре передаются имя публикации, имя статьи и
имя объекта БД, входящего в статью:
use main
go
exec sp_addarticle @publication = 'Replica', @article = 'T_klient',
@source_object = 'klient'
go
exec sp_addarticle @publication = 'Replica', @article = 'T_Postachalnik',
@source_object = 'Postachalnik'
go
exec sp_addarticle @publication = 'Replica', @article = 'T_tovar',
@source_object = 'Tovar'
go
exec sp_addarticle @publication = 'Replica', @article = 'T_zakaz',
@source_object = 'Zakaz'
go
exec sp_addarticle @publication = 'Replica', @article = 'T_Zakaz_tovar',
@source_object = 'Zakaz_tovar'
go
exec sp_addarticle @publication = 'Replica', @article = 'T_Sotrudnik',
@source_object = 'Sotrudnik'
go 

Имя статьи должно быть уникальным в рамках публикации, чаще всего


публикуемыми объектами БД являются таблицы, но могут быть и
представления, ХП и др.
10.Горизонтальная фрагментация
Задают СХП  sp_articlefilter и sp_articleview, вызываемые на издателе в
публикуемой БД, процедуры создают фильтр и представление,
обеспечивающие фрагментацию данных:

use main
go

exec sp_articlefilter @publication = 'Replica', @article = 'T_Tovar',


@filter_name = 'FT_Tovar', @filter_clause = 'Nazva in (''Молоко'',''Сметана'')'
go
exec sp_articleview @publication = 'Replica', @article = 'T_Tovar',
@view_name = 'VT_Tovar', @filter_clause = 'Nazva in (''Молоко'',''Сметана'')'
go

exec sp_articlefilter @publication = 'Replica', @article = 'T_zakaz_tovar',


@filter_name = 'FT_Zakaz_tovar', @filter_clause =
'Id_tovar in (select id_tovar from Tovar where Nazva in (''Молоко'',''Сметана''))'
go

exec sp_articleview @publication = 'Replica', @article = 'T_zakaz_tovar',


@view_name = 'VT_Zakaz_tovar', @filter_clause =
'Id_tovar in (select id_tovar from Tovar where Nazva in (''Молоко'',''Сметана''))'
go

exec sp_articlefilter @publication = 'Replica', @article = 'T_Zakaz',


@filter_name = 'FT_Zakaz', @filter_clause = 'Id_zakaz in (select id_zakaz from
zakaz_tovar, tovar where

zakaz_tovar.id_tovar=tovar.id_tovar and tovar.Nazva in


(''Молоко'',''Сметана''))'
go
exec sp_articleview @publication = 'Replica', @article = 'T_Zakaz',
@view_name = 'VT_Zakaz', @filter_clause = 'Id_zakaz in (select id_zakaz from
zakaz_tovar, tovar where

zakaz_tovar.id_tovar=tovar.id_tovar and tovar.Nazva in


(''Молоко'',''Сметана''))'
go

exec sp_articlefilter @publication = 'Replica', @article = 'T_Sotrudnik',


@filter_name = 'FT_Sotrudnik', @filter_clause ='id_sotrud in (select id_sotrud
from zakaz

where Id_zakaz in (select id_zakaz from zakaz_tovar, tovar

where zakaz_tovar.id_tovar=tovar.id_tovar

and tovar.Nazva in (''Молоко'',''Сметана'')))'


go

exec sp_articleview @publication = 'Replica', @article = 'T_Sotrudnik',


@view_name = 'VT_Sotrudnik', @filter_clause =
' id_sotrud in (select id_sotrud from zakaz
where Id_zakaz in (select id_zakaz from zakaz_tovar, tovar where

zakaz_tovar.id_tovar=tovar.id_tovar
and
tovar.Nazva in (''Молоко'',''Сметана'')))'
go

Параметр @filter_clause определяет условие отбора, записываемое по тем


же синтаксическим правилам, что в разделе where SQL запросов.
Фильтрация записей по пренадлежности записей о заказе ‘Молоку’ и
‘сметане’
Вертикальную фрагментацию задает СХП  sp_articlecolumn, вызываемая на
издателе в публикуемой БД, процедура позволяет исключать (@operation
= 'drop') или включать (@operation = 'add') столбец таблицы в публикацию:
use main
go
exec sp_articlecolumn @publication = 'Replica',
@article = 'T_tovar', @column = 'NaSklade', @operation = 'drop'
go 
11.Активацию публикации
Осуществляем с помощью СХП  sp_changepublication, вызов производится
на издателе в публикуемой БД:
use main
go
exec sp_changepublication 'Replica', 'status', 'active'
go
12. Создание подписки
Осуществляет СХП  sp_addsubscription, вызов производится на издателе в
публикуемой БД:
use main
go
exec sp_addsubscription @publication = 'Replica',
@subscriber = 'HP_LADA', @destination_db = 'node',
@subscription_type = 'push', @update_mode = 'sync tran'
go 
При вызове процедуры указывается имя публикации, сервера, целевой
БД, подписка является принудительной (@subscription_type = 'push'),
параметр @update_mode = 'sync tran' включает поддержку немедленно
обновляемых подписок.
13.Синхронизация БД main и node 
необходимо вызвать агента репликации — команда Запустить задание
на шаге… из контекстного меню узла, соответствующего агенту
моментального снимка (ветвь дерева объектов — Агент SQL
Server\Задания), имя агента можно уточнить, вызвав СХП:

use main
go
exec sp_helppublication_snapshot @publication = 'Replica'
go 

Альтернативным способом является использование СХП:


use main
go
sp_startpublication_snapshot 'Replica'
go 
В результате вызова агента моментального снимка в БД node будут
созданы те же таблицы, что и в БД main, также будут переданы данные
таблиц в соответствии с настроенной горизонтальной и вертикальной
фрагментацией.
14.Протестировать работу публикации выполнив команды модификации
данных в БД.