Giter Club home page Giter Club logo

archery's Introduction

SQL 审核查询平台

功能清单

数据库 查询 审核 执行 备份 数据字典 慢日志 会话管理 账号管理 参数管理 数据归档
MySQL
MsSQL × × × × × × ×
Redis × × × × × × × ×
PgSQL × × × × × × × ×
Oracle × × × ×
MongoDB × × × × ×
Phoenix × × × × × × × ×
ODPS × × × × × × × × ×
ClickHouse × × × × × × ×
Cassandra × × × × × × × ×
Doris × × × × × × × ×

快速开始

系统体验

在线体验

账号 密码
archer archer

Docker

参考 https://github.com/hhyo/archery/wiki/docker

手动安装

部署说明

运行测试

python manage.py test -v 3

依赖清单

框架

前端组件

服务端

功能依赖

贡献代码

可查阅主页的开发计划以及依赖清单,在对应Issues中回复认领,或者直接提交PR,感谢你对Archery的贡献

贡献包括但不限于以下方式:

  • Wiki文档(开放编辑)
  • Bug修复
  • 新功能提交
  • 代码优化
  • 测试用例完善

交流反馈

致谢

  • archer Archery 项目是基于 archer 二次开发而来
  • goInception 一个集审核、执行、备份及生成回滚语句于一身的MySQL运维工具
  • JetBrains Open Source 为项目提供免费的 IDE 授权

archery's People

Contributors

aceattorney avatar boomballa avatar cpzt avatar deng-tr avatar dependabot[bot] avatar feiazifeiazi avatar finovy avatar flyingonthebed avatar grain-yu avatar hhyo avatar honor100 avatar jan-song avatar jly8866 avatar johnliu2008 avatar kjilupin avatar leoquote avatar lvhejin avatar magmongoing avatar nick2wang avatar ocpeng avatar peng19832 avatar qsummery avatar quanbisen avatar songtao12 avatar sunnywalden avatar unknowissue avatar weideguo avatar woshihaoren avatar woshiyanghai avatar yzypals avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

archery's Issues

[ bug ] 普通用户无法进行sql优化

在提交 issue 前,请查阅以下资源,请先进行搜索来保证没有类似的 issue。
文档 | FAQ

重现步骤
普通用户下,SQL优化 -> 提交SQL

错误日志
/downloads/log/archery.log 中有如下错误信息

[2019-03-14 17:47:07,249][MainThread:139633946654528][task_id:default][exception_logging_middleware.py:11][ERROR]- Traceback (most recent call last):
  File "/opt/venv4archery/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/opt/venv4archery/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 20, in _wrapped_view
    if test_func(request.user):
  File "/opt/venv4archery/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 70, in check_perms
    raise PermissionDenied
django.core.exceptions.PermissionDenied

版本信息

  • 部署方式,Docker部署

[ 建议 ] 操作按钮布局调整

SQL线上的操作日志、实例管理、测试、资源组管理 等按钮,在最右侧,当需要调整配置时,点击不便,而且需要比对最左侧列,确认没有点错。

建议将按钮放在“名称”列后面,这样方便操作

如果启用一个布尔型的配置项, 再禁用, 会导致配置项实际上未关闭

https://github.com/hhyo/archery/blob/master/sql/utils/execute_sql.py#L173

比如这里的判断, 因为写入数据库的时候,是文本型变量, 关闭配置项后, 配置值是 'false', 是字符串, 这里的if 判断条件会为真.

建议修改:

  1. sysconfig 对象中加入 get 方法, 如果获取到的key 的内容是 'false' ,转换为 返回 False ,如果内容是 'true', 返回 True
  2. 把所有的 sys_config.get() 改成 .get(), 使用新定义的get方法

[ 需求 ]支持gh-ost

项目地址:GitHub's Online Schema Migrations for MySQL

  • 删除pt-osc相关代码
  • DDL语句执行时可选择通过inception执行还是gh-ost执行,同时增加表体积检测参数,类似inception_osc_min_table_size,超出时选择非gh-ost执行可给出风险提示
  • gh-ost执行(进度展示)、暂停、终止、cut-over

回滚报错

(1146, "Table '127_0_0_1_3306_archery.$$Inception_backup_information$$' doesn't exist")
您好,我在查看回滚SQL时,报这个错,请问是哪里错了呢?

