# Backup and Restore

## 備份與還原

測試版本：5.6.3

建立資料夾

bitnami：需要加-H 'Content-Type: application/json'

```
-H 'Content-Type: application/json'
```

## 資料夾設定

```
# 打開資料夾所有權限  避免使用者權限問題
sudo chmod -R 777 [path]

# 檢視資料夾詳細設定
ls -al [path]
```

## elasticsearch.yml設定

更新elasticsearch.yml內容 (cluster每一台都要?)

```
# 新增備份絕對路徑
path.repo: ["/mnt/es_backup"]
```

設定完成後重啟es server

```
# bitnami環境
sudo service bitnami restart

# 檢查重啟是否成功
systemctl status bitnami.service
```

## Repository設定

### 建立repository

```
curl -XPUT 'http://[ip]:9200/_snapshot/[repository_name]' -d '{
     "type":"fs",
     "settings":{
         "location":"[backup_absolute_path]",
         "compress":true,
         "max_snapshot_bytes_per_sec" : "50mb", 
         "max_restore_bytes_per_sec" : "50mb"
     }
 }'

 # 可能會回傳一些error資訊，但依然可先查詢repository是否有設定成功
 # 可更改備份與恢復的速度，預設是20mb
 # 建立時使用PUT，而更新設定時則使用POST
```

### 檢查repository設定是否成功

```
 curl -XPOST http://[ip]:9200/_snapshot/[repository_name]/_verify?pretty
```

如果在建立或檢查repository時出現資料夾權限錯誤（repository verification exception）

可自行建立sshfs共享資料夾來解決（參考Linux/sshfs）

### 查詢所有repository設定

```
curl -XGET 'http://[ip]:9200/_snapshot?pretty'

# 已設定完成的結果
{
  "[backup_name]" : {
    "type" : "fs",
    "settings" : {
      "compress" : "true",
      "location" : "[backup_name]"
    }
  }
}
```

### 刪除註冊完成的repository

```
curl -XDELETE 'http://[ip]:9200/_snapshot/[repository_name]?pretty'

# 若repository已有snapshot，則無法直接刪除
```

## Snapshot設定

### 建立snapshot並自行命名，包含所有index

```
curl -XPUT 'http://[ip]:9200/_snapshot/[repository_name]/[snpashot_name]?wait_for_completion=true'

# 可從successful、failed欄位得知備份是否完全成功
# 快照只會處理狀態是open的index
```

### 建立特定index的snapshot

```
curl -XPUT 'http://[ip]:9200/_snapshot/[repository_name]/[snapshot_name]' -d '{"indices":"[index_name]"}'

# snapshot備份完成結果格式都相同
```

### 查詢snapshot建立進度

```
curl -XGET 'http://[ip]:9200/_snapshot/[repository_name]/[snapshot_name]/_status?pretty'
```

### 查詢所有snapshot版本

```
curl -XGET "[ip]:9200/_snapshot/[backup_name]/_all?pretty"

# 若已有儲存snapshot，可看到其相關資訊
{
    "snapshots": [
    {
        "snapshot": "snapshot版本名稱",
        "indices": [儲存的index],
        ...
    }
    ]
}

# 可從successful、failed欄位得知備份是否完全成功
```

### 刪除snapshot

```
curl -XDELETE 'http://140.96.68.132:9200/_snapshot/[repository_name]/[snapshot_name]'
```

## 恢復snapshot

### 列出所有index

```
curl -XGET '[ip]:9200/_cat/indices?v'
```

### 先刪除特定index

```
curl -XDELETE 'http://[ip]:9200/[index_name]'

# 刪除完成後再列出一次所有index，確認刪除成功
```

### 關閉index

```
# 恢復前需先關閉index
# 關閉所有index
curl -XPOST 'http://[ip]:9200/_all/_close'

# 關閉指定index
curl -XPOST 'http://[ip]:9200/[index_name]/_close'
```

### 指定snapshot進行恢復

```
curl -XPOST 'http://[ip]:9200/_snapshot/[repository_name]/[snapshot_name]/_restore?wait_for_completion=true"

# 成功可看到failed:0
# 恢復完成後再檢查一次index
# 在該次恢復完成前，無法再度執行其他snapshot版本的恢復
```

### 指定snapshot中的index進行恢復

```
curl -XPOST 'http://[ip]:9200/_snapshot/[repository_name]/[snapshot_name]/_restore' -d '{
    "indices": "[index_name]", 
    "rename_replacement": "[new_index]"
}‘
```

### 查看恢復進度

```
curl -XGET http://[ip]:9200/_recovery?pretty
```

參考連結：\
<https://docs.bitnami.com/virtual-machine/apps/elasticsearch/>\
<https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html>\
<http://droidspa.blogspot.com/2016/11/elasticsearch-backup-and-restore.html>\
<http://www.itread01.com/content/1495128248.html>\
<http://keenwon.com/1393.html>\
<http://openskill.cn/article/468>\
<http://smallasa.com/2017/03/09/elasticsearch-backup-and-restore/>
