I prefer to use exp/imp to migrate databases.
I first create a fresh new database with a new spfile, a new system tablespace, a new undo, locally managed tablespace, automatic segment space management.
I do not do a full exp. I prefer a schema export. It only exports the schema that I want, not WMSYS or PERFSTAT… I do not want to have old stuff in my system tablespace neither.
What is missing by schema import ? profiles, roles, tablespaces, users, public synonym, public database link, privileges
1) generate create statement profiles, roles, tablespaces, users, public synonym, public database link, privileges
for example with toad or with dbms_metadata. I am using sql + spool. Also possible is PLSQL.
2) export database with OWNER=user1,user2,… so all your users but not SYS, SYSTEM, PERFSTAT, DBSNMP, WMSYS, TSMSYS. Only your own users, not the one created by oracle
3) create a new db
4) create profiles, roles, tablespaces, users on the new db
5) grant dba to public !!! yes. a bit creasy, but it is convenient to do the import without warning/errors.
7) create the public synonym, public database link, privileges
8) revoke dba from public (!)
9) recompile the db
Well, I have written all that in a script, so migrating a db is no longer a problem to me I can do 7.3 –> 10.2 migration. And I am sure my db is clean. I have undo and temporary tablespace. I can have Java or ASM. I have only 10.2 system objects in my 10.2 database. Since I am using exp/imp, it is no problem to change os/server/domain/bitwordsize.