gifts2017

Как из обычной базы сделать распределенную (SQL)?

Опубликовал Вадим 1С911.BY (Вадимко) в раздел Администрирование - Распределенная БД (УРИБ, УРБД)

Базу в которой уже работали необходимо сделать периферийной и включить в обмен?
Каким-то странным образом повредились/исчезли служебные таблицы?
Нет возможности сделать выгрузку-загрузку большой базы при создании периферийной РБД?

Эта статья поможет решить данные проблемы!
Приведу просто скрипт с комментариями, который необходимо выполнить в QA

 

use MyFuckingBase 
--
название SQL базы
,
в которой создается РБД

if OBJECT_ID
(
'_1SUPDTS'
)
is not null drop table _1SUPDTS
go
if OBJECT_ID
(
'_1SDBSET'
)
is not null drop table _1SDBSET
go
if OBJECT_ID
(
'_1SDWNLDS'
)
is not null drop table _1SDWNLDS
go

Create table _1SUPDTS 
(
DBSIGN CHAR
( 3 ) NOT
NULL
,
TYPEID INTEGER 
NOT
NULL
,
OBJID CHAR
( 9 ) NOT
NULL
,
DELETED CHAR
( 1 ) NOT
NULL
,
DWNLDID CHAR
( 9 ) NOT
NULL 
)
go
If
not exists 
(
select 
*
from sysindexes where name
=
'PK__1SUPDTS' and id
=
object_id
(
'_1SUPDTS'
))
Alter table _1SUPDTS add constraint PK__1SUPDTS PRIMARY KEY CLUSTERED
(
DBSIGN
,
TYPEID
,
OBJID
)
go
If
not exists 
(
select 
*
from sysindexes where name
=
'DID' and id
=
object_id
(
'_1SUPDTS'
) )
Create UNIQUE index DID  on _1SUPDTS 
(
DWNLDID
,
DBSIGN
,
TYPEID
,
OBJID
)
go

Create table _1SDBSET 
(
DBSIGN CHAR
( 3 ) NOT
NULL
,
DBDESCR CHAR
( 40 ) NOT
NULL
,
DBSTATUS CHAR
( 1 ) NOT
NULL
,
DBUUID CHAR
( 36 ) NOT
NULL
,
DBFMODE TINYINT 
NOT
NULL
,
DBFNCP CHAR
( 64 ) NOT
NULL
,
DBFNPC CHAR
( 64 ) NOT
NULL
,
DBFAUTO TINYINT 
NOT
NULL
,
DBRECPT TINYINT 
NOT
NULL
,
EMAILFLGS TINYINT 
NOT
NULL
,
EMAIL CHAR
( 64 ) NOT
NULL
,
PSW CHAR
( 32 ) NOT
NULL 
)
go
If
not exists 
(
select 
*
from sysindexes where name
=
'PK__1SDBSET' and id
=
object_id
(
'_1SDBSET'
))
Alter table _1SDBSET add constraint PK__1SDBSET PRIMARY KEY CLUSTERED
(
DBSIGN
)
go
If
not exists 
(
select 
*
from sysindexes where name
=
'IDBSTATUS' and id
=
object_id
(
'_1SDBSET'
) )
Create UNIQUE index IDBSTATUS  on _1SDBSET 
(
DBSTATUS
,
DBSIGN
)
go

Create table _1SDWNLDS 
(
DWNLDID CHAR
( 9 ) NOT
NULL
,
DBSIGN CHAR
( 3 ) NOT
NULL
,
DIRECT CHAR
( 1 ) NOT
NULL
,
ACKNOWL CHAR
( 1 ) NOT
NULL 
)
go
If
not exists 
(
select 
*
from sysindexes where name
=
'PK__1SDWNLDS' and id
=
object_id
(
'_1SDWNLDS'
))
Alter table _1SDWNLDS add constraint PK__1SDWNLDS PRIMARY KEY CLUSTERED
(
DWNLDID
)
go
If
not exists 
(
select 
*
from sysindexes where name
=
'IDBSIGN' and id
=
object_id
(
'_1SDWNLDS'
) )
Create UNIQUE index IDBSIGN  on _1SDWNLDS 
(
DBSIGN
,
DWNLDID
)
go

