在测试过程中,一般为了让测试环境与开发环境隔离,一般要球测试环境对应的数据库也与开发环境进行隔离
这时候我的做法是:先创建一个用于测试环境的用户,然后将开发环境中该用户对应的表及数据导出,再导入到测试用户下
具体实现步骤:
方式一:
创建测试用户,并赋权限(看需要是否需要创建表空间)--》》》然后可直接使用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