- A+
所属分类:Shell
#!/bin/bash
# MongoDB安装脚本 - 适用于 CentOS 系统
# 脚本功能:自动安装MongoDB 7.0.14并完成基础配置
# 定义颜色变量,用于输出提示信息
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 重置颜色
# 日志文件
LOG_FILE="/var/log/mongodb_install.log"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB安装脚本开始执行" > $LOG_FILE
echo -e "${YELLOW}开始安装MongoDB数据库,请稍候...${NC}"
# 检查是否为root用户,非root用户无法执行安装
if [ "$(id -u)" -ne 0 ]; then
echo -e "${RED}错误:请使用root用户执行此脚本!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 非root用户尝试执行安装脚本" >> $LOG_FILE
exit 1
fi
# 1. 修改内核参数
echo -e "${YELLOW}修改系统内核参数...${NC}"
if ! grep -q "vm.max_map_count" /etc/sysctl.conf; then
echo "vm.max_map_count = 262144" >> /etc/sysctl.conf
else
sed -i 's/^vm.max_map_count.*/vm.max_map_count = 262144/' /etc/sysctl.conf
fi
if ! sysctl -p; then
echo -e "${RED}内核参数加载失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] sysctl -p 执行失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 内核参数修改成功" >> $LOG_FILE
fi
# 2. 设置用户进程和文件句柄限制
echo -e "${YELLOW}设置系统资源限制...${NC}"
LIMIT_CONF="/etc/security/limits.conf"
if ! grep -q "soft nproc 65535" $LIMIT_CONF; then
cat >> $LIMIT_CONF << 'EOF'
* soft nproc 65535
* hard nproc 65535
* soft nofile 81920
* hard nofile 81920
EOF
fi
if ! ulimit -u 65535 -Hu 65535 -n 81920 -Hn 81920; then
echo -e "${YELLOW}临时资源限制设置失败,但已写入配置文件,重启后生效${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [WARNING] ulimit设置失败" >> $LOG_FILE
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 系统资源限制设置成功" >> $LOG_FILE
fi
# 3. 安装依赖包
echo -e "${YELLOW}安装MongoDB依赖包...${NC}"
if ! yum -y install libcurl openssl xz-libs; then
echo -e "${RED}依赖包安装失败,请检查网络连接或系统环境!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 依赖包安装失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 依赖包安装成功" >> $LOG_FILE
fi
# 4. 下载MongoDB安装包
echo -e "${YELLOW}下载MongoDB安装包...${NC}"
DOWNLOAD_URL="https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.14.tgz"
INSTALL_PACKAGE="mongodb-linux-x86_64-rhel70-7.0.14.tgz"
# 检查安装包是否已存在,不存在则下载
if [ ! -f "$INSTALL_PACKAGE" ]; then
if ! wget $DOWNLOAD_URL -O $INSTALL_PACKAGE; then
echo -e "${RED}下载MongoDB安装包失败,请手动下载后放置于当前目录!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] MongoDB安装包下载失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB安装包下载成功" >> $LOG_FILE
fi
else
echo -e "${GREEN}安装包已存在,跳过下载...${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB安装包已存在" >> $LOG_FILE
fi
# 5. 解压并安装MongoDB
echo -e "${YELLOW}解压并安装MongoDB...${NC}"
if ! tar xvf $INSTALL_PACKAGE; then
echo -e "${RED}解压安装包失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 解压MongoDB安装包失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB安装包解压成功" >> $LOG_FILE
fi
MONGODB_DIR="mongodb-linux-x86_64-rhel70-7.0.14"
TARGET_DIR="/usr/local/mongodb-7.0.14"
if [ -d "$TARGET_DIR" ]; then
echo -e "${YELLOW}目标目录已存在,将其备份...${NC}"
mv "$TARGET_DIR" "${TARGET_DIR}_$(date +%Y%m%d%H%M%S)"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 已备份原有MongoDB目录" >> $LOG_FILE
fi
if ! mv "$MONGODB_DIR" "$TARGET_DIR"; then
echo -e "${RED}移动安装目录失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 移动MongoDB目录失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB目录移动成功" >> $LOG_FILE
fi
# 创建软链接
if ! ln -sf "$TARGET_DIR" "/usr/local/mongodb"; then
echo -e "${RED}创建软链接失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 创建MongoDB软链接失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB软链接创建成功" >> $LOG_FILE
fi
# 6. 创建配置目录
if ! mkdir -p /usr/local/mongodb/etc; then
echo -e "${RED}创建配置目录失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 创建MongoDB配置目录失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB配置目录创建成功" >> $LOG_FILE
fi
# 7. 配置mongod.conf文件
echo -e "${YELLOW}配置MongoDB参数文件...${NC}"
CONF_FILE="/usr/local/mongodb/etc/mongod.conf"
# 写入配置内容
cat > "$CONF_FILE" << 'EOF'
systemLog:
destination: file
logAppend: true
quiet: true
path: /usr/local/mongodb/logs/mongodb.log
storage:
dbPath: /data/mongodb
processManagement:
fork: true
pidFilePath: /usr/local/mongodb/logs/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017
bindIp: 0.0.0.0
security:
authorization: enabled
EOF
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB配置文件创建成功" >> $LOG_FILE
# 8. 创建数据和日志目录
echo -e "${YELLOW}创建数据和日志目录...${NC}"
if ! mkdir -pv /data/mongodb /usr/local/mongodb/logs; then
echo -e "${RED}创建目录失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 创建MongoDB数据或日志目录失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB数据和日志目录创建成功" >> $LOG_FILE
fi
# 9. 创建MongoDB用户
echo -e "${YELLOW}创建MongoDB用户和授权...${NC}"
if ! useradd -s /bin/false -M mongod; then
echo -e "${YELLOW}MongoDB用户已存在,跳过创建...${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB用户已存在" >> $LOG_FILE
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB用户创建成功" >> $LOG_FILE
fi
# 设置目录权限
if ! chown -R mongod:mongod /usr/local/mongodb*; then
echo -e "${RED}目录权限设置失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 设置MongoDB目录权限失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB目录权限设置成功" >> $LOG_FILE
fi
if ! chown -R mongod:mongod /data/mongodb/; then
echo -e "${RED}数据目录权限设置失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 设置MongoDB数据目录权限失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB数据目录权限设置成功" >> $LOG_FILE
fi
# 10. 配置systemd服务
echo -e "${YELLOW}配置MongoDB开机自启动...${NC}"
SERVICE_FILE="/usr/lib/systemd/system/mongod.service"
cat > "$SERVICE_FILE" << 'EOF'
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
User=mongod
Group=mongod
Environment="OPTIONS=-f /usr/local/mongodb/etc/mongod.conf"
ExecStart=/usr/local/mongodb/bin/mongod $OPTIONS
ExecStop=/usr/local/mongodb/bin/mongod --shutdown $OPTIONS
RuntimeDirectory=mongodb
LimitFSIZE=infinity
LimitCPU=infinity
LimitAS=infinity
LimitNOFILE=64000
LimitNPROC=64000
LimitMEMLOCK=infinity
TasksMax=infinity
TasksAccounting=false
[Install]
WantedBy=multi-user.target
EOF
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB systemd服务配置成功" >> $LOG_FILE
# 11. 启动MongoDB服务
echo -e "${YELLOW}启动MongoDB服务...${NC}"
if ! systemctl daemon-reload; then
echo -e "${RED}系统服务重载失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] systemctl daemon-reload失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] systemctl daemon-reload成功" >> $LOG_FILE
fi
# 检查端口占用
if netstat -tulpn | grep -q :27017; then
echo -e "${RED}错误:端口27017已被占用!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 端口27017被占用" >> $LOG_FILE
netstat -tulpn | grep :27017 >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 端口27017可用" >> $LOG_FILE
fi
# 尝试启动服务
if ! systemctl start mongod.service; then
echo -e "${RED}启动MongoDB服务失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 启动MongoDB服务失败" >> $LOG_FILE
# 收集错误信息
echo -e "\n===== systemctl status mongod.service =====" >> $LOG_FILE
systemctl status mongod.service >> $LOG_FILE 2>&1
echo -e "\n===== journalctl -xe | grep -i mongodb =====" >> $LOG_FILE
journalctl -xe | grep -i mongodb >> $LOG_FILE 2>&1
echo -e "\n===== MongoDB日志文件 =====" >> $LOG_FILE
if [ -f "/usr/local/mongodb/logs/mongodb.log" ]; then
tail -n 20 /usr/local/mongodb/logs/mongodb.log >> $LOG_FILE 2>&1
else
echo "MongoDB日志文件不存在" >> $LOG_FILE
fi
# 提供错误排查建议
echo -e "${YELLOW}错误排查建议:${NC}"
echo -e "1. 查看详细错误信息:${GREEN}systemctl status mongod.service${NC}"
echo -e "2. 查看MongoDB日志:${GREEN}cat /usr/local/mongodb/logs/mongodb.log${NC}"
echo -e "3. 检查配置文件:${GREEN}cat /usr/local/mongodb/etc/mongod.conf${NC}"
echo -e "4. 检查目录权限:${GREEN}ls -ld /data/mongodb /usr/local/mongodb/logs${NC}"
exit 1
else
echo -e "${GREEN}MongoDB服务启动成功!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB服务启动成功" >> $LOG_FILE
# 设置开机自启
if ! systemctl enable mongod.service; then
echo -e "${YELLOW}设置开机自启失败,但MongoDB已正常启动${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [WARNING] 设置MongoDB开机自启失败" >> $LOG_FILE
else
echo -e "${GREEN}MongoDB已设置为开机自启!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB开机自启设置成功" >> $LOG_FILE
fi
fi
# 12. 安装MongoSH工具
echo -e "${YELLOW}安装MongoDB交互式Shell工具(mongosh)...${NC}"
MONGOSH_PACKAGE="mongosh-2.3.1-linux-x64.tgz"
MONGOSH_URL="https://downloads.mongodb.com/compass/$MONGOSH_PACKAGE"
# 创建MongoSH目录
mkdir -p /usr/local/mongosh
# 下载并安装MongoSH
if [ ! -f "$MONGOSH_PACKAGE" ]; then
if ! wget $MONGOSH_URL -O $MONGOSH_PACKAGE; then
echo -e "${RED}下载MongoSH失败!请检查网络连接或手动下载后重试。${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 下载MongoSH失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoSH下载成功" >> $LOG_FILE
fi
fi
if ! tar xvf $MONGOSH_PACKAGE -C /usr/local/mongosh --strip-components=1; then
echo -e "${RED}解压MongoSH失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 解压MongoSH失败" >> $LOG_FILE
exit 1
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoSH解压成功" >> $LOG_FILE
fi
# 创建软链接到系统路径
if ! ln -sf /usr/local/mongosh/bin/mongosh /usr/bin/mongosh; then
echo -e "${RED}创建mongosh软链接失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 创建MongoSH软链接失败" >> $LOG_FILE
exit 1
else
echo -e "${GREEN}MongoSH安装成功!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoSH安装成功" >> $LOG_FILE
fi
# 13. 创建超级管理员账号
echo -e "${YELLOW}创建MongoDB超级管理员账号...${NC}"
echo -e "${YELLOW}请设置管理员密码(输入时不会显示):${NC}"
read -s ADMIN_PASSWORD
echo ""
if [ -z "$ADMIN_PASSWORD" ]; then
ADMIN_PASSWORD="default@123"
echo -e "${YELLOW}未输入密码,使用默认密码: $ADMIN_PASSWORD${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [WARNING] 使用默认管理员密码" >> $LOG_FILE
else
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 自定义管理员密码设置成功" >> $LOG_FILE
fi
# 使用mongosh创建管理员账号
echo -e "${YELLOW}正在创建管理员账号...${NC}"
if ! mongosh --host localhost --port 27017 << EOF
use admin
db.createUser({user: "root", pwd: "$ADMIN_PASSWORD", roles: ["root"]})
exit
EOF
then
echo -e "${RED}创建管理员账号失败!请手动创建。${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 创建MongoDB管理员账号失败" >> $LOG_FILE
# 提供手动创建命令
echo -e "${YELLOW}手动创建命令:${NC}"
echo -e "mongosh --host localhost --port 27017"
echo -e "use admin"
echo -e "db.createUser({user: \"root\", pwd: \"你的密码\", roles: [\"root\"]})"
else
echo -e "${GREEN}超级管理员账号创建成功!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB管理员账号创建成功" >> $LOG_FILE
fi
# 14. 配置环境变量
echo -e "${YELLOW}配置MongoDB环境变量...${NC}"
ENV_SCRIPT="/etc/profile.d/mongodb.sh"
echo "export PATH=/usr/local/mongodb/bin:/usr/local/mongosh/bin:\$PATH" > "$ENV_SCRIPT" || {
echo -e "${RED}环境变量配置失败!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 配置MongoDB环境变量失败" >> $LOG_FILE
exit 1
}
if ! source /etc/profile; then
echo -e "${YELLOW}环境变量刷新失败,请手动执行 source /etc/profile${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [WARNING] 刷新MongoDB环境变量失败" >> $LOG_FILE
else
echo -e "${GREEN}环境变量配置成功!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB环境变量配置成功" >> $LOG_FILE
fi
# 15. 验证安装
echo -e "${YELLOW}验证MongoDB安装...${NC}"
if ! mongosh --host localhost --port 27017 -u root -p <<< "$ADMIN_PASSWORD" --eval "db.version()" &> /dev/null; then
echo -e "${RED}MongoDB连接失败!请检查服务状态和密码。${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] MongoDB连接验证失败" >> $LOG_FILE
else
echo -e "${GREEN}MongoDB安装验证成功!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB连接验证成功" >> $LOG_FILE
fi
echo -e "${GREEN}MongoDB安装完成!${NC}"
echo -e "${YELLOW}管理员账号: root${NC}"
echo -e "${YELLOW}管理员密码: $ADMIN_PASSWORD${NC}"
echo -e "${YELLOW}登录命令:${NC}"
echo -e " mongosh --host localhost --port 27017 -u root -p"
echo -e "${YELLOW}安装日志位置:${NC}"
echo -e " $LOG_FILE"
echo -e "${YELLOW}常用操作命令请参考文档:${NC}"
echo -e " https://docs.mongodb.com/manual/reference/command/"
echo -e "${GREEN}MongoDB安装脚本执行完毕!${NC}"
echo -e "$(date '+%Y-%m-%d %H:%M:%S') [INFO] MongoDB安装脚本执行完毕" >> $LOG_FILE
