Блог

    Sybase Replication Server
    В данном блоге планируется освещать некоторые практические вопросы работы с репликационным сервером. При чем, не вопросы администрирования (они отчасти документированы) а бОльшей частью специфичные вопросы работы со структурами и логикой
  • RSS подписка

Последние записи


Теги

Информация

Sybase Replication Server

Фильтр по тегу: script


Практическая задача- добавить несколько таблиц в подписку

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


--Универсальный генератор публикаций имени Горчилина. Нужно указать имя базы откуда и куда, после нарисовать нужные артикли

select * into #rs_databases from rs_databases
select * into #rs_sites from rs_sites

--declare @db_1 varchar (30),@db_2 varchar (30),@pubnam varchar(30)
--select @db_1 ='%1'
--select @db_2 ='%2'

select @pubnam= upper(rs_databases.dsname)+lower(rs_databases.dbname) +'_'+upper(#rs_databases.dsname)+lower(#rs_databases.dbname)
from rs_databases,#rs_databases where
rtrim(rs_databases.dsname)+'.'+rtrim(rs_databases.dbname) =@db_1 and
#rs_databases.dsname+'.'+#rs_databases.dbname =@db_2

select @db_1= rs_databases.dsname+'.'+rs_databases.dbname from rs_databases where rs_databases.dsname+'.'+rs_databases.dbname =@db_1
select @db_2= rs_databases.dsname+'.'+rs_databases.dbname from rs_databases where rs_databases.dsname+'.'+rs_databases.dbname =@db_2

--select @pubnam,@db_1,@db_2


select
'-- SUB: '+subname
from rs_subscriptions,rs_databases,#rs_databases where
rs_databases.dsname+'.'+rs_databases.dbname =@db_1 and
#rs_databases.dsname+'.'+#rs_databases.dbname =@db_2 and
rs_subscriptions.pdbid=rs_databases.dbid and
rs_subscriptions.dbid=#rs_databases.dbid
group by subname

select
--subname subid type objid dbid pdbid requestdate pownerid rownerid status recovering error_flag materializing dematerializing primary_sre replicate_sre materialization_try method generation parentid security mechanism prsid objname objid dbid objtype attributes ownertype crdate parentid ownerid rowtype phys_tablename deliver_as_name phys_objowner repl_objowner has_baserepdef minvers dsname dbname dbid dist_status src_status attributes errorclassid funcclassid prsid rowtype sorto_status ltype ptype ldbid enable_seq dsname dbname dbid dist_status src_status attributes errorclassid funcclassid prsid rowtype sorto_status ltype ptype ldbid enable_seq articlename articleid type primaryname primaryowner objid pubid requestdate
'-- TABLES: '+phys_tablename+char(9)+objname+char(9)+subname
from rs_subscriptions,rs_objects,rs_databases,#rs_databases,rs_articles where
rs_databases.dsname+'.'+rs_databases.dbname =@db_1 and
#rs_databases.dsname+'.'+#rs_databases.dbname =@db_2 and
--rs_subscriptions.objid=rs_objects.objid and
rs_subscriptions.pdbid=rs_databases.dbid and
rs_subscriptions.dbid=#rs_databases.dbid and
rs_articles.articleid=rs_subscriptions.objid and
rs_articles.objid=rs_objects.objid
order by phys_tablename

select '-- ['+rs_sites.name+'] '+@db_1+' ==> ['+#rs_sites.name+'] '+@db_2+ ' {'+@pubnam+'}'
from rs_databases,#rs_databases,rs_sites,#rs_sites where
rs_databases.dsname+'.'+rs_databases.dbname =@db_1 and
#rs_databases.dsname+'.'+#rs_databases.dbname =@db_2 and
rs_databases.prsid=rs_sites.id and
#rs_databases.prsid=#rs_sites.id


select 'create publication "'+@pubnam+'" with primary at '+@db_1,

char(10)+'create article "<<ARTICLE>>" for "'+@pubnam+'" with primary at '+@db_1+' with replication definition "<<REP DEF>>"',

char(10)+'validate publication "'+@pubnam+'" with primary at '+@db_1,

char(10)+'define subscription "'+@pubnam+'" for publication "'+@pubnam+'" with primary at '+@db_1+' with replicate at '+@db_2,

char(10)+'activate subscription "'+@pubnam+'" for publication "'+@pubnam+'" with primary at '+@db_1+' with replicate at '+@db_2

drop table #rs_databases
drop table #rs_sites

go
добавлено: 09 сен 15 просмотры: 1198, комментарии: 0



Как скриптом узнать размер очереди

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

select getdate ()
select 'ROUTE TO ->'+name,
'RSI',
count(*)
from rs_sites,rs_segments where
rs_sites.id=rs_segments.q_number
group by name
go

select dsname+'.'+dbname,
case when q_type=0 then 'dsi' else 'LTM' end,
count(*),
case when dist_status=1 then 'up' else '!!' end
from rs_databases,rs_segments where
rs_databases.dbid=rs_segments.q_number
group by dsname+'.'+dbname,
case when q_type=0 then 'dsi' else 'LTM' end,
case when dist_status=1 then 'up' else '!!' end
go
select '---------------------------- for resume ---------------------'
go
select 'resume connection to '+dsname+'.'+dbname+' skip transacion'+char(10)+'go'
from rs_databases
where
dist_status!=1 and src_status=1 and
prsid in (select id from rs_sites where name in (select charvalue from rs_config where optionname='oserver'))
group by 'resume connection to '+dsname+'.'+dbname+' skip transacion'+char(10)+'go'
go
добавлено: 06 сен 15 просмотры: 1163, комментарии: 0



Забавная подробность BCP

Были несколько раз забавные приключения, когда bcp паковала данные мимо форинкея. А потом у счастливых владельцев этих таблиц недоумение, раз даже на грани истерики. Судя по всему, ропот был услышан MS:



2005

https://technet.microsoft.com/ru-ru/library/ms186247(v=sql.90).aspx

По умолчанию, инструкция INSERT проверяет ограничения CHECK и FOREIGN KEY. Однако инструкция INSERT ... SELECT * FROM OPENROWSET(BULK...) позволяет переопределить проверку ограничений CHECK и FOREIGN KEY.

Примечание.

Нельзя отключить ограничения UNIQUE, PRIMARY KEY или NOT NULL.



2008 R2

https://technet.microsoft.com/ru-ru/library/ms186247(v=sql.105).aspx

Примечание

Только ограничения CHECK могут быть отключены. Нельзя отключить ограничения UNIQUE, PRIMARY KEY, FOREIGN KEY или NOT NULL.



То есть, в 2008 R2 проверку на форинкей отключить нельзя, а в 2005 можно.

Ну а в целом конечно форинкеи враг репликации. Таблицы иногда получают из разных источников, иногда возникают расхождения в данных. Упала репликация- за это голова болит вроде бы уже как и не у владельцев сервера- получателя. Лучше бы на стороне получателя убрать все проверки кроме PK. Это не всегда возможно, но очень желательно.
добавлено: 03 сен 15 просмотры: 1060, комментарии: 2



Практическая задача- сдуть очередь на полуживой сервер

Периодически возникала проблема- некий сервер помирает, его бы отписать, да накопившиеся в очереди транзакции не дают. В принципе, очередь можно просто сдуть. Но по ряду причин этот метод не всегда хорош, лучше бы оно отработало штатно. Еще один вариант- в базе побило несколько таблиц, транзакции по ним мешают. Именно по этим таблицам репликацию бы и отписать бы, но очередь не дает. Хочется сохранить очередь, выборочно удалив транзакции по некоторым таблицам. После их можно будет пересоздать, изменить структуру, закачать bcp. Иногда даже подкладывали вместо умершего сервера базу учебного сервера, и он быстренько сдувал очередь. Сделать то надо всего ничего- по таблицам идущим в эту базу создать пустой fsc, поднять. Репсервер честно все их применит- пустые. В базе при этом сами таблицы не нужны, достаточно репликационных объектов (вроде rs_lastcommit).
В литературе мне этот метод не встречался, но практически использовался часто.


/* Этот чудесный и замечательный скрипт позволяет сливать данные из очереди при полудохлой базе,
не выполняя каких-либо действий на sql-сервере и не очищая очередь силовыми методами*/

declare @dsname varchar(30),@dbname varchar(30)
select @dsname='%'
select @dbname='%'
select 'alter connection to "'+@dsname+'"."'+@dbname+'"'+char(10)+'set function string class to empty_function_class'

select 'create function string '+objname+
".rs_insert for empty_function_class with overwrite output language '/*empty*/'"+char(10)+'go',
char(10)+'create function string '+objname+
".rs_update for empty_function_class with overwrite output language '/*empty*/'"+char(10)+'go',
char(10)+'create function string '+objname+
".rs_delete for empty_function_class with overwrite output language '/*empty*/'"+char(10)+'go'
from rs_subscriptions,rs_objects,rs_articles,rs_databases
where rs_subscriptions.objid=rs_articles.articleid and
rs_articles.objid=rs_objects.objid and
rs_databases.dbid=rs_subscriptions.dbid and
dsname like @dsname and dbname like @dbname

select 'resume connection to "'+@dsname+'"."'+@dbname+'"'+char(10)+'go'
print 'Успехов и процветания, дорогой Дмитрий Ильич!'
добавлено: 02 сен 15 просмотры: 1020, комментарии: 0



Практическая задача- взвести флаги на репликацию

Прошло некоторое время, по ряду причин не связан какими-либо обязательствами. Решил выложить некоторые старые скрипты-примочки. Мелочь вроде, но иногда именно они приносят огромную пользу. Скрипты имеют важную особенность- написаны в виде учебных, избегал псевдонимов для лучшего понимания, некоторые из этих вещей делались в формате наглядного пособия. Кроме того, гуру SQL заметят некоторые моменты в плане стиля. Я это тоже вижу, себе я пишу иначе :) В принципе, любая серьезная работа подразумевает подготовку многих скриптов, не было большой работы в которой не пришлось бы придумывать что-то новое. Творческое это дело :)

