【数据库系列】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

又可以继续使用啦!

相关推荐
白帽攻防录9 分钟前
SRC 挖洞:Roundcube 预认证 SQL 注入深度复盘,CVE-2026-48842 preg_replace 转义绕过怎么打穿邮件系统
网络·数据库·sql·网络安全·sql注入
꯭自꯭闭꯭36 分钟前
达梦SQL优化相关
linux·运维·数据库·sql
对空六课1 小时前
支持注意力分析的热力图工具有哪些?
前端·数据库·数据分析
南京码讯光电技术有限公司1 小时前
How to Design an Antenna System for an Industrial WiFi Module
数据库·人工智能
lusklusklusk2 小时前
Oracle数据库基础之2_体系结构
数据库·oracle
可乐ea3 小时前
从第一性原理构建 AI Agent:提示词、工具、技能与记忆全解剖
数据库·人工智能·工具调用·ai智能体·提示词工程·agent开发·智能体记忆
东方护航数据恢复(深圳)3 小时前
医疗案例:HIS/PACS 数据库页损坏修复,医院不停诊完成恢复【东方护航数据恢复深圳店】
数据库·数据恢复·医疗·二次开盘
lusklusklusk4 小时前
Oracle数据库基础之11_Duplicate和Dataguard和RAC
数据库·oracle
PHP实战开发录5 小时前
MySQL字段加索引为什么没变快
数据库·mysql·php·开发
红红谈说6 小时前
标签化推送与已读统计怎么做?一次通知链路的工程复盘
数据库·消息推送·数字乡村·集合运算·已读回执·标签体系·写入放大