我们在做逻辑数据泵全库导出的时候, 有两种流行的写法, 一种是 sys 用户导出, 一种是使用 system 用户导出.
现在想知道二者之间有什么区别? 实验验证之前不妨先思考一下:
sys 和 system 用户的权限区别;
你之前习惯使用的是哪种? 当时选择的原因是?
1. 准备测试环境:
Oracle 10.2.0.5
使用模拟业务最小测试用例 02初始化数据, 另外手工在 sys 和 system 用户下各自创建一些表, 索引, 同义词等对象.
2. 测试验证:
测试命令:
-- 创建 directory
- $ mkdir -p /public/xdump
- SQL> create directory xdump as '/public/xdump';
--sys 用户导出全库, sys 导入指定 sqlfile 参数, 生成脚本后续对比使用
$ expdp \'/ as sysdba\' directory=xdump dumpfile=full_sys_%U.dmp logfile=full_sys.log full=y parallel=2
$ impdp \'/ as sysdba\' directory=xdump dumpfile=full_sys_%U.dmp logfile=full_sys_impdp.log full =y sqlfile=full_sys.sql
--system 用户导出全库, system 导入指定 sqlfile 参数, 生成脚本后续对比使用
$ expdp system directory=xdump dumpfile=full_system_%U.dmp logfile=full_system.log full=y parallel=2
$ impdp system directory=xdump dumpfile=full_system_%U.dmp logfile=full_system_impdp.log full =y sqlfile=full_system.sql
生成的文件如下:
- [oracle@rac1-server xdump]$ ls -lrth
- total 801M
- -rw-rw---- 1 501 1000 7.4M Jun 2 13:37 full_system_02.dmp
- -rw-rw---- 1 501 1000 376M Jun 2 13:37 full_system_01.dmp
- -rw-rw---- 1 501 1000 7.4M Jun 2 13:37 full_sys_02.dmp
- -rw-rw---- 1 501 1000 376M Jun 2 13:37 full_sys_01.dmp
- -rw-rw-rw- 1 501 1000 81K Jun 2 13:37 full_sys.log
- -rw-rw-rw- 1 501 1000 81K Jun 2 13:37 full_system.log
- -rw-rw-rw- 1 501 1000 18M Jun 2 13:40 full_sys.sql
- -rw-rw-rw- 1 501 1000 4.9K Jun 2 13:40 full_sys_impdp.log
- -rw-rw-rw- 1 501 1000 18M Jun 2 13:40 full_system.sql
- -rw-rw-rw- 1 501 1000 5.0K Jun 2 13:40 full_system_impdp.log
可以通过 diff 命令对比 full_sys.sql 和 full_system.sql 两个文件内容:
发现创建的对象一致, 文件内容不一样的都是 owner 本身的一些信息.
进一步通过手工创建的一些对象进行搜索, 发现:
使用 sys 和 system 导出都可以看到 system 下面的对象;
使用 sys 和 system 导出都看不到 sys 下面都对象;
3. 总结:
也就是说, 使用 sys 或者 system 用户, 二者导出全库的对象实际上本质没什么区别.
就算管理特别不规范, 在 SYS 用户下创建了业务对象. 那么使用 SYSTEM 和 SYS 两种方式默认都是导不出来的.
只是 system 导出一定需要输入密码, sys 则不一定 (本例中 sys 导出就没有使用密码).
这时, 有好奇的同学就会问了, 那么如果想导出 sys 下的某些表怎么办呢? 正好之前自己也遇到的一个案例:
Oracle 如何导出 sys 用户下的系统表
附: 本文中, 手工在 sys 和 system 用户下各自创建一些表, 索引, 同义词等对象
- #----sys 用户创建
- --table&index
- create table sys_test as select * from dba_objects;
- create index idx_sys_test on sys_test(object_id);
- --table&trigger
- create table sys_emp as select * from scott.emp;
- create table sys_aud_salary_history(
- empno NUMBER(4),
- old_sal NUMBER(7,2),
- new_sal NUMBER(7,2),
- change_time varchar2(50)
- );
create or replace trigger tri_sys_sal after update
- on sys_emp
- for each row
- begin
- insert into sys_aud_salary_history VALUES
- (:OLD.empno, :OLD.sal, :NEW.sal, TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'));
- end;
- /
-- 这里发现 sys 用户无法创建 owner 为 sys 的触发器, 忽略.
- --synonym
- create synonym sysemp for scott.emp;
- --------------------------------------------------------------------------------------------
- --------------------------------------------------------------------------------------------
- #----system 用户创建
- conn system/oracle
- --table&index
- create table system_test as select * from dba_objects;
- create index idx_system_test on system_test(object_id);
- --table&trigger
- create table system_emp as select * from scott.emp;
- create table system_aud_salary_history(
- empno NUMBER(4),
- old_sal NUMBER(7,2),
- new_sal NUMBER(7,2),
- change_time varchar2(50)
- );
- create or replace trigger tri_system_sal after update
- on system_emp
- for each row
- begin
- insert into system_aud_salary_history VALUES
- (:OLD.empno, :OLD.sal, :NEW.sal, TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss'));
- end;
- /
- --synonym
- create synonym systememp for scott.emp;
来源: https://www.cnblogs.com/jyzhao/p/9125393.html