oracle admin datafiles tablespace - ghdrako/doc_snipets GitHub Wiki

SELECT tablespace_name,
       contents,
       extent_management,
       segment_space_management
FROM dba_tablespaces;
Kolumna Co oznacza
CONTENTS Typ przestrzeni: 🔹 PERMANENT – zwykła przestrzeń dla danych 🔹 TEMPORARY – dla sortowania, operacji tymczasowych 🔹 UNDO – do zarządzania transakcjami (rollback, undo)
EXTENT_MANAGEMENT Zarządzanie extentami: 🔹 LOCAL – lokalnie zarządzana (zalecana) 🔹 DICTIONARY – starszy typ, zarządzany przez katalog (niezalecany)
SEGMENT_SPACE_MANAGEMENT Zarządzanie segmentami:🔹 AUTO – automatyczne (zalecane)🔹 MANUAL – ręczne zarządzanie (starsze wersje)

Przykład wyniku:

TABLESPACE_NAME CONTENTS EXTENT_MANAGEMENT SEGMENT_SPACE_MANAGEMENT
USERS PERMANENT LOCAL AUTO
TEMP TEMPORARY LOCAL N/A
UNDO UNDO LOCAL N/A
SELECT file#, name FROM v$datafile;
     FILE# NAME
---------- -------------------------------------
         1 /u01/oracle/oradata/MITP/system01.dbf
         3 /u01/oracle/oradata/MITP/sysaux01.dbf
         4 /u01/oracle/oradata/MITP/undotbs01.dbf
         5 /u01/oracle/oradata/MITP/tools01.dbf
         7 /u01/oracle/oradata/MITP/users01.dbf

Lista plikow danej przestrzeni tabel

SELECT tablespace_name, file_name
FROM dba_data_files
WHERE tablespace_name = 'USERS';  -- wpisz nazwę swojej przestrzeni

Przeniesienie pliku do innej lokalizacji Od Oracle 12c (12.1 i nowsze) możesz użyć polecenia:

ALTER DATABASE MOVE DATAFILE 5 TO '/u02/oracle/oradata/MITP/tools01.dbf';

i wykonać przeniesienie online, bez odmontowywa i bez restartu bazy, o ile plik nie należy do systemowych przestrzeni tabel (np. SYSTEM, SYSAUX) i nie jest w użyciu w sposób, który to blokuje.


SQL> ALTER DATABASE MOVE DATAFILE 5 TO
  2  '/u02/oracle/oradata/MITP/tools01.dbf';

SQL> SELECT file#, name FROM v$datafile;
     FILE# NAME
---------- -------------------------------------
         5 /u02/oracle/oradata/MITP/tools01.dbf

Po wykonaniu polecenia FLASHBACKDATABASE plik danych nie jest przenoszony do swojej pierwotnej lokalizacji. Dane zostaną jednak zaktualizowane do starego statusu

SELECT tablespace_name,file_name
  2  FROM dba_data_files
  3  ORDER BY 1,2;

Istnieją dwa podstawowe typy przestrzeni tabel:

  • Locally Managed Tablespaces
  • Dictionary Managed Tablespaces

Domyślnym typem jest Lokalnie zarządzana przestrzeń tabelowa. Wolną przestrzenią zarządza się za pośrednictwem mapy bitowej w nagłówku pliku danych. Segmentami w przestrzeni tabel można zarządzać automatycznie lub ręcznie. Standardem jest automatyczne zarządzanie przestrzenią segmentów (ASSM), z wyjątkiem przestrzeni tabel SYSTEM, UNDO i TEMP. Oprócz lepszej wydajności, ASSM oferuje zaletę wyeliminowania potrzeby ręcznego zarządzania parametrami pamięci masowej, co upraszcza administrację. Przestrzeń tabel zarządzana za pomocą słownika wykorzystuje katalog bazy danych do zarządzania zakresami. Był to domyślny typ w poprzednich wersjach i został zastąpiony lokalnie zarządzaną przestrzenią tabel w celu uzyskania lepszej wydajności i uniknięcia konfliktów w katalogu.

Przestrzenie tabel zarządzane przez słownik nadal mogą być używane ze względów zgodności.

