SQL进程中断实验
我们操作数据库时,经常遇到数据导入等特别耗时的SQL操作,而关闭MySQL客户端或SSH终端,就会立马关闭SQL会话,导致SQL执行中断,如下实验:
- 在第一个SSH终端执行
shell
# 进入Mysql客户端,模拟一个sleep(30)秒的耗时操作:
$ mysql -uroot
mysql> select sleep(30);
- 打开第二个SSH终端。查看Msql进程
shell
$ mysql -uroot -e "SHOW PROCESSLIST";
+-----+-----------------+-----------+------+---------+--------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+-----------------+-----------+------+---------+--------+------------------------+------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 230197 | Waiting on empty queue | NULL |
| 180 | root | localhost | NULL | Query | 8 | User sleep | select sleep(30) |
| 181 | root | localhost | NULL | Query | 0 | init | SHOW PROCESSLIST |
+-----+-----------------+-----------+------+---------+--------+------------------------+------------------+
- 关闭第一个SSH终端,再次执行第二步(查看Msql进程)。 发现sleep进程已关闭。
守护进程执行SQL
可以借助于nohup,在后台执行sql命令/脚本,格式如下:
sql
nohup mysql -u用户名 -p密码 -e "YOUR_SQL" &
nohup mysql -u用户名 -p密码 < script.sql &
终端直接执行SQL语句
shell
$ mysql -uroot -e "show databases";
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
$ mysql -uroot -e "select @@version";
+-----------+
| @@version |
+-----------+
| 8.3.0 |
+-----------+
nohup执行SQL
shell
# 模拟一个耗时的SQL操作(sleep 10秒),然后将执行结果写入文件
$ nohup mysql -uroot -e "select sleep(10);select now() as complected;select 'SQL执行完毕' as result;" > nohup.txt 2>&1 &
# 验证结果
$ cat nohup.txt
nohup: ignoring input
sleep(10)
0
complected
2024-03-04 03:27:25
result
SQL执行完毕
nohup执行脚本
shell
nohup mysql -h192.168.10.11 -uroot -p123456 < db.sql > nohup.txt 2>&1 &