1.一种面向Web开发环境的关系型数据库数据回溯方法,其特征在于:包括以下步骤:
第一步、建立Web环境SeeLog日志处理模型,过程如下:
1.1自动获取SeeLog日志:Web环境下,当用户操作数据库时,会执行DML语句,包含:
UPDATE、INSERT、DELETE三种形式;成功执行DML语句后,会触发日志处理单元;日志处理单元运用AOP面向切面编程的思想,以业务处理过程中对数据库的修改作为切入点,将日志记录的代码以通知的形式织入切入点中,形成切面,达到日志处理逻辑与业务操作逻辑分离的目的;
1.2根据算法动态调整日志持久化行为:SeeLog日志的作用是记录用户对数据库修改的所有行为,从而保证在数据库发生故障后,能真实还原用户操作数据库的场景,使数据库达到故障发生之前的状态;在SeeLog日志处理模型中,日志首先会被写入内存,一段时间后再将内存中的日志写入持久化层;
1.3采用日志分割策略进行持久化操作:当内存日志写入持久化层时,将日志进行分割,将单个日志文件的最大数据行设置为Rowmax,该数值根据实际需要自行更改;首个日志文件会根据创建时间命名,每当数据行数达到Rowmax时,则新建文件继续写入,所有文件新建时都以创建时间作为文件名,以便搜索文件时快速定位时间点;
第二步、采用TBack数据回溯机制进行数据库恢复,过程如下:
一旦数据库在某一时间点发生故障,利用数据库事务日志进行数据回溯,将数据库恢复至故障发生之前的任意时间点;
步骤2.1 TBack数据回溯机制必须基于某一时刻的数据库版本进行恢复,建立数据库里程碑,里程碑的意义在于:恢复数据时,先将数据库还原至里程碑时的状态,然后依据SeeLog日志,按照时间流的形式重现用户操作进行数据回溯。数据库备份人员可按具体项目需要,不定期进行一次数据库备份,建议选择Web应用用户访问量较少时进行;数据库里程碑的建立根据采用数据库类型不同而略有差异,但都依托数据库自带命令行工具或GUI完成,备份人员执行一次备份任务后,需要将备份文件进行归档,并在里程碑历史表中添加本次里程碑建立信息,里程碑历史表中详细记录了从数据库新建开始到目前为止,每次里程碑建立的时间、备份文件归档路径以及备份文件名,方便对数据库历史进行定位追踪;
TBack数据回溯机制采用基于用户行为分析的备份策略,通过感知用户在Web应用中对数据库所做的修改进行记录,而无法监测到管理员直接对数据库所做的改动;因此每当数据库结构发生改变或者DBA管理员手动修改数据库之后,需要数据库备份人员建立一个里程碑,否则会导致回溯机制失效;
步骤2.2数据库故障发生后,先确定待恢复时间timeEnd,为数据库发生故障前的某个时间点,然后对照里程碑历史表选择合适的里程碑,选择故障发生前最近一次里程碑,根据记录的路径获取相应的备份文件,并记下里程碑建立的时间timeStart。打开数据库自带命令行工具或GUI,读取里程碑备份文件,执行数据库还原命令,由于采用数据库类型不同,还原命令会略有差异。执行成功后,数据库还原至里程碑时的状态;
步骤2.3启动新线程,程序首先确定回溯起始文件,进入SeeLog日志的存放目录,逐个搜索文件名,找到相邻的两个文件F1、F2,使得F1的文件名时间小于里程碑建立的时间timeStart;而F2的文件名时间刚好大于timeStart。此时文件F1记录的是从F1的文件名时间开始到timeStart期间的所有用户行为,因此可以确定回溯起始文件为F1;按照同样的方法,根据待恢复时间timeEnd搜索得到回溯结束文件;接着程序将继续定位恢复起始数据行,由于日志文件的每行数据都记录着用户的操作时间,因此可以根据操作时间进行快速定位;回溯起始文件中,操作时间大于timeStart的第一条数据所在行即为恢复起始数据行lineStart;同样,回溯结束文件中,操作时间小于timeEnd的最后一条数据所在行即为恢复结束行lineEnd。然后程序将读取lineStart到lineEnd区间内的所有用户行为,并逐条将数据压入队列中,该队列创建在内存中,SeeLog日志每行数据构成的五元组将作为参数传入,该五元组存储在队列的每一个元素中;
步骤2.4采用管道流处理机制,首先任务执行中枢将解析Web应用中的数据源配置,并建立数据库连接,然后从队列中取出一个元素进入管道流,其他元素在队列中继续等待,任务执行中枢将读取元素中的五元数据组
步骤2.5若步骤2.4中的任务执行中枢未能成功执行预处理语句,将挂起从队列中读取元素进入管道流的操作,并每间隔一段时间重复执行一次当前的预处理语句,若能成功执行,则恢复挂起的操作,继续读取队列中的元素;若重复执行一定次数后,仍未能执行成功,将提示数据库恢复人员手工排查错误,并暂停整个程序的运行,直到当前预处理语句成功执行,程序才继续运行并恢复挂起的操作;当lineStart到lineEnd区间内的所有数据都恢复成功后,数据回溯完毕,数据库成功还原至故障发生之前的状态;
第三步、采用内存日志的自备份机制,将每个事务即时写入持久化层,保证内存日志不会丢失。
2.如权利要求1所述的一种面向Web开发环境的关系型数据库数据回溯方法,其特征在于:所述第三步中,如果Web服务器发生宕机或者重启,自上一次将内存中的日志写入持久化层到服务器发生宕机或重启这段时间内的日志,由于仅保存在内存中,还未及时写入持久化层,服务器的宕机或重启将会导致这部分日志丢失;
通过配备一台备份服务器,并提供一个额外线程,将该线程作为AOP通知,织入对数据库修改的切入点中,线程执行以下操作:在每条SQL操作语句及参数被写入内存的同时,将该条SQL语句和参数发送至备份服务器上;由于需要不间断地向备份服务器发送数据,并且发送频率不定,与用户行为密切相关,因此需要该线程与备份服务器之间建立长连接。
所述备份服务器每接收到一条SQL语句便直接持久化;同样,由于需要不间断地接收数据,并且接收频率不定,需要日志写入程序与持久化文件之间的IO通道保持打开的状态,备份服务器仅执行数据接收及持久化的操作,并不为其他应用提供服务,因此保持IO打开并不会产生其他影响;当单个文件数据行数达到Rowmax时,程序关闭当前IO通道,新建日志文件,以创建时间命名,并重新建立IO通道。
3.如权利要求1或2所述的一种面向Web开发环境的关系型数据库数据回溯方法,其特征在于:所述步骤1.1中,日志处理单元通过对底层连接数据库代码进行注入,记录下所有对系统增删改的SQL语句及其占位符参数,形成SeeLog日志。该日志为文本数据,反映了用户操作行为,每一行都代表一次用户的原子操作,每行数据是一个由操作时间OperateTime、操作类型OperateType、SQL语句、占位符参数Parameters、是否批量IsBatch操作构成的五元组;其中操作时间精确到毫秒,操作类型有插入、修改、删除3种取值,当批量操作为true时,需要分割占位符参数属性的取值,以便区分占位符参数的前后关系;日志数据使用半形式化方法来描述:LogData=OperateTime,[OperateType],SQL,{Parameters},[IsBatch].
OperateType=’Insert’|’Update’|’Delete’
IsBatch=’True’|’False’。
4.如权利要求1或2所述的一种面向Web开发环境的关系型数据库数据回溯方法,其特征在于:所述步骤1.2中,间隔时间不是固定数值,采用多因子动态权重算法决定是否执行内存日志持久化,过程如下:
1.2.1.确定影响因子,此处影响因子为内存占用率memory_usage、CPU占用率cpu_usage、磁盘占用率io_usage、Web应用用户访问量user_traffic、已存储的SQL语句量sql_amount;
1.2.2.设立基准权重W_stdi,由于每个因子对最终结果的影响不同,因此需要预先设定通常情况下,每个因子的权重;
1.2.3.为每个因子设定阈值Thresholdi,当影响因子的值达到最大值后,基本可以决定最终结果;
1.2.4.建立权重动态增加函数,并计算动态增加后的权重W_coti;
1.2.5.确定动态变化后各因子的权重W_newi,若影响因子未达到阈值,则W_newi=W_stdi;若影响因子达到阈值,则W_newi=W_coti,公式如下:
1.2.6.根据变化后的权重计算最终结果,此处计算结果为将内存中日志写入持久化层的概率,因此需要将影响因子的具体数值转化为百分比,此处为Web应用用户访问量、已存储的SQL语句量,方法如下:Ratememory_usage=Valuememory_usage
Ratecpu_usage=Valuecpu_usage
Rateio_usage=Valueio_usage
Rateuser_traffic=Valueuser_traffic/Maxuser_traffic
Ratesql_amount=Valuesql_amount/Maxsql_amount
对于负相关的影响因子,此处为CPU占用率、磁盘占用率、Web应用用户访问量,在乘以相应权重之前,需要用1-百分比数值进行转换,方法如下:Factormemory_usage=Ratememory_usage=Valuememory_usage
Factorcpu_usage=1-Ratecpu_usage=1-Valuecpu_usage
Factorio_usage=1-Rateio_usage=1-Valueio_usage
Factoruser_traffic=1-Rateuser_traffic=1-Valueuser_traffic/Maxuser_trafficFactorsql_amount=Ratesql_amount=Valuesql_amount/Maxsql_amount将每个因子转换后的数值Factori*变化后各因子的权重W_newi,并将相乘后的结果相加,即可得到将内存中日志写入持久化层的概率Probabilitywrite,加权运算公式如下:Probabilitywrite=∑(Factori×W_newi)
因此,只要设定执行操作的概率阈值Probabilitythreshold,当Probabilitywrite大于Probabilitythreshold时,程序即执行内存日志持久化的操作。
5.如权利要求1或2所述的一种面向Web开发环境的关系型数据库数据回溯方法,其特征在于:所述步骤2.3中,设立动态缓存,规定先将数据按序读入内存,当读取的数据行达到一定量后,暂停数据的读入,当前线程进入线程池中等待,此时队列将无法继续添加元素,实行单向流出策略,流出的数据将执行步骤2.4的操作,当列队中的元素全部流出后,唤醒数据读取的线程继续读入数据。