本文目录导读:

#!/bin/bash
# TimescaleDB 自动配置脚本
# 适用于 Ubuntu 20.04/22.04 或 Debian 11/12
set -e # 遇到错误立即退出
# 颜色输出函数
print_info() {
echo -e "\e[1;34m[INFO]\e[0m $1"
}
print_error() {
echo -e "\e[1;31m[ERROR]\e[0m $1"
}
print_success() {
echo -e "\e[1;32m[SUCCESS]\e[0m $1"
}
# 检查是否以 root 运行
if [ "$EUID" -ne 0 ]; then
print_error "请以 root 权限运行此脚本 (sudo)"
exit 1
fi
# 1. 安装 PostgreSQL 和 TimescaleDB
install_timescaledb() {
print_info "开始安装 TimescaleDB..."
# 添加 PostgreSQL 官方仓库
print_info "添加 PostgreSQL APT 仓库..."
sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
# 添加 TimescaleDB 仓库
print_info "添加 TimescaleDB APT 仓库..."
if [ "$(lsb_release -is)" = "Ubuntu" ]; then
add-apt-repository -y ppa:timescale/timescaledb-ppa
else
sh -c 'echo "deb https://packagecloud.io/timescale/timescaledb/debian/ $(lsb_release -cs) main" > /etc/apt/sources.list.d/timescaledb.list'
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | apt-key add -
fi
# 更新并安装
apt-get update
apt-get install -y timescaledb-2-postgresql-16 postgresql-16
print_success "TimescaleDB 安装完成"
}
# 2. 配置 PostgreSQL
configure_postgresql() {
print_info "配置 PostgreSQL..."
# 停止 PostgreSQL 服务以确保配置生效
systemctl stop postgresql
# 运行 timescaledb-tune 自动优化配置
timescaledb-tune --quiet --yes --conf-path /etc/postgresql/16/main/postgresql.conf
# 启动 PostgreSQL 服务
systemctl start postgresql
print_success "PostgreSQL 配置完成"
}
# 3. 创建数据库和用户
create_database_and_user() {
local db_name="$1"
local db_user="$2"
local db_password="$3"
print_info "创建数据库和用户..."
# 切换到 postgres 用户执行命令
su - postgres -c "psql -c \"CREATE USER ${db_user} WITH PASSWORD '${db_password}';\""
su - postgres -c "psql -c \"CREATE DATABASE ${db_name} OWNER ${db_user};\""
su - postgres -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE ${db_name} TO ${db_user};\""
print_success "数据库 '${db_name}' 和用户 '${db_user}' 创建完成"
}
# 4. 启用 TimescaleDB 扩展
enable_extension() {
local db_name="$1"
print_info "启用 TimescaleDB 扩展..."
# 连接到指定数据库并创建扩展
su - postgres -c "psql -d ${db_name} -c \"CREATE EXTENSION IF NOT EXISTS timescaledb;\""
print_success "TimescaleDB 扩展已启用"
}
# 5. 创建示例超表(优化时间序列数据)
create_sample_hypertable() {
local db_name="$1"
local table_owner="$2"
print_info "创建示例超表..."
# 创建普通表
su - postgres -c "psql -d ${db_name} -c \"
CREATE TABLE IF NOT EXISTS conditions (
time TIMESTAMPTZ NOT NULL,
location TEXT NOT NULL,
temperature DOUBLE PRECISION NULL,
humidity DOUBLE PRECISION NULL
);
\""
# 转换为超表(按时间分区)
su - postgres -c "psql -d ${db_name} -c \"
SELECT create_hypertable('conditions', 'time', if_not_exists => TRUE);
ALTER TABLE conditions SET (
timescaledb.compress,
timescaledb.compress_segmentby = 'location'
);
SELECT add_compression_policy('conditions', INTERVAL '7 days');
\""
# 设置表所有权
su - postgres -c "psql -d ${db_name} -c \"ALTER TABLE conditions OWNER TO ${table_owner};\""
print_success "示例超表 'conditions' 创建完成"
}
# 6. 创建自动分区策略
create_partitioning_policy() {
local db_name="$1"
print_info "创建自动分区策略..."
su - postgres -c "psql -d ${db_name} -c \"
SELECT add_job(
'reorder_chunk',
schedule_interval => INTERVAL '1 hour',
initial_start => now()
);
\""
print_success "自动分区策略已创建"
}
# 7. 创建备份脚本
create_backup_script() {
local db_name="$1"
local backup_dir="/var/backups/timescaledb/${db_name}"
print_info "创建备份脚本..."
mkdir -p "${backup_dir}"
chmod 700 "${backup_dir}"
cat > /usr/local/bin/backup_timescaledb.sh << EOF
#!/bin/bash
# TimescaleDB 备份脚本
BACKUP_DIR="${backup_dir}"
DB_NAME="${db_name}"
DATE=\$(date +%Y%m%d_%H%M%S)
pg_dump -Fc -U postgres -d \${DB_NAME} > \${BACKUP_DIR}/\${DB_NAME}_\${DATE}.dump
echo "Backup created: \${BACKUP_DIR}/\${DB_NAME}_\${DATE}.dump"
EOF
chmod +x /usr/local/bin/backup_timescaledb.sh
print_success "备份脚本已创建: /usr/local/bin/backup_timescaledb.sh"
}
# 主函数
main() {
print_info "TimescaleDB 自动配置脚本开始运行..."
echo "======================================"
# 配置参数
DB_NAME="timescaledb_test"
DB_USER="tsdb_admin"
DB_PASSWORD="YourStrongPassword123!"
# 安装 TimescaleDB
install_timescaledb
# 配置 PostgreSQL
configure_postgresql
# 创建数据库和用户
create_database_and_user "${DB_NAME}" "${DB_USER}" "${DB_PASSWORD}"
# 启用扩展
enable_extension "${DB_NAME}"
# 创建示例超表
create_sample_hypertable "${DB_NAME}" "${DB_USER}"
# 创建分区策略
create_partitioning_policy "${DB_NAME}"
# 创建备份脚本
create_backup_script "${DB_NAME}"
echo "======================================"
print_success "TimescaleDB 自动配置完成!"
print_info "数据库: ${DB_NAME}"
print_info "用户: ${DB_USER}"
print_info "密码: ${DB_PASSWORD}"
print_info "请立即修改默认密码!"
# 显示连接信息
echo ""
print_info "连接信息:"
echo " Host: localhost"
echo " Port: 5432"
echo " Database: ${DB_NAME}"
echo " Username: ${DB_USER}"
echo " Connection string: postgresql://${DB_USER}:${DB_PASSWORD}@localhost:5432/${DB_NAME}"
}
# 执行主函数
main
使用说明
-
保存脚本:
sudo nano /tmp/configure_timescaledb.sh # 将上面的脚本内容粘贴进去
-
赋予执行权限:
sudo chmod +x /tmp/configure_timescaledb.sh
-
运行脚本:
sudo /tmp/configure_timescaledb.sh
自定义配置
如果需要自定义配置,可以修改脚本中的以下参数:
# 在第 178-180 行附近 DB_NAME="timescaledb_test" # 数据库名称 DB_USER="tsdb_admin" # 数据库用户 DB_PASSWORD="YourStrongPassword123!" # 数据库密码
脚本功能说明
| 功能 | 说明 |
|---|---|
| 自动安装 | 安装 PostgreSQL 16 + TimescaleDB 2.x |
| 自动优化 | 使用 timescaledb-tune 优化配置 |
| 创建用户 | 创建数据库用户并设置权限 |
| 创建数据库 | 创建指定名称的数据库 |
| 启用扩展 | 启用 TimescaleDB 扩展 |
| 创建超表 | 创建示例时间序列表并转换为超表 |
| 压缩策略 | 为超表启用压缩并设置自动压缩策略 |
| 备份脚本 | 创建自动备份脚本 |
验证安装
完成后,可以使用以下命令验证:
# 连接到数据库 sudo -u postgres psql -d timescaledb_test # 在 psql 中输入 \d SELECT * FROM timescaledb_information.hypertables;
这个脚本会创建一个完整的 TimescaleDB 环境,包括时间序列数据库、用户、超表和自动维护策略,适合快速部署开发和测试环境。