1. 程式人生 > >實驗驗證sys和system用戶全庫導出的區別

實驗驗證sys和system用戶全庫導出的區別

www ble 最小 如何 total sysdba 用戶 change 用例

我們在做邏輯數據泵全庫導出的時候,有兩種流行的寫法,一種是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;

實驗驗證sys和system用戶全庫導出的區別