【数据库系列】opensearch数据备份和恢复

opensearch是一个开源的数据搜索和分析引擎,在RAG项目中应用广泛,可以执行全文搜索:按字段搜索、搜索多个索引、提升字段、按分数对结果排名、按字段对结果排序以及聚合结果。

1.用docker run 起opensearch服务

今天我们要谈的,是用docker run起opensearch服务,且没有设定宿主机(服务器)数据存储目录的情况下(数据只存于docker容器中,删除docker服务数据便丢失),如何进行数据备份和恢复。如果用-v指定了宿主机目录,或用docker compose命令起了服务,那么数据备份和恢复起来都会简单许多。

首先看一下我们起服务的命令:

bash 复制代码
docker run -d \
  --name opensearch-ai \
  -p 9200:9200 \
  -p 9600:9600 \
  -e OPENSEARCH_INITIAL_ADMIN_PASSWORD=OpenSearch@2026 \
  -e OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g \
  -e discovery.type=single-node \
  -e plugins.security.disabled=true \
  --user 1000 \
  opensearchproject/opensearch:2

2.数据备份

有备份才有恢复的可能!真的要勤于按期备份数据。

  • 第一步:在docker容器内,有一个配置文件/usr/share/opensearch/config/opensearch.yml,我们需要编辑这个文件,为了跳过在容器内装vi或vim编辑器,我们先把容器内 opensearch.yml 拷贝到服务器本地(/opensearch_database/):docker cp opensearch-ai:/usr/share/opensearch/config/opensearch.yml ./opensearch.yml

    文件赋予权限:sudo chmod 777 opensearch.yml

    进入vim ./opensearch.yml

    文件末尾追加:path.repo: "/usr/share/opensearch/snapshots"保存退出。

  • 用root身份进入opensearch交互:sudo docker exec -it --user root opensearch-ai bash,先备份一下原来的opensearch.yml文件。

    退出opensearch交互,将服务器本地opensearch.yml拷贝进容器中:sudo docker cp ./opensearch.yml opensearch-ai:/usr/share/opensearch/config/opensearch.yml

  • 进入容器,修改配置文件属主(用root账号执行),一句一句执行

bash 复制代码
docker exec -it --user root opensearch-ai bash
chown opensearch:opensearch /usr/share/opensearch/config/opensearch.yml
chmod 644 /usr/share/opensearch/config/opensearch.yml
exit
  • 重启opensearch服务:sudo docker restart opensearch-ai,使配置文件生效
  • 再次进入docker交互,创建快照:
bash 复制代码
sudo docker exec -it opensearch-ai bash
mkdir -p /usr/share/opensearch/snapshots
chown -R 1000:1000 /usr/share/opensearch/snapshots
  • 退出docker交互,在终端先注册仓库,告诉opensearch备份目录:
bash 复制代码
curl -X PUT "http://127.0.0.1:9200/_snapshot/backup_repo?pretty" -H 'Content-Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "location": "/usr/share/opensearch/snapshots",
    "compress": true
  }
}
'

返回{ "acknowledged" : true}表示成功

  • 进行快照备份(写入docker的快照文件夹):curl -X PUT http://127.0.0.1:9200/_snapshot/backup_repo/snapshot_$(date +%Y%m%d)?wait_for_completion=true&pretty
    等待完成
  • 将docker容器内 /usr/share/opensearch/snapshots 拷贝到服务器当前目录 os_backup
    sudo docker cp opensearch-ai:/usr/share/opensearch/snapshots ./os_backup_20260910此时 ./os_backup 就是服务器本地的完整快照备份包。

3.数据恢复

若真的把opensearch docker容器删掉了,我们有备份文件,该如何恢复?

  • 首先,我们创建一个新 OpenSearch 容器,把这个 os_backup 目录拷贝进容器的 /usr/share/opensearch/snapshots,注册同名仓库,执行 restore。
    恢复前,重建opensearch容器,和之前的配置保持一致:
