-
Notifications
You must be signed in to change notification settings - Fork 205
Data Access Service
Warning
注意变更操作请使用DDL/DML
工单
数据库访问服务(简称DAS),基于TiDB AST实现,支持MySQL/TiDB/Clickhouse数据库访问。为研发、运营、产品等人员提供统一的数据查询和管理能力。
该功能仅支持数据查询,系统通过表insight_das_allowed_operations
对用户输入的语句类型进行判断和拦截,内置65种语句类型。系统默认启用SELECT/UNION/DESC/USE/Explain/SHOW
操作,如果您需要启用更多的支持,请更新表insight_das_allowed_operations
对应记录的is_enable=1
。
- 支持库表级查询权限,语法提示、查看表结构、自定义主题、自动生成数据字典等功能
- 扩展的语法支持,除SELCET语句外,支持CTE、Explain analyze等语法
- 支持Hint提示,可以方便分析执行计划或者改变SQL执行行为
- 支持传递session变量,比如group_concat_max_len、sql_mode等
- 前端支持多窗口,您可以支持打开多个窗口,实现多tab管理,间接实现多条SQL执行,提升研发效率和体验
- 超时控制机制,当前端查询异常、页面刷新、网络超时等情况时,数据库支持自动结束查询
- 支持限流机制,可以基于SQL指纹和当前查询用户实现限流,避免短时间大量的查询,导致数据库问题
- 增强的审计功能,SQL支持绑定request_id
系统参数配置在config.yaml
配置文件中,您可以根据自己的业务需求进行调整,调整完成后,需要重启goinsight服务生效。
# 数据查询配置
das:
max_execution_time: 600000 # 查询语句最大查询执行时间,默认5分钟,单位ms
default_return_rows: 100 # 查询默认返回行数,系统会重写SQL Limit
max_return_rows: 100 # 查询默认最大返回行数,系统会重写SQL Limit
allowed_useragents: [ # 允许客户端UA
"Chrome",
"Firefox",
"Safari",
"Trident",
"Presto",
"Postman",
] # 允许的UA
避免用户扫表操作,合理控制数据返回数量,依赖参数default_return_rows
和max_return_rows
。
场景1:加上LIMIT
select * from django_admin_log
重写后的SQL:
SELECT /*+ max_execution_time(600000)*/ * FROM `django_admin_log` LIMIT 100 /* 7b56bb88-751f-4806-a270-8f7463f43594 */
场景2:重写LIMIT N
select * from django_admin_log limit 1000
重写后SQL:
SELECT /*+ max_execution_time(600000)*/ * FROM `django_admin_log` LIMIT 100 /* 830dfafa-c77b-480d-9807-8b7f8ce921da */
场景3:重写LIMIT OFFSET
select * from django_admin_log limit 1000 offset 10
重写后SQL:
SELECT /*+ max_execution_time(600000)*/ * FROM `django_admin_log` LIMIT 10,100 /* 27971df5-48b3-404b-9471-fb62a2b8711b */
适用于:MySQL/Aurora/TiDB/ClickHouse
执行的SQL语句,系统会自动绑定max_execution_time
,当SQL执行时间大于max_execution_time
时,数据库自动结束,保障数据库稳定性。
select * from django_admin_log
重写后的SQL:
SELECT /*+ max_execution_time(600000)*/ * FROM `django_admin_log` LIMIT 100 /* 7b56bb88-751f-4806-a270-8f7463f43594 */
这里需要注意下,TiDB不支持DB接口上下文超时自动结束会话,因此TiDB不支持此能力,下文通过其他方式实现。
适用于:MySQL/Aurora/ClickHouse
执行SQL时,引入context控制,当请求结束或异常时,查询会自动释放。当用户刷新前端或结束请求后,后端数据库会结束执行,同时DAS会记录当前的错误信息为context canceled。
适用于:TiDB
由于TiDB不支持DB接口上下文超时自动结束会话,支持基于request_id实现定时KILL DAS发起的异常连接。
实现机制:通过表insight_das_records
找出当前时间 - max_execution_time
之内的is_kill=0 and is_finish=1 and db_type = 'TiDB'
的执行记录,根据request_id
去目标tidb
的information_schema.processlist
表匹配User=${remotedb.username}
和Info like '%request_id%'
的查询,如果有,进行kill
。
能基于语法树可以解析出SQL语句中的库名和表名,形成对应关系。
需配置数据库实例为主节点(可写节点),请确保完成了配置审核/查询数据库实例
前提是元数据已经同步完成
以管理员身份登录系统,选择:Admin
-> 系统配置
-> 数据查询权限配置
。
这里我们给用户zhangsan
授权访问test
库访问权限,不指定表名,zhangsan
默认有当前库所有表的查询权限,如下图:
如果您想对用户zhangsan
限制指定表的访问权限,您可以点击当前库名,进行表的详情页面进行控制,如下图:
权限开通完成后,用户zhangsan
登录系统,点击左侧导航栏数据查询
,可以看到自己新开通的权限,如下图:
Tip
更多功能请自行探索
鼠标右击表名,可查看表结构,如下图: