当前位置: 首页 > news >正文

Shell脚本源码安装Redis、MySQL、Mongodb、PostgreSQL(无报错版)

Redis脚本

#!/bin/bash# ====== 配置变量 ======
REDIS_VERSION="7.4.2"
REDIS_PORT="63790"
REDIS_USER="redis"
REDIS_GROUP="redis"
REDIS_HOME="/usr/local/redis"
REDIS_DATA_DIR="/var/lib/redis"
REDIS_LOG_DIR="/var/log/redis"
REDIS_RUN_DIR="/var/run/redis"# ====== 颜色输出函数 ======
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Colorlog_info() {echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}log_warning() {echo -e "${YELLOW}[WARNING]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}log_error() {echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2
}# ====== 检查并安装依赖 ======
install_dependencies() {log_info "开始安装依赖包..."# 检查并安装tarif ! command -v tar &> /dev/null; thenyum -y install tarlog_info "已安装tar"elselog_info "tar已安装"fi# 检查并安装gccif ! command -v gcc &> /dev/null; thenyum -y install gcclog_info "已安装gcc"elselog_info "gcc已安装"fi# 检查gcc是否安装成功if ! command -v gcc &> /dev/null; thenlog_error "GCC安装失败,请检查YUM源配置"exit 1fi
}# ====== 配置系统参数 ======
configure_system() {log_info "配置系统参数..."# 配置内存过度分配if ! grep -q "vm.overcommit_memory = 1" /etc/sysctl.conf; thenecho "vm.overcommit_memory = 1" >> /etc/sysctl.confsysctl -plog_info "已配置内存过度分配策略"fi# 配置透明大页 (需要重启生效)if [ ! -f /etc/rc.d/rc.local ]; thenecho '#!/bin/bash' > /etc/rc.d/rc.localfichmod +x /etc/rc.d/rc.localif ! grep -q "transparent_hugepage" /etc/rc.d/rc.local; thenecho 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.locallog_info "已配置透明大页禁用(重启后生效)"fi
}# ====== 创建Redis用户和组 ======
create_redis_user() {log_info "创建Redis用户和组..."if ! getent group ${REDIS_GROUP} > /dev/null; thengroupadd -r ${REDIS_GROUP}log_info "已创建Redis组: ${REDIS_GROUP}"fiif ! id -u ${REDIS_USER} > /dev/null 2>&1; thenuseradd -r -g ${REDIS_GROUP} -s /sbin/nologin ${REDIS_USER}log_info "已创建Redis用户: ${REDIS_USER}"fi
}# ====== 安装Redis ======
install_redis() {log_info "开始安装Redis ${REDIS_VERSION}..."# 检查Redis源码包是否存在if [ ! -f "/usr/local/src/redis-${REDIS_VERSION}.tar.gz" ]; thenlog_error "Redis源码包不存在: /usr/local/src/redis-${REDIS_VERSION}.tar.gz"exit 1fi# 解压Redis源码tar -zxf "/usr/local/src/redis-${REDIS_VERSION}.tar.gz" -C /usr/localif [ $? -ne 0 ]; thenlog_error "解压Redis源码包失败"exit 1fi# 重命名目录mv "/usr/local/redis-${REDIS_VERSION}" "${REDIS_HOME}"# 编译安装Rediscd "${REDIS_HOME}"make MALLOC=libcif [ $? -ne 0 ]; thenlog_error "Redis编译失败"exit 1ficd "${REDIS_HOME}/src"make install PREFIX="${REDIS_HOME}"if [ $? -ne 0 ]; thenlog_error "Redis安装失败"exit 1filog_info "Redis ${REDIS_VERSION} 安装成功"
}# ====== 配置Redis ======
configure_redis() {log_info "配置Redis..."# 创建数据和日志目录mkdir -p ${REDIS_DATA_DIR} ${REDIS_LOG_DIR} ${REDIS_RUN_DIR}chown -R ${REDIS_USER}:${REDIS_GROUP} ${REDIS_DATA_DIR} ${REDIS_LOG_DIR} ${REDIS_RUN_DIR}chmod -R 755 ${REDIS_DATA_DIR} ${REDIS_LOG_DIR} ${REDIS_RUN_DIR}# 修改Redis配置文件if [ -f "${REDIS_HOME}/redis.conf" ]; then# 备份原始配置文件cp "${REDIS_HOME}/redis.conf" "${REDIS_HOME}/redis.conf.bak"# 应用配置修改sed -i 's/^bind 127.0.0.1/bind 0.0.0.0/g' "${REDIS_HOME}/redis.conf"   # 开放对外链接sed -i 's/daemonize no/daemonize yes/' "${REDIS_HOME}/redis.conf"      # 守护进程方式启动sed -i 's/protected-mode yes/protected-mode no/' "${REDIS_HOME}/redis.conf"   # 开放外部访问sed -i "s/port 6379/port ${REDIS_PORT}/" "${REDIS_HOME}/redis.conf"    # 修改端口号# 添加额外配置echo "dir ${REDIS_DATA_DIR}" >> "${REDIS_HOME}/redis.conf"echo "logfile ${REDIS_LOG_DIR}/redis.log" >> "${REDIS_HOME}/redis.conf"echo "pidfile ${REDIS_RUN_DIR}/redis.pid" >> "${REDIS_HOME}/redis.conf"# 设置配置文件权限chown ${REDIS_USER}:${REDIS_GROUP} "${REDIS_HOME}/redis.conf"chmod 644 "${REDIS_HOME}/redis.conf"log_info "Redis配置已完成"elselog_error "Redis配置文件不存在: ${REDIS_HOME}/redis.conf"exit 1fi
}# ====== 创建Systemd服务 ======
create_systemd_service() {log_info "创建Systemd服务..."cat > /etc/systemd/system/redis.service << EOF
[Unit]
Description=Redis In-Memory Data Store
Documentation=https://redis.io/documentation
After=network.target[Service]
Type=forking
User=${REDIS_USER}
Group=${REDIS_GROUP}
PIDFile=${REDIS_RUN_DIR}/redis.pid
ExecStart=${REDIS_HOME}/bin/redis-server ${REDIS_HOME}/redis.conf
ExecStop=${REDIS_HOME}/bin/redis-cli -h 127.0.0.1 -p ${REDIS_PORT} shutdown
Restart=always
RestartSec=3
LimitNOFILE=65535
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
PrivateTmp=true[Install]
WantedBy=multi-user.target
EOF# 重新加载Systemd配置systemctl daemon-reloadlog_info "Systemd服务已创建"
}# ====== 创建符号链接 ======
create_symlinks() {log_info "创建符号链接..."ln -sf "${REDIS_HOME}/bin/redis-cli" /usr/local/sbin/redis-cliln -sf "${REDIS_HOME}/bin/redis-server" /usr/local/sbin/redis-server# 添加到PATH环境变量if ! grep -q "${REDIS_HOME}/bin" /etc/profile; thenecho "export PATH=\${PATH}:${REDIS_HOME}/bin" >> /etc/profilesource /etc/profilefilog_info "符号链接已创建"
}# ====== 配置防火墙 ======
configure_firewall() {log_info "配置防火墙..."if systemctl is-active --quiet firewalld; thenfirewall-cmd --permanent --add-port=${REDIS_PORT}/tcpfirewall-cmd --reloadlog_info "已放行TCP ${REDIS_PORT}端口"elselog_warning "firewalld未运行,跳过端口放行"fi
}# ====== 启动Redis服务 ======
start_redis_service() {log_info "启动Redis服务..."# 设置目录权限chown -R ${REDIS_USER}:${REDIS_GROUP} ${REDIS_HOME}# 启动并启用服务systemctl start redissystemctl enable redis# 检查服务状态sleep 2  # 等待服务启动if systemctl is-active --quiet redis; thenlog_info "Redis服务启动成功"systemctl status redis --no-pagerelselog_error "Redis服务启动失败"journalctl -u redis --since "1 minute ago" --no-pagerexit 1fi
}# ====== 安装后提示 ======
post_install_info() {echo ""log_info "========== Redis 安装完成 =========="log_info "版本: Redis ${REDIS_VERSION}"log_info "端口: ${REDIS_PORT}"log_info "配置文件: ${REDIS_HOME}/redis.conf"log_info "数据目录: ${REDIS_DATA_DIR}"log_info "日志文件: ${REDIS_LOG_DIR}/redis.log"log_info "管理命令:"log_info "  启动: systemctl start redis"log_info "  停止: systemctl stop redis"log_info "  状态: systemctl status redis"log_info "  连接: redis-cli -p ${REDIS_PORT}"echo ""log_warning "注意: 当前配置未设置密码,生产环境请设置requirepass"log_warning "      修改配置文件: ${REDIS_HOME}/redis.conf"log_warning "      取消注释: # requirepass foobared 并设置强密码"echo ""
}# ====== 主执行流程 ======
main() {log_info "开始Redis安装流程"# 检查root权限if [ "$(id -u)" != "0" ]; thenlog_error "此脚本必须使用root权限运行"exit 1fi# 执行安装步骤install_dependenciesconfigure_systemcreate_redis_userinstall_redisconfigure_rediscreate_systemd_servicecreate_symlinksconfigure_firewallstart_redis_servicepost_install_infolog_info "Redis安装完成"
}# 执行主函数
main "$@"

