可以使用%SYS.Journal.File类中的ByTimeReverseOrder查询,以及%SYS.Journal.Record类中的List查询来实现。
下面是这两个查询的具体作用:
A) %SYS.Journal.File类中的ByTimeReverseOrder查询
这个查询会获取journal日志文件名并按降序排列
USER>set rs=##class(%ResultSet).%New("%SYS.Journal.File:ByTimeReverseOrder") USER>do rs.Execute() USER>while rs.Next() { write rs.Name,! } c:\intersystems\cache\mgr\journal\20190620.003 c:\intersystems\cache\mgr\journal\20190620.002 c:\intersystems\cache\mgr\journal\20190620.001 c:\intersystems\cache\mgr\journal\20190610.001
B) %SYS.Journal.Record类中的List查询
这个查询可以从指定journal日志文件中获取日志记录
USER>set rs2=##class(%ResultSet).%New("%SYS.Journal.Record:List") USER>do rs2.Execute("c:\intersystems\cache\mgr\journal\20190620.003") USER>while rs2.Next() { if rs2.Get("GlobalReference")["TEST" write rs2.Get("GlobalReference"),!} ^["^^c:\intersystems\cache\mgr\user\"]TEST(1) ...... ^["^^c:\intersystems\cache\mgr\user\"]TEST(9) ^["^^c:\intersystems\cache\mgr\user\"]TEST(10)
这里我们可以把从A查询获得的结果传到B查询里。如果想了解从B查询里还能获得哪些字段的内容,请参考文档里的%SYS.Journal.Record类定义
下面是一个把A和B查询合并在一起的例子:
///参数 globalname: 需要查询的Global名字(不包括^)
ClassMethod SearchAllJournals(globalname As %String)
{
if $get(globalname)="" {
write "请指定Global名字",!
quit
}
//从当前所有journal日志文件中搜索指定的global
set rs1=##class(%ResultSet).%New()
set rs1.ClassName="%SYS.Journal.File"
set rs1.QueryName="ByTimeReverseOrder"
do rs1.%Execute()
while rs1.%Next() {
set jrnfile=rs1.%Get("Name")
set size=rs1.%Get("Size")
write "Journal file:",jrnfile,!," File size:",size/1024/1024," MB",!
do ..SearchGlobal(globalname,jrnfile)
}
do rs1.Close()
}
///第一个参数 globalname: 需要查询的Global名字(不包括^)
///第二个参数 jrnfile: 指定的journal日志文件名字(包括路径)
ClassMethod SearchGlobal(globalname As %String, jrnfile As %String)
{
set rs1=##class(%ResultSet).%New()
set rs1.ClassName="%SYS.Journal.Record"
set rs1.QueryName="List"
//打开journal日志文件并搜索指定的Global
do rs1.%Execute(jrnfile,"GlobalReference,NewValue",,,$lb("GlobalReference","[",globalname))
while rs1.%Next() {
set glo=rs1.%Get("GlobalReference")
write " ",glo," = ",rs1.%Get("NewValue"),!
}
do rs1.Close()
}