TL;DR
sysbenchでDROP用のテーブルと、その他トラフィック用のテーブルをprepareして
sysbench runしながらDROP TABLEするだけ
sysbenchは無ければインストール(CentOS 7.xだとepelに入ってる)
$ sudo yum install -y sysbench
ベンチ先がMySQL 8.0の場合、 default_authentication_plugin=mysql_native_password
かつ、sysbench用のアカウントがmysql_native_passwordでされてないとエラーになる。
FATAL: error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
FATAL: `sysbench.cmdline.call_command' function failed: /usr/share/sysbench/oltp_common.lua:83: connection creation failed
ちなみにchaching_sha2_passwordは libmysqlcliento.so
に埋め込まれているので、どこを探しても caching_sha2_password.so
なんてものは無いのでyum providesとかで探す必要はない。
どうしても8.0のcaching_sha2_passwordで通したい場合は最新のmysql-community-develを使ってsysbenchをビルドしなおすことになると思う。
mysql80 16> CREATE USER sysbench@localhost IDENTIFIED WITH mysql_native_password BY '';
Query OK, 0 rows affected (0.02 sec)
mysql80 16> GRANT ALL ON for_drop.* TO sysbench@localhost;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql80 16> GRANT ALL ON sysbench.* TO sysbench@localhost;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql80 21> CREATE DATABASE for_drop;
Query OK, 1 row affected (0.00 sec)
mysql80 21> CREATE DATABASE sysbench;
Query OK, 1 row affected (0.00 sec)
for_dropスキーマの方にデカめのテーブルを作る。
$ sysbench --mysql-socket=/usr/mysql/8.0.29/data/mysql.sock --mysql-user=sysbench --mysql-db=for_drop oltp_common --table-size=10000000 prepare
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Creating table 'sbtest1'...
Inserting 10000000 records into 'sbtest1'
Creating a secondary index on 'sbtest1'...
$ ll -h /usr/mysql/8.0.29/data/for_drop/sbtest1.ibd
-rw-r----- 1 yoku0825 yoku0825 2.3G Jun 29 15:21 /usr/mysql/8.0.29/data/for_drop/sbtest1.ibd
1000万行で2.3Gらしいので、このへんを基準(?)にDROPで試したいテーブルサイズを作る。とりあえず10倍の23GBを作っておいた。
今度はsysbenchスキーマの方に小さめのテーブルを複数作っておく。
$ sysbench --mysql-socket=/usr/mysql/8.0.29/data/mysql.sock --mysql-user=sysbench --mysql-db=sysbench oltp_common --tables=100 prepare
..
で、sysbench側にベンチをかける。
oltp_* にどんなスクリプトが用意されているかはこんな感じ。
$ ll /usr/share/sysbench/
total 132
-rwxr-xr-x 1 root root 1452 May 8 2020 bulk_insert.lua
-rw-r--r-- 1 root root 14369 May 8 2020 oltp_common.lua
-rwxr-xr-x 1 root root 1290 May 8 2020 oltp_delete.lua
-rwxr-xr-x 1 root root 2415 May 8 2020 oltp_insert.lua
-rwxr-xr-x 1 root root 1265 May 8 2020 oltp_point_select.lua
-rwxr-xr-x 1 root root 1649 May 8 2020 oltp_read_only.lua
-rwxr-xr-x 1 root root 1824 May 8 2020 oltp_read_write.lua
-rwxr-xr-x 1 root root 1118 May 8 2020 oltp_update_index.lua
-rwxr-xr-x 1 root root 1127 May 8 2020 oltp_update_non_index.lua
-rwxr-xr-x 1 root root 1440 May 8 2020 oltp_write_only.lua
-rwxr-xr-x 1 root root 1919 May 8 2020 select_random_points.lua
-rwxr-xr-x 1 root root 2118 May 8 2020 select_random_ranges.lua
drwxr-xr-x 4 root root 49 Apr 13 12:53 tests
-rwxr-xr-x 1 root root 12320 May 8 2020 tpcc_check.lua
-rwxr-xr-x 1 root root 20795 May 8 2020 tpcc_common.lua
-rwxr-xr-x 1 root root 1863 May 8 2020 tpcc.lua
-rwxr-xr-x 1 root root 28512 May 8 2020 tpcc_run.lua
oltp_read_onlyにしてみる。--report-interval=1
にすると毎秒出力されるので便利。
$ sysbench --mysql-socket=/usr/mysql/8.0.29/data/mysql.sock --mysql-user=sysbench --mysql-db=sysbench oltp_read_only --tables=100 --report-interval=1 --threads=100 --time=1000 run
..
Threads started!
[ 1s ] thds: 100 tps: 1530.75 qps: 25282.12 (r/w/o: 22122.60/0.00/3159.52) lat (ms,95%): 132.49 err/s: 0.00 reconn/s: 0.00
[ 2s ] thds: 100 tps: 1585.97 qps: 25346.51 (r/w/o: 22180.57/0.00/3165.93) lat (ms,95%): 121.08 err/s: 0.00 reconn/s: 0.00
[ 3s ] thds: 100 tps: 1679.10 qps: 26823.60 (r/w/o: 23465.40/0.00/3358.20) lat (ms,95%): 110.66 err/s: 0.00 reconn/s: 0.00
[ 4s ] thds: 100 tps: 1655.01 qps: 26505.23 (r/w/o: 23195.20/0.00/3310.03) lat (ms,95%): 114.72 err/s: 0.00 reconn/s: 0.00
[ 5s ] thds: 100 tps: 1673.00 qps: 26725.07 (r/w/o: 23377.06/0.00/3348.01) lat (ms,95%): 112.67 err/s: 0.00 reconn/s: 0.00
[ 6s ] thds: 100 tps: 1577.97 qps: 25269.49 (r/w/o: 22112.55/0.00/3156.94) lat (ms,95%): 121.08 err/s: 0.00 reconn/s: 0.00
[ 7s ] thds: 100 tps: 1580.93 qps: 25326.88 (r/w/o: 22166.02/0.00/3160.86) lat (ms,95%): 116.80 err/s: 0.00 reconn/s: 0.00
[ 8s ] thds: 100 tps: 1593.91 qps: 25551.54 (r/w/o: 22365.73/0.00/3185.82) lat (ms,95%): 110.66 err/s: 0.00 reconn/s: 0.00
[ 9s ] thds: 100 tps: 1593.18 qps: 25472.95 (r/w/o: 22282.58/0.00/3190.37) lat (ms,95%): 99.33 err/s: 0.00 reconn/s: 0.00 <--- ここで開始
[ 10s ] thds: 100 tps: 1316.81 qps: 21059.97 (r/w/o: 18429.35/0.00/2630.62) lat (ms,95%): 99.33 err/s: 0.00 reconn/s: 0.00
..
[ 60s ] thds: 100 tps: 1890.99 qps: 30242.85 (r/w/o: 26459.87/0.00/3782.98) lat (ms,95%): 13.46 err/s: 0.00 reconn/s: 0.00
[ 61s ] thds: 100 tps: 1783.59 qps: 28572.41 (r/w/o: 25006.23/0.00/3566.18) lat (ms,95%): 14.73 err/s: 0.00 reconn/s: 0.00
[ 62s ] thds: 100 tps: 1820.78 qps: 29147.51 (r/w/o: 25503.95/0.00/3643.56) lat (ms,95%): 12.98 err/s: 0.00 reconn/s: 0.00
[ 63s ] thds: 100 tps: 1783.71 qps: 28545.30 (r/w/o: 24977.89/0.00/3567.41) lat (ms,95%): 13.95 err/s: 0.00 reconn/s: 0.00
[ 64s ] thds: 100 tps: 1943.01 qps: 31046.16 (r/w/o: 27163.14/0.00/3883.02) lat (ms,95%): 12.98 err/s: 0.00 reconn/s: 0.00
[ 65s ] thds: 100 tps: 1978.97 qps: 31682.47 (r/w/o: 27721.53/0.00/3960.93) lat (ms,95%): 12.75 err/s: 0.00 reconn/s: 0.00
[ 66s ] thds: 100 tps: 1768.98 qps: 28216.69 (r/w/o: 24683.73/0.00/3532.96) lat (ms,95%): 170.48 err/s: 0.00 reconn/s: 0.00 <-- ここで終わった
[ 67s ] thds: 100 tps: 1559.02 qps: 24944.31 (r/w/o: 21828.27/0.00/3116.04) lat (ms,95%): 121.08 err/s: 0.00 reconn/s: 0.00
[ 68s ] thds: 100 tps: 1648.94 qps: 26347.03 (r/w/o: 23046.15/0.00/3300.88) lat (ms,95%): 116.80 err/s: 0.00 reconn/s: 0.00
[ 69s ] thds: 100 tps: 1702.05 qps: 27290.79 (r/w/o: 23887.69/0.00/3403.10) lat (ms,95%): 110.66 err/s: 0.00 reconn/s: 0.00
[ 70s ] thds: 100 tps: 1708.01 qps: 27256.18 (r/w/o: 23839.16/0.00/3417.02) lat (ms,95%): 108.68 err/s: 0.00 reconn/s: 0.00
というわけで、semisyncなしでSELECTしか来てないサーバーだとデカいテーブルのDROP TABLEでも他のクエリにはほとんど影響は無さそうでした。
……というのを手元で確認するためのやり方でした。