shell脚本批量删除es索引的方法

发现elasticsearch集群的状态是red,unassign的分片数很多,看了下都是些旧的日期的索引(应该是定时任务删除失败导致的)。

curl -XGET ip:port/_cat/shards | grep UNASSIGNED

数量有几百个,写个脚本处理下,先恢复成green。red状态好像会影响索引创建和数据迁移

先把需要删除的索引导出到文件

curl -XGET ip:port/_cat/shards | grep UNASSIGNED >> needDelIndex.txt

确认下要删除的索引列表。没问题就执行下面删除shell(es的ip和端口需要修改下)

#!/bin/bash
echo "$1"
esUrl=${esip}:${esport}
indexfile=needDelIndex.txt
#cp -f /dev/null ${indexfile}
#curl -XGET ip:port/_cat/shards | grep UNASSIGNED >> needDelIndex.txt
if [ ! -f ./${indexfile} ]; then
  echo $indexfile not exists
  exit 0
fi
logfile=esindex_del.`date +"%m-%d"`.log
cp -f /dev/null ${logfile}
lastIndexName="test"
for item in `cat ${indexfile} | awk '{print $1}'`
do
  if [ "$item" = "error" ]
  then
    continue
  fi
  if [ "$item" != "$lastIndexName" ]
  then
    curl -XDELETE ${esUrl}/${item} >> ${logfile}
    echo ---------${item} `date` >> ${logfile}
    sleep 5
  fi
  lastIndexName=${item}
done

因为我们的索引是按天创建的,索引名前缀是yyyy-MM-dd, 保留一段时间后需要批量删除。shell的第一个参数为yyyy-MM-dd,将删除该天及以前的旧索引

#!/bin/bash
esUrl=${esip}:${esport}
echo "$1"
if [ $# -ge 1 ]
then
  deleteDate=$1
else
  echo "please inpust detete esindex's date(yyyy-MM-dd)"
  exit 0
fi
indexfile=esindex.info
cp -f /dev/null ${indexfile}
curl '${esUrl}/_cat/indices' >> ${indexfile}
logfile=esindex_del.`date +"%m-%d"`.out
cp -f /dev/null ${logfile}
for item in `cat ${indexfile} | awk '{print $3}'`
do
  if [ "$item" = "error" ]
  then
    continue
  fi
  parameter=${esUrl}/${item}
  indexdate=${item:0:10}
  if [ "$indexdate" = "$deleteDate" ]
  then
    curl -XDELETE ${parameter} >> ${logfile}
    echo ---------${item} >> ${logfile}
    sleep 5
  elif [[ "$indexdate" < "$deleteDate" ]]
  then
    curl -XDELETE ${parameter} >> ${logfile}
    echo ---------${item} >> ${logfile}
    sleep 5
  fi
done

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • linux shell之控制台打印各种颜色字体和背景的实现方法

    1 问题 控制台打印各种颜色字体和背景 字体颜色 #30:黑 #31:红 #32:绿 #33:黄 #34:蓝色 #35:紫色 #36:深绿 #37:白色 背景颜色 #40:黑 #41:深红 #42:绿 #43:黄色 #44:蓝色 #45:紫色 #46:深绿 #47:白色 echo -e "\e[43;35m chenyu\e[0m hello word" 比如上面的命令,43是背景颜色,35是字体颜色, \e[0m 是还原本色 2 代码实现 这里写的是color.sh文件如下 #!/b

  • 干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)

    一大早就被电话吵醒了,云某项目数据库全挂了,启动不了(睡得太死,没听到报警短信),吓得不轻啊! 电话中说所有mysql数据库主库都启动不了,但从库正常,怀疑是主库去连其它阿里云的主库了.这些数据库,以前是从阿里云迁移到idc机房的,因此他有这个判断. 赶紧打开电脑,连***,登录其中一个数据库服务器,试着执行如下命令启动mysql服务 [root@bbsmysql121 backup]#mysqld_safe –user=mysql & 启动失败,又换一台数据库服务器尝试,还是失败.考虑到所有的

  • linux shell中if的各种判断

    shell编程中使用到得if语句内判断参数 –b当file存在并且是块文件时返回真 -c当file存在并且是字符文件时返回真 -d当pathname存在并且是一个目录时返回真 -e当pathname指定的文件或目录存在时返回真 -f当file存在并且是正规文件时返回真 -g当由pathname指定的文件或目录存在并且设置了SGID位时返回为真 -h当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效 -k当由pathname指定的文件或目录存在并且设置了"粘滞"位时返回真

  • shell脚本实现监控某个进程意外停止后拉起进程

    要监护的进程启动脚本:实现脚本写入crontab定时任务 #!/usr/bin/env bash # scheduled task at 22:00 everyday script_path=`eval pwd` user_name=`whoami` echo "crontab_script_path:${script_path}" sudo echo "* * * * * cd ${script_path} && sh xxx.sh > start_c

  • 使用shell脚本每天对MySQL多个数据库自动备份的讲解

    Linux下使用shell脚本,结合crontab,定时备份MySQL下多个数据库,每次备份的数据存放于以日期命名的文件夹中,同时删除超过设定的备份保留时间的数据. 以下例子设定备份保留时间为1个月(-1month),可根据需求修改 #! /bin/bash # MySQL用户 user="root" # MySQL密码 userPWD="123456" # 需要定时备份的数据表列表 dbNames=(db_test1 db_test2 db_test3 db_te

  • linux shell之通过标识测试文件系统属性的方法示例

    1 通过标识测试文件系统属性 [ -f $file_var ] :如果给定的变量包含正常的文件路径或文件名,则返回真. [ -x $var ] :如果给定的变量包含的文件可执行,则返回真. [ -d $var ] :如果给定的变量包含的是目录,则返回真. [ -e $var ] :如果给定的变量包含的文件存在,则返回真. [ -c $var ] :如果给定的变量包含的是一个字符设备文件的路径,则返回真. [ -b $var ] :如果给定的变量包含的是一个块设备文件的路径,则返回真. [ -w

  • shell脚本操作mysql数据库删除重复的数据

    由于之前的业务,造成数据库上产生了脏数据,写个脚本删除重复的数据.由于是开发测试环境,所以选择任意删除相同uid中的一条.由于每次执行只删除重复数据的一条,需要重复执行,如果本轮没有数据被删就OK #!/bin/sh # delete all company's duplicate uid MYSQL_BIN_PATH=/data/mysql/server/mysql_3306/bin MYSQL_SOCK_PATH=/data/mysql/server/mysql_3306/tmp DBUSE

  • 在Shell脚本中调用另一个脚本的三种方式讲解

    先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. exec: exec path/to/foo.sh source: source path/to/foo.sh fork fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用 foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh.运行的时候 terminal 会新开一个子 Shell 执行

  • 使用shell脚本来给mysql加索引的方法

    用shell脚本来给mysql加索引 刚好用到, mark一下: #! /bin/bash tb_base=tb_student_ arr=("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b" "c" &q

  • linux shell之pushd、popd和dirs的使用讲解

    1 问题 我们有时候需要保存多个路径,上下键切换不方便,用cd-只能到上个目录,我们可以用dirs和pushd和popd 2 dirs.pushd.popd dirs: 这个命令显示栈里面所有的路径,一定会包含当前路径,常用参数如下 dirs -v 显示栈里面的所有路径和下标,通过下标,我们可以用pushd +下标到这个目录,然后popd+下标把这个路径在栈里面弹出来, dirs -c 清除栈里所有路径,但是当前路径不会删除 pushd:我们可以添加目录到栈(dirs)里面,比如添加当前目录pu

随机推荐