If
exists 
(
select 
*
from sysobjects where id 
=
object_id
(
'_1sp_RegisterUpdate'
)
and sysstat 
& 0
xf 
= 4)
Drop procedure _1sp_RegisterUpdate
go
Create procedure _1sp_RegisterUpdate
(
@p1 CHAR
(3),
@p2 INTEGER
,
@p3 CHAR
(9),
@p4 CHAR
(1))
AS
set nocount on update _1SUPDTS set DELETED
=
@p4
,
DWNLDID
=
'         ' where DBSIGN
=
@p1 and TYPEID
=
@p2 and OBJID
=
@p3 if @@ROWCOUNT
=0
insert into _1SUPDTS values
(
@p1
,
@p2
,
@p3
,
@p4
,
'         '
)
go

If
exists 
(
select 
*
from sysobjects where id 
=
object_id
(
'_1sp__1SDBSET_TLock'
)
and sysstat 
& 0
xf 
= 4)
Drop procedure _1sp__1SDBSET_TLock
go
Create procedure _1sp__1SDBSET_TLock AS
set nocount on declare @i integer select @i
=1
from _1SDBSET
(
TABLOCK HOLDLOCK
)
where 
0=1
go

If
exists 
(
select 
*
from sysobjects where id 
=
object_id
(
'_1sp__1SUPDTS_TLock'
)
and sysstat 
& 0
xf 
= 4)
Drop procedure _1sp__1SUPDTS_TLock
go
Create procedure _1sp__1SUPDTS_TLock AS
set nocount on declare @i integer select @i
=1
from _1SUPDTS
(
TABLOCK HOLDLOCK
)
where 
0=1
go

If
exists 
(
select 
*
from sysobjects where id 
=
object_id
(
'_1sp__1SDWNLDS_TLock'
)
and sysstat 
& 0
xf 
= 4)
Drop procedure _1sp__1SDWNLDS_TLock
go
Create procedure _1sp__1SDWNLDS_TLock AS
set nocount on declare @i integer select @i
=1
from _1SDWNLDS
(
TABLOCK HOLDLOCK
)
where 
0=1
go

--
далее идет пример с данными 
НЕ
ДЛЯ ВАШЕЙ базы
,
в комментариях написано где их взять
--
пример составлен для периф
.
базы со статусом 
"не только получатель"
и автонумерацией пакетов

Update _1SSYSTEM
Set DBSIGN 
=
'П35'					
--
код базы
,
находится в списке баз центра
,
_1SDBSET поле DBSIGN
,
DBSETUUID 
=
'EDB286ED
-4
E93
-49
CD
-9
CF5
-
E5F8D1F6BE21'	
--
уид
,
находится в центральной базе
,
_1SSYSTEM поле DBSETUUID
go

Insert into _1SDBSET values 
(
'П35'
, --
код периф
.
базы
'Магазин № 
35,
Минск
,
ул
.
Ленина
, 10
'
, --
название периф
.
базы
'M'
, --
статус
'A73535C6
-2
D44
-484
C
-
B64F
-048
A4779CB44'
, --
уид периф
.
базы 
(
центральная база
,
_1SDBSET поле DBSETUUID соответсвующей базы
) 3, --
режим
'P358
.
zip'
, --
имя файла обмена 
(
посмотреть в настройках центра или в _1SDBSET
)
'P359
.
zip'
, --
имя файла обмена
0, 0, 0,
''
,
''
)
go

Insert into _1SDBSET values 
(
'ЦБ1'
, --
код центральной базы
'Центральная база'
, --
название центральной базы
'P'
, --
статус
'
0349
D130
-87
F6
-43
F0
-
A94D
-61
E46D176F5D'
, --
уид центральной базы 
(
центральная база
,
_1SDBSET поле DBSETUUID центральной базы
) 0, --
режим
''
,
''
, 0, 0, 0,
''
,
''
)
go

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