/* Запусти меня в базе RSSD, и я расскажу какие таблицы ходят с конкретного сервера */
select 'DATABASE '+dsname+'.'+dbname+' tabename:'+phys_tablename
from rs_objects,rs_databases where rs_databases.dbid=rs_objects.dbid
and (phys_tablename not like 'rs_%%')
and dsname='ИмяСервера'
/*and dbname in('если надо- название базы')*/
group by dsname,dbname,phys_tablename
order by dsname,dbname,phys_tablename

/* Запусти меня в любой базе, и я сформирую скрипт, чтобы снести флаги на репликацию в этой базе */

select
'sp_setreptable '+name+' ,false'+char(13)+char(10)+'go'
from sysobjects where type='u'
order by name

/* Запусти меня в базе RSSD, и я сформирую скрипт, чтобы взвести флаги на репликацию для конкретного сервера */

select 'use '+dbname+char(10)+'go'+char(10)+'sp_setreptable '+phys_tablename+',true'+char(10)+'go'
from rs_objects,rs_databases where rs_databases.dbid=rs_objects.dbid
and (phys_tablename not like 'rs_%%') and dsname='ИмяСервера' /*!!!!!!!!!!!!!!!!*/

/* Запусти меня в базе RSSD, и я сформирую скрипт, чтобы взвести флаги на репликацию для конкретного сервера */
-- с группировкой и указанием имени сервера на котором полученный скрипт нужно запустить

select 'use '+dbname+' /* Run Me on: '+dsname+' */'+char(10)+'go'+char(10)+'sp_setreptable '+phys_tablename+',true'+char(10)+'go'
from rs_objects,rs_databases where rs_databases.dbid=rs_objects.dbid
and (phys_tablename not like 'rs_%%') and
--!!!
dsname='ИмяСервера' /*!!!!!!!!!!!!!!!!*/
--!!!
group by
'use '+dbname+' /* Run Me on: '+dsname+' */'+char(10)+'go'+char(10)+'sp_setreptable '+phys_tablename+',true'+char(10)+'go'


/* Запусти меня в базе RSSD, и я сформирую скрипт, чтобы взвести флаги на репликацию вообще для всех серверов */
-- с группировкой и указанием имени сервера на котором полученный скрипт нужно запустить

select 'use '+dbname+' /* Run Me on: '+dsname+' */'+char(10)+'go'+char(10)+'sp_setreptable '+phys_tablename+',true'+char(10)+'go'
from rs_objects,rs_databases where rs_databases.dbid=rs_objects.dbid
and (phys_tablename not like 'rs_%%') --and
--!!!
--dsname='ИмяСервера' /*!!!!!!!!!!!!!!!!*/
--!!!
group by
'use '+dbname+' /* Run Me on: '+dsname+' */'+char(10)+'go'+char(10)+'sp_setreptable '+phys_tablename+',true'+char(10)+'go'
order by dsname,dbname

/* Скрипт имени Горчилина */
--Dmitry Gorchilin scripts for Sybase Replication Server
добавлено: 01 сен 15 просмотры: 1008, комментарии: 0