您的位置:首页 > 数据库 > Oracle

oracle将一个用户下的所有表复制到以一个用户下

2016-07-13 13:21 791 查看
在测试过程中,一般为了让测试环境与开发环境隔离,一般要球测试环境对应的数据库也与开发环境进行隔离

这时候我的做法是:先创建一个用于测试环境的用户,然后将开发环境中该用户对应的表及数据导出,再导入到测试用户下

具体实现步骤:

方式一:

创建测试用户,并赋权限(看需要是否需要创建表空间)--》》》然后可直接使用imp命令将开发环境用户下的所有表及数据,包括约束,存储过程,触发器导出为一个dmp文件,然后使用exp命令将该文件导入到测试用户下即可

--创建表空间

CREATE TABLESPACE "TBS_KFMH_DAT01" DATAFILE 

  '/+DG_DATA/kfmh_dat01' SIZE 204800000

  LOGGING ONLINE PERMANENT BLOCKSIZE 8192

  EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT 

 NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO

--/+DG_DATA/kfmh_dat002为oracle的数据文件路径

--TBS_KFMH_DAT01为表空间名称

---创建用户

create user kfmhDev identified by kfmhDev

  default tablespace TBS_KFMH_DAT01

  temporary tablespace TEMP

  profile DEFAULT

  password expire;

  

--赋权限

-- Grant/Revoke object privileges 

grant execute on DBMS_JOB to kfmhDev;

grant execute on DBMS_RANDOM to kfmhDev;

-- Grant/Revoke role privileges 

grant connect to kfmhDev;

-- Grant/Revoke system privileges 

grant alter session to kfmhDev;

grant create cluster to kfmhDev;

grant create materialized view to kfmhDev;

grant create procedure to kfmhDev;

grant create sequence to kfmhDev;

grant create session to kfmhDev;

grant create synonym to kfmhDev;

grant create table to kfmhDev;

grant create trigger to kfmhDev;

grant create type to kfmhDev;

grant create view to kfmhDev;

grant execute any procedure to kfmhDev;

grant execute any type to kfmhDev;

grant force transaction to kfmhDev;

grant select any table to kfmhDev;

grant unlimited tablespace to kfmhDev;

---查看表空间大小及使用情况

SELECT a.tablespace_name "表空间名", 

total "表空间大小", 

free "表空间剩余大小", 

(total - free) "表空间使用大小", 

total / (1024 * 1024 * 1024) "表空间大小(G)", 

free / (1024 * 1024 * 1024) "表空间剩余大小(G)", 

(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)", 

round((total - free) / total, 4) * 100 "使用率 %" 

FROM (SELECT tablespace_name, SUM(bytes) free 

FROM dba_free_space 

GROUP BY tablespace_name) a, 

(SELECT tablespace_name, SUM(bytes) total 

FROM dba_data_files 

GROUP BY tablespace_name) b 

WHERE a.tablespace_name = b.tablespace_name 

select * from user_tables;

select * from user_tables where num_rows!=0;

--查询外键列表

select * from user_constraints c where c.constraint_type = 'R';

--查询所有索引

select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name

--查询触发器 

SELECT NAME FROM USER_SOURCE WHERE TYPE = 'TRIGGER' GROUP BY NAME

--导出用户下的所有表结构及数据

--进入到oracle所在服务器(通常为linux)

--进入linux

--# su - oracle

--导出某个用户下的所有数据

--$ exp sys/oracle\"@kfmh\" file=kfmhTest.dmp owner=kfmhTest log=exp_kfmhTest.log

只导出数据对象,不导出数据 (rows=n )





--向某个用户导入数据

--$ imp sys/oracle\"@kfmh\" file=kfmhTest.dmp log=imp_kfmhDev.log fromuser=kfmhTest touser=kfmhDev commit=y ignore=y





方式二:

我给人的项目由于表众多,且不同表之间的关联性比较强,使用第一张方式导出表数据的时候会报错,此时我是按照分布导出的方式进行的:

步骤如下:

创建测试用户,并赋权限(看需要是否需要创建表空间)--》》》然后导出表结构,导出表数据--》》》在导入到测试用户时,是先将表结构和主键导入,然后导入数据,再导入表存储过程,触发器,最后导入外键

传送门:

3. 三种模式 
    (1)表方式,将指定表的数据导出/导入。 
    导出:导出一张或几张表:$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2 
    导出某张表的部分数据 
    $ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1 query=\“where col1=\‘…\’and col2 \<…\” 
    导入:导入一张或几张表 
    $ imp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1, 
    table2 fromuser=dbuser touser=dbuser2 commit=y ignore=y 
    (2)用户方式,将指定用户的所有对象及数据导出/导入。 
    导出:$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=(xx, yy) 
    只导出数据对象,不导出数据 (rows=n ) 
    $ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=user rows=n 
    导入:$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2 
    commit=y ignore=y 
    (3)全库方式,将数据库中的所有对象导出/导入导出: 
    $ exp user/pwd file=/dir/xxx.dmp log=xxx.log full=ycommit=y ignore=y 
    导入:$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: