数据库常见问题

一步一个脚印一个坑 1年前 ⋅ 1536 阅读
ad

有些同学在部署webfunny的时候会遇到数据库相关的问题,我在这里总结一下,供大家参考

一、为什么数据库里创建了几千张表?

首先,为了提升查询效率,所以webfunny按照项目、日志类型、日期来进行建表的,这就导致了表的数量会比较多。

表的数量并不会影响数据库的性能,可以不用担心哈,这些操作可以理解为一些数据库的分区和分片设计。

那么怎么才能尽量减少表的数量呢?

1. 不要创建无效的项目、删除或者禁用无效的项目

2. 存储周期不要太长,默认8天。如果不需要往前查询数据,可以再减少一点。monitor/config_variable/config.json、event/config_variable/config.json,在这两个文件中找到logSaveDays参数可以进行修改。

二、数据库有些表非常大,怎么办?

首先,为了帮助用户排查问题,我们不得不尽可能的上报用户的各种日志。其中接口请求量一般是比较大的,所以 -HttpLogInfo- 这张表的量会比较大,因为我们记录了项目中的所有请求和返回值。

那应该怎么办呢?

其实项目中有很多接口是不需要我们关注的,因为我们只需要关注业务接口就行了,在项目详情页,有各种设置,可以帮我们解决:

1. 我们不需要接口监控,那就直接关闭好了(不推荐

2. 有些接口是无效的,非业务,那就可以把它过滤掉,可以参考应用设置第四步

3. 接口的返回值我们也不需要,那就把请求和返回值的长度设置为0

这样就可以降低接口请求日志的量了。

三、err message: Table 'webfunny_db.webfunny1275CustomerPV20210710' doesn't exist

这个问题很多小伙伴都可能会遇到,但是这并不是一个严重的问题,不要紧张哈。

webfunny采用每天分表的方式,所以webfunny的运行不能中断,才能完成每天建表哦。大家在测试过程中,难免会出现中断运行的情况,所以这种情况很正常,只需要在启动webfunny以后,进入 设置->管理员特权 页面(或者直接进入:/databaseTable.html),「点击重建今明两天的表」,就可修复最近两天的表结构了。

webfunny的上报机制是通过项目标识(webfunny1275),和日期(20210710)找到对应的表,然后数据入库的,所以项目标识和日期对应不上,就无法入库了。

四、为什么还会收到一个月甚至几个月前的日志呢?

webfunny探针产生的日志先存放在本地,再进行上报的。 有些用户产生了日志,还没来得及上报,就关闭了网页,几个月后再次打开,旧日志就会跟新日志一起上报。虽然这个方式有弊端,但是也会减低日志的丢失率。所以大家也不必担心这个问题

五、mysql 连接数太多(SequelizeConnectionError: Too many connections)

这个就是最常见的问题了。因为我做的这个是前端监控系统,日志上报量比较大,所以经常会遇到连接数不够用的情况。 除了你要使用其他技术来缓解并发量,还需要适当的设置mysql数据库的最大连接数。那么怎么增加mysql的最大连接数呢,设置多大为合适呢,这又是一个比较麻烦的问题了。下边是我的一些浅见,仅供参考。

首先我们需要登录mysql, 进入mysql的命令行:

查看当前mysql的连接数:

mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 403   |
+----------------------+-------+
1 row in set (0.00 sec)

如何设置mysql的最大连接数呢?

第一种方法:通过mysql命令设置(这种方法是临时性的,重启mysql以后就会失效)

mysql> set GLOBAL max_connections=5000;
Query OK, 0 rows affected (0.00 sec)

第二种方法:进入mysql目录(/usr/local/mysql)找到my.cnf文件,添加如下配置(注意:最大连接数不要设置过大,有可能会在启动的时候爆掉哦),然后执行命令$: service mysql restart 

[mysqld]
max_connections=5000

Mysql的最大连接数设置多少合适呢?一般设置个3,5000都没有问题的。

六、Mysql连接错误太多(SequelizeConnectionError: Host 'xx.xx.xx.xx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts')

这个问题并不常见,因为一般mysql的默认值是100。只有当同一个IP对mysql访问出现100次连接错误的时候,mysql就会拒绝这个ip的请求访问。因为我的日志服务和数据库是分离的,所以,经常会在量大的时候出现这个问题。

查看连接报错配置:

mysql> show variables like '%max_connect_errors%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 100   |
+--------------------+-------+
1 row in set (0.01 sec)

此时只需要执行一下: flush hosts;  就可以清理掉错误记录了。

mysql> flush hosts; 

 

七、数据无法保存 The MySQL server is running with the --read-only option

从字面意思看,应该是只读权限问题,但是这个有极大可能是因为硬盘满了,删除一些过期日志表,或者扩容硬盘即可解决

八、数据库ID无法自增

正常情况下数据库自增是没有问题,除非你做了一些设置。 特别是在更换数据库的时候,极大可能性发生,数据库厂商都会有自增相关的配置,请检查一下

 

 

 

 

 

关于Webfunny

Webfunny专注于前端监控系统,前端埋点系统的研发。 致力于帮助开发者快速定位问题,帮助企业用数据驱动业务,实现业务数据的快速增长。支持H5/Web/PC前端、微信小程序、支付宝小程序、UniApp和Taro等跨平台框架。实时监控前端网页、前端数据分析、错误统计分析监控和BUG预警,第一时间报警,快速修复BUG!支持私有化部署,Docker容器化部署,可支持千万级PV的日活量!

  点赞 0   收藏 0
  • 一步一个脚印一个坑
    共发布119篇文章 获得4个收藏
全部评论: 0