W wersji 10g wprowadzono kolejny typ przestrzeni tabel:Bigfile Tablespace . Było to spowodowane głównie rosnącym rozmiarem baz danych. Plik danych małej przestrzeni tabelowej plików (domyślnie) może składać się maksymalnie z 4 milionów bloków danych. Przy rozmiarze bloku 8 KB oznacza to, że maksymalny rozmiar pliku danych nie może przekroczyć 32 GB. Plik danych dużej przestrzeni tabelowej plików może osiągnąć rozmiar 32 TB przy rozmiarze bloku 8 KB. Jednak w przestrzeni tabel dużego pliku nie może znajdować się więcej niż jeden plik danych.

Pliki dziennika redo tworzą dziennik transakcji bazy danych. Zmiany w bazie danych zwykle nie są zapisywane na dysku po zakończeniu transakcji (COMMIT), lecz pozostają w pamięci podręcznej bufora bazy danych aż do następnego punktu kontrolnego. Są one jednak zapisywane w plikach dziennika redo, tak aby w przypadku awarii bazy danych możliwe było odzyskanie wszystkich zakończonych transakcji. Pliki dziennika powtórzeń online mają zatem kluczowe znaczenie dla możliwości odzyskania bazy danych. Pliki dziennika powtórzeń online składają się z kilku grup. Każda grupa może zawierać wielu członków (plików). Pliki członków grupy są identycznymi lustrzanymi odbiciami, co zapewnia niezawodność. Jeśli członek grupy ulegnie uszkodzeniu lub zostanie przypadkowo usunięty, dostęp do pozostałych członków będzie nadal możliwy. Zazwyczaj w skład grupy wchodzą dwie osoby

Log Writer zawsze zapisuje do dokładnie jednej grupy o statusie CURRENT,Jeśli grupa jest pełna, ma miejsce przełączenie dziennika. Logwriter zmienia się w następną grupę i oznacza je jako CURRENT. Gdy dziennik dotrze do ostatniej grupy, zaczyna się ponownie od pierwszego i zastępuje go. Jeśli baza danych działa w trybie Archivelog, grupa jest zarchiwizowana przed nadpisaniem. Kopia jest tworzona w postaci zarchiwizowanego pliku dziennika ponownego. Oracle gwarantuje zatem przywrócenie w dowolnym momencie z powodu poprzedniej kopii zapasowej. Nowy numer sekwencji jest tworzony z każdym przełącznikiem dziennika.


SQL> SELECT group#,sequence#,status,first_time
  2  FROM v$log;
    GROUP#  SEQUENCE# STATUS           FIRST_TIME
---------- ---------- ---------------- -------------------
         1         73 CURRENT          23.06.2019 20:00:51
         2         71 INACTIVE         20.06.2019 21:00:16
         3         72 INACTIVE         23.06.2019 18:49:32

Utworzenie przestrzeni tabel z autoextend

CREATE TABLESPACE moja_przestrzen
DATAFILE '/u01/app/oracle/oradata/moja_przestrzen01.dbf'
SIZE 500M
AUTOEXTEND ON
NEXT 100M
MAXSIZE 2G;

Ustawienie pliku jako autoextend

ALTER DATABASE DATAFILE '/ścieżka/do/plik_danych.dbf'
AUTOEXTEND ON
NEXT 100M
MAXSIZE 2G;
  • AUTOEXTEND ON – włącza automatyczne zwiększanie pliku danych, gdy kończy się miejsce.
  • NEXT 100M – ustala krok powiększania, czyli o ile ma rosnąć plik danych za każdym razem.
  • MAXSIZE 2G – ustala maksymalny rozmiar, do jakiego plik może urosnąć.

Gdy mamy ustawiony data guard to na standby:

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- Wykonaj zmianę, np. AUTOEXTEND:
ALTER DATABASE DATAFILE '/u02/oracle/oradata/xyz01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 2G;

-- Wznów recovery w tle:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

Utworzenie przestrzeni tabel z autoextend

CREATE TABLESPACE moja_przestrzen
DATAFILE '/u01/app/oracle/oradata/moja_przestrzen01.dbf'
SIZE 500M
AUTOEXTEND ON
NEXT 100M
MAXSIZE 2G;

Włączyć auto-rozszerzanie (autoextend) na poziomie datafile’a

SELECT tablespace_name, file_name, autoextensible, bytes/1024/1024 AS size_mb
FROM dba_data_files;

Jeśli kolumna AUTOEXTENSIBLE ma wartość NO, to autoextend jest wyłączony.

ALTER DATABASE DATAFILE '/ścieżka/do/pliku.dbf'
AUTOEXTEND ON
NEXT 100M
MAXSIZE UNLIMITED;
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf'
AUTOEXTEND ON
NEXT 50M
MAXSIZE 5G;

Opcje:

  • AUTOEXTEND ON – włącza auto-rozszerzanie
  • NEXT 100M – przyrost o 100 MB, gdy plik się zapełni
  • MAXSIZE UNLIMITED – brak ograniczenia rozmiaru (możesz też ustawić limit, np. MAXSIZE 10G)

Wyłaczenie autoextend

ALTER DATABASE DATAFILE '/ścieżka/do/pliku.dbf'
AUTOEXTEND OFF;

Ustawienie pliku jako autoextend

ALTER DATABASE DATAFILE '/ścieżka/do/plik_danych.dbf'
AUTOEXTEND ON
NEXT 100M
MAXSIZE 2G;
  • AUTOEXTEND ON – włącza automatyczne zwiększanie pliku danych, gdy kończy się miejsce.
  • NEXT 100M – ustala krok powiększania, czyli o ile ma rosnąć plik danych za każdym razem.
  • MAXSIZE 2G – ustala maksymalny rozmiar, do jakiego plik może urosnąć.

Gdy mamy ustawiony data guard to na standby:

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- Wykonaj zmianę, np. AUTOEXTEND:
ALTER DATABASE DATAFILE '/u02/oracle/oradata/xyz01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 2G;

-- Wznów recovery w tle:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

Create Tablespace

Create tablespace test_tbs datafile '/u01/test_tbs_01.dbf' size 50m;

Add Space to Tablespace

!!! Make sure you have space at OS level before resizing or adding new datafile

Alter database datafile '/u01/test_tbs_01.dbf' resize 10g;
Alter tablespace test_tbs add datafile '/u01/test_tbs_02.dbf' size 5g;

Powieksz limit w autoextend

ALTER DATABASE DATAFILE '/ścieżka/do/pliku.dbf' AUTOEXTEND ON MAXSIZE 10G;

Dodanie pliku do tablespace z autoextend

alter tablespace sysaux add datafile '/ora/oradata/ora/sysaux02.dbf' size 64m autoextend on next 64m maxsize 32765m;

Drop Tablespace

drop tablespace test_tbs including contents and datafiles;

Tablespace Coalesce

  • Tablespace Coalesce combines all contiguous free extents into larger contiguous extents inside all datafiles
  • It takes any free extents that are right next to some other free extent and make one bigger free extent
  • SMON will perform this coalescing in the background but if you need it to happen right now, coalesce will do it
SQL> ALTER TABLESPACE USERS COALESCE;

Find Tablespace Utilization

set colsep |
set linesize 100 pages 100 trimspool on numwidth 14 
col name format a25
col owner format a15 
col "Used (GB)" format a15
col "Free (GB)" format a15 
col "(Used) %" format a15 
col "Size (M)" format a15 
SELECT d.status "Status", d.tablespace_name "Name", 
       TO_CHAR(NVL(a.bytes / 1024 / 1024 /1024, 0),'99,999,990.90') "Size (GB)", 
       TO_CHAR(NVL(a.bytes - NVL(f.bytes, 0), 0)/1024/1024 /1024,'99999999.99') "Used (GB)", 
       TO_CHAR(NVL(f.bytes / 1024 / 1024 /1024, 0),'99,999,990.90') "Free (GB)", 
       TO_CHAR(NVL((a.bytes - NVL(f.bytes, 0)) / a.bytes * 100, 0), '990.00') "(Used) %"
 FROM sys.dba_tablespaces d, 
      (select tablespace_name, sum(bytes) bytes from dba_data_files group by tablespace_name) a, 
      (select tablespace_name, sum(bytes) bytes 
         from dba_free_space group by tablespace_name) f 
        WHERE d.tablespace_name = a.tablespace_name(+) 
          AND d.tablespace_name = f.tablespace_name(+) 
          AND NOT (d.extent_management like 'LOCAL' AND d.contents like 'TEMPORARY') 
UNION ALL 
SELECT d.status 
       "Status", d.tablespace_name "Name", 
       TO_CHAR(NVL(a.bytes / 1024 / 1024 /1024, 0),'99,999,990.90') "Size (GB)", 
       TO_CHAR(NVL(t.bytes,0)/1024/1024 /1024,'99999999.99') "Used (GB)",
       TO_CHAR(NVL((a.bytes -NVL(t.bytes, 0)) / 1024 / 1024 /1024, 0),'99,999,990.90') "Free (GB)", 
       TO_CHAR(NVL(t.bytes / a.bytes * 100, 0), '990.00') "(Used) %" 
 FROM sys.dba_tablespaces d, 
      (select tablespace_name, sum(bytes) bytes from dba_temp_files group by tablespace_name) a, 
      (select tablespace_name, sum(bytes_cached) bytes from v$temp_extent_pool group by tablespace_name) t 
 WHERE d.tablespace_name = a.tablespace_name(+) 
   AND d.tablespace_name = t.tablespace_name(+) 
   AND d.extent_management like 'LOCAL' 
   AND d.contents like 'TEMPORARY';

Uzycie tablespace (dla danych, nie undo/temp)

SELECT
    df.tablespace_name,
    ROUND(df.total_mb, 2) AS total_mb,
    ROUND(df.total_mb - NVL(fs.free_mb, 0), 2) AS used_mb,
    ROUND(NVL(fs.free_mb, 0), 2) AS free_mb,
    ROUND((df.total_mb - NVL(fs.free_mb, 0)) / df.total_mb * 100, 2) AS pct_used
FROM
    (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 AS total_mb
     FROM dba_data_files
     GROUP BY tablespace_name) df
LEFT JOIN
    (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 AS free_mb
     FROM dba_free_space
     GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
ORDER BY pct_used DESC;

Uzycie tablespace uwzgledniajac AUTOEXTEND (czyli potencjalny wzrost)

SELECT
    a.tablespace_name,
    ROUND(a.used_mb, 2) AS used_mb,
    ROUND(a.free_mb, 2) AS free_mb,
    ROUND(a.max_mb, 2) AS max_mb,
    ROUND((a.used_mb / a.max_mb) * 100, 2) AS pct_used
FROM (
    SELECT
        df.tablespace_name,
        SUM(df.bytes) / 1024 / 1024 AS max_mb,
        SUM(df.bytes - NVL(fs.bytes, 0)) / 1024 / 1024 AS used_mb,
        SUM(NVL(fs.bytes, 0)) / 1024 / 1024 AS free_mb
    FROM dba_data_files df
    LEFT JOIN dba_free_space fs
        ON df.file_id = fs.file_id
    GROUP BY df.tablespace_name
) a
ORDER BY pct_used DESC;

TEMP tablespace (bo tam dba_free_space nie działa)

SELECT
    tablespace_name,
    ROUND(SUM(bytes_used)/1024/1024, 2) AS used_mb,
    ROUND(SUM(bytes_free)/1024/1024, 2) AS free_mb,
    ROUND(SUM(bytes_used + bytes_free)/1024/1024, 2) AS total_mb,
    ROUND(SUM(bytes_used) / SUM(bytes_used + bytes_free) * 100, 2) AS pct_used
FROM v$temp_space_header
GROUP BY tablespace_name;

Monitor tablespace usage

cat sql/ts.sql
select df.tablespace_name "Tablespace",
totalusedspace "Used MB",
(df.totalspace - tu.totalusedspace) "Free MB",
df.totalspace "Total MB",
round(100 * ( (df.totalspace - tu.totalusedspace)/ df.totalspace))
"Pct. Free"
from
(select tablespace_name,
round(sum(bytes) / 1048576) TotalSpace
from dba_data_files
group by tablespace_name) df,
(select round(sum(bytes)/(1024*1024)) totalusedspace, tablespace_name
from dba_segments
group by tablespace_name) tu
where df.tablespace_name = tu.tablespace_name
/
$cat to.sql
prompt
prompt Tablespace: &&1
prompt Object size > &&2 MB
set pagesize 999
set verify off
col owner for a16
col segment_name for a30
col segment_type for a20
select owner, segment_name, segment_type, round(bytes/1048576) MB
from dba_segments
where tablespace_name=upper('&&1')
  and bytes > nvl(to_number('&&2'),0) * 1024 * 1204
order by bytes desc
/