sql计算留存_SQL无所不能:DBA宝妈宝爸系列分享

原文链接:https://www.modb.pro/db/22315

目前程序从功能上其实已经完全满足客户(当然我这里的客户都是指媳妇儿)需求,具体可参考:

  • 使用SQL计算宝宝每次吃奶的时间间隔 - Part1:分析函数的使用
  • 使用SQL计算宝宝每次吃奶的时间间隔 - Part2:提升程序易用性

(扫描文章底部小程序码,查看上面两篇文章 )

那么本篇 使用SQL计算宝宝每次吃奶的时间间隔 - Part3:保障数据安全 存在的意义在哪呢?
原因很简单,就是因为我们作为技术人,实际需要考虑的要更多。比如本篇从数据保障层面,我们必须要考虑数据的一致性和安全性等。而且我们要很清楚,这些需求并不是客户不关注不需要,很可能只是因为客户并不知道可能会出现什么问题,不知道如果一旦出现硬件损坏、各类故障导致数据损坏或出现讹误时,我们目前的情况是恢复不了的,到时就只能被说成是技术差,甚至连带背各种锅。在这样的场景下,技术人再去狡辩说客户开始也压根没提这些安全性的数据保障需求啊,是没有人会站在技术这一边的,因为这些客户考虑不到的,恰恰是需要你来主动去提出去建议去实施的,这也是体现一位技术人专业性的关键所在。
下面以几个维度来展开说明:

  • 1. 程序备份
  • 2. 数据备份
  • 3. 数据实时同步
  • 4. 已知问题解决

1. 程序备份


场景:一旦程序所在主机故障,需要在新环境下重新部署程序时,程序备份的作用就体现出来了。

其实我这里程序所连接的底层数据库是Oracle RAC架构,可直接在RAC另一个节点部署一套程序。因为之前程序使用的文件默认在/home/oracle下,该目录还有很多其他与程序无关的文件,比较混乱,现考虑将程序整理到统一目录下整体打包,便于备份,遇到故障也可以方便快速重新部署。
我这里统一放置目录:/home/oracle/baby,并将程序按照当前版本号进行打包备份,最后拷贝备份的程序包到NAS留存。

1.1 统一放置目录:/home/oracle/baby

[oracle@jystdrac2 baby]$ pwd/home/oracle/baby[oracle@jystdrac2 baby]$ ls -lrthtotal 76K-rw-r--r-- 1 oracle oinstall  36 Dec 22 09:47 d1.sql-rw-r--r-- 1 oracle oinstall  71 Dec 22 09:47 i1.sql-rw-r--r-- 1 oracle oinstall  91 Dec 22 09:47 i2.sql-rw-r--r-- 1 oracle oinstall  59 Dec 22 09:47 u1.sql-rw-r--r-- 1 oracle oinstall 199 Dec 22 09:47 v1.sql-rw-r--r-- 1 oracle oinstall 218 Dec 22 09:47 v2.sql-rw-r--r-- 1 oracle oinstall 396 Dec 22 09:47 v3.sql-rw-r--r-- 1 oracle oinstall 465 Dec 22 09:47 v4.sql-rw-r--r-- 1 oracle oinstall 132 Dec 22 09:47 v_estimate.sql-rwxr-xr-x 1 oracle oinstall 302 Dec 22 09:54 baby_delete.sh-rwxr-xr-x 1 oracle oinstall 296 Dec 22 09:55 baby_insert.sh-rwxr-xr-x 1 oracle oinstall 335 Dec 22 09:55 baby_insert_diy.sh-rwxr-xr-x 1 oracle oinstall 545 Dec 22 09:56 baby_help.sh-rwxr-xr-x 1 oracle oinstall 305 Dec 22 09:57 baby_update.sh-rwxr-xr-x 1 oracle oinstall 293 Dec 22 09:57 baby_view.sh-rwxr-xr-x 1 oracle oinstall 252 Dec 22 09:58 baby_view_diy.sh-rw-r--r-- 1 oracle oinstall 244 Dec 22 13:30 bash_profile-rw-r--r-- 1 oracle oinstall 273 Dec 26 09:10 backup_exp_t_baby.sh-rw-r--r-- 1 oracle oinstall 154 Dec 26 09:53 readme[oracle@jystdrac2 baby]$ cd ..

1.2 将程序按照当前版本号进行打包备份

