最近一直在考虑oracle数据自动备份到本地的问题,也找机会当面向大牛请教过,得到了一堆关于DG、GG、RAC、DBLINK、ARCHLOG等方面的建议,还有个哥们直接建议我用redis实现。
但因为受服务器配置和网络带宽的限制,以上方法实现起来较繁琐,且有一定的学习成本(毕竟新技术发展太快,早就跟不上潮流了),而且nosql实现起来可能还需要进行二次开发来实现数据库的读写。
磨蹭了大半个月,终于决定还是选择自己最熟悉的批处理来实现异步备份到本地
思路如上图示:
数据库改造,将大表按天建立表分区
服务端定时exp前三天(天数自定)的表分区
将表分区压缩后放到ftp目录下(压缩比10%,相比其他同步方式可以节省90%的网络资源)
本地定时(自测服务端任务延时30分钟即可,需根据实际情况定)通过ftp方式下载指定压缩包到本地,解压后使用imp导入表分区
技术点:
表名及分区名为三天前日期,批处理不直接支持对date进行加减天数的操作,使用sqlplus运行固定脚本spool到文本1,然后typefind 输出唯一行到文本2,利用for/f 读取文本2获取日期参数到变量,exp时文件名直接调用日期变量即可;
批处理中for/f 读取多列文本时,只能定义首列变量名(单字符)如%i,默认第二列赋值到变量%j,依次递增;
exp导出时因为11G的延迟段特性,当同一大表某一表分区中无数据时会出现exp00003错误,无法对分区表直接使用ALTER TABLE XXX ALLOCATE EXTENT和ALTER TABLE XXX PARTITION XX ALLOCATE EXTENT的方式分配段信息,需要直接使用insert into为每个表分区插入一条数据,变相实现分配段的功能。
以上,在测试环境测试通过。
领取专属 10元无门槛券
私享最新 技术干货