背景

最近的 goInception 版本现已自带 gh-ost 的支持,而且审核系统会根据待操作的表的空间大小判断是否需要使用在线改表(Online DDL Schema Migration),可谓是开箱即用,所以就无需多构建一个二进制可执行文件。

初探

内置 gh-ost 源码:

  • v1.2.5: 内置 v1.0.48
  • v1.3.0: 内置 v1.0.49

判断依据

goInception 具体是如何判断是否要使用 gh-ost,而不是连上去直接改表。
配置文件中有个 osc_min_table_size,单位为 M,其含义如下:

  1. 如果设置为 0,则全部 ALTER 语句都要借助 gh-ost 来完成。
  2. 如果设置为非 0,则当这个表占用空间大小大于这个值时才使用 gh-ost 方式。这个表大小的计算方式是通过语句
select (DATA_LENGTH + INDEX_LENGTH)/1024/1024 from information_schema.tables where table_schema = "dbname" and table_name = "tablename";

也就是说通过计算指定数据库的指定表的数据大小和索引大小,再和配置文件中的参数对比,决定是否使用 gh-ost。

简单的例子

假设我们已经有一张表,和一条数据

CREATE TABLE t1(
     id INT NOT NULL AUTO_INCREMENT,
     c1 int NOT NULL,
     PRIMARY KEY (id)
);
INSERT INTO t1(id, c1) VALUES(1,1);

下面我们为了快速演示功能,可以体现把上面的参数值设置为 0,这样所有的操作都会触发 gh-ost,省去造数据的过程。

[osc]
osc_min_table_size = 0

ghost_on = true

注意事项

  • 添加列的话,要注意该列要有默认值,或允许为空,否则那么旧数据无法迁移。
  • 更改原有列,则是小心不同类型是否有精度损失,转换失败的情况
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import pymysql
import prettytable as pt
tb = pt.PrettyTable()

sql = '''/*--user=root;--password=your_pass;--host=127.0.0.1;--check=1;--port=3306;*/
inception_magic_start;
use test_inc;
ALTER TABLE t1 ADD t1 SMALLINT NULL COMMENT 'test only';
inception_magic_commit;'''

conn = pymysql.connect(
    host='127.0.0.1', user='', passwd='',
    db='', port=4000, charset="utf8mb4",
    cursorclass=pymysql.cursors.DictCursor)

with conn:
    with conn.cursor() as cursor:
        cursor.execute(sql)
        result = cur.fetchall()

tb.field_names = [i[0] for i in cur.description]
for row in result:
    tb.add_row(row.values())
print(tb)

运行结果如下:

+----------+---------+-------------+-----------------+---------------+------------------------------------------------------------------+---------------+--------------+---------------+--------------+-------------------------------------------+-------------+
| order_id |  stage  | error_level |   stage_status  | error_message |                               sql                                | affected_rows |   sequence   | backup_dbname | execute_time |                  sqlsha1                  | backup_time |
+----------+---------+-------------+-----------------+---------------+------------------------------------------------------------------+---------------+--------------+---------------+--------------+-------------------------------------------+-------------+
|    1     | CHECKED |      0      | Audit Completed |      None     | ALTER TABLE t1 ADD t1 SMALLINT NULL COMMENT 'test only'; |   1    | 0_0_00000000 |      None     |      0       | *E1A49E5E78BA67D0D8BD145852D108B7894A84B3 |      0      |
+----------+---------+-------------+-----------------+---------------+------------------------------------------------------------------+---------------+--------------+---------------+--------------+-------------------------------------------+-------------+

若是数据条数比较少的话,结果可能一下子就返回。当然线上的业务库都是上千万,这时候我们就要用另开一个线程,去查询进度,而不是单个进程死等。

未完待续

原始文档比较拗口,摘选如下:

--full-diff
Without this flag, git log -p ... shows commits that touch the specified paths, and diffs about the same specified paths. With this, the full diff is shown for commits that touch the specified paths; this means that "…" limits only commits, and doesn’t limit diff for those commits.

说人话,假设你提交了一个 Commit,这个 Commit Z 修改了 文件 A 和 B。

- More -

背景信息

搭建 SQL 审核引擎服务,审核待上线的 SQL 是否有问题。经调研确定使用 GoInception——一个集审核、执行、备份及生成回滚语句于一身的 MySQL 运维工具。

- More -

问题背景

系统的日志、缓存,或程序的输出、结果等文件写入频率很高,随着时间的推移,磁盘空间的占用慢慢增长,这些超过一定时限的数据,比如 3 个月前的数据,可能没有太大的价值(在此假设重要的事件已经收集并上报),那么在系统空间不足时(如剩余 10% 的可用空间),可删除这些文件,以确保系统和服务的正常运转。

- More -

问题描述

笔者先是在终端安装了 opencv-python 最新版本(4.7.0.72),并在文件头导入了 cv2

但是发现 cv2 的一些全局变量与函数签名无法不全,PyCharm 想要看某个函数的定义文档也是跳转不过去。不过实际调用是可以的,执行结果也是正常的。

image-20230531095440713.webp

- More -