powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ужатие тейблспейса.
15 сообщений из 15, страница 1 из 1
Ужатие тейблспейса.
    #39870723
Gorgeous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
База 11.2.0.3 Для уменьшения базы из неё были убраны картинки. Необходимо ужать тейблспейс с данными. Стал делать dbms_redefinition, у него есть некоторые недостатки, переносится только один объект, а файл может вообще не ужаться.
Можно ли без остановки базы перенести объекты на новый тейблспейс и удалить старый? Правильно ли я понимаю, что можно взять объект у которого максимальный INITIAL_EXTENT, перенести этот объект и появится возможность немного ужать тейблспейс на диске? Какие варианты могут быть по решению этой задачи?
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39870736
Фотография Vivat!San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создаёшь новый TBS, там новые сегменты и туда уже переносишь с помощью online redefiniton,
когда завершишь удалишь старый TBS, переименуешь новый в старый.
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39870744
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorgeousПравильно ли я понимаю, что можно взять объект у которого максимальный INITIAL_EXTENT, перенести этот объект и появится возможность немного ужать тейблспейс на диске?
Примерно так, допиливайте под свои потребности:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with segs as (
select owner, segment_name, partition_name, segment_type, relative_fno, max(block_id) block_id, tablespace_name
from dba_extents where tablespace_name like 'USERS'
group by tablespace_name, relative_fno, owner, segment_name, partition_name, segment_type
)
select 'alter '||regexp_substr(segment_type,'(\w+)')||' '|| s.owner||'.'||segment_name
     || case regexp_substr(segment_type,'(\w+)')
        when 'INDEX' then ' rebuild '
        when 'TABLE' then ' move ' end
     || nvl2( regexp_substr(segment_type,'(\w+)',1,2)
            , regexp_substr(segment_type,'(\w+)',1,2)||' '||partition_name
            , ''
            )
     || ' online tablespace USERS'
     || case when regexp_substr(segment_type,'(\w+)') = 'TABLE' 
              and regexp_substr(segment_type,'(\w+)',1,2) is not null
             then ' update indexes' end
     ||';' s
from segs s 
where tablespace_name like 'USERS'
  and segment_name not like '%PK'
order by relative_fno, block_id desc
;



По итогу можно делать alter database datafile ... resize <новый размер>;
Вычисление размера, до которого можно ресайзить файл, тоже делается легко, но прям сейчас под рукой готового скрипта нет.
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39870939
Фотография Aliona
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vivat!SanСоздаёшь новый TBS,
Если места на диске мало, то это не лучший вариант.
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871023
maverick2104
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousВычисление размера, до которого можно ресайзить файл, тоже делается легко, но прям сейчас под рукой готового скрипта нет.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select
    f.file#,
    round(f.bytes/1024/1024,2)||' Mb' megabytes,
    decode(trunc(e.maxextend*blocksize/1000/10),
       0,round(e.maxextend*blocksize,2)||' Mb',
       null,null,
       'Unlimited') maxextend,
    decode(e.inc,null,null,round(e.inc*blocksize,2)||' Mb') inc,
    ceil(nvl(r.min_resize,0)*blocksize)||' Mb' min_resize,
    f.name
  from sys.filext$ e, v$datafile f,
    ( select
          e.file_id file#,
          max(e.block_id + e.blocks) as min_resize
        from dba_extents e
        group by e.file_id
    ) r,
    (select to_number(value)/1024/1024 blocksize
   
       from v$parameter where name='db_block_size')
  where e.file#(+) = f.file#
    and r.file#(+) = f.file#
  order by 1
;
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871029
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverick2104,

6045690
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871042
maglevdevice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
Код: plsql
1.
     || ' online tablespace USERS'


Для 11.2.0.3 alter table move online не взлетит.
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871114
Фотография Vivat!San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlionaЕсли места на диске мало, то это не лучший вариант.
А если подумать, то места в случае одного TBS нужно ровно столько же,
при этому требуемого ты не достигнешь, думаю не стоит пояснять почему.
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871147
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vivat!Sanместа в случае одного TBS нужно ровно столько жеРазница в том, что задача перенести не объекты, а перенести свободное место в конец датафайлов. В ужимаемом TS это свободное место как раз и есть.
Другой вопрос, что в худшем случае внутри TS требуется этого свободного места в объеме более максимального сегмента (после move). А экстенты могут разложиться так, что остаток никак не освободить.
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871156
Фотография Vivat!San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Разница в том, что задача перенести не объекты, а перенести свободное место в конец датафайлов. В ужимаемом TS это свободное место как раз и есть.
Другой вопрос, что в худшем случае внутри TS требуется этого свободного места в объеме более максимального сегмента (после move). А экстенты могут разложиться так, что остаток никак не освободить.

Это и имел в виду - для усечения TBS нужно сдвинуть HWM вниз,
а чтобы не потреблять новое место на FS нужно обходиться свободным местом в рамках HWM,
занимая уже выделенные свободные экстенты, задачи друг другу противоречат.
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871162
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maglevdeviceandrey_anonymous
Код: plsql
1.
     || ' online tablespace USERS'


Для 11.2.0.3 alter table move online не взлетит.
Перечитайте:
andrey_anonymousПримерно так, допиливайте под свои потребности
Это просто один из скриптов, которым я пользовался для решения задачи ужатия табличного пространства.
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871181
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousПеречитайте:


"Для уменьшения базы из неё были убраны картинки". Скорее всего "картинки" хранились в LOB, тек-что переливание самих таблиц есть переливание из пустого в порожнее :).

SY.
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871213
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYandrey_anonymousПеречитайте:

"Для уменьшения базы из неё были убраны картинки". Скорее всего "картинки" хранились в LOB, тек-что переливание самих таблиц есть переливание из пустого в порожнее :).
Не имеет значения.
Суть в том, что отбираем экстенты в порядке от хвоста файла к началу, для экстента определяем сегмент, в зависимости от типа сегмента генерируем команду на его, сегмента, релокацию.
При некоторой удаче (или при сдвиге сегментов в отдельное табличное пространство) это освобождает место в хвосте файла, что позволяет выполнить resize.
Если заранее известен сегмент, содержащий a lot of wasted space, то такой сегмент следует реорганизовать до начала операции "режем хвост табличному пространству"
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871240
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousНе имеет значения.
Суть в том, что отбираем экстенты в порядке от хвоста файла к началу, для экстента определяем сегмент, в зависимости от типа сегмента генерируем команду на его, сегмента, релокацию.


Скрипт который ты привел забуксует как только в хвосте файла окажется LOBSEGMENT/LOB PARTITION/LOBINDEX.

SY.
...
Рейтинг: 0 / 0
Ужатие тейблспейса.
    #39871264
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYandrey_anonymousНе имеет значения.
Суть в том, что отбираем экстенты в порядке от хвоста файла к началу, для экстента определяем сегмент, в зависимости от типа сегмента генерируем команду на его, сегмента, релокацию.

Скрипт который ты привел забуксует как только в хвосте файла окажется LOBSEGMENT/LOB PARTITION/LOBINDEX.
Еще раз, последний: скрипт является частным решением, был набросан под конкретную задачу и сохранился только благодаря скопидомству Notepad++.
Скрипт может быть взят за основу и доработан по месту или выброшен в корзину по усмотрению ТС.
Скрипт может быть доработан до общего решения любым желающим.
Мой вариант подобного универсального скрипта был благополучно выброшен в корзинку, как только в нем отпала необходимость, ибо за несколько минут пишется на коленке :)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ужатие тейблспейса.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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