背景
某项目接口采用plsql开发,接口返回用户密码,但要求密码不能是明文返回,因为程序内部需要用到明文密码,所以只能在plsql中对密码进行对称加密,在程序内部进行解密,程序采用java开发。
实现
dbms_crypto是oracle自带的加密包,包含多种加密解密方法,非dba用户需要授权才能进行使用
grant execute on dbms_crypto to xxx;
下面是一个通过DES
算法加密的function
function encrypt_password(p_password in varchar2) return varchar2 is
v_key varchar2(32) := 'TucM2fYDaxnd1UeRL7HVvyshXvXaMKO9';
v_encrypted_raw RAW(256);
begin
v_encrypted_raw := dbms_crypto.Encrypt(src => UTL_RAW.CAST_TO_RAW(p_password),
typ => DBMS_CRYPTO.DES_CBC_PKCS5,
iv=>UTL_RAW.CAST_TO_RAW('12345678'),
key => UTL_RAW.CAST_TO_RAW(v_key));
return utl_raw.cast_to_varchar2(utl_encode.base64_encode(v_encrypted_raw));
end;
DES
介绍
在Oracle BPM中如何动态指定审批人,你可能觉得这问题很简单,在UserTask前面加上获取人员的Service就行了,这个也是一般做法,如图
在Service里可以调用第三方接口也可以调用存储过程,但如果这里想调用java代码该如何实现?有两个方案
- 把代码发布成webservice或者rest接口,通过service进行调用
- 借助script组件,script可以执行java代码,如图
把代码发布成webservice,增加了工作量,也增加了系统的复杂度,动态获取审批人问题变成了第三方系统集成问题,script组件的引入污染了流程图,试想如果每个节点都需要同样的计算逻辑,那么在每个节点前面都需要加上script组件,不仅不利于后期维护,而且也会影响最终给用户的流程图,影响流程图的美观。那有办法两者兼得吗,最近在看老外做的一个bpm项目,发现了一个解决方案。
Read the rest of this entry
背景
之前发表过一篇Oracle 12c RAC到单机数据迁移的文章,介绍了Oracle 12c从RAC到单机的数据迁移过程,本文在此基础上继续介绍从单机到RAC的迁移过程。
阅读本文之前建议先阅读Oracle 12c RAC到单机数据迁移了解相关知识点
实现
下文远程数据库指的是需要迁移的远程数据库,本地数据库指的是迁入的目标数据库
rac
背景
某项目数据库磁盘告警,磁盘使用率接近100%
$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 99G 60G 35G 64% /
devtmpfs devtmpfs 32G 0 32G 0% /dev
tmpfs tmpfs 32G 69M 32G 1% /dev/shm
tmpfs tmpfs 32G 7.8M 32G 1% /run
tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/vdc1 ext4 99G 94G 52M 100% /u01/oracle
/dev/vdb4 ext3 99G 30G 64G 32% /soa
tmpfs tmpfs 6.3G 0 6.3G 0% /run/user/1002
tmpfs tmpfs 6.3G 52K 6.3G 1% /run/user/1003
tmpfs tmpfs 6.3G 0 6.3G 0% /run/user/1005
可以看到/dev/vdc1
使用率已经100%
Read the rest of this entry
运维攻坚
背景
某项目需要对生产环境数据库进行数据迁移,需要迁移的数据库版本为12.2.0.1.0
RAC双节点,目标数据库为单实例数据库,版本一样。简单一句话就是,需要将数据从rac迁移到单机。
方案
本次尝试过以下三种方案
- 通过rman进行备份迁移,但因为rac数据库和单机数据库控制文件spfile存在差异,需要手动修改的地方较多,在迁移过程中并不顺利,考虑到数据的一致性,最后放弃该方案。方案可以参考Steps to restore from RAC to Single Instance (RMAN)
- 通过expdp和impdp数据泵方式进行迁移,方案可以参考Oracle 12c pdb使用expdp/impdp导入导出,impdp导入时出现较多错误,错误都集中其中一个schema上,最后单独对该schema进行导入,但因为错误太多不排除其他schema出现错误,也是考虑到数据的完整性,最后虽然成功导入但还是放弃该方案。
- 通过oracle 12c新特性克隆远程数据库的方案对数据进行迁移,cdb和pdb是oracle 12c的一个新特性,允许oracle数据库以多租户多实例方式运行,每个用户可以分配一个cdb(相当于一台数据库主机),每个cdb可以创建多个pdb(pluggable database,可插拔数据库),不同数据库之间pdb可以克隆。
Read the rest of this entry
oracle, rac
背景
最近需要给一个项目做数据备份,由于数据量较小(一百多兆)就没考虑用rman之类的工具进行备份,直接用数据泵(expdp)进行导出,然后将数据本地存储。脚本写好后,通过crontab进行定时调用即可,问题就出在crontab上,手动执行脚本是可以正常运行,通过crontab就不行。
expdb
同步脚本逻辑比较简单,脚本如下:
#!/bin/bash
file=DB_$(date +%Y%m%d).dmp
echo "dump file ==>"$file
expdp system/password schemas=FND,FUSION directory=DB_DUMP_DIR dumpfile=$file
cd /u01/dump
zip $file.zip $file
find /u01/dump/ -name "*.zip" -mtime +5 -exec rm {} \;
find /u01/dump/ -name "*.dmp" -exec rm {} \;
scp $file.zip oracle@172.10.10.1:/home/oracle/db_db_backup
ssh oracle@172.10.10.1 find /home/oracle/db_db_backup -name "*.zip" -mtime +30 -exec rm {} \;
Read the rest of this entry
expdb
DB Time
物理CPU和逻辑CPU
首先得理解物理cpu和逻辑cpu的区别
物理cpu
比较好理解,就是主板上有几个cpu就有多少个物理CPU,没颗物理cpu有1个或者多个物理内核,每个内核都可以作为单独cpu使用,为了和物理cpu区分开,内核的cpu成为逻辑cpu,因此
逻辑cpu = 物理cpu * cpu核数
在开启超线程后,逻辑cpu计算如下:
逻辑cpu = 物理cpu * cpu核数 * 2
Read the rest of this entry