使用shell批量產生資料整合式遷移的指令碼

來源:互聯網
上載者:User

使用shell批量產生資料整合式遷移的指令碼

對於資料整合式遷移,基本就是小霸王的變形平板,四合一,八合一這樣的節奏,把幾個儘可能相關業務的資料庫中的資料整合到一個庫裡。彼此還是獨立的schema,倒也是相安無事。

在這種整合式遷移中,比較讓人糾結的部分就是效能不是排第一位,而是遷移前的準備比較瑣碎。

如果環境中有大量的db link,那就好像蜘蛛網一般,每個環境之間都有著千絲萬縷的聯絡,如果準備不當,出了一點小的差錯,那可能就是傷筋動骨的影響了。或者環境中存在這大量的串連使用者,有的環境關聯業務多,串連使用者可能幾十上百個。這個時候準備指令碼的時候就感覺非常的繁瑣,比如在得到的使用者建立語句前,首先要得到資料表空間的ddl,profile的ddl等。

有的環境存在大量的測試使用者,或者臨時使用者,這些使用者的資料可能因為曆史的原因,已經無人認領了。但是裡面又存在著一些資料,不遷移,怕隔一段時間發現問題就晚了,遷移的話,感覺這些資料可能佔用了不少遷移的時間,有種雞肋的感覺。

如果存在多套環境,得到了每套環境的資料表空間ddl,如果不加選擇的匯入目標環境,那麼很有可能一部分資料表空間是重名的,為了嚴謹期間,還是需要事先做對比。

如果有一些環境需要遷移,而每次都需要走這些彎路,就可以指令碼化來簡化這部分工作,將來兵擋水來土掩。

所以鑒於此,就抽時間寫了下面的shell指令碼。指令碼內容如下,大體的思路就是動態調用一些通用的檢查項目,比如檢查資料表空間,就會把源庫,目標庫的資料表空間做一個比對,如果在目標庫不存在,就產生對應的ddl語句。在這個基礎上進一步產生需要遷移的使用者profile資訊,使用者的ddl語句和許可權語句。更多的對象許可權的資訊則是計劃通過dump的形式匯入。

function check_ts
 {
 sqlplus -s $1 <<EOF
 set pages 0
 set feedback off
 set linesize 100
 col tablespace_name format a30
 select tablespace_name from dba_tablespaces;
 EOF
 }

 function gen_ts_ddl
 {
 sqlplus -s $1 <<EOF
 set pages 0
 set feedback off
 set linesize 200
 set long 99999
 col TS_DDL format a150
 exec dbms_metadata.set_transform_param( dbms_metadata.session_transform, 'STORAGE', FALSE);
 select dbms_metadata.get_ddl('TABLESPACE', '$2')||';' TS_DDL from dual;
 EOF
 }

 function check_user
 {
 sqlplus -s $1 <<EOF
 set pages 0
 set feedback off
 set linesize 100
 col tablespace_name format a30
 select username from dba_users;
 EOF
 }

 function gen_user_ddl
 {
 sqlplus -s $1 <<EOF
 set pages 0
 set feedback off
 set linesize 200
 set long 99999
 col TS_DDL format a200
 select dbms_metadata.get_ddl('PROFILE', profile)||';' TS_DDL from dba_profiles where profile in (select profile from dba_users where username=upper('$2')) and profile!='DEFAULT' and rownum<2;
 select dbms_metadata.get_ddl('USER', '$2')||';' TS_DDL from dual;
 --select dbms_metadata.get_granted_ddl('SYSTEM_GRANTS', '$2') TS_DDL from dual;
 select dbms_metadata.get_granted_ddl('ROLE_GRANT', '$2') ||';'TS_DDL from dual;
 --select dbms_metadata.get_granted_ddl('OBJECT_GRANT', '$2') TS_DDL from dual;
 EOF
 }

 BASE_DIR='/home/Oracle/data_mig'

 if [[ -z $1 ]] || [[ -z $2 ]]; then
 echo '***********************************************'
 echo 'WARNING :Source And Target Conn details are Needed!'
 echo '***********************************************'
 exit
 fi

 source_alias=`echo $1|awk -F@ '{print $1"_"$2}'|awk -F\/ '{print $2}'`
 target_alias=`echo $2|awk -F@ '{print $1"_"$2}'|awk -F\/ '{print $2}'`

 function diff_run
 {
 opr_type=$1
 check_${opr_type} $2 |sort> ${BASE_DIR}/source_${opr_type}_${source_alias}.lst
 check_${opr_type} $3 |sort> ${BASE_DIR}/target_${opr_type}_${target_alias}.lst
 diff ${BASE_DIR}/source_${opr_type}_${source_alias}.lst  ${BASE_DIR}/target_${opr_type}_${target_alias}.lst|grep \<|sed  -e 's/<//g' -e 's/ //g' > ${BASE_DIR}/target_${opr_type}_diff.lst

 for tmp_opr_type in `cat ${BASE_DIR}/target_${opr_type}_diff.lst |awk '{print $1}'` ;
 do
  echo "#"${tmp_opr_type}
  gen_${opr_type}_ddl $2 ${tmp_opr_type}
 done
 }
 ###MAIN
 diff_run ts $1 $2
 diff_run user $1  $2
比如運行指令碼
sh data_mig_pre.sh xxxx/xxx@source xxxx/xxx@target
得到的結果如下,包含資料表空間,profile資訊,使用者的ddl和許可權語句等,看起來著實簡化了不少,而且可以隨時產生。
#ORDERMOB_INDEX
  CREATE TABLESPACE "ORDERMOB_INDEX" DATAFILE
  '/U01/app/oracle/oradata/ordermob0/ordermob_index01.dbf' SIZE 1073741824
  AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M
  LOGGING ONLINE PERMANENT BLOCKSIZE 8192
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
  NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO
    ALTER DATABASE DATAFILE
  '/U01/app/oracle/oradata/ordermob0/ordermob_index01.dbf' RESIZE 7784628224;
    CREATE PROFILE "PF_APP_ORDERMOB_STAT"
    LIMIT
          COMPOSITE_LIMIT DEFAULT
          SESSIONS_PER_USER 50
          CPU_PER_SESSION DEFAULT
          CPU_PER_CALL DEFAULT
          LOGICAL_READS_PER_SESSION DEFAULT
          LOGICAL_READS_PER_CALL DEFAULT
          IDLE_TIME DEFAULT
          CONNECT_TIME DEFAULT
          PRIVATE_SGA DEFAULT
          FAILED_LOGIN_ATTEMPTS DEFAULT
          PASSWORD_LIFE_TIME DEFAULT
          PASSWORD_REUSE_TIME DEFAULT
          PASSWORD_REUSE_MAX DEFAULT
          PASSWORD_VERIFY_FUNCTION DEFAULT
          PASSWORD_LOCK_TIME DEFAULT
          PASSWORD_GRACE_TIME DEFAULT ;
    CREATE USER "APP_ORDERMOB_STAT" IDENTIFIED BY VALUES 'xxxx'
      DEFAULT TABLESPACE "USERS"
      TEMPORARY TABLESPACE "TEMP"
      PROFILE "PF_APP_ORDERMOB_STAT";
    GRANT "CONNECT" TO "APP_ORDERMOB_STAT";

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.