#!/bin/bash
etcd 备份脚本
用途:备份现有的单节点 etcd 数据
set -e
配置参数
BACKUP_DIR="/etcd-cluster/backup"
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="{BACKUP_DIR}/etcd_backup_{BACKUP_DATE}.db"
CONTAINER_NAME="etcd-old"
颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "{GREEN}========================================{NC}"
echo -e "{GREEN}etcd 数据备份脚本{NC}"
echo -e "{GREEN}========================================{NC}"
检查容器是否运行
echo -e "{YELLOW}\[1/5\] 检查 etcd 容器状态...{NC}"
if ! docker ps | grep -q "${CONTAINER_NAME}"; then
echo -e "{RED}错误: 容器 {CONTAINER_NAME} 未运行${NC}"
exit 1
fi
echo -e "{GREEN}✓ 容器运行正常{NC}"
创建备份目录
echo -e "{YELLOW}\[2/5\] 创建备份目录...{NC}"
mkdir -p "${BACKUP_DIR}"
echo -e "{GREEN}✓ 备份目录: {BACKUP_DIR}${NC}"
执行快照备份
echo -e "{YELLOW}\[3/5\] 创建 etcd 快照...{NC}"
docker exec ${CONTAINER_NAME} etcdctl snapshot save /tmp/etcd_snapshot.db
echo -e "{GREEN}✓ 快照创建成功{NC}"
复制快照到宿主机
echo -e "{YELLOW}\[4/5\] 复制快照到宿主机...{NC}"
docker cp {CONTAINER_NAME}:/tmp/etcd_snapshot.db "{BACKUP_FILE}"
echo -e "{GREEN}✓ 快照已保存到: {BACKUP_FILE}${NC}"
验证快照
echo -e "{YELLOW}\[5/5\] 验证快照完整性...{NC}"
docker exec ${CONTAINER_NAME} etcdctl snapshot status /tmp/etcd_snapshot.db --write-out=table
echo -e "{GREEN}✓ 快照验证通过{NC}"
导出所有数据(可选,用于检查)
echo -e "{YELLOW}\[额外\] 导出所有 key-value 数据...{NC}"
docker exec {CONTAINER_NAME} etcdctl get "" --prefix --keys-only \> "{BACKUP_DIR}/all_keys_${BACKUP_DATE}.txt"
docker exec {CONTAINER_NAME} etcdctl get "" --prefix \> "{BACKUP_DIR}/all_data_${BACKUP_DATE}.txt"
echo -e "{GREEN}✓ 数据已导出{NC}"
显示统计信息
echo -e "{GREEN}========================================{NC}"
echo -e "{GREEN}备份完成!{NC}"
echo -e "{GREEN}========================================{NC}"
echo -e "备份文件: ${BACKUP_FILE}"
echo -e "文件大小: (du -h {BACKUP_FILE} | cut -f1)"
echo -e "备份时间: ${BACKUP_DATE}"
echo -e "{GREEN}========================================{NC}"
清理容器内临时文件
docker exec ${CONTAINER_NAME} rm -f /tmp/etcd_snapshot.db
echo -e "{GREEN}备份脚本执行完成!{NC}"