Insert into _1SDWNLDS values 
(
'  
1
UBRП35'
, --
открыть в последнем пакете
,
который ушел из периф
.
базы
,
файл 
1
cv77Dld
.
id 
		
--
и взять последнее значение файла 
(
число перед чертой
),
затем перевести  в строку функцией _IdToStr
(), --
в данном случае 
85959
|П35
.
обязательны лидирурующие пробелы
,
общая длина 
9
символов 
(
!
) --
посмотреть можно и в таблице _1SDWNLDS центральной базы 
(
select 
*
from _1SDWNLDS where dbsign 
=
'П35' and direct 
=
'I'
)
'ЦБ1'
, --
код центральной базы
'O'
, --
направление
''
)
go


 



Если данную задачу самостоятельно выполнить не удалось - пишите письма
Комментарии и отзывы приветствуются

Оригинал статьи
http://1c911.by/stati_1s/statya-kak-iz-obychnoy-bazy-sdelat-raspredelennuyu-sql.htm
Изменения и новые публикации смотрите на http://1c911.by/stati-1s.htm

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Вадим 1С911.BY (Вадимко) 08.04.08 00:49
Ни одного камента...
Тут интересом пользуются только медленно работающие желто-зеленые отчеты с большими кнопачкаме?
flex2002; +1 Ответить
2. Валентин Терёхин (Valet) 08.04.08 21:48
Задача специфическая просто. Я только пару раз так извращался и то вручную, благо при изменении базы на распределенную и создании из неё периферийной менять приходится по одной записи. А так материал полезный, особенно для тех кому надо вчера и разбираться в структуре табличек некогда или ломает.
3. Вадим 1С911.BY (Вадимко) 09.04.08 03:14
Трабла была специфическая, надо было ЭТО сделать имея только эл. почту и человека с удаленным доступом :)
4. Михаил Семенов (Shaman100M) 10.04.08 18:27
Методологию, все-таки можно было изложить кроме самих скриптов, ведь она действительно быстрее реализуется, чем с созданием новой "периферийки" в http://www.infostart.ru/blogs/236/
Причем, восстановить испорченную периферийную базу можно из другой подобной периферийной.
Метод немного отличается от статейного в части синхронизации выгрузок, - сам хотел выложить в качестве статьи, но автор оказался быстрее. :)

1. Делаем копию из центральной/периферийной работоспособной базы.
2. Заменяем файлы/правим таблицы 1sdbset и 1ssystem в соответствии с настройками восстанавливаемой периферийной БД
3. Удаляем файлы/очищаем таблицы 1sdwnlds и 1supdts
4. "Синхронизируем" выгрузку-загрузку данных, для этого:
4.1. При восстановлении из копии центральной БД:
4.1.1. Делаем выгрузку из центральной БД в нашу восстанавливаемую периферийную БД (запись-то по "периферийке" осталась)
4.1.2. Перед загрузкой в нашу "периферийку" немного откорректируем файл 1cv77Chs.dat из поставляемого архива, заменив кусок текста с данными (начинается от строки " {"Constants... и до конца файла) на "блок-пустышку", для оперативного учета:

{"Constants"},
{"References"},
{"Documents"},
{"Deleted References"},
{"Deleted Documents"}}

4.2. При восстановлении из копии другой периферийной БД придется вставить не "пустышку", а текстовый блок с данными обмена для другой периферийной БД, из которой делалась копия. Т.е. из центральной БД в таком случае делаем выгрузку для двух периферийных БД: для оригинала и клона.
4.3. Загружаем архив с модифицированным1cv77Chs.dat в восстановленную периферийную БД.
5. Готово.
5. Михаил Семенов (Shaman100M) 10.04.08 18:31
+ (4) При восстановлении из копии другой периферийной базы, все изменения в ней сделанные должны быть предварительно выгружены в центральную.
6. Вадим 1С911.BY (Вадимко) 10.04.08 21:16
Зачем делать выгрузку?
В том то и прелесть что не нужно!

1. Создаем в центре базу
2. Делаем копию базы (можно скулевскими способами)
3. Выполняем скрипт в копии, подсматривая значения которые появились в центральной

Вот и все
7. Вадим 1С911.BY (Вадимко) 10.04.08 21:18
Думаю что основное время уйдет на копирование mdf :)
Ну и тщательный подсмотр значений...
К тому же объем может быть очень большой и необходимо колдовство... а тут все по-честному
8. Михаил Семенов (Shaman100M) 11.04.08 09:45
(6) Ну, она же не первичная, должна быть быстрая и не большая.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа