presto备份表第一次做的时候需要手工执行多次

create table if not exists origin_tableName_bak as
select * 
from origin_tableName;

后来就想着能不能使用shell脚本的方式只要传入需要备份的表就可以自动备份,并打印我们关注的信息:
备份是否成功以及备份前后的数据条数

for par in $@;do
 echo "正在备份原表 :${par}  ..." | tee -a 日志文件路径
#./presto.jar --server szzb-bg-prd-etl-13:9000 --catalog hive --schema default --user admin -f /home/admin/zhangminghu/backup_table.sql ${par}
./presto.jar --server hostName或ip:9000 --catalog hive --schema default --user admin --execute "create table if not exists ${par}_bak as select * from ${par}"
echo "-------------------------备份表${par} 创建成功------------------"  | tee -a 日志文件路径
echo "源表${par}数据总条数:" | tee -a 日志文件路径
./presto.jar --server hostName或ip:9000 --catalog hive --schema default --user admin --execute " select count(1)  from ${par} "
echo "备份表'${par}_bak'数据总条数: "   | tee -a 日志文件路径
./presto.jar --server hostName或ip:9000 --catalog hive --schema default --user admin --execute "select count(1) from ${par}_bak"  | tee -a 日志文件路径
done

后来我又想如果备份多个表,我想看这个备份的信息,如果表太多打印的日志太多,看不过来,于是想着把执行过程的日志在打印在控制台的同时写入log日志文件中

#日志打印的同时以追加的方式写入文件中
echo "this is a test" | tee -a 文件路径

改完之后,脚本是如下的样子

for par in $@;do
 echo "正在备份原表 : ${par} ..." | tee -a /backup_table_info.log
./presto.jar --server host或ip:9000 --catalog hive --schema default --user admin --execute "create table if not exists ${par}_bak as select * from ${par}" | tee -a /backup_table_info.log
echo "-------------------------备份表${par} 创建成功------------------" | tee -a /home/admin/zhangminghu/backup_table_info.log
echo "源表${par}数据总条数:"  | tee -a /backup_table_info.log
./presto.jar --server  host或ip:9000 --catalog hive --schema default --user admin --execute " select count(1)  from ${par} " | tee -a /backup_table_info.log
echo "备份表'${par}_bak'数据总条数: "  | tee -a /backup_table_info.log
./presto.jar --server  host或ip:9000 --catalog hive --schema default --user admin --execute "select count(1) from ${par}_bak" | tee -a /backup_table_info.log
done

Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

进一步优化:我想将备份的原表的名字写在一个文件中,执行脚本的时候读取具有这个配置信息的文本,然后将数据存入一个数组中,然后传到执行脚本中批量备份,这样就不用手动传值了,下面是代码

#这个文件配置需要备份的表的库名.表名
====>need_backup_table_name.txt
ods.xxx1  ods.xxx2
ods.xxx3
ods.xxx4

====>backup_table.sh
#!/bin/bash
num=0
for line in  $(</home/admin/xxx/need_backup_table_name.txt);do
  arr[num]=${line}
  echo "当前数组存储的表名为: ${arr[${num}]}"
  num=${num}+1
done

for origin_table_name in ${arr[*]};do
 echo "正在备份原表 : ${origin_table_name} ..." | tee -a /home/admin/xxx/backup_table_info.log
 #echo "正在备份表 : ${origin_table_name}_bak ..."
./presto.jar --server ip或主机名:9000 --catalog hive --schema default --user admin --execute "create table if not exists ${origin_table_name}_bak as select * from ${origin_table_name}" | tee -a /home/admin/xxx/backup_table_info.log
echo "-------------------------备份表${origin_table_name} 创建成功------------------" | tee -a /home/admin/xxx/backup_table_info.log
echo "源表${origin_table_name}数据总条数:"  | tee -a /home/admin/xxx/backup_table_info.log
./presto.jar --server ip或主机名:9000 --catalog hive --schema default --user admin --execute " select count(1)  from ${origin_table_name} " | tee -a /home/admin/xxx/backup_table_info.log
echo "备份表'${origin_table_name}_bak'数据总条数: "  | tee -a /home/admin/xxx/backup_table_info.log
./presto.jar --server ip或主机名:9000 --catalog hive --schema default --user admin --execute "select count(1) from ${origin_table_name}_bak" | tee -a /home/admin/xxx/backup_table_info.log
done

写到这里,因为表备份完之后,如果确认跑数覆盖之后的表和原来备份的表数据量没有太大差异,就视为没有问题,需要把原来备份的表删除,所以我又写了一个批量删除备份表的脚本

#!/bin/bash
num=0
for line in  $(</home/admin/xxx/need_backup_table_name.txt);do
  arr[num]=${line}
  echo "当前数组存储的表名为: ${arr[${num}]}"
  num=${num}+1
done

for origin_table_name in ${arr[*]};do
 echo "正在删除的表 : ${origin_table_name}_bak ..." 
./presto.jar --server ip或主机名你:9000 --catalog hive --schema default --user admin --execute "drop table if exists  ${origin_table_name}_bak"
done
echo "备份的表删除完毕 !"