TP_03_Tablespaces_Co..

Transcription

TP_03_Tablespaces_Co..
Gestion de l'espace de stockage - Corrigé
Objectifs :
➢ Créer, modifier et supprimer les tablespaces
➢ Obtenir des informations sur les tablespaces
➢ Gérer les tablespaces temporaires
➢ Gérer les tablespaces UNDO
Démarrer la machine virtuelle, puis charger le TP « 3 : Gestion de l’espace de stockage».
Tablespaces de données
Cette partie doit être traitée avec une connexion SQLPlus polytech@di.
1. Quel est le tablespace par défaut de la base pdbdi ?
SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE
PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE';
PROPERTY_VALUE
-------------------------------------------------------------------------------SYSTEM
2. Donner une requête permettant de donner la liste des tablespaces de données
SQL> select ts#, name, con_id from v$tablespace;
TS# NAME
CON_ID
---------- ------------------------------ ---------2 UNDOTBS1
0
0 SYSTEM
4
1 SYSAUX
4
2 TEMP
4
3 TSA
4
4 TSB
4
On remarquera la présence du tablespace UNDOTBS1 qui correspond à une autre base de données. Il s'agit du
tablespace undo qui est celui de la base CDB$ROOT.
On peut aussi utiliser la requête SELECT tablespace_name FROM dba_tablespaces qui donnera la liste des
tablespaces de la base uniquement.
3. Donner une requête donnant l'emplacement des fichiers pour chaque tablespaces de
données
SQL> SELECT tablespace_name, file_name FROM dba_data_files ORDER BY 1;
TABLESPACE_NAME
FILE_NAME
-------------------- -------------------------------------------------SYSAUX
/oracle/oradata/POLYTECH/pdbdi/sysaux01.dbf
SYSTEM
/oracle/oradata/POLYTECH/pdbdi/system01.dbf
TSA
/oracle/oradata/POLYTECH/pdbdi/tsA_1.dbf
TSA
/oracle/oradata/POLYTECH/pdbdi/tsA_2.dbf
TSB
/oracle/oradata/POLYTECH/pdbdi/tsB_1.dbf
TSB
/oracle/oradata/POLYTECH/pdbdi/tsB_2.dbf
TSB
/oracle/oradata/POLYTECH/pdbdi/tsB_3.dbf
TSB
/oracle/oradata/POLYTECH/pdbdi/tsB_4.dbf
Remarque : Il est également possible d'utiliser la vue v$datafile
4. Donner une requête permettant de trouver la taille actuelle et maximale de chaque fichiers
de chaque tablespaces.
SQL> SELECT tablespace_name, file_name, bytes, maxbytes FROM dba_data_files ORDER BY 1;
TABLESPACE_NAME
FILE_NAME
BYTES
MAXBYTES
-------------------- -------------------------------------------------- ----------
SYSAUX
3,4360E+10
SYSTEM
3,4360E+10
TSA
31457280
TSA
52428800
TSB
5242880
TSB
5242880
TSB
5242880
TSB
5242880
/oracle/oradata/POLYTECH/pdbdi/sysaux01.dbf
713031680
/oracle/oradata/POLYTECH/pdbdi/system01.dbf
314572800
/oracle/oradata/POLYTECH/pdbdi/tsA_1.dbf
31457280
/oracle/oradata/POLYTECH/pdbdi/tsA_2.dbf
39845888
/oracle/oradata/POLYTECH/pdbdi/tsB_1.dbf
5242880
/oracle/oradata/POLYTECH/pdbdi/tsB_2.dbf
5242880
/oracle/oradata/POLYTECH/pdbdi/tsB_3.dbf
5242880
/oracle/oradata/POLYTECH/pdbdi/tsB_4.dbf
5242880
5. Trouver une requête qui donne l'espace utilisé et la taille maximale de chaque tablespace de
données.
SQL> SELECT tablespace_name, sum(bytes),sum(maxbytes) FROM dba_data_files GROUP BY
tablespace_name ORDER BY 1;
TABLESPACE_NAME
SUM(BYTES) SUM(MAXBYTES)
-------------------- ---------- ------------SYSAUX
713031680
3,4360E+10
SYSTEM
314572800
3,4360E+10
TSA
71303168
83886080
TSB
20971520
20971520
Tablespace temporaire
1. Quel est le tablespace temporaire par défaut ?
SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE
PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';
PROPERTY_VALUE
-------------------------------------------------------------------------------SYSTEM
2. Lister les tablespaces temporaires, leurs fichiers et leurs tailles actuelles et maximales.
SQL> select tablespace_name, file_name, bytes, maxbytes from dba_temp_files;
TABLESPACE_NAME
FILE_NAME
BYTES
MAXBYTES
-------------------- -------------------------------------------------- ---------------TEMP
/oracle/oradata/POLYTECH/pdbdi/pdbseed_temp01.dbf
20971520
3,4360E+10
Création/modification
1. Créer un tablespace tsC qui devra être composé des fichiers :
• /oracle/oradata/POLYTECH/pdbdi/tsC1.dbf : 20Mo à l'origine, pas d'extension possible
/oracle/oradata/POLYTECH/pdbdi/tsC2.dbf : 20Mo à l'origine, extension infinie par pas
de 10Mo.
Regarder la valeur MAXBYTES dans dba_data_files pour les fichiers du tablespace tsC. Les
valeurs sont elles cohérentes?
•
SQL> CREATE TABLESPACE tsC
DATAFILE '/oracle/oradata/POLYTECH/pdbdi/tsC_1.dbf' SIZE 20M,
'/oracle/oradata/POLYTECH/pdbdi/tsC_2.dbf' SIZE 20M AUTOEXTEND ON NEXT 10M
MAXSIZE UNLIMITED
;
Grégory Fonlupt - Gestion de l'espace de stockage - Corrigé - 2/6
Tablespace Créé
SQL> SELECT file_name, bytes, maxbytes, autoextensible FROM dba_data_files WHERE
tablespace_name='TSC';
FILE_NAME
BYTES MAXBYTES AUTOEXTEN
-------------------------------------------------- ---------- ---------- --------/oracle/oradata/POLYTECH/pdbdi/tsC_1.dbf
20971520
0
NO
/oracle/oradata/POLYTECH/pdbdi/tsC_2.dbf
20971520
3,4360E+10 YES
Le fichier tsC2.dbf a une valeur de 32Go ; En effet Oracle limite la taille d'un fichier à 4 millions de blocks soit 32Go
pour des blocks de 8ko.
Pour tsC1.dbf la valeur est de 0 car il n'autorise pas les extensions automatiques.
2. Regarder les valeurs BYTES et MAXBYTES des fichiers du tablespace tsC.
a. Créer une table dans ce tablespace avec:
CREATE TABLE tableC1(
texte CHAR(2000)
) TABLESPACE tsC;
b. Exécuter 5 fois de suite le script PL/SQL suivant et remplir le tableau ci-dessous:
BEGIN FOR i in 1..5000 LOOP
INSERT INTO tableC1 VALUES ('Ligne '||i||' tableC1');
END LOOP;
END;
/
Commit;
SELECT file_name, bytes, user_bytes FROM dba_data_files WHERE
tablespace_name='TSC';
Valeurs de BYTES
Nb Lignes
0
5000
10000
15000
20000
25000
tsC_1.dbf
20971520
20971520
20971520
20971520
20971520
20971520
tsC_2.dbf
20971520
20971520
20971520
31457280
41943040
62914560
c. Supprimer toutes les lignes de tableC1 (DELETE FROM tableC1), et observer une
dernière fois les valeurs BYTES et MAXBYTES des fichiers du tablespace tsC.
Que pouvez vous conclure sur l'allocation d'espace dans les fichiers de données.
A l'origine on constate que chaque fichier a une taille de 20Mo, cette taille correspond bien à l'état alloué, et non a
l'espace disponible.
Une ligne représentant un peu plus de 2Ko les deux fichiers devraient pouvoir recevoir environ 20000 lignes avant de
grandir. Or on constate que le fichier 2 a grandi de 10Mo dès 15000 lignes, le fichier 1 lui ne peut grandir (pas d'autoextend). L'accroissement de la taille des fichiers est du à la façon dont fonction l'AUTOALLOCATE. Plusieurs raisons à
cet accroissement anticipé :
• Oracle conserve toujours de la place dans un fichier. Si des lignes existantes sont modifiées (update) leur taille peu
augmenter, donc Oracle garde de l'espace libre pour ne pas fractionner une ligne
• La table grandit très rapidement. Dans ce cas l'algo AUTOALLOCATE va créer des extents plus grands pour
anticiper un accroissement futur et limiter le nombre et la fragmentation des extents.
Après suppression l'espace alloué reste le même. C'est le fonctionnement normal, entre autre pour la fonction
RECYCLEBIN.
3. Exécuter le script PL/SQL suivant :
BEGIN FOR i in 1..3000 LOOP
INSERT INTO tableB1(key, ts, content, last_mod)
VALUES (i, 'tsB', 'Ligne '||i||' tableB1',sysdate);
END LOOP;
END;
Grégory Fonlupt - Gestion de l'espace de stockage - Corrigé - 3/6
a. Pourquoi ce code génère une erreur ?
b. Proposer des solutions pour corriger l'erreur
BEGIN FOR i in 1..3000 LOOP
INSERT INTO tableB1(key, ts, content, last_mod)
VALUES (i, 'tsB', 'Ligne '||i||' tableB1',sysdate);
END LOOP;
5 END;
6 /
BEGIN FOR i in 1..3000 LOOP
*
ERREUR à la ligne 1 :
ORA-01653: impossible d'étendre la table POLYTECH.TABLEB1 de 128 dans le tablespace TSB
ORA-06512: à ligne 2
Il n'y a plus d'espace dans le tablespace tsB et tous les fichiers tous les fichiers sont arrivés à leur taille maximale.
Pour corriger le problème on peut :
• Ajouter 1 ou plusieurs fichiers au tablespace
• Augmenter la valeur MAXSIZE d'un ou plusieurs fichier de données existants
Information Espace
Vous devez créer une script sqlplus tsinfo qui devra être appelé de la façon suivante :
sqlplus cnxinfo @tsinfo, où cnxinfo représente une chaîne de connexion à une base de données.
Le script devra retourner les informations sur les tablespaces de données uniquement (les
tablespaces undo et temporaires doivent être exclus), de la base ciblée par cnxinfo. Par exemple :
[oracle@oracle12c ~]$ sqlplus -silent di_admin/oracle@di @tsinfo
*******************************************************************
Informations sur les tablespaces de la base PDBDI
Liste des tablespaces
...
Tablespace #3, TSA :
68.00Mo,
85.00 % occupé
Fichier /oracle/oradata/POLYTECH/pdbdi/tsA_1.dbf
Maximum
Fichier /oracle/oradata/POLYTECH/pdbdi/tsA_2.dbf
Maximum
Tablespace #4, TSB :
20.00Mo, 100.00 % occupé
Fichier /oracle/oradata/POLYTECH/pdbdi/tsB_1.dbf
Maximum
Fichier /oracle/oradata/POLYTECH/pdbdi/tsB_2.dbf
Maximum
Fichier /oracle/oradata/POLYTECH/pdbdi/tsB_3.dbf
Maximum
Fichier /oracle/oradata/POLYTECH/pdbdi/tsB_4.dbf
Maximum
Tablespace #5, TSC :
50.00Mo,
00.15 % occupé
Fichier /oracle/oradata/POLYTECH/pdbdi/tsC_1.dbf
Maximum
Fichier /oracle/oradata/POLYTECH/pdbdi/tsC_2.dbf
Maximum
…
30.00 Mo,
0.03Go
38.00 Mo,
0.05Go
5.00 Mo,
0.005Go
5.00 Mo,
0.005Go
5.00 Mo,
0.005Go
5.00 Mo,
0.005Go
20.00 Mo,
0.02Go
30.00 Mo, 32.00Go
Commencer par faire un script qui affiche les informations pour un tablespace dont le nom est
passé en argument. Celui-ci sera utilisé par tsinfo pour tous les tablespaces de la base.
Pour formater un nombre vous pouvez utiliser la fonction TO_CHAR. Par exemple TO_CHAR(n,
'900.99') affichera des nombres de la forme 01.00, 15.23.
Grégory Fonlupt - Gestion de l'espace de stockage - Corrigé - 4/6
-- desc_ts.sql
-- Affiche des informations sur un tablespace dont le nom est passé en argument
set head off
set pagesize 5000
set line 1000
set verify off
SELECT 'Tablespace #'||ts#||', '||name||' : '||To_CHAR(Sum(Bytes)/
(1024*1024),'99990.99')||'Mo, '||TO_CHAR(100*sum(Bytes)/Sum(decode(maxbytes, 0, bytes,
maxbytes)),'900.99')||' % occupé'
FROM v$tablespace vts INNER JOIN dba_data_files df ON vts.name=df.tablespace_name
WHERE name='&1'
GROUP BY ts#, name;
SELECT '
Fichier '||file_name||' '||TO_CHAR(Bytes/(1024*1024), '99990.99')||' Mo,
'||TO_CHAR(maxbytes/(1024*1024*1024), '9990.999')||'Go Maximum '
FROM dba_data_files
WHERE tablespace_name = '&1'
AND autoextensible='YES'
UNION
SELECT '
Fichier '||file_name||' '||TO_CHAR(Bytes/(1024*1024), '99990.99')||' Mo,
'||TO_CHAR(Bytes/(1024*1024*1024), '9990.999')||'Go Maximum '
FROM dba_data_files
WHERE tablespace_name = '&1'
AND autoextensible!='YES'
;
-- tsinfo.sql
-- Affiche des informations sur tous les tablespaces du conteneur courant
set head off
set pagesize 0
set line 200
set term off
set feed off
SPOOL describeTS.sql
SELECT '@desc_ts '||tablespace_name FROM dba_tablespaces WHERE contents!='TEMPORARY';
SPOOL OFF
set term on
prompt *******************************************************************
SELECT 'Informations sur les tablespaces de la base '||SYS_CONTEXT('USERENV',
'CON_NAME') FROM dual;
PROMPT Liste des tablespaces
@describeTS.sql
exit;
Configuration UNDO
1. Quelle est la configuration actuelle de la base de données (mode de gestion, tablespace
utilisé et durée de la rétention)?
SQL>
select
name,
display_value
from
v$parameter
('UNDO_MANAGEMENT', 'UNDO_RETENTION', 'UNDO_TABLESPACE');
where
upper(name)
in
NAME
DISPLAY_VALUE
-------------------- -------------------undo_management
AUTO
undo_tablespace
UNDOTBS1
Grégory Fonlupt - Gestion de l'espace de stockage - Corrigé - 5/6
undo_retention
600
Le paramètre UNDO_MANAGEMENT est à AUTO, ce qui signifie que c'est le mode automatique qui est utilisé. Le tablespace
est UNDOTBS1 et la durée minimale de rétention est de 600 secondes
2. Fixer la durée de la rétention à 1 heure (de façon définitive).
Il faut pour cela modifier le paramètre UNDO_RETENTION dans la mémoire et dans le fichier de paramètres. Cette
opération ne peut se faire que depuis une connexion à la CDB.
SQL> alter session set container=cdb$root;
Session modifiée.
SQL> ALTER SYSTEM SET undo_retention=3600 SCOPE=BOTH;
Système modifié.
Grégory Fonlupt - Gestion de l'espace de stockage - Corrigé - 6/6