Tidb数据库——自定义 lua压测脚本及报告

1、vim config

mysql-host=192.168.180.53
mysql-port=4000
mysql-user=root
mysql-password=q1w2E#R$
# 指定数据库名
mysql-db=sbtest
# 限制最多能够创建 5个事务。默认为 0 表示没有限制
events=1
# 要创建的工作线程总数,客户端的并发连接数
threads=1
# 生成报告的时间间隔,单位是秒,如10
report-interval=10
#
db-driver=mysql

2、新增 vim insert_transfer.lua insert:700万数据 limit5000

#!/usr/bin/env sysbench
-- 执行 cleanup 命令时触发的函数。(清空数据表)
function cleanup()
    local drv = sysbench.sql.driver()
    local con = drv:connect()
    print(string.format("Dropping table dc_organization_master"))
    con:query("DROP TABLE IF EXISTS dc_organization_master")
end


-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
    -- 连接数据库
    local drv = sysbench.sql.driver()
    local con = drv:connect()
    for j = 1, 100 do
        -- 每个事务中7SQL语句,每个语句1W个values;
        -- 1. 开启事务
        con:query("BEGIN")
        for j = 1, 7 do
            -- 编写SQL创建数据
            sql= "INSERT INTO dc_organization_master VALUES"
            -- 编写插入语句前半部分
            con:bulk_insert_init(sql)
            -- 生成 1W个VALUES
            for k = 1, 10000 do
                sql= string.format("('DS000000%d','江阴市海鹏医药有限公司张家港花园浜店','PAAS-ID-%d')", k, k)
                con:bulk_insert_next(sql)
            end
            -- 编写语句结束
            con:bulk_insert_done()
        end
        -- 提交事务
        con:query("COMMIT")
    end
end

2、新增 vim insert.lua insert:tidb某个表复制一份儿到另一个表,5000一提交,新表先建好

#!/usr/bin/env sysbench

-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
    -- 连接数据库
    local drv = sysbench.sql.driver()
    local con = drv:connect()

    --con:query("BEGIN")

    for i = 0, 120 do
    con:query("BEGIN")
      sql = string.format("INSERT INTO dc_flowdata_deliver_inventory_20201120 (SELECT * FROM dc_flowdata_deliver_inventory  order by paas_id  limit %d, %d)", i*5000, 5000)
      local result = con:query(sql)
      print(i)
    con:query("COMMIT")
    end

    --con:query("COMMIT")
end

3、执行

sysbench --config-file=./config insert_transfer.lua run
sysbench --config-file=./config insert.lua run

4、查询
select.lua

#!/usr/bin/env sysbench

-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
    -- 连接数据库
    local drv = sysbench.sql.driver()
    local con = drv:connect()
    for i = 1, 700 do
      -- 编写SQL创建数据
      sql = string.format("SELECT * FROM dc_organization_master LIMIT %d,10000", i * 10000)
      local result = con:query(sql)
      -- 打印第二列
      --print(result:fetch_row()[2])
      --for i = 1, result.nrows do
      --    print(string.format("%s %s %s", unpack(result:fetch_row(), 1, result.nfields)))
      --end
    end
end

update.lua:

[tidb@dev10 pressure_test]$ cat update.lua
#!/usr/bin/env sysbench
-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
    -- 连接数据库
    local drv = sysbench.sql.driver()
    local con = drv:connect()

    for i = 1, 1400 do
        con:query("BEGIN")
        local result = con:query(string.format("UPDATE dc_organization_master SET district = '毛村' WHERE city = '苏州市' limit 5000"))
        con:query("COMMIT")
    end
end

delete.lua

[tidb@dev10 pressure_test]$ cat delete.lua
#!/usr/bin/env sysbench
-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()
    -- 连接数据库
    local drv = sysbench.sql.driver()
    local con = drv:connect()

    for i = 1, 1400 do
        con:query("BEGIN")
        local result = con:query(string.format("DELETE FROM  dc_organization_master WHERE city = '苏州市' limit 5000"))
        con:query("COMMIT")
    end
end

其他参考:

#!/usr/bin/env sysbench