[oracle@jystdrac2 ~]$ tar -zcvf baby_v2.02.tar.gz baby/baby/baby/readmebaby/u1.sqlbaby/v4.sqlbaby/baby_view_diy.shbaby/d1.sqlbaby/v3.sqlbaby/baby_update.shbaby/v2.sqlbaby/v_estimate.sqlbaby/i1.sqlbaby/bash_profilebaby/baby_insert_diy.shbaby/baby_insert.shbaby/i2.sqlbaby/v1.sqlbaby/baby_help.shbaby/baby_view.shbaby/baby_delete.shbaby/backup_exp_t_baby.sh[oracle@jystdrac2 ~]$ ls -lrth baby_v2.02.tar.gz-rw-r--r-- 1 501 1000 1.9K Dec 26 11:46 baby_v2.02.tar.gz

1.3 最后拷贝备份的程序包到NAS留存

[oracle@jystdrac2 ~]$ cp baby_v2.02.tar.gz /public/backup/

2. 数据备份


场景:上面已经做了程序备份,但出现故障时我们只恢复程序是不够的,还需要之前产生的业务数据。所以我们还需要业务数据的备份。

可以采用exp/expdp定时逻辑备份,因为我这里数据量很小,所以直接采用更简单的exp备份。
比如每天12点使用exp备份出当前表t_baby的数据:
设置crontab定时任务:

[oracle@jystdrac2 ~]$ crontab -l0 12 * * * /bin/sh /home/oracle/baby/backup_exp_t_baby.sh

exp备份脚本:

[oracle@jystdrac2 ~]$ cat /home/oracle/baby/backup_exp_t_baby.shbackupdate=`date +%Y%m%d`export ORACLE_SID=demo2export ORACLE_BASE=/opt/app/oracleexport ORACLE_HOME=/opt/app/oracle/product/11.2.0/dbhome_1export PATH=$PATH:$ORACLE_HOME/binexp test/test tables=t_baby file=/public/backup/t_baby_$backupdate.dmp log=/public/backup/t_baby_$backupdate.log

备份出的文件类似这样:

[oracle@jystdrac2 backup]$ ls -lrth t_baby*-rw-rw-rw- 1 501 1000 626 Dec 26 12:00 t_baby_20191226.log-rw-rw-rw- 1 501 1000 16K Dec 26 12:00 t_baby_20191226.dmp

3. 数据实时同步


场景:如果只有上面步骤的定时逻辑备份,其实还是无法满足完全的数据恢复的。

比如今天中午12点做了备份,晚上18点出现了故障,数据丢失。通过逻辑备份只能恢复到今天中午12点的数据,而12点到18点之间的数据将会丢失。
如果采用物理RMAN备份呢?其实也同样存在这样的问题,因为日志归档并不是实时的,如果故障不可恢复,联机重做日志也丢失,RMAN也是不完全恢复到最近的归档日志,也同样会有丢失部分数据的风险。

那怎么办呢?如何进行数据实时同步到另外的环境呢?目前可以想到两种主流的解决方案:

  • 1)数据库DG实时同步
  • 2)数据表OGG同步