mysql_slow_query_review_history表中始终没有数据

1、相关配置
#配置archery数据库的连接地址
monitor_db_host="127.0.0.1"
monitor_db_port=3306
monitor_db_user="root"
monitor_db_password="123"
monitor_db_database="archery"

#实例慢日志位置
slowquery_file="/usr/local/mysql/data/slow_query.log"
pt_query_digest="/usr/bin/pt-query-digest"

#实例连接信息
hostname="127.0.0.1:3306" # 和archery实例配置内容保持一致,用于archery做筛选

因为我的archery和数据库在一台服务器上,所以配置信息都写的是本地信息。
实例信息也是写的本地地址。

2、慢日志中的记录
/usr/local/mysql/bin/mysqld, Version: 5.7.24-log (MySQL Community Server (GPL)). started with:
Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument

Time: 2019-01-08T01:50:46.146644Z

User@Host: root[root] @ localhost [] Id: 59

Query_time: 10.000529 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0

SET timestamp=1546912246;
select sleep(10);
/usr/local/mysql/bin/mysqld, Version: 5.7.24-log (MySQL Community Server (GPL)). started with:
Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument

Time: 2019-01-15T08:40:06.033848Z

User@Host: root[root] @ localhost [] Id: 2690

Query_time: 10.000361 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0

use archery;
SET timestamp=1547541606;
select sleep(10);

Time: 2019-01-17T07:46:37.068505Z

User@Host: root[root] @ localhost [] Id: 3207

Query_time: 20.000389 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0

SET timestamp=1547711197;
select sleep(20);

脱敏问题

我用手册中的脱敏规则设置后,发现和实际不一样
(.{3})(.*)(.{4}) 隐藏手机号前3位

(.*)(.{4})$ 保留证件号后4位了

[ How-to ] 如何写单元测试

最近学习了TDD, 学会了一些简单的单元测试方法, 跟大家分享一下, 希望大家看完了, 就可以在项目里加几个单元测试, 提高一下项目的覆盖率

单元测试的核心是比起集成测试, 更加关注过程, 而不是关注结果. 而且因为是"单元"测试, 单个的单元测试只关注一个方法甚至一个方法的一部分, 这些测试全部通过了, 整个系统也就通过了

为了达到"单元"这个效果, 写一个方法的单元测试, 我们要做的事情就是如下几步, 这里我拿一个简单的例子做讲解

# code.py
def func_a():
    result = func_b()
    if result == 'success':
        return True
  1. 屏蔽, 模拟这个方法内调用的其它方法, 比如在要测试A方法, A方法中调用了 B方法
  2. 在测试脚本中调用A方法
  3. 验证B方法有没有被调用, 调用的参数对不对, A方法中对返回值的处理正不正确

Python中模拟方法用到的是mock 模块, 里面有patch作为decorator

https://docs.python.org/3.6/library/unittest.mock.html

那么我们的测试脚本可以这么写

# tests.py
from unittest import TestCase
from code import func_a

class FuncATest(TestCase):
    def setUp(self):
        # 这里定义在这个test class下每次运行测试之前要做的事情, 比如模拟数据

    def tearDown(self):
        # 这里定义每次结束测试要做的事情, 比如销毁模拟数据
        # 在写测试的时候, 要保证各个测试是独立运行的, 
        # 在测试中创建的数据就删除,这是比修改数据后改回来更简单有效的策略
   
    @patch('func_b')
    # 这里把func_b 已经模拟成了一个Mock 对象, 你可以在自己的测试代码里定义它的返回值等
    def testA(self, _func_b): # _func_b 代表被mock的func_b 用_func_b 在程序主题里制定 func_b 的返回值等
        _func_b.return_value = 'success'
        a_result = func_a()
        _func_b.assert_called_once()
       # 验证有没有被调用, 还有更多的断言比如 assert_called_once_with() 可以查看(文档)[https://docs.python.org/3.6/library/unittest.mock.html#the-mock-class]
        self.assertTrue(a_result)
        
        # 验证非 success 的返回
        _func_b.return_value = 'some_thing_else'
        a_result = func_a()
        self.assertIsNone(a_result)

if __name__ == '__main__':
    unittest.main()

这样一个简单的单元测试就完成了, 如我所说, patch所有的调用, 只关注于方法内部. 验证方法内部的数据处理, 以及if for之类的判断是否正常

