【警惕流文件转string存数据库操作】记一次数据库异常增长的排查经历
存在问题的代码, ps 这个content最后被直接存到了表中
string reqUrl = GetRequestApiName(context.Request.RequestUri.ToString()); //获取请求的URL全地址 using (System.IO.Stream sm = task.Result) { if (sm != null) { sm.Seek(0, SeekOrigin.Begin); int len = (int)sm.Length; byte[] inputByts = new byte[len]; sm.Read(inputByts, 0, len); sm.Close(); content = Encoding.UTF8.GetString(inputByts); }
}
背景描述:
公司自用的OA系统,在部分节点需要上传图片或视频。webapi为了记录app的请求和返回方便以后排查问题,在数据库新增了访问记录表
存在的问题:
在使用一段时间后数据增长量过大,刚开始因为硬盘够大,并没有引起足够的重视,只是简单认为访问记录多导致并且因为定期有清理访问记录所以没有发现潜在异常增长原因
排查过程:
最近因为要求保留历史请求记录,不再定时删记录后,数据库增长问题异常突出。具体表现为新增50G云盘,用了不到一个月,数据库源文件22个g,备份压缩后备份文件7个G左右。
存储访问记录的表也就request_con和response_con两个字段捎长一点
1、缩减response_con内容
检查response_con字段中长度最大的,发现最大长度也就8000多
返回内容都是json格式的字符串,所以第一步就去掉了json中的"以及很多value为空的键值对
一番操作后并没有缩小多少空间
2、缩减request_con内容
检查response_con字段中长度最大的,发现最大长度有94000000多!
拷贝字符串单独len,发现长度只有1413左右
类似这样的记录:
后面有乱码,有些还有Eif结尾
在本地做模拟库尝试update这个字段为空后,再手动压缩,直接从22g压缩到只剩下400多M
问题定位就是记录上传图片参数时,把图片转码后也存到了数据库中 导致库文件异常增大
解决思路:
在拿到content内容后对字符串做识别,然后通过字符串操作替换,将图片编码后的内容去掉。只保存基本请求信息即可