运城 网站 建设 招聘,WordPress手机菜单样式修改,关于软文营销的案例,罗村网站制作公司原文链接#xff1a;https://www.modb.pro/db/22315 目前程序从功能上其实已经完全满足客户(当然我这里的客户都是指媳妇儿)需求#xff0c;具体可参考#xff1a;使用SQL计算宝宝每次吃奶的时间间隔 - Part1#xff1a;分析函数的使用使用SQL计算宝宝每次吃奶的时间间隔 -…原文链接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[oraclejystdrac2 baby]$ pwd/home/oracle/baby[oraclejystdrac2 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[oraclejystdrac2 baby]$ cd ..1.2 将程序按照当前版本号进行打包备份[oraclejystdrac2 ~]$ 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[oraclejystdrac2 ~]$ ls -lrth baby_v2.02.tar.gz-rw-r--r-- 1 501 1000 1.9K Dec 26 11:46 baby_v2.02.tar.gz1.3 最后拷贝备份的程序包到NAS留存[oraclejystdrac2 ~]$ cp baby_v2.02.tar.gz /public/backup/2. 数据备份场景上面已经做了程序备份但出现故障时我们只恢复程序是不够的还需要之前产生的业务数据。所以我们还需要业务数据的备份。可以采用exp/expdp定时逻辑备份因为我这里数据量很小所以直接采用更简单的exp备份。比如每天12点使用exp备份出当前表t_baby的数据设置crontab定时任务[oraclejystdrac2 ~]$ crontab -l0 12 * * * /bin/sh /home/oracle/baby/backup_exp_t_baby.shexp备份脚本[oraclejystdrac2 ~]$ cat /home/oracle/baby/backup_exp_t_baby.shbackupdatedate %Y%m%dexport ORACLE_SIDdemo2export ORACLE_BASE/opt/app/oracleexport ORACLE_HOME/opt/app/oracle/product/11.2.0/dbhome_1export PATH$PATH:$ORACLE_HOME/binexp test/test tablest_baby file/public/backup/t_baby_$backupdate.dmp log/public/backup/t_baby_$backupdate.log备份出的文件类似这样[oraclejystdrac2 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.dmp3. 数据实时同步场景如果只有上面步骤的定时逻辑备份其实还是无法满足完全的数据恢复的。比如今天中午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)同步[rootjystdrac1 ~]# dateSun Dec 22 08:48:51 CST 2019[rootjystdrac1 ~]# ntpdate ntp2.aliyun.com22 Dec 08:52:31 ntpdate[24481]: step time server 203.107.6.88 offset 206.232030 sec[rootjystdrac1 ~]# 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.[oraclejystdrac2 ~]$ iInsert a row using current time:1 row created.Commit complete.View Todays 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:testDEMO select s1.nextval from dual; NEXTVAL---------- 239--实例2:testDEMO select s1.nextval from dual; NEXTVAL---------- 193查询下sequence的创建语句testDEMO 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:testDEMO select s1.nextval from dual; NEXTVAL---------- 261--实例2:testDEMO select s1.nextval from dual; NEXTVAL---------- 262但还需要注意如果将序列改为ORDER在实际业务压力大时很可能会造成严重性能问题这估计也是不加任何参数创建的sequence默认就是NOORDER的原因。