# Automatic Elasticsearch snapshot backup

**URL:** <https://discuss.elastic.co/t/automatic-elasticsearch-snapshot-backup/173223>\
**Category:** Elasticsearch\
**Created:** [March 20, 2019, 8:45pm UTC](https://discuss.elastic.co/t/automatic-elasticsearch-snapshot-backup/173223 "2019-03-20T20:45:09Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![elasticforme](https://avatars.discourse-cdn.com/v4/letter/e/f05b48/32.png) [@elasticforme](https://discuss.elastic.co/u/elasticforme)\
**Post date:** [March 20, 2019, 8:45pm UTC](https://discuss.elastic.co/t/automatic-elasticsearch-snapshot-backup/173223/1 "2019-03-20T20:45:09Z")

</div>

This is not a question but information. I spend few hours to get this works, because nothing I found was what I wanted, hence posting it here for other people

Once you setup first few variable this script will do backup and remove old backup.

```
#!/bin/bash

## All needs to be in lower case

### /data01/snapshot/netbackup_stat/02mar2019
### /data01/snapshot/netbackup_stat --> snapshot dir
### 02mar2019 --> backup name, but you won't see that name on linux prompt anywhere, sorry it is confusing, took me while to figure out.

### We will do two backup a week and remove older backup then 7 days.
### each backup will be name like
### /data01/snapshot/<indice_name>/<today_date>

### remove, /data01/snapshot/<indice_name>/<eight_day_old_date>
### I am using Indice name as snapshot name that way all the indice are on different dirs.

#### Variable setup
### hopefully nothing else needs to be set after changing variables
URL="http://elkm01:9200"
storage_path="/data01/snapshot"
HOSTNAME=`hostname`
today=`date +%d%b%Y | tr '[:upper:]' '[:lower:]'`
eight_days_ago=`date --date="8 days ago" +%d%b%Y |tr '[:upper:]' '[:lower:]'`
########

## Get list of index except kibana,metricbeat and monitor index.
## we will do kibana later
curl -XGET ${URL}/_cat/indices |egrep -v 'monitor|kibana|metric' |grep -v Speed |awk '{print $3}' > /tmp/list_indices
## Remove some unwanted index
sed -i '/--/d' /tmp/list_indices

     # echo "Now delete snapshot older then 7 days
for indice in `cat /tmp/list_indices`
do
   echo "Delete backup of $indice named/location ${storage_path}/$indice/${eight_days_ago}"
   curl -XDELETE "${URL}/_snapshot/${indice}/${eight_days_ago}"
   sleep 60
   echo
done

### Register snapshot repository now
### This is not actual backup just register repository
### /data01/snapshot/<snapshot name> , $indice = snapshot name here

for indice in `cat /tmp/list_indices`
do
   echo "Creating snapshot repository for $indice at ${storage_path}/${indice}/"
   curl -XPUT "${URL}/_snapshot/${indice}/" -H "Content-Type: application/json" -d"
 {
  \"type\": \"fs\",
  \"settings\": {
    \"location\": \"${storage_path}/${indice}/\"
  }
}"
  sleep 5
   echo
done

### echo " Now doing actual backup"
### /data01/snapshot/hou_netbackup_stat/02mar2019 ( backup name will be recognize like this )
# GET /_snapshot/hou_netbackup_stat/07mar2019/_status?pretty ---> if you want to know status of one backup

### $today = backup name in to /data01/snapshot/<indicename> dir.

for indice in `cat /tmp/list_indices`
do
   echo "Actual backup of $indice to ${storage_path}/$indice/$today"
curl -XPUT "${URL}/_snapshot/${indice}/${today}?wait_for_completion=true" -H "Content-Type: application/json" -d"
{
    \"indices\": \"${indice}\",
     \"ignore_unavailable\": true
}"
   echo
   sleep 6
done

#### Enjoy automatic backup.
```

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [April 17, 2019, 8:45pm UTC](https://discuss.elastic.co/t/automatic-elasticsearch-snapshot-backup/173223/2 "2019-04-17T20:45:19Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
