听说你还在苦哈哈的造数据

背景

前段时间一个朋友找到我说,线上有一条 update 表现的非常的诡异;现在的问题在于,线上的数据库不可能让 DBA 实际的去执行 update;想在测试环境复现吧,又不能同步线上的数据到测试环境。

最终是想在测试环境创建一个一样结构的表,然后通过程序向表插入数据,程序已经开发完成了(支持任意表结构),就在这里分享一下。

mtls-auto-file


安装程序

本程序作为 mysqltools-python 的一部分来发行,所以只要把 mysqltools-python 安装上就行了。可以使用 pip 来自动的安装。

pip3 install mysqltools-python --upgrade

创建目标表

在测试环境中创建表。

use tempdb;

create table tempdb.person(
    id bigint not null auto_increment,
    name varchar(16) not null default '',
    birthday date not null
);

create index idx_001 on tempdb.person(birthday);
create index idx_002 on tempdb.person(name);

自动插入数据

mtls-auto-fill 这个命令会去检查表中包含哪些列,列的类型是什么,然后自己去组织相应的插入语句;为了提高插入的效率 mtls-auto-fill 也支持指定并发插入的进程数。

以下命令会开两个进程,每个进程向 tempdb.person 表插入 200 行数据。

mtls-auto-fill --host=127.0.0.1 --port=3306 --user=root --password=dbma@0352 --database=tempdb --table=person --rows=200 --process=2  execute

检查结果

mtls-auto-fill 所有的数值都是随机生成的,理论上来讲表中的所有行都是随机的。

mysql> select * from tempdb.person limit 5;
+----+------------------+------------+
| id | name             | birthday   |
+----+------------------+------------+
|  1 | jqSvgPTB0fsnexab | 2024-08-03 |
|  2 | ky1AJMNuZipcEBb6 | 2036-11-18 |
|  3 | TywJonB1HVUZum6c | 2035-07-01 |
|  4 | x8uIoeCkS10DhpQM | 2037-03-18 |
|  5 | Blp16NGt9moyYdnE | 2035-12-18 |
+----+------------------+------------+
5 rows in set (0.00 sec)

为什么 id 列看起来不是随机的呢?因为 mtls-auto-fill 内部对 auto_increment 做了特别的处理,只要是自增列就让 MySQL 去完成自增的操作。