patch还有别的用法, 大家可以参考文档, 这里我再补充一下patch的一个要注意的点

在patch多个方法的时候, 要注意测试函数的参数, 第一个参数是倒数第一个被patch 的方法, 第二个参数是倒数第二个被patch的方法, 这是由于装饰器的机制造成的, 只要在平时的时候多加注意就可以了

@patch('module.ClassName2')
@patch('module.ClassName1')
def test(MockClass1, MockClass2):

另外在patch对象方法的时候, 要注意要这么写

# code.py
class A:
    def some_method(self):
# tests.py

@patch('A')
def testA(_mock_a):# 同样的 _mock_a 代表的是A
    _mock_a.return_value.some_method.return_value = 'mock return value of the method'
    new_a = A()
    new_a.some_method()
    _mock_a.return_value.some_method.assert_called_once()
    # 这里有点绕, 因为 我们是新建了一个A对象, 所以这个方法其实是 A的返回的对象的方法
    # 在设置方法的返回值的时候, 写了两次 return_value

目前测试都在各个文件夹下的tests.py 里, 大家可以参考之前有过的测试, 并且记得一定要看PythonDjango 的文档.

对于django的测试也可以使用Client 进行模拟访问, 这一部分可以参考我们的 注册测试

今天就写到这里, 大家单元测试写起来, 有什么疑问的可以发在这里, 希望我的文字可以给大家一些启发

本地pycharm打开项目,启动django服务,sql无法执行

【bug】工单执行完成后,页面不会刷新,需要手动刷新,才会变成结束状态

重现步骤
1.4.3,提交sql,审核,执行,然后状态一直是执行中,实际查看数据库发现,语句是没有发送到数据库执行。
好像缺个服务,1.4.2没有这种情况;
同样的代码放到docker里面启动,就正常

错误日志
没有错误日志

版本信息

  • 应用版本:1.4.3
  • 部署方式:手工部署, pycharm 启动

[ bug ]sql查询速度问题

在提交 issue 前,请查阅以下资源,请先进行搜索来保证没有类似的 issue。
文档 | FAQ

重现步骤

  1. 在查询页面正常查询数据库,
  2. 输入带 * 且不带limit 的语句

预期的结果是限制大小后的结果集, 实际因为结果集过大查询超时没有返回。

截图
如果可以,请提供错误信息截图方便我们定位问题

错误日志
如果可以,请务必查看相关错误日志并贴出(这很关键),查看方式

/downloads/log/archery.log
/downloads/log/soar.log
docker logs archery -f --tail=10

版本信息

  • 1.4.2
  • 部署方式,Docker还是手工部署

docker1.3.6 阿里云RDS实例无法获取TOP表空间

RDS的进程状态和慢SQL都是可以获取的,就是TOP空间显示不出来

我发现一个问题
1、把阿里云RDS配置中实例ID和对应主库实例名称删除后,进程和top空间就可以显示,但是慢SQL就查不到了
2、把阿里云RDS配置中实例ID和对应主库实例名称增加后,进程和top空间就不显示了,但是慢SQL就可以显示了

[ bug ]查询语句where created_at>'2019-03-07 18:20',时间带时分报错了

在提交 issue 前,请查阅以下资源,请先进行搜索来保证没有类似的 issue。
文档 | FAQ

重现步骤
简单描述问题出现场景和重现步骤

截图
如果可以,请提供错误信息截图方便我们定位问题
_15519573286293

错误日志
DEBUG:django-q:Pushed ('hamper-william-west-shade', 'f61a12a635944b1f89f51a94b3ba1bd6')
ERROR:default:Traceback (most recent call last):
File "/opt/archery/sql/utils/data_masking.py", line 36, in data_masking
table_hit_columns, hit_columns = self.analy_query_tree(query_tree, instance_name)
File "/opt/archery/sql/utils/data_masking.py", line 154, in analy_query_tree
query_tree_dict = json.loads(query_tree_str)
File "/opt/venv4archery/lib/python3.6/site-packages/simplejson/init.py", line 518, in loads
return _default_decoder.decode(s)
File "/opt/venv4archery/lib/python3.6/site-packages/simplejson/decoder.py", line 370, in decode
obj, end = self.raw_decode(s)
File "/opt/venv4archery/lib/python3.6/site-packages/simplejson/decoder.py", line 400, in raw_decode
return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting ',' delimiter or '}': line 1 column 330 (char 329)

ERROR:default:Traceback (most recent call last):
File "/opt/archery/sql/query.py", line 530, in query
return HttpResponse(json.dumps(masking_result), content_type='application/json')
File "/opt/venv4archery/lib/python3.6/site-packages/simplejson/init.py", line 382, in dumps
return _default_encoder.encode(obj)
File "/opt/venv4archery/lib/python3.6/site-packages/simplejson/encoder.py", line 286, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/opt/venv4archery/lib/python3.6/site-packages/simplejson/encoder.py", line 368, in iterencode
return _iterencode(o, 0)
File "/opt/venv4archery/lib/python3.6/site-packages/simplejson/encoder.py", line 263, in default
o.class.name)
TypeError: Object of type datetime is not JSON serializable

/downloads/log/archery.log
/downloads/log/soar.log
docker logs archery -f --tail=10

版本信息

  • 应用版本 1.4.1
  • 部署方式,Docker

查询数据不能导出成Excel格式

在提交 issue 前,请查阅以下资源,请先进行搜索来保证没有类似的 issue。
文档 | FAQ

重现步骤
v1.3.8
“SQL查询”-->“MySQL查询”,查询结果导出时不能导出成 Excel 格式
v.1.2.0
可以导出

v1.2.0
default
v1.3.8
default

版本信息

  • v1.3.8
  • 手工部署

[ 易用性改善 ] 配置页面增加一些类似向导的功能, 引导用户在一个页面内添加实例,增加或者分配资源组, 关联用户, 设置审批流等

目前的第一次安装用户的初次安装后, 需要执行一些事情, 才能使新用户可用

  1. 添加用户组
  2. 为用户组关联权限
  3. 设置为默认权限组
  4. 添加实例

然后再添加实例的体验是需要自己列一个checklist

  1. 添加实例
  2. 增加并关联资源组
  3. 为资源组关联用户
  4. 为资源组设置审批流
  5. 将资源组设为默认资源组(可选)

这些配置无疑是必要的, 但是也很繁琐, 需要去很多地方去配置, 我的想法是在一个页面上就可以完成这些表单的填写, 并且经过这初次的提交后, 系统就已经是可用的。

后续可以填写别的表单, 进行补充配置

首次配置

  1. 添加一个资源组
  2. 为资源组关联用户
  3. 添加一个用户组
  4. 为用户组关联用户
  5. 为资源组设置工单和查询的审批流程
  6. 设置默认资源组和默认权限组

补充配置

添加资源组流程

  1. 添加资源组
  2. 关联用户(可选)
  3. 配置工单和查询的审批流

添加实例流程

  1. 添加一个实例
  2. 为实例关联资源组

[ bug ]

在提交 issue 前,请查阅以下资源,请先进行搜索来保证没有类似的 issue。
文档 | FAQ

重现步骤
简单描述问题出现场景和重现步骤

截图
如果可以,请提供错误信息截图方便我们定位问题

错误日志
如果可以,请务必查看相关错误日志并贴出(这很关键),查看方式

/downloads/log/archery.log
/downloads/log/soar.log
docker logs archery -f --tail=10

版本信息

  • 应用版本
  • 部署方式,Docker还是手工部署

建议新增功能

1.增加DML和DDL页面。
由于 inception 在同一个命令中不能同时执行 DDL 和 DML,由于开发提交SQL非常随意,且页面上没有提示,所以在执行时会出现备份异常或者工单不执行的问题,望从页面上进行区分。

2.增加工单号功能,并区分DDL和 DML 工单。
目前工单名称需要手动填写,开发人员填写名称各有各的风格,不便于和开发沟通过程中对工单的描述及工单的管理、指派。

3.增加自动派单功能。
DBA有多人时,对SQL 审批轮流分配给 DBA组(或指定组)中的成员并优先提醒他,分配方式采用轮转或者根据值班设置分配给指定人员(如周一 09:00周二 08:59 A值班,周二09:00 周三 08:59 B值班)。

唯一索引创建异常

在archary中提交唯一索引创建工单,执行时异常,并且显示不使用gh-osc,执行速度也很慢,要250s左右,我在命令行直接执行也就2s左右。
创建普通索引是可以的,但是也是很慢
1> Cannot connect to A=utf8,P=2369,h=11.193.2.110,p=...,u=zhan_admin
No slaves found. See --recursion-method if host a61a01334.cloud.et15 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, 10, 1
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Not updating foreign keys because --alter-foreign-keys-method=none. Foreign keys that reference the table will no longer work.
Altering zhan_public_class.tpo_publicclass_signup_users_test...

Event Count

====== =====

INSERT 0

zhan_public_class.tpo_publicclass_signup_users_test was not altered.
You are trying to add an unique key. This can result in data loss if the data is not unique.
Please read the documentation for the --check-unique-key-change parameter.
You can check if the column(s) contain duplicate content by running this/these query/queries:

SELECT IF(COUNT(DISTINCT PassPortId) = COUNT(*),
'Yes, the desired unique index currently contains only unique values',
'No, the desired unique index contains duplicated values. There will be data loss'
) AS IsThereUniqueness FROM zhan_public_class.tpo_publicclass_signup_users_test;

Keep in mind that these queries could take a long time and consume a lot of resources

archery 用kubernetes 部署,出现错误

archery-deployment.yaml :

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: archery
  name: archery
  namespace: archery
spec:
  replicas: 1
  selector:
    matchLabels:
      app: archery
  template:
    metadata:
      labels:
        app: archery
    spec:
      containers:
      - args:
        - -c
        - /opt/archery/src/docker/startup.sh
        command:
        - bash
        image: hhyo/archery
        imagePullPolicy: Always
        name: archery
        ports:
        - containerPort: 9123
          name: http
          protocol: TCP
        volumeMounts:
        - mountPath: /opt/archery/archery/
          name: archery-settings
        - mountPath: /opt/archery/archery/settings.py
          name: setting
          readOnly: true
          subPath: settings.py
        - mountPath: /opt/archery/downloads
          name: archery-downloads
        - mountPath: /etc/soar.yaml
          name: soar
          readOnly: true
          subPath: soar.yaml
      volumes:
      - hostPath:
          path: /opt/archery/archery/
          type: ""
        name: archery-settings
      - configMap:
          name: setting
        name: setting
      - name: archery-downloads
        persistentVolumeClaim:
          claimName: archery-pv-claim
      - configMap:
          name: soar
        name: soar

kubectl apply -f archery-deployment.yaml
出现错误:

[root@test01 mongodb]# kubectl     log   archery-5d5ddfffb4-jkdhj -n archery 
log is DEPRECATED and will be removed in a future version. Use logs instead.
Traceback (most recent call last):
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/arbiter.py", line 202, in run
    self.manage_workers()
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/arbiter.py", line 544, in manage_workers
    self.spawn_workers()
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/arbiter.py", line 612, in spawn_workers
    time.sleep(0.1 * random.random())
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/arbiter.py", line 244, in handle_chld
    self.reap_workers()
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/arbiter.py", line 524, in reap_workers
    raise HaltServer(reason, self.WORKER_BOOT_ERROR)
gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/venv4archery/bin/gunicorn", line 11, in <module>
    sys.exit(run())
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 74, in run
    WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/app/base.py", line 203, in run
    super(Application, self).run()
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/app/base.py", line 72, in run
    Arbiter(self).run()
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/arbiter.py", line 231, in run
    self.halt(reason=inst.reason, exit_status=inst.exit_status)
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/arbiter.py", line 344, in halt
    self.stop()
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/arbiter.py", line 393, in stop
    time.sleep(0.1)
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/arbiter.py", line 244, in handle_chld
    self.reap_workers()
  File "/opt/venv4archery/lib/python3.6/site-packages/gunicorn/arbiter.py", line 524, in reap_workers
    raise HaltServer(reason, self.WORKER_BOOT_ERROR)
gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>

请问如何解决。谢谢。

[ bug ]binlog2sql解析结果中DDL语句展示异常

建议获取时勾选--only-dml,也可到downloads/binlog2sql目录获取完整SQL文件

重现步骤

  • 执行DDL语句,例如create table
  • 打开binlog2sql,不勾选--only-dml,点击获取SQL
  • DDL语句展示异常

截图
image

错误日志
无,仅前端显示异常

版本信息

  • 应用版本:v1.4.3
  • 部署方式:Docker

