We have a database that has reached it's 12 GB limit. Export of the user went ok with no errors or warnings. Next step is to drop it completely and then do an import.
Trouble is that drop user [name] cascade;
never finishes. And when we look at the object count for that user, nothing has been dropped.
When we look at what the session dropping the user is waiting on we get these two a lot: latch: cache buffers chains
, resmgr:cpu quantum
.
We also get this one: log file switch completion
, not so often, but the wait time is long (700+ seconds on the one in wait just now).
Here is the result of a query against the v$session_event
for the drop user cascade
SID:
SID EVENT TOTAL_WAITS TOTAL_TIMEOUTS TIME_WAITED AVERAGE_WAIT MAX_WAIT TIME_WAITED_MICRO EVENT_ID WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS CON_ID
--- ----------------------------------- ----------- -------------- ----------- ------------ ---------- ----------------- ---------- ------------- ----------- --------------- ------
61 Disk file operations I/O 89 0 0 0 0 3741 166678035 1740759767 8 User I/O 3
61 control file sequential read 654 0 0 0 0 4274 3213517201 4108307767 9 System I/O 3
61 control file parallel write 66 0 8 ,12 0 82283 4078387448 4108307767 9 System I/O 3
61 latch: cache buffers chains 3 0 1 ,41 1 12447 2779959231 3875070507 4 Concurrency 3
61 write complete waits 11 0 886 80,5 177 8855414 4229542060 3290255840 2 Configuration 3
61 log file switch completion 1 0 0 ,25 0 2459 3834950329 3290255840 2 Configuration 3
61 log file sync 6 0 1 ,17 0 10429 1328744198 3386400367 5 Commit 3
61 db file sequential read 3264 0 14 0 0 140814 2652584166 1740759767 8 User I/O 3
61 db file scattered read 692 0 10 ,01 0 99381 506183215 1740759767 8 User I/O 3
61 db file single write 20 0 2 ,09 0 17032 1307477558 1740759767 8 User I/O 3
61 db file parallel read 6 0 0 ,01 0 818 834992820 1740759767 8 User I/O 3
SID EVENT TOTAL_WAITS TOTAL_TIMEOUTS TIME_WAITED AVERAGE_WAIT MAX_WAIT TIME_WAITED_MICRO EVENT_ID WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS CON_ID
--- ----------------------------------- ----------- -------------- ----------- ------------ ---------- ----------------- ---------- ------------- ----------- --------------- ------
61 index (re)build lock or pin object 204 0 0 0 0 1007 3347698104 4166625743 3 Administrative 3
61 latch: shared pool 11 0 0 ,01 0 1369 2696347763 3875070507 4 Concurrency 3
61 resmgr:cpu quantum 6 0 19 3,14 18 188682 1452455426 2396326234 10 Scheduler 3
61 SQL*Net message to client 17 0 0 0 0 42 2067390145 2000153315 7 Network 3
61 SQL*Net message from client 17 0 62533 3678,42 30488 625331207 1421975091 2723168908 6 Idle 3
61 events in waitclass Other 364 5 427 1,17 100 4267757 1736664284 1893977003 0 Other 3
17 rows selected.
Any insights or tips would be great.
Database is Oracle XE 18.04.
Best Answer
'drop user' has to be atomic, which means we need to be able to roll it back, so its potentially a big operation depending on the number of objects and dependencies.
In some circumstances, I've found it faster to drop all the objects first for that user and then drop the user. For example spooling something like this
and running that covers the typical majority of objects. (There can be leftovers, like scheduler jobs etc) but at least at normally gets the number of objects down very low. And then run 'drop user' after that