From time to time people run into problems with UNDO tablespaces that have grown much larger than expected (perhaps due to a rogue process doing far too much work) and refuse to shrink. The workaround is to create a new undo tablespace and switch the instance to use it – but even this simple procedure introduces a couple of surprises.
There’s a little demonstration and discussion of the operation at this URL.
Footnote 1: The example assumes you are using an spfile for your database; if you’re not, then don’t forget that changing the undo tablespace with an alter system command can work – but you might get a nasty surprise if you forget to update the pfile before you next restart the database.
Footnote 2: It is possible (despite occasional claims to the contrary) to resize the files in an undo tablespace with the standard command:
alter database datafile {filename} resize .... ;
However, given the unpredictable way in which undo segments can be allocated, then grow, shrink and get de-allocated, you have to be a little lucky to find a moment when there is free space at the end of the file that can be de-allocated in a resize operation.