#!/bin/bash
export PATH=$PATH:/usr/local/bin
set -euo pipefail
# 配置参数(可根据需要修改)
CLICKHOUSE_USER="**"
CLICKHOUSE_PASSWORD="**" # ClickHouse密码
BACKUP_PATH="/var/lib/clickhouse/backup" # 备份存储路径
ARCH="linux-amd64" # 系统架构(linux-amd64/linux-arm64)
BINARY_TAR_PATH="/soft/clickhouse-backup-linux-amd64.tar.gz" # 二进制包路径
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m'
# 依赖检查函数
check_dependencies() {
local deps=("tar" "clickhouse-client" "")
for dep in "${deps[@]}"; do
if ! command -v $dep &> /dev/null; then
echo -e "${RED}错误:未找到依赖 $dep${NC}"
exit 1
fi
done
}
# 配置ClickHouse用户权限
#configure_clickhouse_user() {
# local users_xml="/etc/clickhouse-server/users.xml"
# if [ ! -f "$users_xml" ]; then
# echo -e "${RED}错误:ClickHouse配置文件不存在于 $users_xml${NC}"
# exit 1
# fi
#
# echo -e "${YELLOW}[1/7] 配置ClickHouse用户权限...${NC}"
# sed -i \
# -e '/<default>/a <allow_ddl>1</allow_ddl>' \
# -e '/<default>/a <allow_backup>1</allow_backup>' \
# "$users_xml"
#
# # 重启ClickHouse服务
# if ! systemctl restart clickhouse-server; then
# echo -e "${RED}错误:ClickHouse服务重启失败${NC}"
# exit 1
# fi
#}
# 安装二进制文件
install_binary() {
echo -e "${YELLOW}[2/7] 安装二进制程序...${NC}"
# 验证压缩包存在
if [ ! -f "$BINARY_TAR_PATH" ]; then
echo -e "${RED}错误:二进制包 $BINARY_TAR_PATH 不存在${NC}"
exit 1
fi
# 创建临时目录
local temp_dir=$(mktemp -d)
trap 'rm -rf "$temp_dir"' EXIT
# 解压文件
if ! tar -xzf "$BINARY_TAR_PATH" -C "$temp_dir"; then
echo -e "${RED}错误:解压失败${NC}"
exit 1
fi
# 复制文件
cp "${temp_dir}/build/linux/amd64/clickhouse-backup" /usr/local/bin/
chmod +x /usr/local/bin/clickhouse-backup
# 验证安装
if ! clickhouse-backup --version &> /dev/null; then
echo -e "${RED}错误:二进制文件验证失败${NC}"
exit 1
fi
}
# 配置备份工具
configure_backup() {
echo -e "${YELLOW}[3/7] 生成配置文件...${NC}"
mkdir -p /etc/clickhouse-backup
echo "[DEBUG] Current PATH: $PATH"
echo "[DEBUG] clickhouse-backup path: $(which clickhouse-backup 2>/dev/null)"
sh -c "clickhouse-backup default-config > /etc/clickhouse-backup/config.yml"
echo -e "${YELLOW}[4/7] 修改配置文件...${NC}"
sed -i \
-e "s/username: \"default\"/username: '${CLICKHOUSE_USER}'/" \
-e "s/password: \"\"/password: '${CLICKHOUSE_PASSWORD}'/" \
-e "s|backup_path: \"\"|backup_path: '${BACKUP_PATH}'|" \
/etc/clickhouse-backup/config.yml
}
# 创建备份目录
create_backup_dir() {
echo -e "${YELLOW}[5/7] 创建备份目录...${NC}"
mkdir -p "$BACKUP_PATH"
chown -R clickhouse:clickhouse "$BACKUP_PATH"
}
# 验证功能
verify_installation() {
echo -e "${YELLOW}[6/7] 验证备份功能...${NC}"
# 创建测试备份
if ! clickhouse-backup create test_backup; then
echo -e "${RED}错误:备份创建失败${NC}"
exit 1
fi
# 列出备份
if ! clickhouse-backup list; then
echo -e "${RED}错误:备份列表查看失败${NC}"
exit 1
fi
}
# 系统服务集成(可选)
setup_service() {
read -p "是否配置系统服务?(y/n): " choice
case "$choice" in
y|Y )
echo -e "${YELLOW}[7/7] 配置系统服务...${NC}"
# 创建服务文件
tee /etc/systemd/system/clickhouse-backup.service > /dev/null <<EOF
[Unit]
Description=ClickHouse Backup Service
After=network.target clickhouse-server.service
[Service]
User=clickhouse
Group=clickhouse
ExecStart=/usr/local/bin/clickhouse-backup server
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 重载系统服务
systemctl daemon-reload
systemctl enable --now clickhouse-backup
;;
* )
echo -e "${YELLOW}跳过系统服务配置${NC}"
;;
esac
}
# 主执行流程
main() {
check_dependencies
configure_clickhouse_user
install_binary
configure_backup
create_backup_dir
verify_installation
setup_service
echo -e "\n${GREEN}部署成功!${NC}"
echo -e "使用命令管理备份:"
echo -e " 创建备份: clickhouse-backup create <backup_name>"
echo -e " 恢复备份: clickhouse-backup restore <backup_name>"
}
main "$@"