数据库DG实时同步是物理的方式,数据表OGG同步是逻辑的方式。
一般情况下,如果两个方案只能选择其一时,我们会强烈推荐客户选用物理方式的实时同步,因为逻辑方式按经验来看遇到的问题远比物理方式要高。而在我这个场景下,数据量很小,其实完全可以二者都选择。
至于DG和OGG环境搭建的部分我这里不再详细展开,如有问题,可参考之前的文章:

  • 模拟生产搭建Standby RAC实验环境(11.2.0.4 DG)(链接:https://www.cnblogs.com/jyzhao/p/7338689.html)
  • OGG学习笔记02-单向复制配置实例(链接:https://www.cnblogs.com/jyzhao/p/6278418.html)

4. 已知问题解决


在这个计算喂奶间隔的程序投入使用了一段时间后,还发现一些问题亟待解决:4.1 系统时间不准确
系统运行几天后,操作系统的时间会和真实时间相差几分钟,这个暂时通过定时同步阿里云的NTP服务器来解决

--使用ntpdate命令与阿里云时间服务器(ntp2.aliyun.com)同步[root@jystdrac1 ~]# dateSun Dec 22 08:48:51 CST 2019[root@jystdrac1 ~]# ntpdate ntp2.aliyun.com22 Dec 08:52:31 ntpdate[24481]: step time server 203.107.6.88 offset 206.232030 sec[root@jystdrac1 ~]# dateSun Dec 22 08:52:35 CST 2019--使用crontab定时,每小时与阿里云时间服务器同步一次,同步日志追加到/tmp/ntpdate.log日志文件crontab -l0 * * * * ntpdate ntp2.aliyun.com >> /tmp/ntpdate.log

当然,这里其实还可以设置NTP微调(-x)模式,保证RAC稳定性不受其调整的影响。

4.2 数据一致性问题


这个也可以说是程序设计时的bug。现象:当前程序连接的数据库底层是单实例,或始终在RAC的同一个节点上运行,就不会有任何问题;但如果在RAC的两个节点交叉运行插入数据,序列就会出现问题导致计算结果产生讹误。
先称之为是RAC环境下sequence的问题解决:

比如:在节点1插入记录,ID为235,再到节点2插入记录,ID却为192.

[oracle@jystdrac2 ~]$ iInsert a row using current time:1 row created.Commit complete.View Today's Result:        ID FEED_TIME   L   LAG(min)     LAG(h)---------- ----------- - ---------- ----------       192 12-26 18:21 N       5689      94.82       227 12-26 02:22 N        225       3.75       228 12-26 04:48 N        146       2.43       229 12-26 07:31 N        164       2.73       230 12-26 10:02 N        151       2.51       231 12-26 11:49 N        107       1.79       232 12-26 14:10 N        141       2.34       233 12-26 17:38 N        208       3.47       234 12-26 18:18 N         41        .68       235 12-26 18:19 N          0        .0110 rows selected.

可以看到在节点2后插入的记录ID值反而小,导致程序本身间隔计算也出现了讹误,明显这样是有问题的。
其实问题也非常明显,实例1和实例2获取s1的sequence是不连续的,分别在两个实例上查询:

--实例1:test@DEMO> select s1.nextval from dual;   NEXTVAL----------       239--实例2:test@DEMO> select s1.nextval from dual;   NEXTVAL----------       193

查询下sequence的创建语句:

test@DEMO> select dbms_metadata.get_ddl('SEQUENCE','S1') from dual;DBMS_METADATA.GET_DDL('SEQUENCE','S1')--------------------------------------------------------------------------------   CREATE SEQUENCE  "TEST"."S1"  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 241 CACHE 20 NOORDER  NOCYCLE

可以看到序列默认是NOORDER,如果设为ORDER,测试反复在两个实例上交叉读序列的nextval,都能保证序列值是顺序的,就不会再出现最初的情况。
所以解决方案就是重建sequence s1,修改为ORDER。

drop SEQUENCE s1;CREATE SEQUENCE s1 MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 261 CACHE 20 ORDER  NOCYCLE;

再次验证(select s1.nextval from dual;),确认此时序列是有序的:

--实例1:test@DEMO> select s1.nextval from dual;   NEXTVAL----------       261--实例2:test@DEMO> select s1.nextval from dual;   NEXTVAL----------       262

但还需要注意如果将序列改为ORDER,在实际业务压力大时很可能会造成严重性能问题,这估计也是不加任何参数创建的sequence默认就是NOORDER的原因。

63ffd4de886f10dcca1474308f110513.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java8流分组 性能_Java性能教程– Java 8流有多快?

java8流分组 性能在此JAX Magazine的预览预览中,JAX伦敦发言人Angelika Langer为使用Java流的任何人回答了最重要的问题:它们真的更快吗? Java 8是JDK收集框架的主要补充,即流​​API。 与集合相似,流表示元素序列。 …

对 int 变量赋值的操作是原子的吗?为什么?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删这个是在面试的时候遇到的问题,当时没有答出来。回到家以后查了查,整理记录下来。原问题:什么指令集支持原子…

C语言知识总结:if-else判断语句和switch-case选择语句

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删1、if-else判断语句一个基本的if语句由一个关键字if开头,跟上在括号()里边的是表示逻辑条件的表达式&#xf…

hibernate性能_改善Hibernate应用程序性能的7种方法

hibernate性能Hibernate是将Java Web应用程序与SQL数据库集成的好工具,但是当应用程序的响应时间开始显着增加时,我们应该怎么做? 当我们怀疑应用程序是否会随着客户群的增长而扩展时,我们该怎么办? 在花大价钱托管或…

python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度

python学习笔记--坐标轴刻度所用的库及环境:ide:pycharmpython环境:python3.7matplotlib: matplotlib 1.11numpy: numpy1.15.datetime :datetime坐标轴刻度概念当需要把x,y坐标轴刻度调整的更密集些或者更宽松点学习如何调整x&…

为什么永远不会有语言取代C/C++?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删数以百计的 C/C 替代品将会出现,但 C/C 将永远与我们同在!每个 CPU 都带有一种称为 ISA(指令集架构&#xff…

mwc校准油门_编写下载服务器。 第五部分:油门下载速度

mwc校准油门在僵尸网络时代,您可以租用几百美元来运行自己的分布式拒绝服务攻击,拥有紧急开关来有选择地关闭昂贵的功能或严重降低性能是一个巨大的胜利。 在缓解问题的同时,您的应用程序仍可运行。 当然,这种安全措施在高峰或工作…

sql 非主键每年自增_或许你不知道的 10 条 SQL 技巧

上文我们简述了 SQL 的一些进阶技巧,一些朋友觉得不过瘾,我们继续来下篇,再送你 10 个技巧一、 使用延迟查询优化 limit [offset], [rows]经常出现类似以下的 SQL 语句:SELECT * FROM film LIMIT 100000, 10offset 特别大!这是我司出现很多慢…

C语言最全入门笔记

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删c语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&am…

yolo v4 python_YOLOv4: Darknet 如何于 Ubuntu 编译,及使用 Python 接口

本文将介绍 YOLOv4 官方 Darknet 实现,如何于 Ubuntu 18.04 编译,及使用 Python 接口。主要内容有:准备基础环境: Nvidia Driver, CUDA, cuDNN, CMake, Python编译应用环境: OpenCV, Darknet用预训练模型进行推断&…

junit测试spring_使用Spring JUnit规则进行参数化集成测试

junit测试springSpring 4.2附带了全新的JUnit规则: SpringClassRule和SpringMethodRule 。 使用JUnit规则的主要优点是让开发人员摆脱SpringJUnit4ClassRunner并在Spring集成测试中利用不同的JUnit运行器。 我认为Spring JUnit Rules的最大机会是易于创建参数化的集…

不属于python的数据类型_下列________不是Python的数据类型。

【判断题】已知 x, y 3, 5,那么执行x, y y, x 之后,x的值为15。【多选题】Python 中对变量描述正确的选项是( )【单选题】字符串是一个连续的字符序列,用________方式打印出可以换行的字符串。【多选题】以下选项中,不符合 Python 语言变量命名规则的有( )【多选题】Python的…

无处不在_Java无处不在:使用DukeScript在任何地方运行一次编写

无处不在在相当长一段时间内,Java都未能兑现“一次编写,随处运行”的承诺。 DukeScript希望通过在跨平台应用程序中实现视图和逻辑的清晰分离来改变这种状况。 在本文中,一个简单的场景用于介绍DukeScript的基础。 多年以来,Java…

C语言为何不会过时

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删评价任何一门编程语言,都是招人骂的。永远是这样。就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方…

下列选项中不属于python循环语句的是哪一项_下列选项中,不属于字典操作的方法是哪一项?_学小易找答案...

【简答题】字符串有哪几种表现形式?【简答题】简述Python程序的执行过程。【单选题】Python 语句x‘char’;y2,print(xy)输出的结果是哪一项?()【编程题】输入三角形的边长和高,计算并输出三角形的面积。【简答题】手机插上充电器却没有显示充电,可以用万用表检测吗?请上网搜…

mysql 死锁监视器_并发基础知识:死锁和对象监视器

mysql 死锁监视器本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中,您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识,并学习诸如原子性,同步和线程安全性的概念。 在这里查看 ! 目录 …

python ks值计算_利用Python计算KS的实例详解

在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布。好的信用风控模型一般从准确性、稳定性和可解释性来评估模型。sOf免费资源网一般来说。好人样本的分布同坏人样本的分布应该是有很大不同的,KS正好是有效性指标中的区分能力指…

教你如何用一句话激怒IT人

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删在IT行业摸爬滚打这么久,你是否听过下面这些话:“这个很简单,我也是做程序出身的。”“预算砍掉一半&#xf…

java的网络编程有用吗_十大有用但又偏执的Java编程技术

java的网络编程有用吗经过一段时间的编码(以我为例,大约20年左右,当您玩得开心时光飞逝),人们开始接受这些习惯。 因为,你知道... 任何可能出错的事情都会发生。 这就是为什么人们会采用“防御性编程”的原…

python bootstrap 4_Python3.4+Django1.9+Bootstrap3

实现和原理Python集成Django开发框架后,可以通过在cmd命令提示符下建立工程,工程名为learn_modelsdjango-admin.py startproject learn_models再进入到learn_models里面,新建一个app项目cd learn_modelspython manage.py startapp learn此时目…