使用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";
在這種整合式遷移中,比較讓人糾結的部分就是效能不是排第一位,而是遷移前的準備比較瑣碎。
如果環境中有大量的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";
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2065538/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料遷移指令碼的快速生成指令碼
- 資料遷移指令碼指令碼
- MySQL 批量更新、刪除資料shell指令碼MySql指令碼
- shell指令碼批量操作使用者指令碼
- 使用SqlBulkCopy批量插入或遷移資料(轉)SQL
- 資料整合式遷移的一些總結
- 通過shell指令碼批量操作mysql資料庫指令碼MySql資料庫
- iOS使用shell指令碼批量修改屬性iOS指令碼
- 巧用shell生成資料庫檢查指令碼資料庫指令碼
- 批量生成DDL指令碼指令碼
- [Shell] Shell 生成 HTML指令碼HTML指令碼
- 資料遷移(1)——通過資料泵表結構批量遷移
- 使用shell 指令碼備份資料指令碼
- 通過shell指令碼 批量新增使用者指令碼
- iOS使用Shell指令碼批量修改類名稱iOS指令碼
- 使用shell指令碼生成只讀許可權的sql指令碼指令碼SQL
- 透過shell指令碼生成查詢表資料的sql指令碼SQL
- 通過shell指令碼生成查詢表資料的sql指令碼SQL
- 巧用shell指令碼生成快捷指令碼指令碼
- sqoop指令碼批量生成OOP指令碼
- 海量資料轉換遷移的程式碼自動生成
- 【遷移】使用rman遷移資料庫資料庫
- 通過shell指令碼生成資料統計資訊的報表指令碼
- 透過shell指令碼生成資料統計資訊的報表指令碼
- shell指令碼建立使用者及批量建立使用者指令碼
- 使用shell生成orabbix自動化配置指令碼指令碼
- 【資料遷移】使用傳輸表空間遷移資料
- MySQL資料庫遷移與MySQL資料庫批量恢復MySql資料庫
- 【HIVE】hive 使用shell指令碼跑歷史資料Hive指令碼
- 巧用shell指令碼分析資料庫使用者指令碼資料庫
- 使用shell指令碼替換csv檔案中的資料指令碼
- 海量資料遷移之透過shell估算資料量
- 海量資料遷移之通過shell估算資料量
- 【AWR】Oracle批量生成awr報告指令碼Oracle指令碼
- 儲存過程批量生成awr指令碼儲存過程指令碼
- 轉貼:批量生成awr報告指令碼指令碼
- 利用shell指令碼生成動態sql指令碼SQL
- 資料匯出shell指令碼(上)指令碼