Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Ужатие тейблспейса.  [new]
Gorgeous
Member

Откуда:
Сообщений: 60
Здравствуйте.
База 11.2.0.3 Для уменьшения базы из неё были убраны картинки. Необходимо ужать тейблспейс с данными. Стал делать dbms_redefinition, у него есть некоторые недостатки, переносится только один объект, а файл может вообще не ужаться.
Можно ли без остановки базы перенести объекты на новый тейблспейс и удалить старый? Правильно ли я понимаю, что можно взять объект у которого максимальный INITIAL_EXTENT, перенести этот объект и появится возможность немного ужать тейблспейс на диске? Какие варианты могут быть по решению этой задачи?
2 окт 19, 17:55    [21985254]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
Vivat!San
Member

Откуда: Москва
Сообщений: 720
Создаёшь новый TBS, там новые сегменты и туда уже переносишь с помощью online redefiniton,
когда завершишь удалишь старый TBS, переименуешь новый в старый.
2 окт 19, 18:17    [21985271]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18399
Gorgeous
Правильно ли я понимаю, что можно взять объект у которого максимальный INITIAL_EXTENT, перенести этот объект и появится возможность немного ужать тейблспейс на диске?

Примерно так, допиливайте под свои потребности:
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 <новый размер>;
Вычисление размера, до которого можно ресайзить файл, тоже делается легко, но прям сейчас под рукой готового скрипта нет.
2 окт 19, 18:26    [21985280]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
Aliona
Member

Откуда: Питер
Сообщений: 4031
Vivat!San
Создаёшь новый TBS,

Если места на диске мало, то это не лучший вариант.
3 окт 19, 08:16    [21985526]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
maverick2104
Member

Откуда:
Сообщений: 317
andrey_anonymous
Вычисление размера, до которого можно ресайзить файл, тоже делается легко, но прям сейчас под рукой готового скрипта нет.


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
;
3 окт 19, 11:14    [21985643]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
Elic
Member

Откуда:
Сообщений: 29991
maverick2104,

6045690
3 окт 19, 11:21    [21985652]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
maglevdevice
Member

Откуда:
Сообщений: 8
andrey_anonymous
     || ' online tablespace USERS'

Для 11.2.0.3 alter table move online не взлетит.
3 окт 19, 11:44    [21985675]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
Vivat!San
Member

Откуда: Москва
Сообщений: 720
Aliona
Если места на диске мало, то это не лучший вариант.

А если подумать, то места в случае одного TBS нужно ровно столько же,
при этому требуемого ты не достигнешь, думаю не стоит пояснять почему.
3 окт 19, 13:07    [21985798]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
-2-
Member

Откуда:
Сообщений: 15330
Vivat!San
места в случае одного TBS нужно ровно столько же
Разница в том, что задача перенести не объекты, а перенести свободное место в конец датафайлов. В ужимаемом TS это свободное место как раз и есть.
Другой вопрос, что в худшем случае внутри TS требуется этого свободного места в объеме более максимального сегмента (после move). А экстенты могут разложиться так, что остаток никак не освободить.
3 окт 19, 13:49    [21985860]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
Vivat!San
Member

Откуда: Москва
Сообщений: 720
-2-
Разница в том, что задача перенести не объекты, а перенести свободное место в конец датафайлов. В ужимаемом TS это свободное место как раз и есть.
Другой вопрос, что в худшем случае внутри TS требуется этого свободного места в объеме более максимального сегмента (после move). А экстенты могут разложиться так, что остаток никак не освободить.


Это и имел в виду - для усечения TBS нужно сдвинуть HWM вниз,
а чтобы не потреблять новое место на FS нужно обходиться свободным местом в рамках HWM,
занимая уже выделенные свободные экстенты, задачи друг другу противоречат.
3 окт 19, 14:08    [21985880]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18399
maglevdevice
andrey_anonymous
     || ' online tablespace USERS'

Для 11.2.0.3 alter table move online не взлетит.

Перечитайте:
andrey_anonymous
Примерно так, допиливайте под свои потребности

Это просто один из скриптов, которым я пользовался для решения задачи ужатия табличного пространства.
3 окт 19, 14:25    [21985896]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10054
andrey_anonymous
Перечитайте:


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

SY.
3 окт 19, 15:06    [21985941]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18399
SY
andrey_anonymous
Перечитайте:

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

Не имеет значения.
Суть в том, что отбираем экстенты в порядке от хвоста файла к началу, для экстента определяем сегмент, в зависимости от типа сегмента генерируем команду на его, сегмента, релокацию.
При некоторой удаче (или при сдвиге сегментов в отдельное табличное пространство) это освобождает место в хвосте файла, что позволяет выполнить resize.
Если заранее известен сегмент, содержащий a lot of wasted space, то такой сегмент следует реорганизовать до начала операции "режем хвост табличному пространству"
3 окт 19, 16:04    [21986003]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10054
andrey_anonymous
Не имеет значения.
Суть в том, что отбираем экстенты в порядке от хвоста файла к началу, для экстента определяем сегмент, в зависимости от типа сегмента генерируем команду на его, сегмента, релокацию.


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

SY.
3 окт 19, 16:41    [21986043]     Ответить | Цитировать Сообщить модератору
 Re: Ужатие тейблспейса.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18399
SY
andrey_anonymous
Не имеет значения.
Суть в том, что отбираем экстенты в порядке от хвоста файла к началу, для экстента определяем сегмент, в зависимости от типа сегмента генерируем команду на его, сегмента, релокацию.

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

Еще раз, последний: скрипт является частным решением, был набросан под конкретную задачу и сохранился только благодаря скопидомству Notepad++.
Скрипт может быть взят за основу и доработан по месту или выброшен в корзину по усмотрению ТС.
Скрипт может быть доработан до общего решения любым желающим.
Мой вариант подобного универсального скрипта был благополучно выброшен в корзинку, как только в нем отпала необходимость, ибо за несколько минут пишется на коленке :)
3 окт 19, 17:18    [21986082]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить