alter session set container=PDB1; CREATE TEMPORARY TABLESPACE TEMP3 TEMPFILE '/disk1/oradata/PDB1/temp03.dbf' SIZE 20G AUTOEXTEND ON NEXT 128K MAXSIZE 20G TABLESPACE GROUP TEMP_NEW EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M FLASHBACK ON; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP_NEW; DROP TABLESPACE TEMP1 INCLUDING CONTENTS AND DATAFILES; DROP TABLESPACE TEMP2 INCLUDING CONTENTS AND DATAFILES; CREATE TEMPORARY TABLESPACE TEMP1 TEMPFILE '/disk1/oradata/PDB1/temp01.dbf' SIZE 1G AUTOEXTEND ON NEXT 128K MAXSIZE 20G TABLESPACE GROUP TEMP EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M FLASHBACK ON; CREATE TEMPORARY TABLESPACE TEMP2 TEMPFILE '/disk1/oradata/PDB1/temp02.dbf' SIZE 1G AUTOEXTEND ON NEXT 128K MAXSIZE 20G TABLESPACE GROUP TEMP EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M FLASHBACK ON; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP; DROP TABLESPACE TEMP3 INCLUDING CONTENTS AND DATAFILES; exitMore about temporary tablespace groups in Oracle 19c here
Minimalistic Oracle contains a collection of practical examples from my encounters with Oracle technologies. When relevant, I also write about other technologies, like Linux or PostgreSQL. Many of the posts starts with "how to" since they derive directly from my own personal experience. My goal is to provide simple examples, so that they can be easily adapted to other situations.
Showing posts with label Temporary Tablespaces. Show all posts
Showing posts with label Temporary Tablespaces. Show all posts
Friday, August 23, 2024
How to cleanup temporary tablespaces in a PDB and create new ones in the right location
Notice how temporary tablespace groups can be used instead of directly referencing the temporary tablespace name:
Wednesday, May 8, 2024
syntax for dropping a temporary file from a temporary tablespace
For future reference, here is how to drop and recreate a temporary file in an existing temporary tablespace, but with a changed path:
If applicable, set the container:
alter session set container=pdb1;Drop the current tempfile, and recreate it in the desired location. Make it autoextensible:
alter database tempfile '/data/oradata/db01/temp1.dbf' drop including datafiles; alter tablespace TEMP1 add tempfile '/data/oradata/db02/temp1.dbf' size 1G; alter database tempfile '/data/oradata/db02/temp1.dbf' autoextend on next 1G maxsize unlimited;A good query for temporary tablespaces:
select t.ts#, t.name,t.bigfile, t.con_id, f.name "file_name", tg.group_name from v$tempfile f join v$tablespace t on (t.TS# = f.TS#) and t.con_id = f.CON_ID join DBA_TABLESPACE_GROUPS tg on (tg.tablespace_name = t.name) TS# NAME BIG CON_ID file_name GROUP_NAME ---------- ------------------------------ --- ---------- ---------------------------------------- ------------------------------ 3 TEMP1 YES 3 /u02/oradata/pdb1/temp1.dbf TEMP 4 TEMP2 YES 3 /u02/oradata/pdb1/temp2.dbf TEMP
Thursday, June 30, 2022
How to solve ORA-01187: cannot read from file because it failed verification tests
After a successful clone, alert log reports:
Any operation you try against the database will give the following error stack in return:
Check tempfile situation:
Is the temporary tablespace database default?
Add new tempfile:
Drop the old ones:
Both of the old datafiles are now gone from the data dictionary:
If you want to add the old datafiles back to your temp tablespace you can do this with the REUSE keyword:
The alert log confirms this:
022-06-30T04:04:17.542368+02:00 Errors in file /orainst/oracle/diag/rdbms/testdb01/testdb01/trace/testdb01_dbw0_130154.trc: ORA-01186: file 201 failed verification tests ORA-01122: database file 201 failed verification check ORA-01110: data file 201: '/data/oradata/testdb01/temp01.dbf' ORA-01203: wrong incarnation of this file - wrong creation SCN File 201 not verified due to error ORA-01122
Any operation you try against the database will give the following error stack in return:
ORA-01187: cannot read from file because it failed verification tests ORA-01110: data file 201: '/data/oradata/testdb01/temp01.dbf' ORA-06512: at "SYS.DBMS_LOB", line 741 ORA-06512: at "SYS.DBMS_DATAPUMP", line 5420 ORA-06512: at line 1
Check tempfile situation:
SYS@testdb01>SQL>select ts#,status,enabled, name from v$tempfile; TS# STATUS ENABLED NAME ---------- ------- ---------- --------------------------------- 3 ONLINE READ WRITE /data/oradata/testdb01/temp01.dbf 3 ONLINE READ WRITE /data/oradata/testdb01/temp02.dbfA query against dba_temp_files however, will give an error:
SYS@testdb01>SQL>SELECT tablespace_name, file_name FROM dba_temp_files WHERE tablespace_name = 'TEMP'; SELECT tablespace_name, file_name FROM dba_temp_files WHERE tablespace_name = 'TEMP' * ERROR at line 1: ORA-01187: cannot read from file because it failed verification tests ORA-01110: data file 201: '/data/oradata/testdb01/temp01.dbf'
Is the temporary tablespace database default?
SYS@testdb01>SQL> col property_value format a30 SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE'; PROPERTY_VALUE ----------------------- TEMPYes it is, so we cannot drop it, but will have to add new files and drop the old ones
Add new tempfile:
SYS@testdb01>SQL>ALTER TABLESPACE temp ADD TEMPFILE '/data/oradata/testdb01/temp.dbf' size 256M; Tablespace altered.
Drop the old ones:
SYS@testdb01>SQL>ALTER DATABASE TEMPFILE '/data/oradata/testdb01/temp01.dbf' DROP INCLUDING DATAFILES; Database altered. SYS@testdb01>SQL>ALTER DATABASE TEMPFILE '/data/oradata/testdb01/temp02.dbf' DROP INCLUDING DATAFILES; Database altered.
Both of the old datafiles are now gone from the data dictionary:
SYS@pserser4>SQL> set lines 200 col tablespace_name format a20 col file_name format a50 SELECT tablespace_name, file_name FROM dba_temp_files WHERE tablespace_name = 'TEMP'; TABLESPACE_NAME FILE_NAME --------------------- -------------------------------------- TEMP /data/oradata/testdb01/temp.dbfNote that the old tempfiles are still on disk:
SYS@testdb01>SQL>!ls -la /data/oradata/testdb01/temp01.dbf -rw-r----- 1 oracle dba 114302976 Jun 30 04:04 /data/oradata/testdb01/temp01.dbf
If you want to add the old datafiles back to your temp tablespace you can do this with the REUSE keyword:
SYS@testdb01>SQL>ALTER TABLESPACE temp ADD TEMPFILE '/data/oradata/testdb01/temp01.dbf' size 256M reuse; Tablespace altered.In my case, the other tempfile /data/oradata/testdb01/temp02.dbf, was not present physically on disk.
The alert log confirms this:
2022-06-30T04:04:18.302852+02:00 Errors in file /data/oracle/diag/rdbms/testdb01/testdb01/trace/testdb01_dbw0_130154.trc: ORA-01157: cannot identify/lock data file 202 - see DBWR trace file ORA-01110: data file 202: '/data/oradata/testdb01/temp02.dbf' ORA-17503: ksfdopn:4 Failed to open file /data/oradata/testdb01/temp02.dbf ORA-17500: ODM err:File does not exist
Wednesday, June 30, 2021
How to deal with ORA-01110 during export
If you receive errors like this during data pump export
ORA-01187: cannot read from file because it failed verification tests ORA-01110: data file 204: '/datafiles/oradata/proddb/temp.dbf' ORA-06512: at "SYS.DBMS_LOB", line 724 ORA-06512: at "SYS.DBMS_DATAPUMP", line 4546 ORA-06512: at line 1you need to drop and recreate your temporary tablespace(s). If you only use bigfile temporary tablespaces, you can use the following script to rectify the situation:
set trimspool on set lines 200 set feedback off set verify off set heading off set echo off spool 1.drop_non_default_temp.sql select 'spool 1.drop_non_default_temp.log' from dual; select 'drop tablespace ' || ts.name || ' including contents and datafiles;' from v$tempfile tf join v$tablespace ts on (ts.ts# = tf.ts#) and ts.name not in( select property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE' ); select 'exit' from dual; spool 2.recreate_temp.sql select 'spool 2.recreate_temp.log' from dual; select 'create bigfile temporary tablespace ' || ts.name || ' tempfile ''' || tf.name || ''' SIZE 32M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;' from v$tempfile tf join v$tablespace ts on (ts.ts# = tf.ts#) and ts.name not in( select property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE' ); select 'exit' from dual; spool off; spool 3.alter_default_temp.sql select 'spool 3.alter_default_temp.log' from dual; select 'alter database default temporary tablespace TEMP;' from dual; select 'exit' from dual; spool off spool 4.drop_default_temp.sql select 'spool 4.drop_default_temp.log' from dual; select 'drop tablespace ' || ts.name || ' including contents and datafiles;' from v$tempfile tf join v$tablespace ts on (ts.ts# = tf.ts#) and ts.name in( select property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE' ); select 'exit' from dual; spool off; spool 5.create_default_temp.sql select 'spool 5.create_default_temp.log' from dual; select 'create bigfile temporary tablespace ' || ts.name || ' tempfile ''' || tf.name || ''' SIZE 32M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;' from v$tempfile tf join v$tablespace ts on (ts.ts# = tf.ts#) and ts.name in( select property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE' ); select 'exit' from dual; spool off; spool 6.reset_default_temp.sql select 'spool 6.reset_default_temp.log' from dual; select 'alter database default temporary tablespace ' || ts.name || ';' from v$tempfile tf join v$tablespace ts on (ts.ts# = tf.ts#) and ts.name in( select property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE' ); select 'exit' from dual; spool off; exitRun the script in your database, and it will product 6 new sql files, numbered 1 to 6. Run them sequenctially and you should have recreated your temporary tablespaces. After this your data pump export will start as expected.
Wednesday, June 19, 2019
What to remember when adding temporary tablespaces on primary databases
Are temporary tablespaces automatically replicated to the standby databases?
No, they are not.
This is documentet in Oracle support note 834174.1 "Temporary Datafile created in Primary is missing in the Standby Database"
The setting of STANDBY_FILE_MANAGEMENT has no impact on temporary tablespaces and temporary files, because no redo is generated.
Unfortunately, this fact is not mentioned in the matrix listed in the documentation under the headline "Primary Database Changes That Require Manual Intervention at a Physical Standby"
From my own experience, here is what I did at a time when the primary database ran short on temporary space, and a new tablespace had to be created immediately:
Add temporary tablespace to the primary database:
CREATE BIGFILE TEMPORARY TABLESPACE TMP TEMPFILE '/u02/oradata/proddb01/tmp.dbf' SIZE 1024M AUTOEXTEND ON NEXT 128M MAXSIZE 1T EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
Check the situation on the standby database:
SQL> SELECT TABLESPACE_NAME , bigfile,status FROM DBA_TABLESPACES WHERE CONTENTS = 'TEMPORARY'; TABLESPACE_NAME BIG STATUS ------------------------------ --- --------- TEMP NO ONLINE TMP YES ONLINE
The temporary tablespace name is registred in the standby data dictionary, but there is no tempfile attached.
In order to add a tempfile to the standby database, it must be opened in READ ONLY mode.
Since my standby database is an active standby, it is already opened in READ ONLY mode:
SQL> select open_mode from v$database; OPEN_MODE -------------------- READ ONLY WITH APPLY
Add the tempfile:
alter tablespace tmp add tempfile '/u02/oradata/proddb01/tmp.dbf' size 1024M autoextend on next 128M maxsize 1T; Tablespace altered.
Recheck the situation in the standby database:
SQL> select ts#,name,status,enabled from v$tempfile; TS# NAME STATUS ENABLED ---------- -------------------------------------------------- ------- ---------- 3 /u02/oradata/proddb01/temp01.dbf ONLINE READ WRITE 31 /u02/oradata/proddb01/tmp.dbf ONLINE READ WRITE
Thursday, February 16, 2017
How to create a global temporary table
An example of a Global Temporary Table (GTT) would be:
ON COMMIT DELETE ROWS indicates that Oracle will purge the rows after an ended transaction (after a COMMIT, ROLLBACK or an implicit COMMIT).
Instead of ON COMMIT DELETE ROWS you could also use ON DELETE PRESERVE ROWS, which will remove the rows at the end of the user's session.
You can add indexes, triggers and views on a GTT. You can even truncate a temporary table, and it will only affect the curren session's rows, leaving other users' rows intact.
With Oracle 12c came the ability for temporary tables to store its UNDO segments in temporary tablespaces, rather than conventional tablespaces, thus removing the need to generate REDO.
To enable this for your session, use:
before creating the GTT.
Sources:
Oracle-Base: article about GTT and another one explaining the 12c new feature "temporary undo"
Oracle Documentation: Overview of GTT
Check my note on private temporary tables, available from Oracle 18c.
CREATE GLOBAL TEMPORARY TABLE INCOMING_DATA ( ROW_ID NUMBER(10) NOT NULL, SSN NUMBER(11), ENTRY_DATE DATE NOT NULL, HANDLED_BY VARCHAR2(30 BYTE) NOT NULL, CONTENT_CODE VARCHAR2(4 BYTE), MESSAGE CLOB ) ON COMMIT DELETE ROWS ;
ON COMMIT DELETE ROWS indicates that Oracle will purge the rows after an ended transaction (after a COMMIT, ROLLBACK or an implicit COMMIT).
Instead of ON COMMIT DELETE ROWS you could also use ON DELETE PRESERVE ROWS, which will remove the rows at the end of the user's session.
You can add indexes, triggers and views on a GTT. You can even truncate a temporary table, and it will only affect the curren session's rows, leaving other users' rows intact.
With Oracle 12c came the ability for temporary tables to store its UNDO segments in temporary tablespaces, rather than conventional tablespaces, thus removing the need to generate REDO.
To enable this for your session, use:
ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE;
before creating the GTT.
Sources:
Oracle-Base: article about GTT and another one explaining the 12c new feature "temporary undo"
Oracle Documentation: Overview of GTT
Check my note on private temporary tables, available from Oracle 18c.
Monday, January 9, 2017
List temporary tablepaces and their tempfiles
select t.file#,ts#,status,t.name "temp file name",n.name "tablespace name", n.bigfile,t.bytes/1024/1024 "Size MB" from v$tempfile t join v$tablespace n using(ts#);
FILE# | TS# | STATUS | temp file name | tablespace name | BIGFILE | Size MB |
---|---|---|---|---|---|---|
1 | 3 | ONLINE | /u02/oradata/proddb01/temp01.dbf | TEMP | YES | 256 |
2 | 66 | ONLINE | /u02/oradata/proddb01/user_temp.dbf | USER_TEMP | YES | 256 |
3 | 70 | ONLINE | /u02/oradata/proddb01/temp_d1u_01.dbf | BATCH_TEMP | YES | 256 |
Monday, December 1, 2014
How to find and change the default temporary tablespace and default tablespace for a database instance
set lines 200 col description format a50 col property_value format a30 col property_name format a30 SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE '%TABLESPACE%';
To change the default temporary tablespace, use
alter database default temporary tablespace tmp;
To change the default tablespace, use
alter database default tablespace user_data;
Friday, January 24, 2014
How to create a temporary tablespace and assign it as the database default
CREATE TEMPORARY TABLESPACE TMP TEMPFILE '/data/oracle/u01/PRODDB01/datafile/tmp_01.dbf' SIZE 128M AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED TABLESPACE GROUP '' EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TMP;
Subscribe to:
Posts (Atom)