描述:如何在不同数据库或者同一个数据库内复制用户结构,下面以不同数据库为例,且表空间不同。
1.方法一:使用exp/imp
1.1源库导出结构
$ export ORACLE_SID=testa
$ sqlplus \'/ as sysdba\'
--用户占用的表空间
SQL>select tablespace_name,sum(bytes)/1024/1024 from dba_segments where wner = 'TESTUSER' group by tablespace_name;
TABLESPACE_NAME SUM(BYTES)/1024/1024
------------------------------ --------------------
TBS_INDEX 10560
TBS_DATA 2
--用户的对象数量
SQL> select object_type,count(*) from dba_objects where wner='TESTUSER' group by rollup(object_type);
OBJECT_TYPE COUNT(*)
------------------- ----------
DATABASE LINK 1
INDEX 6
TABLE 25
VIEW 5
37
--导出用户结构
$ exp \'/ as sysdba\' wner=testuser rows=n file=testuser.dmp
1.2将dmp文件ftp到目标数据库主机(可选)
1.3生成表和索引的SQL脚本
$ export ORACLE_SID=testb
--目标库表空间空闲情况
SQL> select tablespace_name,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;
TABLESPACE_NAME SUM(BYTES)/1024/1024
------------------------------ --------------------
SYSTEM 3.25
TBS_DATA 75815.5625
USERS 4.5625
SYSAUX 7.25
UNDOTBS1 1817.5625
--建用户
SQL> create user TESTUSER identified by TESTUSER default tablespace tbs_data temporary tablespace temp;
SQL> grant connect,resource,select any table,debug connect session to TESTUSER;
--生成建表和索引SQL文件
$ imp \'/ as sysdba\' fromuser=TESTUSER touser=TESTUSER indexfile=TESTUSER_create.sql
--将源表空间替换成目标表空间
$ vi TESTUSER_create.sql
:g/REM /s//
:g/TBS_INDEX/s//TBS_DATA/g
1.4创建表和索引,导入其他对象
$ sqlplus "/ as sysdba" @TESTUSER_create.sql
$ imp \'/ as sysdba\' fromuser=TESTUSER touser=TESTUSER ignore=y
--统计用户对象,核查是否和源用户对象一致
SQL> select object_type,count(*) from dba_objects where wner='TESTUSER' group by rollup(object_type);
OBJECT_TYPE COUNT(*)
------------------- ----------
DATABASE LINK 1
INDEX 6
TABLE 25
VIEW 5
37
2.方法二:使用expdp/impdp
2.1expdp导出用户结构
$ export ORACLE_SID=testa
$ expdp \'/ as sysdba\' content=metadata_only schemas=TESTUSER DIRECTORY=dir_test dumpfile=TESTUSER.dmp
2.2将dmp文件ftp到目标数据库主机
2.3impdp导入用户结构
$ export ORACLE_SID=testb
$ impdp \'/ as sysdba\' content=metadata_only schemas=TESTUSER DIRECTORY=dir_test dumpfile=TESTUSER.dmp REMAP_TABLESPACE=tbs_index:tbs_data
注:这里可以使用network_link参数,一步到位复制用户。