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

又可以继续使用啦!

相关推荐
anxiao_m1 小时前
2026企业AI数字孪生选型攻略,不同场景对应不同解决方案
大数据·网络·数据库
SelectDB1 小时前
从 ClickHouse 迁移到 Doris:SQL 兼容、同步与验证清单(实战笔记)
大数据·数据库·数据分析
SelectDB1 小时前
Doris 还是 ClickHouse?一张表说清 6 个关键差异(实战笔记)
大数据·数据库·数据分析
oradh2 小时前
Oracle Undo问题总结(两类Undo表空间不足和单个会话占用大量Undo的性能问题)
数据库·oracle
企业数字化笔记2 小时前
固定资产财务账与实物账怎么对账?折旧快照、差异检测与SQL核对
android·数据库·sql
DBA_G2 小时前
GBase 8a表空间多路径存储数据迁移链路适配解析
数据库·oracle
java1234_小锋2 小时前
Tornado 6.5,全面支持 Python 3.14
数据库·python·tornado
jyOverQ2 小时前
MySQL 事务到底是什么?ACID 四大特性与隔离级别怎么理解?
数据库·mysql
SelectDB3 小时前
Doris 直查 Paimon 索引:快手湖上向量检索的共建与落地
大数据·数据库·数据分析