MySQL脚本

#!/bin/bash# 脚本配置
SCRIPT_NAME="install_mysql-ziqi"
LOG_FILE="/var/log/${SCRIPT_NAME}.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color# 函数:记录日志
log() {local level=$1local message=$2echo -e "${TIMESTAMP} [${level}] ${message}" | tee -a "${LOG_FILE}"
}# 函数:检查命令执行状态
check_status() {local exit_code=$1local success_msg=$2local error_msg=$3if [ ${exit_code} -eq 0 ]; thenlog "SUCCESS" "${success_msg}"return 0elselog "ERROR" "${error_msg} (退出码: ${exit_code})"return 1fi
}# 函数:错误处理
error_exit() {local error_msg=$1local exit_code=${2:-1}log "FATAL" "${error_msg}"exit ${exit_code}
}# 函数:清理旧MySQL安装
cleanup_old_mysql() {log "INFO" "清理旧的MySQL安装..."# 查找并停止正在运行的MySQL服务if systemctl is-active --quiet mysqld 2>/dev/null || systemctl is-active --quiet mysql 2>/dev/null; thensystemctl stop mysqld mysql 2>/dev/nulllog "INFO" "已停止运行的MySQL服务"fi# 查找并移除旧包old_mysql=$(rpm -qa | grep -E 'mariadb|mysql' | tr '\n' ' ')if [ -n "${old_mysql}" ]; thenrpm -e --nodeps ${old_mysql} >> "${LOG_FILE}" 2>&1check_status $? "旧MySQL包移除成功" "旧MySQL包移除失败"fi# 移除MySQL相关目录find / -name "mysql" -type d -not -path "/data*" -exec rm -rf {} + 2>/dev/null || truelog "INFO" "旧MySQL安装清理完成"
}# 主执行函数
main() {log "INFO" "开始MySQL安装过程"# 创建日志目录mkdir -p "$(dirname "${LOG_FILE}")"touch "${LOG_FILE}"chmod 644 "${LOG_FILE}"# 显示开始信息echo -e "${GREEN}开始安装MySQL...${NC}"echo -e "详细日志请查看: ${YELLOW}${LOG_FILE}${NC}"# 修改环境log "INFO" "修改SELinux设置..."setenforce 0 >> "${LOG_FILE}" 2>&1check_status $? "SELinux临时禁用成功" "SELinux临时禁用失败"sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config >> "${LOG_FILE}" 2>&1check_status $? "SELinux永久禁用成功" "SELinux永久禁用失败"# 清理旧MySQL安装cleanup_old_mysql# 定义路径变量mysql_path_b=/data/mysqlmysql_path=/data/mysql/mysqlmysql_path_data=$mysql_path_b/data# 安装依赖log "INFO" "安装必要依赖..."yum -y install libaio >> "${LOG_FILE}" 2>&1check_status $? "libaio安装成功" "libaio安装失败" || error_exit "无法安装libaio"yum -y install tar >> "${LOG_FILE}" 2>&1check_status $? "tar安装成功" "tar安装失败" || error_exit "无法安装tar"# 创建用户和组log "INFO" "创建MySQL用户和组..."groupadd mysql >> "${LOG_FILE}" 2>&1check_status $? "MySQL用户组创建成功" "MySQL用户组创建失败" || error_exit "无法创建MySQL用户组"useradd -g mysql -s /sbin/nologin mysql >> "${LOG_FILE}" 2>&1check_status $? "MySQL用户创建成功" "MySQL用户创建失败" || error_exit "无法创建MySQL用户"# 创建目录log "INFO" "创建MySQL目录..."mkdir -p $mysql_path_data >> "${LOG_FILE}" 2>&1check_status $? "MySQL目录创建成功" "MySQL目录创建失败" || error_exit "无法创建MySQL目录"# 解压MySQLlog "INFO" "解压MySQL安装包..."tar -xvf /usr/local/src/mysql-8.0.4* -C $mysql_path_b >> "${LOG_FILE}" 2>&1check_status $? "MySQL解压成功" "MySQL解压失败" || error_exit "无法解压MySQL安装包"# 重命名目录mv $mysql_path_b/mysql-8.0.4* $mysql_path_b/mysql >> "${LOG_FILE}" 2>&1check_status $? "MySQL目录重命名成功" "MySQL目录重命名失败"# 设置权限chown -R mysql:mysql $mysql_path_data $mysql_path_b >> "${LOG_FILE}" 2>&1check_status $? "目录权限设置成功" "目录权限设置失败"chmod 755 $mysql_path_data $mysql_path_b >> "${LOG_FILE}" 2>&1check_status $? "目录权限修改成功" "目录权限修改失败"# 创建符号链接ln -s $mysql_path/bin/mysql /usr/bin/mysql >> "${LOG_FILE}" 2>&1check_status $? "MySQL符号链接创建成功" "MySQL符号链接创建失败"# 添加PATH环境变量echo "export PATH=${PATH}:$mysql_path/bin" >>/etc/profilesource /etc/profile >> "${LOG_FILE}" 2>&1check_status $? "PATH环境变量更新成功" "PATH环境变量更新失败"# 移除旧配置文件rm -fr /etc/my.cnf >> "${LOG_FILE}" 2>&1check_status $? "旧配置文件移除成功" "旧配置文件移除失败"# 创建新配置文件log "INFO" "创建MySQL配置文件..."cat > /etc/my.cnf << EOF
[client]
port = 3306
socket = $mysql_path_data/mysql.sock
default-character-set = utf8mb4[mysql]
disable-auto-rehash
default-character-set = utf8mb4
connect-timeout = 10[mysqld]
user = mysql
server-id = 3306
port = 3306
socket = $mysql_path_data/mysql.sock
pid-file = $mysql_path_data/mysql.pid
basedir = $mysql_path_b
datadir = $mysql_path_data/data
autocommit = 1
plugin_dir = $mysql_path/lib/plugin
default_authentication_plugin = mysql_native_password
character-set-server = utf8mb4
explicit_defaults_for_timestamp = true
lower_case_table_names = 1
back_log = 103
max_connections = 10000
max_connect_errors = 100000
table_open_cache = 512
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 2M
join_buffer_size = 2M
thread_cache_size = 51
transaction_isolation = READ-COMMITTED
tmp_table_size = 96M
max_heap_table_size = 96M###***logs
long_query_time = 10
slow_query_log = 1
slow_query_log_file = $mysql_path_data/slow.log
log_error_verbosity = 3
log-error = $mysql_path_data/mysql.err
log_output = FILEmax_binlog_size = 1G
log-bin = $mysql_path_data/mysql-bin# innodb storage engine parameters
innodb_buffer_pool_size = 500M
innodb_data_file_path = ibdata1:100M:autoextend:max:5G
innodb_temp_data_file_path = ibtemp1:100M:autoextend:max:10G
innodb_log_buffer_size = 16M
innodb_log_file_size = 256M
innodb_log_files_in_group = 2
innodb_lock_wait_timeout = 50
innodb_file_per_table = 1
EOFcheck_status $? "MySQL配置文件创建成功" "MySQL配置文件创建失败" || error_exit "无法创建MySQL配置文件"# 创建必要的文件touch $mysql_path/mysql.pidtouch $mysql_path/mysql_err.logchown -R mysql:mysql $mysql_path_b# 初始化MySQLlog "INFO" "初始化MySQL..."mysqld --defaults-file=/etc/my.cnf --initialize-insecure >> "${LOG_FILE}" 2>&1check_status $? "MySQL初始化成功" "MySQL初始化失败" || error_exit "无法初始化MySQL"# 创建systemd服务log "INFO" "创建systemd服务..."cat > /etc/systemd/system/mysql.service << EOF
[Unit]
Description=MySQL Server 8.0
After=network.target[Service]
User=mysql
Group=mysql
ExecStart=$mysql_path/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 65535
PIDFile=$mysql_path/mysql.pid
ExecStop=$mysql_path/mysqladmin shutdown[Install]
WantedBy=multi-user.target
EOFcheck_status $? "systemd服务文件创建成功" "systemd服务文件创建失败" || error_exit "无法创建systemd服务文件"chmod 644 /etc/systemd/system/mysql.service >> "${LOG_FILE}" 2>&1check_status $? "服务文件权限设置成功" "服务文件权限设置失败"systemctl daemon-reload >> "${LOG_FILE}" 2>&1check_status $? "systemd重载成功" "systemd重载失败"# 启动MySQL服务log "INFO" "启动MySQL服务..."systemctl start mysql >> "${LOG_FILE}" 2>&1check_status $? "MySQL服务启动成功" "MySQL服务启动失败" || error_exit "无法启动MySQL服务"systemctl enable mysql >> "${LOG_FILE}" 2>&1check_status $? "MySQL服务启用自启成功" "MySQL服务启用自启失败"# 配置防火墙log "INFO" "配置防火墙..."firewall-cmd --zone=public --add-port=3306/tcp --permanent >> "${LOG_FILE}" 2>&1check_status $? "防火墙端口添加成功" "防火墙端口添加失败"firewall-cmd --reload >> "${LOG_FILE}" 2>&1check_status $? "防火墙重载成功" "防火墙重载失败"# 等待MySQL完全启动log "INFO" "等待MySQL完全启动..."sleep 5# 设置root密码和远程访问log "INFO" "设置MySQL root密码和远程访问..."$mysql_path/bin/mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'shangben@123';" >> "${LOG_FILE}" 2>&1check_status $? "Root密码设置成功" "Root密码设置失败"$mysql_path/bin/mysql -u root -pshangben@123 -e "UPDATE mysql.user SET host = '%' WHERE user = 'root' AND host = 'localhost';" >> "${LOG_FILE}" 2>&1check_status $? "远程访问设置成功" "远程访问设置失败"$mysql_path/bin/mysql -u root -pshangben@123 -e "FLUSH PRIVILEGES;" >> "${LOG_FILE}" 2>&1check_status $? "权限刷新成功" "权限刷新失败"# 验证安装log "INFO" "验证MySQL安装..."systemctl status mysql >> "${LOG_FILE}" 2>&1check_status $? "MySQL服务状态检查成功" "MySQL服务状态检查失败"# 显示安装摘要log "SUCCESS" "===== MySQL安装完成 ====="log "INFO" "安装路径: $mysql_path"log "INFO" "数据目录: $mysql_path_data"log "INFO" "配置文件: /etc/my.cnf"log "INFO" "Root密码: shangben@123"log "INFO" "服务状态: $(systemctl is-active mysql)"log "INFO" "日志文件: $LOG_FILE"log "INFO" "连接命令: mysql -u root -p -h 127.0.0.1"log "SUCCESS" "=========================="echo -e "${GREEN}MySQL安装完成!${NC}"echo -e "Root密码: ${YELLOW}shangben@123${NC}"echo -e "连接命令: ${YELLOW}mysql -u root -p -h 127.0.0.1${NC}"echo -e "详细日志请查看: ${YELLOW}${LOG_FILE}${NC}"
}# 执行主函数
main "$@"

