Skip to content

Commit

Permalink
添加业务低峰时间范围,ddl只能够在在业务低峰执行选项,避免非dba执行sql锁表影响业务
Browse files Browse the repository at this point in the history
  • Loading branch information
woshiyanghai committed Jul 17, 2024
1 parent 4ac9fad commit c78bf80
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 1 deletion.
27 changes: 27 additions & 0 deletions common/templates/config.html
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,26 @@ <h4 style="color: darkgrey"><b>功能模块配置</b></h4>
<h5 style="color: darkgrey"><b>SQL上线</b></h5>
<hr/>
<div class="form-horizontal">
<div class="form-group">
<label for="query_low_peak_start"
class="col-sm-4 control-label">QUERY_LOW_PEAK_START</label>
<div class="col-sm-5">
<input type="number" class="form-control" id="query_low_peak_start"
key="query_low_peak_start"
value="{{ config.query_low_peak_start }}"
placeholder="每天业务低峰开始时间,单位小时,默认为空" />
</div>
</div>
<div class="form-group">
<label for="query_low_peak_end"
class="col-sm-4 control-label">QUERY_LOW_PEAK_END</label>
<div class="col-sm-5">
<input type="number" class="form-control" id="query_low_peak_end"
key="query_low_peak_end"
value="{{ config.query_low_peak_end }}"
placeholder="每天业务低峰结束时间,单位小时,默认为空" />
</div>
</div>
<div class="form-group">
<label for="critical_ddl_regex"
class="col-sm-4 control-label">CRITICAL_DDL_REGEX</label>
Expand Down Expand Up @@ -1319,6 +1339,13 @@ <h5 class="control-label text-bold">当前审批流程:<b id="workflow_auditor
return;
}
}
// 业务低峰期时间设置开始时间和结束时间必须同时填写
var start = $("#query_low_peak_start").val();
var end = $("#query_low_peak_end").val();
if ((start === "" && end !== "") || (start !== "" && end === "")) {
alert('业务低峰开始时间和结束时间必须同时填写!');
return;
}
var sys_config = $("#div-system-config");
var configs = [];
sys_config.find('[key]').each(
Expand Down
9 changes: 9 additions & 0 deletions sql/sql_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
can_timingtask,
can_cancel,
can_execute,
on_query_low_peak_time_ddl,
on_correct_time_period,
can_view,
can_rollback,
Expand Down Expand Up @@ -306,6 +307,14 @@ def execute(request):
"errMsg": "不在可执行时间范围内,如果需要修改执行时间请重新提交工单!"
}
return render(request, "error.html", context)
sys_config = SysConfig()
if not request.user.is_superuser and on_query_low_peak_time_ddl(workflow_id) is False:
start = sys_config.get("query_low_peak_start", 0)
end = sys_config.get("query_low_peak_end", 24)
context = {
"errMsg": "管理员设置了业务低峰期时间范围:每天%s:00至%s,你只能在业务低峰时间范围执行DDL工单操作!" % (start, end)
}
return render(request, "error.html", context)
# 获取审核信息
audit_id = Audit.detail_by_workflow_id(
workflow_id=workflow_id, workflow_type=WorkflowType.SQL_REVIEW
Expand Down
20 changes: 20 additions & 0 deletions sql/utils/sql_review.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,26 @@ def can_execute(user, workflow_id):
result = True
return result

def on_query_low_peak_time_ddl(workflow_id, run_date=None):
"""
判断是否是ddl,ddl必须在业务低峰期执行,包括人工执行和定时执行
:param workflow_id:
:param run_date:
:return:
"""
config = SysConfig()
workflow_detail = SqlWorkflow.objects.get(id=workflow_id)
start = int(config.get("query_low_peak_start", ""))
end = int(config.get("query_low_peak_end", ""))
result = True
ctime = run_date or datetime.datetime.now()
hour = ctime.hour
syntax_type = workflow_detail.syntax_type
if syntax_type == 1:
if (start and hour < start) or (end and hour > end):
result = False
return result


def on_correct_time_period(workflow_id, run_date=None):
"""
Expand Down
9 changes: 8 additions & 1 deletion sql_api/api_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
from sql.notify import notify_for_audit, notify_for_execute
from sql.query_privileges import _query_apply_audit_call_back
from sql.utils.resource_group import user_groups
from sql.utils.sql_review import can_cancel, can_execute, on_correct_time_period
from sql.utils.sql_review import can_cancel, can_execute, on_correct_time_period,on_query_low_peak_time_ddl
from sql.utils.tasks import del_schedule
from sql.utils.workflow_audit import Audit, get_auditor, AuditException
from .filters import WorkflowFilter, WorkflowAuditFilter
Expand Down Expand Up @@ -340,6 +340,13 @@ def post(self, request):
"errors": "不在可执行时间范围内,如果需要修改执行时间请重新提交工单!"
}
)
sys_config = SysConfig()
if not request.user.is_superuser and on_query_low_peak_time_ddl(workflow_id) is False:
start = sys_config.get("query_low_peak_start", 0)
end = sys_config.get("query_low_peak_end", 24)
raise serializers.ValidationError(
{"errMsg": "管理员设置了业务低峰期时间范围:每天%s:00至%s,你只能在业务低峰时间范围执行DDL工单操作!" % (start, end)}
)

# 获取审核信息
audit_id = Audit.detail_by_workflow_id(
Expand Down

0 comments on commit c78bf80

Please sign in to comment.