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

时间:2022-04-30 09:38:39

在测试过程中,一般为了让测试环境与开发环境隔离,一般要球测试环境对应的数据库也与开发环境进行隔离

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

具体实现步骤:

方式一:

创建测试用户,并赋权限(看需要是否需要创建表空间)--》》》然后可直接使用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 )
oracle将一个用户下的所有表复制到以一个用户下

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



--向某个用户导入数据
--$ imp sys/oracle\"@kfmh\" file=kfmhTest.dmp log=imp_kfmhDev.log fromuser=kfmhTest touser=kfmhDev commit=y ignore=y

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

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


方式二:

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

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




传送门:

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