Skip to content

Data Access Service

zongfei.fu edited this page Aug 27, 2024 · 10 revisions

目录

内容

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

举例

LIMIT重写实现

避免用户扫表操作,合理控制数据返回数量,依赖参数default_return_rowsmax_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 */

超时机制

SQL语句自动绑定max_execution_time

适用于: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 */

支持Context Cancel

这里需要注意下,TiDB不支持DB接口上下文超时自动结束会话,因此TiDB不支持此能力,下文通过其他方式实现。

适用于:MySQL/Aurora/ClickHouse

执行SQL时,引入context控制,当请求结束或异常时,查询会自动释放。当用户刷新前端或结束请求后,后端数据库会结束执行,同时DAS会记录当前的错误信息为context canceled。

TiDB定时KILL兜底机制

适用于: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去目标tidbinformation_schema.processlist表匹配User=${remotedb.username}Info like '%request_id%'的查询,如果有,进行kill

强大的库表解析引擎

能基于语法树可以解析出SQL语句中的库名和表名,形成对应关系。

image

配置数据库实例

需配置数据库实例为主节点(可写节点),请确保完成了配置审核/查询数据库实例

用户授权

给用户授权库级访问权限

前提是元数据已经同步完成

以管理员身份登录系统,选择:Admin -> 系统配置 -> 数据查询权限配置

这里我们给用户zhangsan授权访问test库访问权限,不指定表名,zhangsan默认有当前库所有表的查询权限,如下图:

image

image

给用户授权表级访问权限

如果您想对用户zhangsan限制指定表的访问权限,您可以点击当前库名,进行表的详情页面进行控制,如下图:

image

image

用户访问

权限开通完成后,用户zhangsan登录系统,点击左侧导航栏数据查询,可以看到自己新开通的权限,如下图:

image

image

执行查询

Tip

更多功能请自行探索

image

鼠标右击表名,可查看表结构,如下图:

image

image