前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实验验证sys和system用户全库导出的区别

实验验证sys和system用户全库导出的区别

作者头像
Alfred Zhao
发布2022-05-06 15:16:51
3850
发布2022-05-06 15:16:51
举报

我们在做逻辑数据泵全库导出的时候,有两种流行的写法,一种是sys用户导出,一种是使用system用户导出。 现在想知道二者之间有什么区别?实验验证之前不妨先思考一下:

  • sys和system用户的权限区别;
  • 你之前习惯使用的是哪种?当时选择的原因是?

1.准备测试环境: Oracle 10.2.0.5 使用《模拟业务最小测试用例02》初始化数据,另外手工在sys和system用户下各自创建一些表、索引、同义词等对象。

2.测试验证: 测试命令:

代码语言:javascript
复制
--创建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

生成的文件如下:

代码语言:javascript
复制
[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下的某些表怎么办呢?正好之前自己也遇到的一个案例:

附:本文中,手工在sys和system用户下各自创建一些表、索引、同义词等对象

代码语言:javascript
复制
#----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;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档