bash 复制代码
docker run -d \
  --name opensearch-new \
  -p 9200:9200 \
  -p 9600:9600 \
  -e OPENSEARCH_INITIAL_ADMIN_PASSWORD=OpenSearch@2026 \
  -e OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g \
  -e discovery.type=single-node \
  -e plugins.security.disabled=true \
  --user 1000 \
  opensearchproject/opensearch:2
  • 把新容器的 yml 拷到宿主机sudo docker cp opensearch-new:/usr/share/opensearch/config/opensearch.yml ./opensearch-new.yml
  • 编辑文件,最低行加上:path.repo: "/usr/share/opensearch/snapshots"
  • 传回容器,修改权限:docker cp ./opensearch-new.yml opensearch-new:/usr/share/opensearch/config/opensearch.yml
  • 用root进入容器修改文件属主
bash 复制代码
sudo docker exec -it --user root opensearch-new bash
chown opensearch:opensearch /usr/share/opensearch/config/opensearch.yml
chmod 644 /usr/share/opensearch/config/opensearch.yml
exit
  • 重启新容器,让 path.repo 配置生效:docker restart opensearch-new
  • 在新容器内创建快照目录,修正权限
bash 复制代码
sudo docker exec -it opensearch-new bash
mkdir -p /usr/share/opensearch/snapshots
chown -R opensearch:opensearch /usr/share/opensearch/snapshots
exit
  • 宿主机执行,把本地 os_backup 里面所有快照文件,放到容器 /usr/share/opensearch/snapshots
    注意: os_backup 是你之前备份到宿主机的快照文件夹
bash 复制代码
sudo docker cp ./os_backup/. opensearch-new:/usr/share/opensearch/snapshots/

重点: 命令末尾的 . 不能漏,代表拷贝 os_backup内部所有文件,而不是把 os_backup 整个文件夹塞进去。

  • 拷贝完成后,再次修复容器内快照目录权限(非常关键!)
bash 复制代码
docker exec -it --user root opensearch-new bash
chown -R opensearch:opensearch /usr/share/opensearch/snapshots
chmod -R 755 /usr/share/opensearch/snapshots
exit
  • 退出docker服务交互,在宿主机执行 curl,注册这个库:
bash 复制代码
curl -X PUT "http://127.0.0.1:9200/_snapshot/backup_repo?pretty" -H 'Content-Type: application/json' -d'
{
  "type": "fs",
  "settings": {
    "location": "/usr/share/opensearch/snapshots",
    "compress": true
  }
}
'

返回 {"acknowledged":true} 代表仓库注册成功

  • 查看仓库中有哪些快照:curl -X GET "http://127.0.0.1:9200/_snapshot/backup_repo/_all?pretty"
  • 选择一个快照,执行恢复命令:curl -X POST http://127.0.0.1:9200/_snapshot/backup_repo/snapshot_20260910/_restore?pretty

又可以继续使用啦!

相关推荐
乌暮5 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
小此方5 小时前
Re:Mysql数据库基础篇(十二):什么是事务、事务解决了什么问题、事务的四大属性、事务的操作方式
数据库·mysql
flash俊杰6 小时前
v0.5-01 让桌面 AI 助手记得住:预算组装、递归摘要、长期记忆与评估基线
数据库·安全·架构
2501_933923257 小时前
redis:string类型常见命令
数据库·redis·缓存
byte轻骑兵8 小时前
时序数据库选型指南:Apache IoTDB 社区版实践与踩坑
数据库·人工智能·apache·时序数据库·iotdb
黄连木笛9 小时前
Redis Insight 汉化教程:Windows / macOS / Linux 设置中文界面(附繁體、教程汉化、关闭自动更新)
数据库·redis·缓存
nice_lcj5209 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
古典和浪漫10 小时前
MVCC机制
数据库
xixingzhe210 小时前
mysql全量、增量备份
数据库·mysql
AllData公司负责人18 小时前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql