powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Изменение файловой архитектуры базы
3 сообщений из 28, страница 2 из 2
Изменение файловой архитектуры базы
    #36500402
Викторрр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
12,

>>Вот решенеие вашей проблемы http://www.5nt.ru/tech/sy-recovery.html

Ссылка не открывается. Что там за рецепт? Осталась ли у вас сохраненная страничка?
...
Рейтинг: 0 / 0
Изменение файловой архитектуры базы
    #36501245
blzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надеюсь автор simm не будет против публикации его скрипта для этой процедуры =)

Задача

Нередко приходится создавать сервер, который должен быть точной копией некоторого исходного сервера. Одной из задач при этом является создание на новом сервере баз данных, которые по своей структуре должны быть идентичны базам исходного сервера (имеется в виду размеры баз и расположение их сегментов по девайсам). Решение обозначенной задачи вызывает затруднение в том случае, когда базы на исходном сервере расширялись после создания, либо имена девайсов не связаны с именами баз (например, база db01 расположена на девайсах dev12, device06_dat и my_device_log). Такие скрипты приходится писать вручную, чего не позволяет админская лень :).

Решением данной задачи есть описанный ниже способ, который состоит в создании процедуры в базе данных и вызова её с необходимыми параметрами.

Процедура

Для решения поставленной задачи была написана процедура getScriptCreateDatabase, которая сгенерирует скрипт на создание базы данных со всеми необходимыми alter-ами.

Процедура принимает 3 параметра - имя базы и 2 флага:

@for_load - если "1", сгенерируется скрипт для создания баз for load.
@is_debug - если "1", будет выводиться информация для отладки. Итак, чтобы создать на исходном сервере описанную процедуру, необходимо выполнить следующее:

Перейти в какую-нибудь пользовательскую базу:
Код: plaintext
1.
2.
use userbase
go


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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
create procedure getScriptCreateDatabase @dbname varchar( 20 ), @for_load char( 1 ), @is_debug char( 1 )
as
begin
select
        dbname=d.name,
        datalog=case
                when u.segmap =  8  then 'd'
                when u.segmap =  7  then 'd'
                when u.segmap =  4  then 'l'
                when u.segmap =  3  then 'd'
                when u.segmap =  2  then 'd'
                when u.segmap =  1  then 'd'
                when u.segmap =  0  then 'l'
        end,
        devname=v.name,
        size=convert(varchar,((u.size)*(@@maxpagesize/ 1024 )/ 1024 ), 10 )+'M'
into tmpTable
  from master..sysusages u, master..sysdatabases d, master..sysdevices v
  where u.dbid=d.dbid and
        u.vstart >= v.low and
        u.vstart <= v.high and
        v.name not like 'tapedump%' and
        d.name=@dbname
  order by u.dbid,u.lstart
if @is_debug='1'
        select * from tmpTable
set rowcount  1 
declare @vdatalog char( 1 )
declare @vdevname_dat varchar( 20 )
declare @vdevname_log varchar( 20 )
declare @vsize_dat varchar( 10 )
declare @vsize_log varchar( 10 )
declare @create char( 1 )
select @create='1'
declare @prefix_dat varchar( 10 )
declare @prefix_log varchar( 30 )
declare @postfix varchar( 15 )
if @for_load='0'
        select @postfix=''
else
        select @postfix=' for load'
while (select count(*) from tmpTable) <>  0 
        begin
        select @vdevname_dat=devname, @vsize_dat=size from tmpTable where datalog='d'
        select @vdevname_log=devname, @vsize_log=size from tmpTable where datalog='l'
        if @create='1'
                begin
                select @prefix_dat='create'
                select @prefix_log=''
                end
        else
                begin
                select @prefix_dat='alter'
                select @prefix_log='alter database ' + @dbname
                end
        if isnull(@vdevname_dat, '0') <> '0' and isnull(@vdevname_log, '0') <> '0' and @create='1'
                begin
                if @is_debug='1'
                        select 'BOTH'
                select @prefix_dat + ' database ' + @dbname + ' on ' + @vdevname_dat + '=''' + @vsize_dat + '''' +
                        @prefix_log + ' log on ' + @vdevname_log + '=''' + @vsize_log  +'''' + @postfix + char( 10 ) + 'go'
                delete from tmpTable where devname=@vdevname_dat and size=@vsize_dat and datalog='d'
                select @vdevname_dat=NULL
                delete from tmpTable where devname=@vdevname_log and size=@vsize_log and datalog='l'
                select @vdevname_log=NULL
                end
        else
                begin
                if isnull(@vdevname_dat, '0') <> '0'
                        begin
                        if @is_debug='1'
                                select 'DAT'
                        select @prefix_dat + ' database ' + @dbname + ' on ' + @vdevname_dat + '=''' + @vsize_dat + ''''  + @postfix + char( 10 ) + 'go'
                        delete from tmpTable where devname=@vdevname_dat and size=@vsize_dat and datalog='d'
                        select @vdevname_dat=NULL
                        end
                if isnull(@vdevname_log, '0') <> '0'
                        begin
                        if @is_debug='1'
                                select 'LOG'
                        select @prefix_log + ' log on ' + @vdevname_log + '=''' + @vsize_log + ''''  + @postfix + char( 10 ) + 'go'
                        delete from tmpTable where devname=@vdevname_log and size=@vsize_log and datalog='l'
                        select @vdevname_log=NULL
                        end
                end
        if @create='1'
                select @create='0'
        end
set rowcount  0 
drop table tmpTable
end

Использование

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

1. Имя базы, которую необходимо создать.
2. Флаг, если '1' - создавать скрипт для создания баз for load.
3. Флаг , если '1' - выводить отладочную информацию.

Чтобы получить скрипт на получание скрипта для создания баз, можно выполнить

select 'getScriptCreateDatabase ' + name + ', ''0'', ''0''' + char(10) + 'go'
from master..sysdatabases

После получения необходимых скриптов, не забываем удалить созданную процедуру:

drop procedure getScriptCreateDatabase

Пример

getScriptCreateDatabase simm2, '0', '0'
go

Результатом чего будет скрипт следующего вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
create database simm2 on master='4M'  log on simm2_log='1M'
go
alter database simm2 on simm2_data='2M'
go
alter database simm2 log on simm2_log='2M'
go

Замеченные баги

- при реальном размере сегмента '1M', в скрипте может появиться размер '0M'. Править вручную.

Замечание

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

-----------

в вашем задаче, объединить логсегменты на один девайс, дата - на другой: вручную изменить имена девайсов в скрипте, который сгенерится:
Код: plaintext
1.
2.
3.
4.
5.
6.
create database simm2 on my_new_big_data_dev='4M'  log on my_new_big_log_dev='1M'
go
alter database simm2 on my_new_big_data_dev='2M'
go
alter database simm2 log on my_new_big_log_dev='2M'
go
...
Рейтинг: 0 / 0
Изменение файловой архитектуры базы
    #36501495
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Викторрр12,

>>Вот решенеие вашей проблемы http://www.5nt.ru/tech/sy-recovery.html

Ссылка не открывается. Что там за рецепт? Осталась ли у вас сохраненная страничка?

есть такая вещь как WEB ARCHIVE
если страничка больше недоступна, то её можно попытаться отыскать в архиве интернета
тынц
...
Рейтинг: 0 / 0
3 сообщений из 28, страница 2 из 2
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Изменение файловой архитектуры базы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]