grafana配置redis数据源预警误报问题(database is locked)
因为grafana上支持直接配置redis数据源的插件,可以直接在grafana上配置监控和告警,不用每台redis去配置监控客户端,比较契合我的redis集群多的需求,于是我就把redis监控从prometheus直接挪到了grafana上,开始用着挺正常的,但是用了一段时间后开始出现间歇性的瞬时告警,去排查各个redis并不存在性能瓶颈,我调整过数据源的超时时间、预警模板的一些时间参数,都没有好转,网上搜了很多处理方法,都没有解决。
后面怀疑监控本身问题,去查看了日志,每次告警的时间,刚好有下面这样的报错:
t=2025-10-27T01:01:12+0800 lvl=eror msg="Failed getting data source" logger=sqlstore err="database is locked" uid=uTCY4wRHk id=0 name= orgId=1
t=2025-10-27T01:01:13+0800 lvl=eror msg="Failed getting data source" logger=sqlstore err="database is locked" uid=cNsDV_LNk id=0 name= orgId=1
gitlab上面很早就有人提了这个问题:https://github.com/grafana/grafana/issues/16638
但是解决的方案千奇百怪,说是sqlite库问题,推荐调整sqlite库busy_timeout的(grafana默认用的sqlite库),我一个个试过了,default.ini中改参数的几种方法,根本不生效,由于sqlite库也不是很熟,好像不能直接客户端改配置,于是我考虑直接把sqlite库换成mysql。
1.首先准备一个mysql5.7的库,配置好grafana用户的权限
create user grafana@'127.0.0.1' identified by 'xxx';
grant all privileges on grafana.* to grafana@'127.0.0.1';
flush privileges;
2.安装一个工具:sqlite3-to-mysql
pip install sqlite3-to-mysql
3.通过这个工具把sqlite库导出到mysql库里
sqlite3mysql -f ./grafana.db -d grafana -ugrafana -p -h127.0.0.1
4.还得改下某些字段,导出后其实表字段对应的默认长度不够,会导致导入dashboard的时候报错
可能根据你实际存储的内容大小有关系,我这边是改了:
ALTER TABLE `dashboard` MODIFY COLUMN `data` longtext NOT NULL;
ALTER TABLE `dashboard_version` MODIFY COLUMN `data` LONGTEXT NOT NULL;
5.然后改grafana配置并重启grafana便可正常访问
vi default.ini
[database]
type = mysql
host = 127.0.0.1:3306
name = grafana
user = grafana
password = """xxx""" ##特殊字符用"""括起来
账号都可以继承之前的,不管是ldap的还是数据库存储的。
听我的,别去信那个给你提供个py脚本手动改的,老老实实用sqlite3-to-mysql插件!!!
我开始就是用了网上推荐的py脚本(因为centos7安装sqlite3-to-mysql老是报错,偷懒图省事):
import re
def convert_sqlite_to_mysql(sql):sql = re.sub(r'PRAGMA .*?;', '', sql)sql = sql.replace('BEGIN TRANSACTION;', 'START TRANSACTION;')sql = sql.replace('COMMIT;', 'COMMIT;')sql = sql.replace('AUTOINCREMENT', 'AUTO_INCREMENT')sql = sql.replace('INTEGER', 'BIGINT')sql = sql.replace('TEXT', 'VARCHAR(255)')sql = sql.replace('"', '`')return re.sub(r'CREATE TABLE `(.*?)` \(', r'CREATE TABLE IF NOT EXISTS `\1` (', sql)
with open('grafana-20251107.sql', 'r', encoding='utf-8') as file:sqlite_sql = file.read()
mysql_sql = convert_sqlite_to_mysql(sqlite_sql)
with open('dump_grafana_mysql.sql', 'w', encoding='utf-8') as file:file.write(mysql_sql)
print("ok,file: dump_grafana_mysql.sql")
开始用的那个根本导入都一直报错,很多字段长度不够,用了varchar或者int,导入的时候一堆报错,改了半天好不容易没报错了,结果启动后直接页面打不开,报错:
t=2025-11-07T14:36:13+0800 lvl=eror msg="failed to fetch alert rule" logger=ngalert uid=Ff75d9gvk org=1 err="invalid character '`'looking for beginning of object key string"
看着是字段内容有问题,我总不能又去改吧,吐了吐了,后面老老实实用插件。
如果你们安装sqlite3-to-mysql也报错(建议你直接容器跑,换个系统,我反正没解决):
/usr/local/bin/pip3.6 install sqlite3-to-mysqlRunning setup.py install for backports-datetime-fromisoformat ... errorERROR: Command errored out with exit status 1:...error: command 'gcc' failed with exit status 1----------------------------------------Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-o1s54be5/backports-datetime-fromisoformat/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-an_ked9q-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-o1s54be5/backports-datetime-fromisoformat/
热乎的,亲测有效!!!
