Linux多库并行多表并行造MySQL大数据 原创 数据库 2020年12月3日 21:51 夏至未至 1092 当前内容 14241 字,在路上,马上到,马上到 ### 目录 [TOC] ### 脚本说明 1. 鉴于系统资源有限,并不是并发数越高越好,这个应该不难理解,用以下场景说明并行用法:场景为100个库,库并发数为 5; 每个库100张表,并发数为5。那么,在脚本运行过程中,始终都有 5 * 5 = 25 个进程在跑,也就是25个表在同时插数据,这个数值并不是越大越好,需视系统情况而定。 2. 如果脚本运行报语法错误,请参照此文处理:[Linux运行脚本报错](https://www.codecomeon.com/posts/208/ "Linux运行脚本报错") ### 脚本特点 #### 优点 1. 库名、表名继续支持自定义,随心命名 2. 数据库个数、库下表个数、表下行数支持自定义 3. 多库并行插数据,库下多表并行插数据,库、表并行数量支持自定义 4. 使用存储过程加表拷贝的方式,性能甚好 5. 支持插入图片、文本文件等,此也是为快速造数据加分的地方 6. 配置方便,即开即用 #### 缺点 1. 插入文件需要配置数据库,即mysql文件导入,需要使用 load_file 函数,load_file 使用配置,[详见这里](https://www.codecomeon.com/posts/48/ "详见这里")。 2. 由于数据库和表都支持并行,但鉴于系统资源问题,并不是通道数越高越好,需要据自身环境情况而定。 ### 使用步骤 #### 环境检查 由于是需要插入文件,需要配置mysql文件导入功能,[请移步这里](https://www.codecomeon.com/posts/48/ "请移步这里")。配置完成后,用如下方式验证: mysql> select load_file("/mysql_load_file/codecomeon.jpg"); 只要输出不是 NULL,就证明配置成功。 拿当前测试环境为例,我脚本和图片都放在如下路径: [root@localhost mysql_load_file]# pwd /mysql_load_file [root@localhost mysql_load_file]# 配置导入文件后,查询可得: mysql> show global variables like '%secure%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | require_secure_transport | OFF | | secure_auth | ON | | secure_file_priv | /mysql_load_file/ | +--------------------------+--------+ 3 rows in set (0.13 sec) mysql> 至此环境配置完成。 #### 创建脚本 复制文末脚本内容,创建脚本,这里假设为:superbigdata.sh,其中codecomeon.jpg为默认插入的图片,与脚本放在同级目录即可,以下提供图片源,以供下载使用: [root@localhost mysql_load_file]# ll total 44 -rw-r--r--. 1 root root 33736 Mar 3 04:19 codecomeon.jpg -rw-r--r--. 1 root root 6724 Mar 3 03:20 superbigdata.sh [root@localhost mysql_load_file]# 给最高权限 [root@localhost mysql_load_file]# chmod 777 /mysql_load_file/ -R 如果因为拷贝导致编码格式错乱,脚本运行报错,试试以下命令,改变文件编码: :set ff=unix > 需要在 vi 或 vim 在 查看模式下输入需要在 vi 或 vim 在 查看模式下输入。  #### 脚本配置 以下内容为整个脚本唯一需要修改的地方,简单配置,其他均无需再改动: #========================================================# #------------------1. 连接数据库参数配置-----------------# # 数据库实例用户 DB_USER_NAME=root # 数据库实例密码 DB_PASSWORD=123456 # 数据库实例端口号 DB_PORT=3306 # 据库实例IP DB_HOST=localhost #-------------------2. 造数据参数配置---------------------# # 数据库个数(默认10个) DB_NUMBER=10 # 多个数据库,几个库同时插数据,即多库并发量(默认5个库同时插数据) DB_BINGFA_NUMBER=5 # 单库下表的个数(默认5个) TB_NUMBER=5 # 希望单库下,几个表同时插数据,即单库下多表并发量(默认5个表同时插数据) TB_BINGFA_NUMBER=5 # 单表插多少行数据(默认插5行) TB_LINE_NUMBER=5 # 数据库基础名(实际表名=基础库名 + 数字) eg:codedb_1001 DB_BASE_NAME=codedb_ # 单库中表基础名(默认:code_tb_)[实际表名=基础表名 + 数字]:eg:code_tb_1001 TB_BASE_NAME=code_tb_ # 表中插入的文件名(可以是图片、文本等,文件需和当前脚本在同级目录,默认为 codecomeon.jpg) LOAD_FILE_NAME=codecomeon.jpg #------------------自定义配置结束,其他勿动---------------# #=========================================================# 其中需要配置的分为两类: 1. 连接数据库参数配置:连接数据的参数,根即账号、密码、端口号、IP 2. 造数据参数配置:数据库数量、数据库并发量、表数量、表并发量、表行数、数据库基础名、表基础名、最后是插入的文件名 ### 执行效果 #### 并发验证 数据并发数(5) 乘 表并发数(5) = 25 张表同时进行造数据: mysql> show processlist; +-------+------+-----------+-------------+---------+------+--------------+------------------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-------+------+-----------+-------------+---------+------+--------------+------------------------------------------------------+ | 10610 | root | localhost | NULL | Query | 0 | starting | show processlist | | 15119 | root | localhost | codedb_1001 | Query | 16 | Sending data | CREATE TABLE code_tb_1002 SELECT * FROM code_tb_1001 | | 15120 | root | localhost | codedb_1004 | Query | 16 | Sending data | CREATE TABLE code_tb_1002 SELECT * FROM code_tb_1001 | | 15121 | root | localhost | codedb_1004 | Query | 16 | Sending data | CREATE TABLE code_tb_1004 SELECT * FROM code_tb_1001 | | 15122 | root | localhost | codedb_1004 | Query | 16 | Sending data | CREATE TABLE code_tb_1006 SELECT * FROM code_tb_1001 | | 15123 | root | localhost | codedb_1003 | Query | 16 | Sending data | CREATE TABLE code_tb_1006 SELECT * FROM code_tb_1001 | | 15124 | root | localhost | codedb_1003 | Query | 16 | Sending data | CREATE TABLE code_tb_1003 SELECT * FROM code_tb_1001 | | 15125 | root | localhost | codedb_1003 | Query | 16 | Sending data | CREATE TABLE code_tb_1005 SELECT * FROM code_tb_1001 | | 15126 | root | localhost | codedb_1004 | Query | 16 | Sending data | CREATE TABLE code_tb_1005 SELECT * FROM code_tb_1001 | | 15127 | root | localhost | codedb_1004 | Query | 16 | Sending data | CREATE TABLE code_tb_1003 SELECT * FROM code_tb_1001 | | 15128 | root | localhost | codedb_1002 | Query | 16 | Sending data | CREATE TABLE code_tb_1005 SELECT * FROM code_tb_1001 | | 15129 | root | localhost | codedb_1002 | Query | 16 | Sending data | CREATE TABLE code_tb_1002 SELECT * FROM code_tb_1001 | | 15130 | root | localhost | codedb_1002 | Query | 16 | Sending data | CREATE TABLE code_tb_1006 SELECT * FROM code_tb_1001 | | 15131 | root | localhost | codedb_1005 | Query | 16 | Sending data | CREATE TABLE code_tb_1004 SELECT * FROM code_tb_1001 | | 15132 | root | localhost | codedb_1005 | Query | 16 | Sending data | CREATE TABLE code_tb_1005 SELECT * FROM code_tb_1001 | | 15133 | root | localhost | codedb_1001 | Query | 16 | Sending data | CREATE TABLE code_tb_1003 SELECT * FROM code_tb_1001 | | 15134 | root | localhost | codedb_1001 | Query | 16 | Sending data | CREATE TABLE code_tb_1006 SELECT * FROM code_tb_1001 | | 15135 | root | localhost | codedb_1002 | Query | 16 | Sending data | CREATE TABLE code_tb_1003 SELECT * FROM code_tb_1001 | | 15136 | root | localhost | codedb_1003 | Query | 16 | Sending data | CREATE TABLE code_tb_1002 SELECT * FROM code_tb_1001 | | 15137 | root | localhost | codedb_1001 | Query | 16 | Sending data | CREATE TABLE code_tb_1005 SELECT * FROM code_tb_1001 | | 15138 | root | localhost | codedb_1003 | Query | 16 | Sending data | CREATE TABLE code_tb_1004 SELECT * FROM code_tb_1001 | | 15139 | root | localhost | codedb_1002 | Query | 16 | Sending data | CREATE TABLE code_tb_1004 SELECT * FROM code_tb_1001 | | 15140 | root | localhost | codedb_1001 | Query | 16 | Sending data | CREATE TABLE code_tb_1004 SELECT * FROM code_tb_1001 | | 15141 | root | localhost | codedb_1005 | Query | 16 | Sending data | CREATE TABLE code_tb_1002 SELECT * FROM code_tb_1001 | | 15142 | root | localhost | codedb_1005 | Query | 16 | Sending data | CREATE TABLE code_tb_1003 SELECT * FROM code_tb_1001 | | 15143 | root | localhost | codedb_1005 | Query | 16 | Sending data | CREATE TABLE code_tb_1006 SELECT * FROM code_tb_1001 | +-------+------+-----------+-------------+---------+------+--------------+------------------------------------------------------+ 26 rows in set (0.07 sec) #### 执行输出 [root@localhost data]# sh superbigdata.sh ******************************* 参数确认: 数据库用户=root 数据库密码=123456 数据库端口号=3306 数据库IP=localhost ******************************* 数据库总数=10 数据库并发数=5 表总数=5 表并发数=5 ******************************* Are You Sure? [y/n] y Yes 正在插数据到数据库:codedb_1003 正在插数据到数据库:codedb_1004 正在插数据到数据库:codedb_1005 正在插数据到数据库:codedb_1001 正在插数据到数据库:codedb_1002 正在插数据到表:codedb_1001.code_tb_1001 正在插数据到表:codedb_1005.code_tb_1001 正在插数据到表:codedb_1004.code_tb_1001 正在插数据到表:codedb_1003.code_tb_1001 正在插数据到表:codedb_1002.code_tb_1001 正在插数据到表:codedb_1001.code_tb_1004 正在插数据到表:codedb_1001.code_tb_1005 正在插数据到表:codedb_1001.code_tb_1002 正在插数据到表:codedb_1001.code_tb_1003 正在插数据到表:codedb_1005.code_tb_1004 正在插数据到表:codedb_1005.code_tb_1005 正在插数据到表:codedb_1005.code_tb_1002 正在插数据到表:codedb_1005.code_tb_1003 正在插数据到数据库:codedb_1006 正在插数据到数据库:codedb_1007 正在插数据到表:codedb_1007.code_tb_1001 正在插数据到表:codedb_1006.code_tb_1001 正在插数据到表:codedb_1002.code_tb_1004 正在插数据到表:codedb_1002.code_tb_1005 正在插数据到表:codedb_1002.code_tb_1002 正在插数据到表:codedb_1002.code_tb_1003 正在插数据到表:codedb_1004.code_tb_1003 正在插数据到表:codedb_1004.code_tb_1004 正在插数据到表:codedb_1004.code_tb_1005 正在插数据到表:codedb_1004.code_tb_1002 正在插数据到表:codedb_1003.code_tb_1003 正在插数据到表:codedb_1003.code_tb_1004 正在插数据到表:codedb_1003.code_tb_1005 正在插数据到表:codedb_1003.code_tb_1002 正在插数据到数据库:codedb_1008 正在插数据到表:codedb_1008.code_tb_1001 正在插数据到表:codedb_1006.code_tb_1004 正在插数据到表:codedb_1006.code_tb_1002 正在插数据到表:codedb_1006.code_tb_1003 正在插数据到表:codedb_1006.code_tb_1005 正在插数据到表:codedb_1007.code_tb_1004 正在插数据到表:codedb_1007.code_tb_1002 正在插数据到表:codedb_1007.code_tb_1003 正在插数据到表:codedb_1007.code_tb_1005 正在插数据到数据库:codedb_1009 正在插数据到表:codedb_1009.code_tb_1001 正在插数据到数据库:codedb_1010 正在插数据到表:codedb_1010.code_tb_1001 正在插数据到表:codedb_1008.code_tb_1004 正在插数据到表:codedb_1008.code_tb_1005 正在插数据到表:codedb_1008.code_tb_1002 正在插数据到表:codedb_1008.code_tb_1003 正在插数据到表:codedb_1009.code_tb_1004 正在插数据到表:codedb_1009.code_tb_1005 正在插数据到表:codedb_1009.code_tb_1002 正在插数据到表:codedb_1009.code_tb_1003 正在插数据到表:codedb_1010.code_tb_1003 正在插数据到表:codedb_1010.code_tb_1004 正在插数据到表:codedb_1010.code_tb_1005 正在插数据到表:codedb_1010.code_tb_1002 ============================= 插数据完成,耗时:28 秒 [root@localhost data]# ### 测试结果 [root@localhost data]# mysql -uroot -p123456 -S /var/lib/mysql/mysql.sock mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5988 Server version: 5.7.37 MySQL Community Server (GPL) Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | codedb_1001 | | codedb_1002 | | codedb_1003 | | codedb_1004 | | codedb_1005 | | codedb_1006 | | codedb_1007 | | codedb_1008 | | codedb_1009 | | codedb_1010 | | mysql | | performance_schema | | sys | +--------------------+ 14 rows in set (1.15 sec) mysql> mysql> use codedb_1008; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-----------------------+ | Tables_in_codedb_1008 | +-----------------------+ | code_tb_1001 | | code_tb_1002 | | code_tb_1003 | | code_tb_1004 | | code_tb_1005 | +-----------------------+ 5 rows in set (0.00 sec) mysql> mysql> select count(*) from code_tb_1004; +----------+ | count(*) | +----------+ | 5 | +----------+ 1 row in set (0.13 sec) mysql> ### 脚本源码 #!/bin/bash #********************************************************* #* Author : codecomeon #* Email : codecomeon@qq.com #* Site: : https://www.codecomeon.com/ #* Last modified : 2022-02-15 : 13:10:15 #* Description : 多库并行多表并行造MySQL大数据 #* ******************************************************* CURRENT_PATH=$(cd "$(dirname "$0")"; pwd) #========================================================# #------------------1. 连接数据库参数配置-----------------# # 数据库实例用户 DB_USER_NAME=root # 数据库实例密码 DB_PASSWORD=123456 # 数据库实例端口号 DB_PORT=3306 # 据库实例IP DB_HOST=localhost #-------------------2. 造数据参数配置---------------------# # 数据库个数(默认10个) DB_NUMBER=10 # 多个数据库,几个库同时插数据,即多库并发量(默认5个库同时插数据) DB_BINGFA_NUMBER=5 # 单库下表的个数(默认5个) TB_NUMBER=5 # 希望单库下,几个表同时插数据,即单库下多表并发量(默认5个表同时插数据) TB_BINGFA_NUMBER=5 # 单表插多少行数据(默认插5行) TB_LINE_NUMBER=5 # 数据库基础名(实际表名=基础库名 + 数字) eg:codedb_1001 DB_BASE_NAME=codedb_ # 单库中表基础名(默认:code_tb_)[实际表名=基础表名 + 数字]:eg:code_tb_1001 TB_BASE_NAME=code_tb_ # 表中插入的文件名(可以是图片、文本等,文件需和当前脚本在同级目录,默认为 codecomeon.jpg) LOAD_FILE_NAME=codecomeon.jpg #------------------自定义配置结束,其他勿动---------------# #=========================================================# CUSER=$(id |cut -d"(" -f2 | cut -d ")" -f1) if [ "$CUSER" != "root" ]; then echo "Permission: Please switch to the root user" exit 1 fi echo "*******************************" echo -e "\e[32m参数确认:\e[0m" echo -e "数据库用户=\e[33m$DB_USER_NAME\e[0m" echo -e "数据库密码=\e[33m$DB_PASSWORD\e[0m" echo -e "数据库端口号=\e[33m$DB_PORT\e[0m" echo -e "数据库IP=\e[33m$DB_HOST\e[0m" echo "*******************************" echo -e "数据库总数=\e[33m$DB_NUMBER\e[0m" echo -e "数据库并发数=\e[33m$DB_BINGFA_NUMBER\e[0m" echo -e "表总数=\e[33m$TB_NUMBER\e[0m" echo -e "表并发数=\e[33m$TB_BINGFA_NUMBER\e[0m" echo "*******************************" read -r -p "Are You Sure? [y/n] " input case $input in [yY][eE][sS]|[yY]) echo "Yes" ;; [nN][oO]|[nN]) ¥5.00 解锁全文 下载资源 本文标题: Linux多库并行多表并行造MySQL大数据 本文作者: 夏至未至 发布时间: 2020年12月3日 21:51 最近更新: 2022年8月16日 14:52 原文链接: 许可协议: 署名-非商业性-禁止演绎 4.0 国际(CC BY-NC-ND 4.0) 请按协议转载并保留原文链接及作者 MySQL(28) shell(10) 上一个 SELinux 下一个 Linux多库串行多表并行造MySQL大数据 当前文章评论暂未开放,请移步至留言处留言。