MongoDB脚本

#!/bin/bash# ====== 变量定义 ======
MONGO_VERSION="6.0.20"
MONGO_PKG="mongodb-linux-x86_64-rhel90-$MONGO_VERSION"
ARCHIVE="$MONGO_PKG.tgz"
INSTALL_DIR="/opt/mongodb"
DATA_DIR="/data/db"
LOG_DIR="/var/log/mongodb"
RUN_DIR="/var/run/mongodb"
MONGO_USER="mongodb"
MONGO_GROUP="mongodb"
AUTH_ENABLED="disabled"  # 默认禁用认证,便于初始配置# ====== 颜色定义 ======
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color# ====== 函数定义 ======
log_info() {echo -e "${GREEN}[INFO]${NC} $1"
}log_warn() {echo -e "${YELLOW}[WARN]${NC} $1"
}log_error() {echo -e "${RED}[ERROR]${NC} $1"
}check_command() {if ! command -v $1 &> /dev/null; thenlog_error "$1 命令未找到,请安装后再运行脚本"exit 1fi
}# ====== 前置检查 ======
check_command tar
check_command curl# 检查是否以root用户运行
if [ "$EUID" -ne 0 ]; thenlog_error "请以root用户运行此脚本"exit 1
fi# ====== 检查本地安装包是否存在 ======
if [ ! -f "$ARCHIVE" ]; thenlog_warn "安装包 $ARCHIVE 不存在,尝试下载..."DOWNLOAD_URL="https://fastdl.mongodb.org/linux/$ARCHIVE"if curl -O --fail "$DOWNLOAD_URL"; thenlog_info "下载成功: $ARCHIVE"elselog_error "下载失败,请手动将 $ARCHIVE 放在当前目录后重试"exit 1fi
fi# ====== 创建 mongodb 用户和组 ======
if ! id "$MONGO_USER" &>/dev/null; thenlog_info "创建 mongodb 用户和组..."groupadd -r $MONGO_GROUPuseradd -r -g $MONGO_GROUP -s /sbin/nologin $MONGO_USER
fi# ====== 安装依赖 ======
log_info "安装依赖包..."
if command -v dnf &> /dev/null; thendnf install -y libcurl openssl xz-libs || { log_error "安装依赖失败"; exit 1; }
elif command -v yum &> /dev/null; thenyum install -y libcurl openssl xz-libs || { log_error "安装依赖失败"; exit 1; }
elselog_warn "未找到dnf或yum包管理器,跳过依赖安装"
fi# ====== 创建目录结构 ======
log_info "创建目录..."
mkdir -p $INSTALL_DIR $DATA_DIR $LOG_DIR $RUN_DIR
chown -R $MONGO_USER:$MONGO_GROUP $INSTALL_DIR $DATA_DIR $LOG_DIR $RUN_DIR
chmod -R 755 $INSTALL_DIR $DATA_DIR $LOG_DIR $RUN_DIR# ====== 检查端口是否被占用 ======
log_info "检查端口 27017 是否被占用..."
if netstat -tuln | grep -q ":27017"; thenlog_warn "端口 27017 已被占用,尝试终止占用进程..."PID=$(lsof -ti:27017)if [ ! -z "$PID" ]; thenkill -9 $PIDsleep 2fi
fi# ====== 解压 MongoDB 安装包 ======
log_info "解压 MongoDB 安装包..."
if ! tar -xzf "$ARCHIVE"; thenlog_error "解压失败"exit 1
fi# 清理可能的旧安装
rm -rf $INSTALL_DIR/*
cp -r $MONGO_PKG/* $INSTALL_DIR/
chown -R $MONGO_USER:$MONGO_GROUP $INSTALL_DIR# 清理临时文件
rm -rf $MONGO_PKG# ====== 配置环境变量 ======
log_info "配置环境变量..."
if ! grep -q "mongodb" /etc/profile; thenecho "export PATH=\$PATH:$INSTALL_DIR/bin" >> /etc/profilesource /etc/profile
fi# ====== 写入配置文件 ======
log_info "写入 mongod.conf 配置..."
cat <<EOF > $INSTALL_DIR/mongod.conf
systemLog:destination: filepath: $LOG_DIR/mongod.loglogAppend: true
storage:dbPath: $DATA_DIRjournal:enabled: true
net:bindIp: 0.0.0.0port: 27017
processManagement:fork: truepidFilePath: $RUN_DIR/mongod.pid
security:authorization: $AUTH_ENABLED
EOF# ====== 创建 systemd 服务文件 ======
log_info "配置 systemd 服务..."
cat <<EOF > /etc/systemd/system/mongodb.service
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target[Service]
User=$MONGO_USER
Group=$MONGO_GROUP
ExecStart=$INSTALL_DIR/bin/mongod --config=$INSTALL_DIR/mongod.conf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=$INSTALL_DIR/bin/mongod --shutdown --config=$INSTALL_DIR/mongod.conf
Restart=always
RestartSec=10
StartLimitInterval=60
StartLimitBurst=5
LimitNOFILE=64000
LimitNPROC=64000
Environment="MONGODB_CONFIG=$INSTALL_DIR/mongod.conf"
Environment="MONGODB_HOME=$INSTALL_DIR"
Environment="MONGODB_DATA=$DATA_DIR"
Environment="MONGODB_LOG=$LOG_DIR"
RuntimeDirectory=mongodb
RuntimeDirectoryMode=0755
PIDFile=$RUN_DIR/mongod.pid
Type=forking[Install]
WantedBy=multi-user.target
EOF# ====== 设置SELinux上下文 ======
if command -v semanage &> /dev/null && command -v restorecon &> /dev/null; thenlog_info "配置SELinux上下文..."semanage fcontext -a -t mongod_var_lib_t "$DATA_DIR(/.*)?" 2>/dev/null || truesemanage fcontext -a -t mongod_log_t "$LOG_DIR(/.*)?" 2>/dev/null || truesemanage fcontext -a -t mongod_var_run_t "$RUN_DIR(/.*)?" 2>/dev/null || truerestorecon -Rv $DATA_DIR $LOG_DIR $RUN_DIR 2>/dev/null || true
fi# ====== 检查SELinux状态 ======
if command -v getenforce &> /dev/null && [ "$(getenforce)" = "Enforcing" ]; thenlog_warn "SELinux处于强制模式,可能需要额外配置"log_warn "如需临时禁用SELinux,可运行: setenforce 0"
fi# ====== 启动服务 ======
log_info "启动 MongoDB 服务..."
systemctl daemon-reload
systemctl enable mongodb# 尝试直接启动MongoDB进程进行测试
log_info "测试启动MongoDB进程..."
sudo -u $MONGO_USER $INSTALL_DIR/bin/mongod --config $INSTALL_DIR/mongod.conf --fork
sleep 3# 检查MongoDB进程是否运行
if pgrep -f "mongod" > /dev/null; thenlog_info "MongoDB 进程启动成功,正在停止测试进程..."pkill -f "mongod"sleep 2
elselog_error "MongoDB 进程启动失败,查看日志获取详细信息:"tail -n 20 $LOG_DIR/mongod.log 2>/dev/null || echo "无法访问日志文件"exit 1
fi# 正式启动服务
if systemctl start mongodb; thensleep 5# 检查服务状态if systemctl is-active --quiet mongodb; thenlog_info "MongoDB 服务启动成功"elselog_error "MongoDB 服务启动失败"journalctl -u mongodb -n 20 --no-pagerlog_error "详细日志:"tail -n 30 $LOG_DIR/mongod.log 2>/dev/null || echo "无法访问日志文件"exit 1fi
elselog_error "启动MongoDB服务失败"journalctl -u mongodb -n 20 --no-pagerlog_error "详细日志:"tail -n 30 $LOG_DIR/mongod.log 2>/dev/null || echo "无法访问日志文件"exit 1
fi# ====== 放行防火墙端口 ======
log_info "配置防火墙放行 MongoDB 端口..."
if command -v firewall-cmd &> /dev/null && systemctl is-active --quiet firewalld; thenfirewall-cmd --add-port=27017/tcp --permanentfirewall-cmd --reloadlog_info "已放行 TCP 27017 端口"
elselog_warn "firewalld 未运行,跳过端口放行"
fi# ====== 显示最终状态 ======
log_info "MongoDB 服务状态:"
systemctl status mongodb --no-pager -llog_info "MongoDB 安装完成!"
log_info "安装目录: $INSTALL_DIR"
log_info "数据目录: $DATA_DIR"
log_info "日志目录: $LOG_DIR"
log_info "配置文件: $INSTALL_DIR/mongod.conf"if [ "$AUTH_ENABLED" = "enabled" ]; thenlog_info "认证已启用,管理员账号: admin, 密码: admin123"
elselog_info "认证已禁用,无需账号密码即可连接"
filog_info "连接命令: $INSTALL_DIR/bin/mongo"

PostgreSQL脚本

#!/bin/bash# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色# 函数:打印带颜色的消息
print_status() {echo -e "${BLUE}[INFO]${NC} $1"
}print_success() {echo -e "${GREEN}[SUCCESS]${NC} $1"
}print_warning() {echo -e "${YELLOW}[WARNING]${NC} $1"
}print_error() {echo -e "${RED}[ERROR]${NC} $1"
}# 函数:检查命令执行结果
check_result() {if [ $? -eq 0 ]; thenprint_success "$1"elseprint_error "$2"exit 1fi
}# 脚本开始
echo -e "${GREEN}"
echo "================================================"
echo "   PostgreSQL 17.4 安装脚本"
echo "================================================"
echo -e "${NC}"# 检查是否以root权限运行
if [ "$EUID" -ne 0 ]; thenprint_error "请使用sudo或以root用户运行此脚本"exit 1
fiprint_status "开始安装 PostgreSQL 17.4..."# 安装必要依赖
print_status "安装必要依赖包..."
dnf install -y wget tar
check_result "依赖包安装成功" "依赖包安装失败"# 清理旧数据目录
print_status "清理旧数据目录..."
if [ -d "/opt/pgsql/data" ]; thenrm -rf /opt/pgsql/datacheck_result "旧数据目录清理成功" "旧数据目录清理失败"
elseprint_warning "旧数据目录不存在,跳过清理"
fi# 创建 postgres 用户和组
print_status "创建 postgres 用户和组..."
groupadd postgres 2>/dev/null || true
useradd -r -g postgres postgres 2>/dev/null || true
check_result "用户和组创建成功" "用户和组创建失败"# 下载 PostgreSQL 17.4 源码
print_status "下载 PostgreSQL 17.4 源码..."
if [ ! -f "postgresql-17.4.tar.gz" ]; thenwget https://ftp.postgresql.org/pub/source/v17.4/postgresql-17.4.tar.gzcheck_result "源码下载成功" "源码下载失败"
elseprint_warning "源码文件已存在,跳过下载"
fi# 解压源码包
print_status "解压源码包..."
tar -xvzf postgresql-17.4.tar.gz
check_result "源码解压成功" "源码解压失败"cd postgresql-17.4 || exit 1# 安装编译依赖
print_status "安装编译依赖..."
dnf groupinstall -y "Development Tools"
dnf install -y readline-devel zlib-devel libicu-devel perl
check_result "编译依赖安装成功" "编译依赖安装失败"# 配置编译选项
print_status "配置编译选项..."
./configure --prefix=/usr/local/pgsql
check_result "配置成功" "配置失败"# 编译并安装
print_status "编译 PostgreSQL (这可能需要一段时间)..."
make -j$(nproc)
check_result "编译成功" "编译失败"print_status "安装 PostgreSQL..."
make install
check_result "安装成功" "安装失败"# 创建数据目录并设置权限
print_status "创建数据目录并设置权限..."
mkdir -p /opt/pgsql/data
chown -R postgres:postgres /opt/pgsql
check_result "数据目录创建和权限设置成功" "数据目录创建和权限设置失败"# 初始化数据库
print_status "初始化数据库..."
sudo -u postgres /usr/local/pgsql/bin/initdb -D /opt/pgsql/data
check_result "数据库初始化成功" "数据库初始化失败"# 设置全局环境变量
print_status "设置环境变量..."
echo 'export PATH=/usr/local/pgsql/bin:$PATH' | tee /etc/profile.d/pgsql.sh
source /etc/profile.d/pgsql.sh
check_result "环境变量设置成功" "环境变量设置失败"# 修改配置文件允许远程访问
print_status "配置远程访问..."
sudo -u postgres sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" /opt/pgsql/data/postgresql.conf
echo "host    all             all             0.0.0.0/0               md5" | sudo -u postgres tee -a /opt/pgsql/data/pg_hba.conf
check_result "远程访问配置成功" "远程访问配置失败"# 创建 systemd 服务文件
print_status "创建 systemd 服务..."
tee /etc/systemd/system/postgresql.service > /dev/null <<EOF
[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
After=network.target[Service]
Type=forking
User=postgres
Group=postgres
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D /opt/pgsql/data -l /opt/pgsql/data/logfile
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D /opt/pgsql/data
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D /opt/pgsql/data
PIDFile=/opt/pgsql/data/postmaster.pid[Install]
WantedBy=multi-user.target
EOF
check_result "systemd服务创建成功" "systemd服务创建失败"# 重载服务配置并启动
print_status "启动PostgreSQL服务..."
systemctl daemon-reload
systemctl enable postgresql
systemctl restart postgresql
check_result "服务启动成功" "服务启动失败"# 等待服务启动后设置密码
print_status "设置postgres用户密码..."
for i in {1..5}; doif sudo -u postgres /usr/local/pgsql/bin/psql -c "ALTER USER postgres WITH PASSWORD 'shangben@123';" 2>/dev/null; thenprint_success "密码设置成功"breakfiif [ $i -eq 5 ]; thenprint_error "密码设置失败,请手动执行: ALTER USER postgres WITH PASSWORD 'shangben@123';"elseprint_warning "密码设置尝试失败 ($i/5),重试中..."sleep 2fi
done# 验证安装
echo -e "\n${GREEN}"
echo "================================================"
echo "   安装完成,正在进行最终验证"
echo "================================================"
echo -e "${NC}"print_status "检查服务状态..."
systemctl status postgresql --no-pagerecho -e "\n"
print_status "检查数据库连接..."
sudo -u postgres /usr/local/pgsql/bin/psql -c "\l"echo -e "\n${GREEN}"
echo "================================================"
echo "   PostgreSQL 17.4 安装成功完成!"
echo "   连接信息:"
echo "   - 用户名: postgres"
echo "   - 密码: shangben@123"
echo "   - 端口: 5432"
echo "================================================"
echo -e "${NC}"

http://www.dtcms.com/a/344471.html

相关文章:

  • 遥感机器学习入门实战教程|Sklearn案例⑥:网格搜索与超参数优化
  • Logstash——性能、可靠性与扩展性架构
  • Python爬虫实战:构建古籍抄本数据采集分析系统
  • 实验二 Cisco IOS Site-to-Site Pre-share Key
  • LeetCode第55题 - 跳跃游戏
  • GitHub 热榜项目 - 日榜(2025-08-22)
  • 解析三品汽车零部件PLM系统解决方案:如何助力行业解决研发管理难题
  • Curity CTO 深度解析:AI 智能体正让我们“梦游”般陷入安全危机
  • 车载中控:汽车的数字大脑与交互核心
  • 第五章:Leaflet 进阶:高德地图交互与事件处理全解析
  • git回滚相关命令指南
  • 机器学习概述:从零开始理解人工智能的核心技术
  • 树莓派安装pyqt5 opencv等库一些问题
  • 力扣面试150(63/150)
  • C++显示类型转换运算符static_cast使用指南
  • 偶现型Bug处理方法---用系统方法对抗随机性
  • 一、Python IDLE安装(python官网下的环境安装)
  • ArrayList vs LinkedList:底层原理与实战选择指南
  • 企业设备系统选型:功能适配度分析
  • Java多线程面试题二
  • 视频清晰度:静态码率比动态码率更优秀吗?
  • 从零搭建 React 工程化项目
  • 本地通过跳板机连接无公网IP的内网服务器
  • 哈尔滨云前沿服务器托管的优势
  • 【Linux仓库】进程的“夺舍”与“飞升”:exec 驱动的应用现代化部署流水线
  • 前端github-workflows部署腾讯云轻量服务器
  • 学云计算还是网络,选哪个好?
  • Linux:网络层IP协议
  • alicloud 阿里云有哪些日志 审计日志
  • css的white-space: pre