-- 1. 设置参数默认值
sysbench.cmdline.options = {
    table_size = {"一张表多个条数据, 默认值为 1 万", 10000},
    tables = {"创建几张表, 默认创建一张表", 1},
    events_items = {"单个事务中多少条语句, 默认值为 5000 条", 5000}
}

-- 3. 连接数据库,并且根据配置批量创建数据
function cmd_prepare()
    local drv = sysbench.sql.driver()
    local con = drv:connect()
    -- 批量创建
    for i = sysbench.tid % sysbench.opt.threads + 1, sysbench.opt.tables, sysbench.opt.threads do
        create_table(drv, con, i)
    end
end

-- 2. 定义 prepare 命令触发的脚本
sysbench.cmdline.commands = {
    -- 执行批量导入数据函数
    prepare = {cmd_prepare, sysbench.cmdline.PARALLEL_COMMAND}
}


-- 4. 创建数据表、数据
function create_table(drv, con, table_num)
    print(string.format("Creating table 'table_%d'...", table_num))

    -- 1 编写SQL 建表语句
    local query = string.format([[
                                  CREATE TABLE table_%d(
                                    id INTEGER NOT NULL,
                                    big_data TEXT NOT NULL,
                                    PRIMARY KEY (id)
                                  )
                                ]], table_num)
    -- 执行SQL
    con:query(query)

    if (sysbench.opt.table_size > 0) then
        print(string.format("Inserting %d records into 'table_%d'", sysbench.opt.table_size, table_num))
    end


    -- 2 创建较大的数据
    local value = "我是大数据"

    -- 3 编写SQL创建数据
    query = "INSERT INTO table_" .. table_num .. "(id, big_data) VALUES"
    -- 编写插入语句前半部分
    con:bulk_insert_init(query)

    -- 编写多个VALUES
    for i = 1, sysbench.opt.table_size do
        query = string.format("(%d, '%s')", i, value)
        con:bulk_insert_next(query)
    end

    -- 编写语句结束
    con:bulk_insert_done()

end


-- 执行 cleanup 命令时触发的函数。(清空数据)
function cleanup()
    local drv = sysbench.sql.driver()
    local con = drv:connect()

    for i = 1, sysbench.opt.tables do
        print(string.format("Dropping table 'table_%d'...", i))
        con:query("DROP TABLE IF EXISTS table_" .. i)
    end
end


-- 执行 run 命令 触发的函数(开始压测),也就是真正开启事务进行压测的函数
function event()

    -- 随机选择表
    local table_num = sysbench.rand.default(1, sysbench.opt.tables)
    -- 获取当前年月日时分秒
    local datetime = os.date("%Y-%m-%d %H:%M:%S")

    -- 连接数据库
    local drv = sysbench.sql.driver()
    local con = drv:connect()

    -- 1. 开启事务
    con:query("BEGIN")

    -- 在一个事务内循环执行 N 次
    local n = sysbench.opt.events_items
    for i = 1, n do
        -- 将更新数据语句加入到单个事务中
        --
        -- 测试 5000-- local result = con:query(string.format([[ UPDATE table_%d SET big_data = '%s' WHERE id = %d ]], table_num, datetime, i))
        --
        -- 更新 30万 条, 前置条件先造出30万条数据,然后这里不加 where
        -- local result = con:query(string.format([[ UPDATE table_%d SET big_data = '%s' ]], table_num, datetime))
        --
        -- 更新 30万 条, 前置条件先造出30万条数据,分批次更新 添加 LIMIT
        local result = con:query(string.format([[ UPDATE table_%d SET big_data = '%s' LIMIT 5000 ]], table_num, datetime))
        --
        -- 删除 30万 条, 前置条件先造出30万条数据,然后这里不加 where
        -- local result = con:query(string.format([[ DELETE FROM table_%d ]], table_num))
        --
        -- 删除 30万 条, 前置条件先造出30万条数据,分批次删除 添加 LIMIT
        -- local result = con:query(string.format([[ DELETE FROM table_%d LIMIT 5000 ]], table_num))
    end

    -- 回滚事务
    -- con:query("ROLLBACK")

    -- 提交事务
    con:query("COMMIT")
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值