[ 需求 ]支持直接审核MyBatis的XML文件

  • 第一阶段
    在SQL上线DDL语句时支持提交MyBatis的XML文件,自动解析成SQL语句,和DDL语句一起在工单详情展示,供DBA人肉审核
  • 第二阶段
    按照审核规则(可依靠soar)自动审核XML解析的语句,给出修改建议,分值低的语句自动驳回。

1.2.0升级v1.3.8版本,导入数据前,数据库表结构如何升级?

已执行 src/init_sql/ 中的 v1.2.0_1.3.0.sql 、v1.3.0_1.3.2.sql、v1.3.6_v1.3.7.sql 三个脚本。
其中,
1.2.0 db_ops 中 sql_group 对应 1.3.8 的 resource_group,
1.2.0 db_ops 中 sql_group_relations 对应1.3.8 的 resource_group_relations 。
这4张表结构一致,可以对应。

但是仍有5个表对不上,
1.2.0 db_ops 中多2张表: django_apscheduler_djangojob、django_apscheduler_djangojobexecution。
1.3.8 archery 中多3张表:django_q_ormq、django_q_schedule、django_q_task。

麻烦提供一个表结构的升级脚本。

SOAR无执行权限

我是用docker1.3.5 运行的, 用sqladvisr优化建议报错如下

ERROR:default:Traceback (most recent call last):
File "/opt/archery/sql/sql_advisor.py", line 56, in sqladvisor
stdout, stderr = p.communicate()
File "/usr/local/python3/lib/python3.6/subprocess.py", line 843, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "/usr/local/python3/lib/python3.6/subprocess.py", line 1554, in _communicate
self.stdout.errors)
File "/usr/local/python3/lib/python3.6/subprocess.py", line 740, in _translate_newlines
data = data.decode(encoding, errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb1 in position 453: invalid start byte

普通权限用户sql查询时报list indices must be integers or slices, not str

重现步骤
1.普通用户申请查询权限,管理员审批通过
2.普通用户选择相应的库进行查询报list indices must be integers or slices, not str
3.管理员用户查询任何表不会出现此错误。

错误日志
[2019-02-15 16:57:57,076][MainThread:139963200444224][task_id:default][query.py:578][ERROR]- Traceback (most recent call last):
File "/opt/archery/sql/query.py", line 495, in query
limit_num = priv_check_info['data']['limit_num']
TypeError: list indices must be integers or slices, not str

默认资源组 设置项 无效

我创建了资源组 test_resource,并将实例 master加入了该资源组。
同时创建了用户 test_user,给该用户授予了SQL上线和SQL上线工单权限。
将test_resource设置为默认资源组。
当test_user登录后,提交工单时,无法找到实例。
必须要手动将test_user加入到test_resource后,test_user才能看到实例。

抽象化对SQL语句的操作

目前涉及到SQL语句的操作, 都是函数, 可以把这些操作抽象成一个个的 Engine

相当于 java 里的 Interface , 然后再继承这个Interface , 实现一个 MysqlEngine , 这样方便其它数据库比如 PG , oracle等的接入

class EngineBase:
    def __init__(self, instance=None, workflow=None):
        self.instance = instance
        self.workflow = workflow
    @property
    def Connection(self):
        """返回一个conn实例"""
        pass
    def get_all_databases(self):
        """获取数据库列表, 返回一个list"""
        pass
    def get_all_tables(self, db_name):
        """获取table 列表, 返回一个list"""
        pass
    def get_all_columns_by_tb(self, db_name, table_name):
        """获取所有字段, 返回一个列表"""
        pass
    def query_check(self, db_name, sqlcontent):
        """查询语句的检查"""
        pass
    def query(self, db_name, sqlcontent):
        """实际查询"""
        pass
    def execute_check(self, db_name, sqlcontent):
        """执行语句的检查"""
        pass
    def execute(self, db_name, sqlcontent):
        """执行语句"""
        pass

统一了interface之后, 只要继承interface , 统一返回对象, 实现出来的对象就一定能适配到系统中.

比如有 查询方法叫 Query , 那么代码里只要 get_engine , 然后 SomeEngine.query ,就一定能得到预期的结果.

适配数据库时, 也就不需要更改主逻辑部分的代码. 更棒的是, 如果你不用这个引擎, 就不会import到那些库, 那么在你不用pg的时候, 不装pg相关的依赖也是可以的. 测试功能会更加简单, 尤其在一些依赖很难装的windows 机器上.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.