完全随机的向表中插入数据

背景

线上数据库出了性能问题,为了复现 DBA 可能要在测试环境建一个类似的表,但是数据并不能从生产环境导出来(规定上不允许导出),那数据我们只能是自己造了。

这类问题遇到了几次,所以最近写了个程序,并开源了出来让大家也可以用上。

sqlpy


第一步 安装 mysqltools-python

mysqltools-python 已经发布到了 pypi ,支持直接使用 pip install 进行安装。

pip install mysqltools-python

Installing collected packages: mysqltools-python
  Attempting uninstall: mysqltools-python
    Found existing installation: mysqltools-python 2.20.10.1
    Uninstalling mysqltools-python-2.20.10.1:
      Successfully uninstalled mysqltools-python-2.20.10.1
    Running setup.py install for mysqltools-python ... done
Successfully installed mysqltools-python-2.20.11.20

第二步 建表

在 MySQL 中创建我们要插入数据的表。

use tempdb;

create table person(
    id int not null auto_increment primary key,
    first_name varchar(16),
    last_name varchar(16),
    birthday datetime,
    index idx_001 (first_name,last_name),
    index idx_002 (birthday)
);


第三步 填充数据

安装完 mysqltools-python 之后你就可以使用 mtls-auto-fill 这个命令了,它实现了填充数据的功能。

mtls-auto-fill --host=127.0.0.1 --port=3306 --user=appuser --password=123456 \
--database=tempdb --table=person \
--rows=100 --process=1 execute

Report:
------------------------------------
|tps = 1895.842417578251
|cost_time = 0.052747
------------------------------------
Compelete.

第四步 检查

进入数据库看一下数据是不是真的插入进去了。

mysql> show tables;
+------------------+
| Tables_in_tempdb |
+------------------+
| person           |
+------------------+
1 row in set (0.00 sec)

mysql> select * from person limit 7;
+----+------------------+------------------+---------------------+
| id | first_name       | last_name        | birthday            |
+----+------------------+------------------+---------------------+
|  1 | amzADwiXluOjF0QH | Ql4A8LzhqdjgxOir | 2018-01-15 23:50:14 |
|  2 | snPWoMaZgVLT9CbX | KsZp0EBMPJA6LTV8 | 2021-07-03 22:01:30 |
|  3 | pCUZiYV6z9RFTE24 | 85MFk2zlQPWd1Zxh | 2034-12-09 19:07:57 |
|  4 | hsmR7Lo5Y0EGzgyD | Rg1GXCSN38QLpnYs | 2028-02-24 07:37:43 |
|  5 | hjI0Z2Vc7sCOv4oz | RmrFM56ZCcK23Y10 | 2036-06-24 09:04:52 |
|  6 | o1Midatxu09VDWSI | JnQ1qKrCyBsiGE5V | 2028-11-24 13:01:48 |
|  7 | eBTOF1PqDNmniozw | mVYKGnXF2pisyWSf | 2016-09-10 02:24:10 |
+----+------------------+------------------+---------------------+
7 rows in set (0.00 sec)

mtls-auto-fill 的内部逻辑

第一步、从 information_schema.columns 表中查询出给定表的所有列的名字,类型 等其它信息。

第二步、根据查询到的类型随机且动态的生成对应类型的值,加上表名,列名 组合成一条完整的 SQL 语句。

第三步、多进程的向数据库插入值。


其它

注意! mtls-auto-fill 造出来的数据是完全随机的,线上的数据可能达不到这样的随机度。