在服务器中后台执行sql脚本
上传文件
将 数据库结构ddl.sql文件和数据data.sql文件都上传到服务器的/home目录中。
ddl.sql文件:
/*!40101 SET NAMES utf8 */;
CREATE DATABASE `db_test`;
use db_test;
CREATE TABLE `table_test` (
`id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主键',
`create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试表';
data.sql文件:
/*!40101 SET NAMES utf8 */;
insert into table_test (id) VALUES (1);
前台执行
创建数据库 和 表
# 登陆数据库
# -u表示用户名、-h表示ip地址、-P表示端口、-p表示密码登陆
mysql -u root -h 127.0.0.1 -P 3307 -p
# 输入密码
123456
# 执行sql文件
source /home/ddl.sql
导入数据
# 登陆数据库
# -u表示用户名、-h表示ip地址、-P表示端口、-p表示密码登陆
mysql -u root -h 127.0.0.1 -P 3307 -p
# 输入密码
123456
# 执行sql文件
source /home/data.sql
后台执行
注意:后台执行有个问题是,如果sql文件中的语句执行出现报错,则会停止,不会继续执行后面的sql语句。这里有个坑!!!
创建数据库 和 表
准备脚本文件,在Linux控制台中执行下面的命令
# 创建脚本文件
vim importddl.sh
# 进入vim编辑器,按i进入编辑模式,输入如下命令
# -u表示用户名、-h表示ip地址、-P表示端口、
# -p表示密码(注意,-p和密码之间不能用空格隔开)
# <ddl.sql表示登陆数据库之后,执行与脚本同级目录下的ddl.sql文件,如果不是请使用绝对路径
mysql -u root -h 127.0.0.1 -P 3307 -ptest@2022 <ddl.sql
# 退出编辑模式 Esc,保存并退出vim编辑器 :wq!
# 进入指定目录
cd /home/
给脚本文件添加权限
chmod u+x importddl.sh
用nohup命令执行脚本
一定要加“&”,才能脚本放到后台运行
nohup执行后系统会在控制台打印出命令执行的PID
然后nohup会默认在/home目录下创建日志文件nohup.out,可以方便查看
nohup ./importddl.sh &
根据PID使用ps命令可以查看脚本是否还在执行
ps -aux | grep 297042
正在执行中:
只有一行数据,执行结束:
导入数据
准备脚本文件
# 创建脚本文件
vim importdata.sh
# 进入vim编辑器,按i进入编辑模式,输入如下命令
# --database表示使用指定数据库
mysql -u root -h 127.0.0.1 -P 3307 -ptest@2022 --database=ngpr_db_test <data.sql
# 退出编辑模式 Esc,保存并退出vim编辑器 :wq!
# 进入指定目录
cd /home/
给脚本文件添加权限
chmod u+x importdata.sh
用nohup命令执行脚本
一定要加“&”,才能脚本放到后台运行
nohup执行后系统会在控制台打印出命令执行的PID
nohup ./importdata.sh &
根据PID使用ps命令可以查看脚本是否还在执行
ps -aux | grep 33355
等待数据导入完成即可~
疑问(欢迎评论区大佬解答)
1、公司的客户数据非常庞大,data.sql文件大小有高达9G,通过这种方式需要执行一晚上,那么如何在Linux服务器中批量导入大数据呢?
2、使用FinalShell登陆服务器,按照这种方式后台执行,把FinalShell退出之后,还是中止了脚本执行,nohup.out文件中报错:
Terminal close -- query aborted
说明这种后台执行,并不能断开Linux服务器的连接。那有没有即便断开服务器的连接,还能继续执行脚本的方案呢?