Oracle 10G сжимает файлы данных

как уменьшить файлы данных в Oracle 10G?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
22 239
5

Ответы 5

Для стандартных файлов данных в Oracle вы не можете их сжать. Вам нужно будет сделать что-то вроде:

  1. Переместите сегменты в другое табличное пространство или экспортируйте и отпустите их
  2. Перетащите файл данных
  3. Создайте новый файл данных меньшего размера
  4. Переместите сегменты обратно в первые таблицы или импортируйте их из файла дампа

Для табличного пространства "bigfile" - это означает, что для его создания использовалось CREATE BIGFILE TABLESPACE - вы можете использовать ALTER TABLESPACE .. RESIZE ...

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

David Aldridge 24.12.2008 21:14

Предостережение: я не системный администратор Oracle, за исключением личных установок. Относитесь ко всему, что я говорю, с большой долей скепсиса.

Я предполагаю, что вы создали файлы данных с автоматическим расширением, и они были расширены за пределы того, что, по вашему мнению, они должны содержать. Есть предложение ALTER DATABASE, которое изменяет размер файла, вот пример из справочника Oracle SQL:

ALTER DATABASE
DATAFILE 'diskb:tbs_f5.dat' RESIZE 10 M;

Однако я действительно не думаю, что вы хотите делать это вслепую. Лучшим подходом IMO было бы использование команды экспорта для сброса таблиц, которые находятся в этом файле данных, а затем воссоздания табличного пространства.

Вот способ, любезно предоставленный Томом Кайтом, чтобы получить размер блока вашей базы данных, перечислить, сколько места вы можете освободить, и создать команды alter ... для фактического сжатия базы данных. Надеюсь это поможет,

http://cglendenningoracle.blogspot.com/2009/08/how-do-i-shrink-datafiles-to-reclaim.html

Крейг Гленденнинг

Или просто перейдите прямо в AskTom и получите maxshrink.sql, и вы сможете получить скрипт, который работает без рекламы: asktom.oracle.com/pls/asktom/…

AdamH 01.09.2009 22:10

ALTER TABLESPACE .... RESIZE разрешено только за пределами HWM. Таким образом, у вас может быть много неиспользуемых сегментов под ним. Перед этой операцией выдайте:

ALTER TABLE .. .SHRINK SPACE в некоторых таблицах этого табличного пространства / файла данных, чтобы реорганизовать содержимое файлов данных.

Это может быть долгая задача, но вы можете генерировать команды с помощью SQL.

Ответ @ Дэйв об экспорте и импорте правильный и лучший выбор для освобождения места. Также в Oracle нет команды сжатия, @ Дэйв права, но существует команда изменения размера, которая, как @Дэйвид сказал, что "файлы данных могут быть изменены до последнего использованного блока", НО есть одна вещь, о которой следует упомянуть, что свободные блоки в файле данных могут быть выделены как что

0101000001111000000000000000000001110000000000
                                    |---------

где: 0-это бесплатный блок 1-б / у блок

изменив размер файла данных до последнего использованного блока, он станет таким:

010100000111100000000000000000000111
                                    |---------     

Но как насчет других свободных блоков в файле данных ?? Они недоступны для других файлов данных или самой системы.

Если бы файл данных был таким:

1111111111111100000000000000000

тогда изменение размера будет полезно, но не в предыдущем варианте.

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

    select 'alter database '||a.name||' datafile '''||b.file_name||'''' ||
' resize '||greatest(trunc(bytes_full/.7)
,(bytes_total-bytes_free))||chr(10)||
'--tablespace was '||trunc(bytes_full*100/bytes_total)||
'% full now '||
trunc(bytes_full*100/greatest(trunc(bytes_full/.7)
,(bytes_total-bytes_free)))||'%'
from v$database a
,dba_data_files b
,(Select tablespace_name,sum(bytes) bytes_full
From dba_extents
Group by tablespace_name) c
,(Select tablespace_name,sum(bytes) bytes_total
From dba_data_files
Group by tablespace_name) d
,(Select a.tablespace_name,a.file_id,b.bytes bytes_free
From (select tablespace_name,file_id
,max(block_id) max_data_block_id 
from dba_extents
group by tablespace_name,file_id) a
,dba_free_space b
where a.tablespace_name = b.tablespace_name
and a.file_id = b.file_id
and b.block_id > a.max_data_block_id) e
Where b.tablespace_name = c.tablespace_name
And b.tablespace_name = d.tablespace_name
And bytes_full/bytes_total < .7
And b.tablespace_name = e.tablespace_name
And b.file_id = e.file_id

Не волнуйтесь, этот скрипт не будет вырезать использованные блоки из файла данных.

Другие вопросы по теме