Skip to content

SQL自动化 原创

数据库在每个企业都占据的非常重要的位置,它存储着一个公司的命脉。对于数据库的管理也非常的复杂多变,很多公司都有专业的 DBA 团队在管理。

但是,不论有无 DBA,对数据库的操作都不会变少,而且都面临着相同的问题:

  1. 不是在提数就是在修数的路上
  2. 不是在审核 SQL 就是在审核 SQL 的路上
  3. 不是在找历史记录就是在找历史记录的路上
  4. 不是在备份就是在备份的路上

还有非常多类似的工作,这就让 DBA 的工作变得枯燥乏味。

我不是 DBA,仅仅是一个懂一点SELECT *的运维工程师,希望能有一个工具能够帮助开发、DBA 甚至运维降低数据库的操作门槛,希望它具有:

  1. 流程审批功能
  2. 自动纠错能力
  3. 自动备份能力
  4. 自动发布能力
  5. 历史操作记录
  6. 一键回滚能力
  7. 版本记录能力

拥有这些能力,可以让日常的操作变的简单,高效。数据库管理者也有时间去做更有意义的事情。

在过程的过程中,使用过不同的数据库管理工具,比如 Yearning、SQLE,它们本质上只是一个数据库管理平台,可以记录日常的操作记录,也能实现流程审批等能力。但是它们依旧是一个一个的孤岛,无法直接打通开发、DBA 之间的部门墙。

那有什么工具可以比它们更好?

也是偶然的机会,发现 Bytebase 这个项目,它的有点在于可以打通 Gitlab->数据库,这样开发可以在 Gitlab 中管理 SQL 语句,其他的自动交给 Bytebase 去完成。

74a9163a1498b70721a57b64c369ae47 MD5

什么是 Bytebase

Bytebase 团队把它定位成面向开发者可靠的数据库 CICD,它不仅仅是数据库管理工具,更是连接开发和 DBA 的桥梁。

它到底具有什么样的能力呢?

  1. SQL 审核
  2. SQL 纠错
  3. SQL 编辑器
  4. GitOps
  5. 备份恢复
  6. 多租户管理

安装部署

说一千,道一万,不如手中过一遍。

这里,我选择在 Kubernetes 中部署。

(1)首先,部署 PG 数据库

yaml

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pv-claim
  labels:
    app: postgres
spec:
  storageClassName: longhorn
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  postgres
  labels:
    app:  postgres
spec:
  selector:
    matchLabels:
      app: postgres
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app:  postgres
    spec:
      containers:
      - name:  postgres
        image:  postgres:15.2
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 4
            memory: 8000Mi
        env:
        - name: POSTGRES_PASSWORD
          value: '123456'
        - name: POSTGRES_USER
          value: 'bytebase'
        - name: POSTGRES_DB
          value: 'postgres'
        - name: PGDATA
          value: /var/lib/postgresql/data/pgdata
        ports:
        - containerPort:  5432
          name:  postgresport
        volumeMounts:
        - name: localtime
          mountPath: /etc/localtime
        - name: data-disk
          mountPath: /var/lib/postgresql/data
      volumes:
        - name: localtime
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
        - name: data-disk
          persistentVolumeClaim:
            claimName: postgres-pv-claim
---
apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  selector:
    app: postgres
  type: NodePort
  ports:
  - name: postgres
    port: 5432
    targetPort: 5432
    protocol: TCP

需要给 PG 的数据做持久化,不然数据丢失就白忙活一场。

(2)部署 Bytebase

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: bytebase-pvc
  labels:
    app: bytebase
spec:
  storageClassName: longhorn
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bytebase
spec:
  selector:
    matchLabels:
      app: bytebase
  template:
    metadata:
      labels:
        app: bytebase
    spec:
      containers:
        - name: bytebase
          image: bytebase/bytebase:1.13.0
          imagePullPolicy: IfNotPresent
          env:
          - name: PG_URL
            value: "postgresql://bytebase:123456@postgres:5432/postgres"
          args:
            [
              "--data",
              "/var/opt/bytebase",
              "--external-url",
              "http://bytebase.jokerbai.com",
              "--port",
              "8080",
            ]
          ports:
            - containerPort: 8080
          volumeMounts:
            - name: data
              mountPath: /var/opt/bytebase
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 300
            periodSeconds: 300
            timeoutSeconds: 60
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: bytebase-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: bytebase-entrypoint
spec:
  type: ClusterIP
  selector:
    app: bytebase
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: bytebase
spec:
  rules:
  - host: bytebase.jokerbai.com
    http:
      paths:
      - backend:
          serviceName: bytebase-entrypoint
          servicePort: 8080
        path: /

