使用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";

时间: 2024-08-21 02:08:48

使用shell批量生成数据整合式迁移的脚本的相关文章

数据整合式迁移的一些总结

   说起数据迁移,感觉也算是有些感受了,但是最近参与的几个迁移案例还是和以前大大不同,以前的迁移项目是比拼停机维护时间,尽可能在短时间诶导入大批量的数据,有参与表空间传输的场景,还有跨平台的数据迁移,数据库迁移式升级等等,相对难度大一些的算是增量数据的迁移场景.为此也算把sqlldr,datapump和exp/imp玩了一圈,最后写了一个小的工具使用外部表迁移,也算是有了一些谈资.    最近的迁移项目还是有些特殊,有schema级别的迁移,这种情况数据库版本的影响就没有那么大了,基本就是sc

linux中shell批量添加用户和设置随机密码脚本

有一个朋友问我如何批量创建用户和设置密码 ,我就简单给他写了两个脚本,让他自己参考下并自己根据实际情况进行修改,毕竟他需要的用户名和密码都是实际生产环境的. 这里分两种情况,一种是测试for循环批量添加用户,一个是根据实际生产环境进行批量添加.分别写一下案例如下: 1,for添加指定类型用户以及设置随机密码. 脚本作用:批量添加user1-10用户并设置随机8位数随机密码 #!/bin/bash #test add user and set passwd for n in `seq 10` do

SQL Server生成数据发布的INSERT语句

[问题]DB结构的发布,SQL Server的管理器可以生成脚本:那么数据如何发布呢? [思路]生成INSERT INTO ... VALUES...语句 /*-- ============================================= -- Author: Yew -- Create date: 2012-05-18 -- Description: 生成数据发布的INSERT脚本 ----TestCode--------------------------- EXEC [T

批量生成sqlldr文件,高速卸载数据

      SQL*Loader 是用于将外部数据进行批量高速加载的数据库的最高效工具,可用于将多种平面格式文件加载到Oracle数据库.SQL*Loader支持传统路径模式以及直接路径这两种加载模式.关于SQL*Loader的具体用法可以参考Oracle Utilities 手册或者SQL*Loader使用方法.那么如何以SQL*Loader能识别的方式高效的卸载数据呢? Tom大师为我们提供了一个近乎完美的解决方案,是基于exp/imp,Datapump方式迁移数据的有力补充.本文基于此给出

将表里的数据批量生成INSERT语句的存储过程 增强版_MsSql

有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件来生成INSERT语句的,只有借助第三方工具(third party tools) 这种脚本网上也有很多,但是网上的脚本还是欠缺一些规范和功能,例如:我只想导出特定查询条件的数据,网上的脚本都是导出全表数据 如果表很大,对性能会有很大影响 这里有一个存储过程(适用于SQLServer2005 或以上版本) -- Author: <桦仔> -- Blog

Shell脚本实现批量生成nagios配置文件_linux shell

如果管理的站点和服务器较多的情况下,每次修改配置文件都相当痛苦.因而想到了用shell脚本来批量生成配置文件和配置数据.下面这个脚本是为了批量生成nagios监控配置文件的一个shell脚本程序.其原理是事先定义一个shell脚本模板,然后每个需要监控的站点复制一份模板替换掉模板文件里面的变量. 1.准备模板文件webcheck.template more webcheck.template ###################WEBURL define start##############

用shell脚本在mysql表中批量插入数据的方法_linux shell

很多时候需要在mysql表中插入大量测试数据,下面分享一个用shell脚本通过while循环批量生成mysql测试数据的方法,你只需要根据你自己的表结构来生成sql语句即可. 复制代码 代码如下: #!/bin/bash i=1;MAX_INSERT_ROW_COUNT=$1;while [ $i -le $MAX_INSERT_ROW_COUNT ]do    mysql -uroot -proot afs -e "insert into afs_test (name,age,createTi

将表里的数据批量生成INSERT语句的存储过程 增强版

有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件来生成INSERT语句的,只有借助第三方工具(third party tools) 这种脚本网上也有很多,但是网上的脚本还是欠缺一些规范和功能,例如:我只想导出特定查询条件的数据,网上的脚本都是导出全表数据 如果表很大,对性能会有很大影响 这里有一个存储过程(适用于SQLServer2005 或以上版本) -- Author: <桦仔> -- Blog

处理数据批量生成sql插入语句

最近在做一个天气预报模块,首先需要将客户端公网ip转换成所在城市,然后将所在城市名转换成对应的城市代码, 在网上找到了城市代码,但是需要处理一下,看了看,有三百多城市及对应的城市代码,想存到数据库.就想着做一个 数据处理自动生成sql语句的工具,提高效率. 直辖市 "北京","上海","天津","重庆" "101010100","101020100","101030100&qu