Linux多库串行多表并行造MySQL大数据 原创 数据库 2020年11月1日 22:58 夏至未至 2093 当前内容 11981 字,在路上,马上到,马上到 ### 目录 [TOC] ### 脚本特点 #### 优点 1. 库名、表名支持自定义 2. 数据库个数、库下表个数、表下行数支持自定义 3. 库下多表并行插数据,并行数量支持自定义 4. 并行插数据,使用存储过程加表拷贝的方式,性能较好 5. 配置方便,即开即用 #### 缺点 1. 目前多库之间仍然是串行,即一个数据库一个数据库的插,但是单库下,多变一定是并行插入 2. 数据重复 ### 脚本升级 [多库并行多表并行造MySQL大数据](https://www.codecomeon.com/posts/121/ "多库并行多表并行造MySQL大数据"):即库与库之间也是并行插数据,库下的多表也是并行插数据,并且,并行数据均支持自定义 ### 使用步骤 #### 创建脚本 复制文末脚本内容,创建脚本,这里假设为:bigdata.sh: [root@localhost data]# ll total 8 -rw-r--r--. 1 root root 5793 Mar 1 02:13 bigdata.sh [root@localhost data]# 如果因为拷贝导致编码格式错乱,脚本运行报错,试试以下命令,改变文件编码: :set ff=unix 需要在 `vi` 或 `vim` 在 查看模式下输入。或者参照:[Linux运行脚本报错](https://www.codecomeon.com/posts/208/ "Linux运行脚本报错") #### 脚本配置 以下内容为整个脚本唯一需要修改的地方,简单配置,其他均无需再改动: #========================================================# #------------------1. 连接数据库参数配置-----------------# # 数据库实例用户 DB_USER_NAME=root # 数据库实例密码 DB_PASSWORD=123456 # 数据库实例端口号 DB_PORT=3306 # 据库实例IP DB_HOST=localhost #-------------------2. 造数据参数配置---------------------# # 数据库个数(默认10个) DB_NUMBER=10 # 数据库基础名(实际表名=基础库名 + 数字) eg:codedb_1001 DB_BASE_NAME=codedb_ # 单库下表的个数(默认10个) TB_NUMBER=10 # 单表插多少行数据(默认插5行) TB_LINE_NUMBER=5 # 单库中表基础名(默认:code_tb_)[实际表名=基础表名 + 数字]:eg:code_tb_1001 TB_BASE_NAME=code_tb_ # 希望单库下,几个表同时插数据,即单库下表并发量(默认5个表同时插数据) TB_BINGFA_NUMBER=5 #------------------自定义配置结束,其他勿动---------------# #=========================================================# 其中需要配置的分为两类: 1. 连接数据库参数配置:连接数据的参数,根即账号、密码、端口号、IP 2. 造数据参数配置:数据库数量、数据库基础名、库下表格数、表下行数、表基础名、多表并发数 ### 执行效果 #### 执行输出 [root@localhost data]# sh bigdata.sh ******************************* 参数确认: 数据库用户=root 数据库密码=123456 数据库端口号=3306 数据库IP=localhost ******************************* 数据库总数=10 数据库表总数=10 表并发数=5 ******************************* Are You Sure? [y/n] y Yes ============================= 正在创建数据库:codedb_1001 正在插数据到表:code_tb_1001 正在插数据到表:code_tb_1003 正在插数据到表:code_tb_1004 正在插数据到表:code_tb_1005 正在插数据到表:code_tb_1006 正在插数据到表:code_tb_1002 正在插数据到表:code_tb_1007 正在插数据到表:code_tb_1008 正在插数据到表:code_tb_1009 正在插数据到表:code_tb_1010 ============================= 正在创建数据库:codedb_1002 正在插数据到表:code_tb_1001 正在插数据到表:code_tb_1006 正在插数据到表:code_tb_1003 正在插数据到表:code_tb_1004 正在插数据到表:code_tb_1005 正在插数据到表:code_tb_1002 正在插数据到表:code_tb_1007 正在插数据到表:code_tb_1008 正在插数据到表:code_tb_1009 正在插数据到表:code_tb_1010 ============================= 正在创建数据库:codedb_1003 正在插数据到表:code_tb_1001 正在插数据到表:code_tb_1006 正在插数据到表:code_tb_1003 正在插数据到表:code_tb_1004 正在插数据到表:code_tb_1005 正在插数据到表:code_tb_1002 正在插数据到表:code_tb_1007 正在插数据到表:code_tb_1008 正在插数据到表:code_tb_1009 正在插数据到表:code_tb_1010 ============================= 正在创建数据库:codedb_1004 正在插数据到表:code_tb_1001 正在插数据到表:code_tb_1006 正在插数据到表:code_tb_1003 正在插数据到表:code_tb_1004 正在插数据到表:code_tb_1005 正在插数据到表:code_tb_1002 正在插数据到表:code_tb_1007 正在插数据到表:code_tb_1008 正在插数据到表:code_tb_1009 正在插数据到表:code_tb_1010 ============================= 正在创建数据库:codedb_1005 正在插数据到表:code_tb_1001 正在插数据到表:code_tb_1003 正在插数据到表:code_tb_1004 正在插数据到表:code_tb_1005 正在插数据到表:code_tb_1006 正在插数据到表:code_tb_1002 正在插数据到表:code_tb_1007 正在插数据到表:code_tb_1008 正在插数据到表:code_tb_1009 正在插数据到表:code_tb_1010 ============================= 正在创建数据库:codedb_1006 正在插数据到表:code_tb_1001 正在插数据到表:code_tb_1003 正在插数据到表:code_tb_1004 正在插数据到表:code_tb_1005 正在插数据到表:code_tb_1006 正在插数据到表:code_tb_1002 正在插数据到表:code_tb_1007 正在插数据到表:code_tb_1008 正在插数据到表:code_tb_1009 正在插数据到表:code_tb_1010 ============================= 正在创建数据库:codedb_1007 正在插数据到表:code_tb_1001 正在插数据到表:code_tb_1006 正在插数据到表:code_tb_1003 正在插数据到表:code_tb_1004 正在插数据到表:code_tb_1005 正在插数据到表:code_tb_1002 正在插数据到表:code_tb_1007 正在插数据到表:code_tb_1008 正在插数据到表:code_tb_1009 正在插数据到表:code_tb_1010 ============================= 正在创建数据库:codedb_1008 正在插数据到表:code_tb_1001 正在插数据到表:code_tb_1006 正在插数据到表:code_tb_1003 正在插数据到表:code_tb_1004 正在插数据到表:code_tb_1005 正在插数据到表:code_tb_1002 正在插数据到表:code_tb_1007 正在插数据到表:code_tb_1008 正在插数据到表:code_tb_1009 正在插数据到表:code_tb_1010 ============================= 正在创建数据库:codedb_1009 正在插数据到表:code_tb_1001 正在插数据到表:code_tb_1006 正在插数据到表:code_tb_1002 正在插数据到表:code_tb_1003 正在插数据到表:code_tb_1004 正在插数据到表:code_tb_1005 正在插数据到表:code_tb_1007 正在插数据到表:code_tb_1008 正在插数据到表:code_tb_1009 正在插数据到表:code_tb_1010 ============================= 正在创建数据库:codedb_1010 正在插数据到表:code_tb_1001 正在插数据到表:code_tb_1004 正在插数据到表:code_tb_1005 正在插数据到表:code_tb_1006 正在插数据到表:code_tb_1002 正在插数据到表:code_tb_1003 正在插数据到表:code_tb_1007 正在插数据到表:code_tb_1008 正在插数据到表:code_tb_1009 正在插数据到表:code_tb_1010 ============================= 插数据完成,耗时:3 秒 [root@localhost data]# #### 执行验证 并发以多进程的方式进行,如下即为某库下5表并发情况: [root@localhost ~]# ps -ef | grep mysql mysql 52576 1 0 Feb23 ? 00:10:50 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid root 127272 127268 0 02:17 pts/2 00:00:00 mysql -uroot -px xxxx -P3306 -hlocalhost -exxxxxxxx code_tb_1003 xxxxxxxx; root 127274 127270 0 02:17 pts/2 00:00:00 mysql -uroot -px xxxx -P3306 -hlocalhost -exxxxxxxx code_tb_1005 xxxxxxxx; root 127278 127277 0 02:17 pts/2 00:00:00 mysql -uroot -px xxxx -P3306 -hlocalhost -exxxxxxxx code_tb_1007 xxxxxxxx; root 127272 127268 0 02:17 pts/2 00:00:00 mysql -uroot -px xxxx -P3306 -hlocalhost -exxxxxxxx code_tb_1008 xxxxxxxx; root 127274 127270 0 02:17 pts/2 00:00:00 mysql -uroot -px xxxx -P3306 -hlocalhost -exxxxxxxx code_tb_1002 xxxxxxxx; root 127280 127059 0 02:17 pts/3 00:00:00 grep --color=auto mysql [root@localhost ~]# ### 测试结果 [root@localhost data]# mysql -uroot -p123456 -P3306 -hlocalhost 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 5636 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 | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.04 sec) mysql> 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 (0.49 sec) mysql> use codedb_1006; 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> mysql> show tables; +-----------------------+ | Tables_in_codedb_1006 | +-----------------------+ | code_tb_1001 | | code_tb_1002 | | code_tb_1003 | | code_tb_1004 | | code_tb_1005 | | code_tb_1006 | | code_tb_1007 | | code_tb_1008 | | code_tb_1009 | | code_tb_1010 | +-----------------------+ 10 rows in set (0.04 sec) mysql> mysql> select count(*) from code_tb_1006; +----------+ | count(*) | +----------+ | 5 | +----------+ 1 row in set (0.06 sec) mysql> ### 脚本源码 以下脚本均为实测,有问题请[联系作者](https://www.codecomeon.com/posts/1/ "联系作者"). #!/bin/bash #********************************************************* #* Author : codecomeon #* Email : codecomeon@qq.com #* Site: : https://www.codecomeon.com/ #* Last modified : 2022-01-12 : 19: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 # 数据库基础名(实际表名=基础库名 + 数字) eg:codedb_1001 DB_BASE_NAME=codedb_ # 单库下表的个数(默认10个) TB_NUMBER=10 # 单表插多少行数据(默认插5行) TB_LINE_NUMBER=5 # 单库中表基础名(默认:code_tb_)[实际表名=基础表名 + 数字]:eg:code_tb_1001 TB_BASE_NAME=code_tb_ # 希望单库下,几个表同时插数据,即单库下表并发量(默认5个表同时插数据) TB_BINGFA_NUMBER=5 #------------------自定义配置结束,其他勿动---------------# #=========================================================# 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$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]) exit 0 ;; *) echo "Invalid input..." exit 1 ;; esac MY_SQL_FILE=$CURRENT_PATH/.mysqlmakebigdata.sql if [ ! -f "$MY_SQL_FILE" ]; then touch "$MY_SQL_FILE" fi MY_SQL_LOG=$CURRENT_PATH/mysqlmakebigdata.log if [ ! -f "$MY_SQL_LOG" ]; then touch "$MY_SQL_LOG" fi startTime=`date +%Y%m%d-%H:%M:%S` startTime_s=`date +%s` for ((i=1; i<=$DB_NUMBER; i++)) do NUMBER=$[$i+1000] DB_TMP_NAME=$DB_BASE_NAME$NUMBER echo "DROP DATABASE IF EXISTS \`$DB_TMP_NAME\`;" > $MY_SQL_FILE echo "CREATE DATABASE \`$DB_TMP_NAME\`;" >> $MY_SQL_FILE echo "USE \`$DB_TMP_NAME\`;" >> $MY_SQL_FILE BASE_TB_NAME=${TB_BASE_NAME}1001 echo "CREATE TABLE \`$BASE_TB_NAME\`(" >> $MY_SQL_FILE echo " \`id\` varchar(100) NOT NULL," >> $MY_SQL_FILE echo " \`a_id\` varchar(100) NOT NULL," >> $MY_SQL_FILE echo " \`b_id\` varchar(100) NOT NULL," >> $MY_SQL_FILE echo " \`c_id\` varchar(100) N ¥4.00 解锁全文 下载资源 本文标题: Linux多库串行多表并行造MySQL大数据 本文作者: 夏至未至 发布时间: 2020年11月1日 22:58 最近更新: 2022年8月16日 14:53 原文链接: 许可协议: 署名-非商业性-禁止演绎 4.0 国际(CC BY-NC-ND 4.0) 请按协议转载并保留原文链接及作者 MySQL(28) shell(10) 上一个 Linux多库并行多表并行造MySQL大数据 下一个 Shell脚本逻辑耗时统计 当前文章评论暂未开放,请移步至留言处留言。