RRD 是十分好用的统计工具,很多伺服的监测也会使用 RRD。
今天发现 RRD 内的一组数据纪录出错,但 RRD 内建并没有修改旧数据的功能,需要将 RRD 数据库备份成 XML 档,修改 XML 档后,再复原到数据库,以下是修改的方法,在这里记录一下。
1. 例如要修改数据的 RRD 档是 /usr/local/rrd/file.rrd, 先用 rrdtool 的 dump 功能,将 RRD 的资料汇出成 XML 档:
# rrdtool dump /usr/local/rrd/file.rrd file-backup.xml
2. 然后直接用 vi 刚刚建立的 XML 档:
# vi file-backup.xml
例如要找的资料时间是 2020-05-18 08:00:00,找出这个时间字串的一行
3.每一个数值会用
要转换这个数值,可以用 python 实现。例如上面的 5.6206361067e+01,用以下写法:
|
1 2 3 |
#!/usr/bin/python print ("%d"% 5.6206361067e+01) |
执行后可以看到结果是 56, 例如我想将数值改成 60,python 可以这样写:
|
1 2 3 |
#!/usr/bin/python print ("%e"% 60) |
执行后可以得出结果是 6.000000e+01,开启上面建立的 file-backup.xml,将这个数值记录在正确的位置。
为了方便修改,用 Python 写了这个小程式,可以将数值由十进制及科学记数间转换:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/usr/bin/python import sys ### define which log file shoue be read if len(sys.argv) == 1: print "ERRPR: Please input number!" exit() num = sys.argv[1]; try: float(num) except ValueError: print "ERROR: " + num + " is not a number!" exit() if num.find("+") >= 0: print ("%d"% float(num)) else: print ("%e"% float(num)) |
将上面 Script 储存后,使用方法是这样:
$ script.py 123
1.230000e+02
1.230000e+02
上面会将 123 转换成科学记数法,如果输入科学记数法,会回传十进制数值:
$ script.py 1.230000e+02
123
123
4. 修改后 XML 档后,用 rrdtool 的 restore 功能复原数据:
先将原来的 RRD 资料档搬到其他位置:
# mv /usr/local/rrd/file.rrd /usr/local/rrd/file.rrd.bak
复原数据:
# rrdtool restore file-backup.xml /usr/local/rrd/file.rrd
这样便完成了,当下次用 rrdtool graph 更新 RRD 图片时,便会产生正确的统计图。