(3)待应用都正常表示部署完成

bash
# kubectl get po -n bytebase
NAME                        READY   STATUS    RESTARTS   AGE
bytebase-5559b7ff97-bmwc6   1/1     Running   0          5h18m
postgres-6989656975-5glhh   1/1     Running   0          5h20m

使用示例

第一次登录,会要求你创建管理员用户,按着步骤创建即可。

然后就可以进入如下界面。

0dbe3c282017fed7ce1024a5582b1c5d MD5

用户管理

用户支持手动管理,也支持集成 SSO,这里带大家集成 SSO。

点击设置->SSO->创建SSO,这里需要非常多的信息,

1c0a2b3b389122bb249b93eb9502d09d MD5

然后我们在 Gitlab 上去创建应用,填入上面的回调地址,创建应用。

9b96a89c49f2766198aa31589fbcea4e MD5

dbe3aefc0a963dd9f1315fb43d98e93e MD5

将生成的 ID 和 Secret 填入 Bytebase 中,修改对应的 Gitlab 地址即完成配置。

最后,在登录的时候选择 Gitlab 登录即可。

d37cb9c34aa2a79909911f402edfa33d MD5

实例管理

在实例中添加数据库实例即可。

43ede456084615b1454603dacc7805b0 MD5

这里需要填写超级管理员的用户账户,在添加实例的时候,会到该实例中创建一个 bytebase 数据库,在里面创建一个 migration_history 表用于记录所有的操作记录。

然后,会自动将目标库中的数据库同步到 bytebase 中。

1b95264993cdfe00d53156486aa0ff5c MD5

数据库管理

上面已经介绍会自动同步目标数据库中已有的库,当然,也可以自己创建数据库。

85f7a5a3aa9361a3a60c403ce895ee6f MD5

然后就会自动创建数据库,过程如下:

17c9295ec25b65e91ebb2bfc2204071f MD5

我们可以对数据库中的数据进行操作。比如添加一张 user 表。

点击数据库->变更Scheme->选择刚才创建的joker-test库。

af00a7b796524d209d09c02a750a729f MD5

预览工单即可进入创建页面。

aae7ea289b16facaf6d09a80bf95a3d5 MD5

点击创建,发现 SQL 审核不通过,如下:

30113001a06519c63ed2aa6363704209 MD5

就是说我们不允许字段为空,但是又没有设置默认值。

修改字段如下:

7aca9b2eeb8fd989cd56ebd9c174c08a MD5

现在在 SQL 审核处虽然还是警告,但是不影响创建。

当然,还可以进行 DML 操作,比如我们向刚才创建的 user 表中插入一条 name 为 jackma 的数据。

245d7af84e2fd110ad6aa9150f3b1e86 MD5

项目管理

上面的操作比较分散,在实际中可能会以项目为中心进行管理。

我这里就以环境为中心,首先创建一个 TEST 项目。

af112f1038296c087a8161e3fa6276a8 MD5

进入项目过后,把 joker-test 数据库转移过来。

8c8cbba498bdb4be1ae36bf972e370a0 MD5

除此之外,还需要把当前项目对应的人添加进来。选择设置->添加成员即可。

68e4b0cc7edb3c3fa8972631f875547c MD5

然后就可以进行一些变更操作了。

我们还可以为项目添加一些消息通知,可以方便通知到用户。

1973080bf2505927d3f67fb51e2752f5 MD5

环境管理

环境表示不同实例所属的环境,比如开发环境的数据库,测试环境的数据库。

这里创建环境除了标识数据库的归属,还可以设置审批策略以及备份策略。

0f7d88b77218885cd8560ed4ff51e4a9 MD5

最后

上面仅仅是简单的部署和使用,了解基本的功能。但是目前仅仅停留在数据库管理上,如何打通 Gitlab 和 Bytebase,本篇文章还没有实践,下篇文章补上。

最近更新