使用shell批量生成数据整合式迁移的脚本(r8笔记第52天)
对于数据整合式迁移,基本就是小霸王的二合一,四合一,八合一这样的节奏,把几个尽可能相关业务的数据库中的数据整合到一个库里。彼此还是独立的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";
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python爬虫实战 批量下载高清美女图片
- Python matplotlib数据可视化 绘制柱形图、堆叠图、折线图、饼图和环图
- Python Matplotlib数据可视化 绘制箱形图、散点图和直方图
- 【Lighthouse教程】scrapy爬虫初探
- Python爬虫 爬取B站视频弹幕 + 绘制词云
- Python爬虫学习笔记 asyncio+aiohttp 异步爬虫原理和解析
- Python数据分析 利用NetworkX绘制网络图
- Python爬虫练习 爬取网络小说保存到txt
- Python爬取链家成都二手房源信息 asyncio + aiohttp 异步爬虫实战
- Python matplotlib数据可视化 subplot绘制多个子图
- python pathlib模块的基本使用和总结
- Python 爬取前程无忧最新招聘数据 matplotlib数据分析与可视化
- Python opencv图像处理基础总结(一)
- Python opencv图像处理基础总结(二) ROI操作与泛洪填充 模糊操作 边缘保留滤波EPF
- python asyncio+aiohttp异步请求 批量快速验证代理IP是否可用