以下是 MongoDB 自动化脚本安装方案,安装方式:
本文提供五个脚本 安装脚本 状态检查脚本 服务管理脚本 独立用户账号生成脚本 生成集合案例脚本 ;无法直接添加附件
MongoDB 一键安装脚本
脚本功能:
✅ 支持 MongoDB 6.0 版本选择
✅ 官方仓库和发行版仓库安装
✅ 自动安全配置和认证
✅ 性能优化配置
✅ 备份和监控脚本
完整安装脚本
1.安装后可以直接;
2.已修复重启服务器,/var/run/mongodb/mongod.pid丢失无法启动问题;
3.包含账号密码生成 默认未开启认证,需要可自行开启或运行独立脚本(账号生成);
#!/bin/bash
# MongoDB 自动化安装脚本
# 支持 Ubuntu, CentOS, RHEL, Debian 等主流 Linux 发行版
set -e
# 配置参数
MONGO_VERSION="${1:-"6.0"}" # MongoDB 版本
MONGO_PORT="${2:-"27017"}" # 服务端口
# MONGO_BIND_IP="${3:-"127.0.0.1"}" # 绑定IP地址
MONGO_BIND_IP="${3:-"0.0.0.0"}" # 绑定IP地址
DATA_DIR="${4:-"/var/lib/mongodb"}" # 数据目录
LOG_DIR="${5:-"/var/log/mongodb"}" # 日志目录
CONFIG_DIR="${6:-"/etc"}" # 配置目录
ADMIN_USER="${7:-"admin"}" # 新增:管理员用户名
ADMIN_PASSWORD="${8:-"admin123"}" # 新增:管理员密码
ENABLE_AUTH="${9:-"no"}" # 新增:是否启用认证
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 日志函数
log_info() {echo -e "${GREEN}[信息]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_warn() {echo -e "${YELLOW}[警告]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_error() {echo -e "${RED}[错误]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_step() {echo -e "${BLUE}[步骤]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
# 显示使用说明
usage() {echo "使用方法: $0 [版本] [端口] [绑定IP] [数据目录] [日志目录] [配置目录]"echo "示例: $0 6.0 27017 0.0.0.0 /data/mongodb /var/log/mongodb /etc"echo "默认值: $0 6.0 27017 127.0.0.1 /var/lib/mongodb /var/log/mongodb /etc"exit 1
}
# 显示横幅
show_banner() {cat << "EOF"__ __ ____ ____/ / / /___ ____ ____ _/ __ \ / __ )/ /_/ / __ \/ __ \/ __ `/ / / // __ |/ __ / /_/ / / / / /_/ / /_/ // /_/ /
/_/ /_/\____/_/ /_/\__, /_____//_____//____/MongoDB 自动化安装脚本
EOF
}
# 检查 root 权限
check_root() {if [[ $EUID -ne 0 ]]; thenlog_error "此脚本必须以 root 权限运行"exit 1filog_info "权限检查通过"
}
# 检测操作系统
detect_os() {log_step "检测操作系统..."if [[ -f /etc/os-release ]]; thensource /etc/os-releaseOS=$IDOS_VERSION=$VERSION_IDlog_info "检测到操作系统: $NAME $VERSION"elif [[ -f /etc/redhat-release ]]; thenOS="centos"OS_VERSION=$(cat /etc/redhat-release | sed 's/.*release \([0-9]\).*/\1/')log_info "检测到操作系统: CentOS $OS_VERSION"elselog_error "无法检测操作系统类型"exit 1fi# 检查架构ARCH=$(uname -m)case $ARCH inx86_64)log_info "系统架构: x86_64";;aarch64)log_info "系统架构: ARM64";;*)log_error "不支持的架构: $ARCH"exit 1;;esac
}
# 安装系统依赖
install_dependencies() {log_step "安装系统依赖包..."case $OS inubuntu|debian)apt-get updateapt-get install -y wget gnupg curl apt-transport-https ca-certificates \software-properties-common lsb-release;;centos|rhel|fedora)yum install -y wget curl epel-release;;*)log_error "不支持的操作系统: $OS"exit 1;;esaclog_info "系统依赖安装完成"
}
# 配置 MongoDB 仓库
setup_repository() {log_step "配置 MongoDB 官方仓库..."case $OS inubuntu|debian)# 导入 MongoDB GPG 密钥wget -qO - https://www.mongodb.org/static/pgp/server-${MONGO_VERSION}.asc | apt-key add -# 添加仓库echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/${MONGO_VERSION} multiverse" | \tee /etc/apt/sources.list.d/mongodb-org-${MONGO_VERSION}.listapt-get update;;centos|rhel)# 创建仓库文件cat > /etc/yum.repos.d/mongodb-org-${MONGO_VERSION}.repo << EOF
[mongodb-org-${MONGO_VERSION}]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/${MONGO_VERSION}/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-${MONGO_VERSION}.asc
EOF;;fedora)cat > /etc/yum.repos.d/mongodb-org-${MONGO_VERSION}.repo << EOF
[mongodb-org-${MONGO_VERSION}]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/fedora/\$releasever/mongodb-org/${MONGO_VERSION}/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-${MONGO_VERSION}.asc
EOF;;esaclog_info "MongoDB 仓库配置完成"
}
# 安装 MongoDB
install_mongodb() {log_step "安装 MongoDB 版本 $MONGO_VERSION..."case $OS inubuntu|debian)apt-get install -y mongodb-org;;centos|rhel|fedora)yum install -y mongodb-org;;esac# 锁定版本,防止意外升级case $OS inubuntu|debian)echo "mongodb-org hold" | dpkg --set-selectionsecho "mongodb-org-server hold" | dpkg --set-selectionsecho "mongodb-org-shell hold" | dpkg --set-selectionsecho "mongodb-org-mongos hold" | dpkg --set-selectionsecho "mongodb-org-tools hold" | dpkg --set-selections;;centos|rhel|fedora)echo "exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools" >> /etc/yum.conf;;esaclog_info "MongoDB 安装完成"
}
# 创建目录结构
create_directories() {log_step "创建 MongoDB 目录结构..."# 创建必要目录mkdir -p $DATA_DIRmkdir -p $LOG_DIRmkdir -p $(dirname $CONFIG_DIR/mongod.conf)# 创建 MongoDB 用户和组if ! id "mongodb" &>/dev/null; thenuseradd -r -s /bin/false -d $DATA_DIR -M mongodblog_info "创建 MongoDB 系统用户"fi# 设置目录权限chown -R mongodb:mongodb $DATA_DIRchown -R mongodb:mongodb $LOG_DIRchmod 755 $DATA_DIRchmod 755 $LOG_DIRlog_info "目录结构创建完成:"log_info " 数据目录: $DATA_DIR"log_info " 日志目录: $LOG_DIR"
}
# 生成 MongoDB 配置文件
create_config() {log_step "生成 MongoDB 配置文件..."local config_file="$CONFIG_DIR/mongod.conf"# 计算推荐的内存配置 (系统的 50%,最大 2GB)local total_mem=$(grep MemTotal /proc/meminfo | awk '{print $2}')local cache_size_gb=$(echo "scale=1; ($total_mem / 1024 / 1024 * 0.5)" | bc | awk '{if($1>2) print 2; else if($1<0.5) print 0.5; else print $1}')cat > $config_file << EOF
# MongoDB 配置文件
# 生成时间: $(date)
# 系统日志配置
systemLog:destination: filelogAppend: truepath: $LOG_DIR/mongod.loglogRotate: reopentimeStampFormat: iso8601-local
# 存储配置
storage:dbPath: $DATA_DIRjournal:enabled: truewiredTiger:engineConfig:cacheSizeGB: $cache_size_gbjournalCompressor: snappycollectionConfig:blockCompressor: snappyindexConfig:prefixCompression: true
# 网络配置
net:port: $MONGO_PORTbindIp: $MONGO_BIND_IPmaxIncomingConnections: 1000wireObjectCheck: trueipv6: false
# 进程管理
processManagement:fork: falsepidFilePath: /var/run/mongodb/mongod.pidtimeZoneInfo: /usr/share/zoneinfo
# 安全配置 (初始安装后请启用)
security:authorization: disabledjavascriptEnabled: true
# 操作分析配置
operationProfiling:mode: slowOpslowOpThresholdMs: 100slowOpSampleRate: 1.0
# 复制集配置 (可选)
#replication:
# replSetName: rs0
# 分片配置 (可选)
#sharding:
# clusterRole: configsvr|shardsvr
# 审计日志配置 (可选)
#auditLog:
# destination: file
# format: JSON
# path: $LOG_DIR/audit.log
# SNMP 配置 (可选)
#snmp:
# disabled: false
# subagent: true
EOFchown mongodb:mongodb $config_filechmod 644 $config_filelog_info "配置文件生成完成: $config_file"log_info " 绑定地址: $MONGO_BIND_IP"log_info " 服务端口: $MONGO_PORT"log_info " 缓存大小: ${cache_size_gb}GB"
}
# 创建 systemd 服务文件
create_systemd_service() {log_step "创建 systemd 服务配置..."local service_file="/etc/systemd/system/mongod.service"cat > $service_file << EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target
Wants=network.target
[Service]
Type=simple
User=mongodb
Group=mongodb
Environment="OPTIONS=-f $CONFIG_DIR/mongod.conf"
ExecStart=/usr/bin/mongod \$OPTIONS
ExecReload=/bin/kill -HUP \$MAINPID
Restart=always
RestartSec=10
StartLimitInterval=60
StartLimitBurst=5
SuccessExitStatus=143
TimeoutStopSec=60
# 确保 PID 目录在启动前创建
ExecStartPre=/bin/mkdir -p /var/run/mongodb
ExecStartPre=/bin/chown mongodb:mongodb /var/run/mongodb
ExecStartPre=/bin/chmod 755 /var/run/mongodb
# 安全配置
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=$DATA_DIR $LOG_DIR
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reloadlog_info "Systemd 服务配置完成"
}
# 配置防火墙
configure_firewall() {log_step "配置防火墙规则..."if command -v ufw >/dev/null 2>&1; then# Ubuntu UFWufw allow $MONGO_PORT/tcp comment "MongoDB Service"log_info "UFW 防火墙已配置,端口 $MONGO_PORT 已开放"elif command -v firewall-cmd >/dev/null 2>&1; then# CentOS FirewallDif systemctl is-active --quiet firewalld; thenfirewall-cmd --permanent --add-port=$MONGO_PORT/tcpfirewall-cmd --reloadlog_info "FirewallD 已配置,端口 $MONGO_PORT 已开放"fielif command -v iptables >/dev/null 2>&1; then# iptablesiptables -I INPUT -p tcp --dport $MONGO_PORT -j ACCEPTlog_info "iptables 已配置,端口 $MONGO_PORT 已开放"elselog_warn "未检测到防火墙工具,请手动开放端口 $MONGO_PORT"fi
}
# 优化系统配置
optimize_system() {log_step "优化系统配置..."# 禁用透明大页if [[ -f /sys/kernel/mm/transparent_hugepage/enabled ]]; thenecho never > /sys/kernel/mm/transparent_hugepage/enabledecho never > /sys/kernel/mm/transparent_hugepage/defragfi# 配置系统限制if ! grep -q "mongodb" /etc/security/limits.conf; thencat >> /etc/security/limits.conf << EOF
# MongoDB 系统限制
mongodb soft nproc 64000
mongodb hard nproc 64000
mongodb soft nofile 64000
mongodb hard nofile 64000
mongodb soft nice -20
mongodb hard nice -20
EOFfi# 配置系统服务限制mkdir -p /etc/systemd/system/mongod.service.d/cat > /etc/systemd/system/mongod.service.d/limits.conf << EOF
[Service]
LimitNOFILE=64000
LimitNPROC=64000
LimitMEMLOCK=infinity
EOFsystemctl daemon-reloadlog_info "系统优化完成"
}
# 修复 systemd 服务冲突
fix_service_conflict() {log_step "检查并修复 systemd 服务冲突..."# 检查是否存在服务文件冲突local service_files=("/etc/systemd/system/mongod.service""/usr/lib/systemd/system/mongod.service""/lib/systemd/system/mongod.service")local symlink_locations=("/etc/systemd/system/multi-user.target.wants/mongod.service")# 备份并移除冲突的符号链接for link in "${symlink_locations[@]}"; doif [[ -L "$link" ]]; thenlog_warn "发现冲突的符号链接: $link"cp "$link" "${link}.backup.$(date +%Y%m%d_%H%M%S)" 2>/dev/null || truerm -f "$link"log_info "已移除符号链接: $link"fidone# 重新加载 systemdsystemctl daemon-reloadlog_info "systemd 配置已重新加载"
}
# 启动 MongoDB 服务
start_mongodb() {log_step "启动 MongoDB 服务..."# 先修复服务冲突fix_service_conflict# 创建 PID 文件目录mkdir -p /var/run/mongodbchown mongodb:mongodb /var/run/mongodb# 启动服务systemctl start mongod# 检查服务状态local max_retries=30local count=0while [ $count -lt $max_retries ]; doif systemctl is-active --quiet mongod; thenlog_info "MongoDB 服务启动成功"breakfisleep 2count=$((count + 1))doneif [ $count -eq $max_retries ]; thenlog_error "MongoDB 服务启动失败,请检查日志: $LOG_DIR/mongod.log"journalctl -u mongod --no-pager -lexit 1fi# 启用开机自启systemctl enable mongodlog_info "MongoDB 开机自启已启用"
}
# 验证安装
verify_installation() {log_step "验证 MongoDB 安装..."# 检查服务状态if systemctl is-active --quiet mongod; thenlog_info "✓ MongoDB 服务运行正常"elselog_error "✗ MongoDB 服务未运行"return 1fi# 检查端口监听if netstat -tlnp | grep -q ":$MONGO_PORT "; thenlog_info "✓ MongoDB 端口 $MONGO_PORT 监听正常"elselog_error "✗ MongoDB 端口 $MONGO_PORT 未监听"return 1fi# 测试连接if command -v mongosh >/dev/null 2>&1; thenif mongosh --port $MONGO_PORT --eval "db.version()" --quiet >/dev/null 2>&1; thenlog_info "✓ MongoDB 连接测试成功"elselog_error "✗ MongoDB 连接测试失败"return 1fielseif mongo --port $MONGO_PORT --eval "db.version()" --quiet >/dev/null 2>&1; thenlog_info "✓ MongoDB 连接测试成功"elselog_error "✗ MongoDB 连接测试失败"return 1fifilog_info "MongoDB 安装验证完成"return 0
}
# 创建管理员用户
create_admin_user() {log_step "创建管理员用户..."local admin_user="${1:-"admin"}"local admin_password="${2:-"admin123"}"# 等待 MongoDB 完全启动sleep 5# 创建管理员用户if command -v mongosh >/dev/null 2>&1; thenmongosh --port $MONGO_PORT --eval "db = db.getSiblingDB('admin');db.createUser({user: '$admin_user',pwd: '$admin_password',roles: [{ role: 'root', db: 'admin' },{ role: 'userAdminAnyDatabase', db: 'admin' },{ role: 'readWriteAnyDatabase', db: 'admin' }]});" > /dev/null 2>&1if [ $? -eq 0 ]; thenlog_info "管理员用户创建成功"log_info "用户名: $admin_user"log_info "密码: $admin_password"elselog_warn "管理员用户创建失败,可能已存在"fielselog_warn "未找到 mongosh 命令,跳过用户创建"fi
}
# 启用安全认证
enable_security() {log_step "启用安全认证..."local config_file="$CONFIG_DIR/mongod.conf"# 备份原配置cp $config_file "${config_file}.backup.$(date +%Y%m%d_%H%M%S)"# 启用认证sed -i 's/authorization: disabled/authorization: enabled/' $config_file# 重启服务使配置生效systemctl restart mongodlog_info "安全认证已启用,现在需要用户名密码连接"
}
# 显示安装摘要
show_summary() {log_step "=== 显示MongoDB 安装摘要 ==="log_info "版本: MongoDB $MONGO_VERSION"log_info "数据目录: $DATA_DIR"log_info "日志目录: $LOG_DIR"log_info "配置文件: $CONFIG_DIR/mongod.conf"log_info "服务端口: $MONGO_PORT"log_info "绑定地址: $MONGO_BIND_IP"log_info "服务状态: $(systemctl is-active mongod)"log_info "服务管理: systemctl {start|stop|restart|status} mongod"log_info "日志文件: $LOG_DIR/mongod.log"log_info "连接命令: mongosh --port $MONGO_PORT"log_step "========================="
}
# 显示账号密码摘要
show_userpwd() {log_step "=== 显示MongoDB 创建账号密码信息 ==="log_info "MongoDB版本: $MONGO_VERSION"log_info " 监听端口: $MONGO_PORT"log_info " 服务绑定IP: $MONGO_BIND_IP"log_info " 管理员账号: $ADMIN_USER"log_info " 管理员密码: $ADMIN_PASSWORD"#log_info "连接命令: mongosh --port $MONGO_PORT"#log_info "连接命令: mysql -h 127.0.0.1 -P $MYSQL_PORT -u root -p$MYSQL_ROOT_PASSWORD"log_step "========================="
}
# 主安装流程
main() {show_bannercheck_rootdetect_oslog_step "开始安装 MongoDB..."log_info "安装参数:"log_info " 版本: $MONGO_VERSION"log_info " 端口: $MONGO_PORT"log_info " 绑定IP: $MONGO_BIND_IP"log_info " 数据目录: $DATA_DIR"# 执行安装步骤install_dependenciessetup_repositoryinstall_mongodbcreate_directoriescreate_configcreate_systemd_serviceconfigure_firewalloptimize_systemstart_mongodb# 验证安装if verify_installation; thenlog_info " MongoDB 安装成功完成!"show_summaryelselog_error "MongoDB 安装过程中出现问题"exit 1fi# 创建登录用户和登录密码 若需要修改顶部变量ENABLE_AUTH值为yes,默认是no 不执行# create_admin_user() # 创建管理员用户 enable_security() # 启用安全认证if [[ "$ENABLE_AUTH" == "yes" ]]; thenlog_info "MongoDB 是否启用认证: $ENABLE_AUTH"create_admin_user "$ADMIN_USER" "$ADMIN_PASSWORD"enable_securityshow_userpwdfiif [[ "$ENABLE_AUTH" == "no" ]]; thenlog_info "MongoDB 是否启用认证: $ENABLE_AUTH (未启用认证状态)"fi
}
# 信号处理
trap 'log_error "安装过程被中断"; exit 1' INT TERM
# 脚本入口
if [[ $# -gt 0 && ($1 == "-h" || $1 == "--help") ]]; thenusage
fi
main
安装执行过程
过程太长 贴部分片段


账号生成脚本
完整安装脚本中已经包含了 账号密码生成功能, 默认是不启用的,如何安装时需要生成开启即可;
本脚本是独立运行的脚本 ;
#!/bin/bash
# create-mongodb-user.sh - MongoDB 用户创建脚本
set -e
# 默认配置
MONGO_PORT=${1:-"27017"}
ADMIN_USER=${2:-"admin"}
ADMIN_PASSWORD=${3:-"admin123"}
ENABLE_AUTH=${4:-"yes"}
# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[信息]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[警告]${NC} $1"; }
log_error() { echo -e "${RED}[错误]${NC} $1"; }
create_mongodb_user() {log_info "开始创建 MongoDB 用户..."# 检查 MongoDB 是否运行if ! systemctl is-active mongod >/dev/null 2>&1; thenlog_error "MongoDB 服务未运行"return 1fi# 创建用户log_info "创建管理员用户: $ADMIN_USER"if command -v mongosh >/dev/null 2>&1; thenmongosh --port $MONGO_PORT --eval "db = db.getSiblingDB('admin');try {db.createUser({user: '$ADMIN_USER',pwd: '$ADMIN_PASSWORD',roles: [{ role: 'root', db: 'admin' },{ role: 'userAdminAnyDatabase', db: 'admin' },{ role: 'readWriteAnyDatabase', db: 'admin' },{ role: 'dbAdminAnyDatabase', db: 'admin' },{ role: 'clusterAdmin', db: 'admin' }]});print('用户创建成功');} catch (e) {if (e.codeName === 'DuplicateKey') {print('用户已存在,跳过创建');} else {throw e;}}" --quietlog_info "用户创建完成"elselog_error "未找到 mongosh 命令"return 1fi# 启用认证(如果要求)if [[ "$ENABLE_AUTH" == "yes" ]]; thenenable_mongodb_authfilog_info " MongoDB 用户配置完成!"echolog_info "连接信息:"log_info " 用户名: $ADMIN_USER"log_info " 密码: $ADMIN_PASSWORD"log_info " 端口: $MONGO_PORT"log_info " 连接命令: mongosh -u $ADMIN_USER -p --authenticationDatabase admin --port $MONGO_PORT"
}
enable_mongodb_auth() {log_info "启用 MongoDB 安全认证..."local config_file="/etc/mongod.conf"if [[ ! -f "$config_file" ]]; thenlog_error "配置文件不存在: $config_file"return 1fi# 备份配置cp "$config_file" "${config_file}.backup.$(date +%Y%m%d_%H%M%S)"# 启用认证if grep -q "authorization: disabled" "$config_file"; thensed -i 's/authorization: disabled/authorization: enabled/' "$config_file"log_info "已启用安全认证"elif grep -q "authorization: enabled" "$config_file"; thenlog_info "安全认证已启用"else# 如果不存在 authorization 配置,则添加if grep -q "security:" "$config_file"; thensed -i '/security:/a\ authorization: enabled' "$config_file"elseecho -e "\nsecurity:\n authorization: enabled" >> "$config_file"filog_info "已添加安全认证配置"fi# 重启服务systemctl restart mongodsleep 3if systemctl is-active mongod >/dev/null 2>&1; thenlog_info "MongoDB 服务重启成功,安全认证已生效"elselog_error "MongoDB 服务重启失败"return 1fi
}
# 显示使用说明
usage() {echo "使用方法: $0 [端口] [用户名] [密码] [是否启用认证]"echo "示例: $0 27017 admin admin123 yes"echo "默认: $0 27017 admin admin123 yes"exit 1
}
# 主函数
main() {if [[ $# -gt 0 && ($1 == "-h" || $1 == "--help") ]]; thenusageficreate_mongodb_user
}
main "$@"
生成库表案例
MongoDB 初次登录时空的,为了丰满起来 看着友好点 下面生成一些集合数据 。
#!/bin/bash
# init-mongodb-complete-fixed.sh
set -e
MONGO_PORT=${1:-"27017"}
GREEN='\033[0;32m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[信息]${NC} $1"; }
log_step() { echo -e "${BLUE}[步骤]${NC} $1"; }
log_error() { echo -e "${RED}[错误]${NC} $1"; }
create_sample_databases() {log_step "创建示例数据库和集合..."mongosh --port $MONGO_PORT --eval "// =============================================// MongoDB 完整示例数据库初始化// =============================================print('=== 开始创建示例数据库 ===');// 1. 创建电商数据库print('1. 创建电商数据库...');db = db.getSiblingDB('ecommerce');// 用户集合db.customers.insertMany([{customer_id: 'C001',name: '张三',email: 'zhangsan@email.com',phone: '13800138001',address: {city: '北京',district: '海淀区',street: '中关村大街1号'},registration_date: new Date('2023-01-15'),status: 'active'},{customer_id: 'C002',name: '李四',email: 'lisi@email.com',phone: '13900139001',address: {city: '上海',district: '浦东新区',street: '陆家嘴路100号'},registration_date: new Date('2023-02-20'),status: 'active'},{customer_id: 'C003',name: '王五',email: 'wangwu@email.com',phone: '13700137001',address: {city: '深圳',district: '南山区',street: '科技园路200号'},registration_date: new Date('2023-03-10'),status: 'inactive'}]);// 产品集合db.products.insertMany([{product_id: 'P001',name: 'iPhone 15 Pro',category: 'electronics',price: 7999,stock: 50,attributes: {brand: 'Apple',color: '黑色',storage: '128GB'},tags: ['手机', '苹果', '智能手机'],created_at: new Date()},{product_id: 'P002',name: 'MacBook Air',category: 'electronics',price: 8999,stock: 30,attributes: {brand: 'Apple',screen: '13.6英寸',memory: '8GB',storage: '256GB'},tags: ['笔记本', '苹果', '电脑'],created_at: new Date()},{product_id: 'P003',name: '咖啡机',category: 'home_appliances',price: 1299,stock: 100,attributes: {brand: 'Philips',color: '白色',capacity: '1.5L'},tags: ['家电', '咖啡', '厨房'],created_at: new Date()}]);// 订单集合db.orders.insertMany([{order_id: 'ORD001',customer_id: 'C001',customer_name: '张三',items: [{product_id: 'P001',product_name: 'iPhone 15 Pro',quantity: 1,price: 7999}],total_amount: 7999,status: 'completed',order_date: new Date('2024-01-15'),shipping_address: {recipient: '张三',phone: '13800138001',address: '北京市海淀区中关村大街1号'}},{order_id: 'ORD002',customer_id: 'C002',customer_name: '李四',items: [{product_id: 'P002',product_name: 'MacBook Air',quantity: 1,price: 8999},{product_id: 'P003',product_name: '咖啡机',quantity: 2,price: 1299}],total_amount: 11597,status: 'shipped',order_date: new Date('2024-01-16'),shipping_address: {recipient: '李四',phone: '13900139001',address: '上海市浦东新区陆家嘴路100号'}}]);print('电商数据库创建完成 ✓');// 2. 创建博客数据库print('2. 创建博客数据库...');db = db.getSiblingDB('blog');db.users.insertMany([{username: 'admin',email: 'admin@blog.com',role: 'administrator',created_at: new Date('2023-01-01')},{username: 'author1',email: 'author1@blog.com',role: 'author',created_at: new Date('2023-02-01')}]);db.categories.insertMany([{ name: '技术', slug: 'technology', description: '技术相关文章' },{ name: '生活', slug: 'life', description: '生活相关文章' },{ name: '旅游', slug: 'travel', description: '旅游相关文章' }]);db.posts.insertMany([{title: 'MongoDB 入门指南',content: '这是 MongoDB 的入门教程...',author: 'author1',category: '技术',tags: ['mongodb', '数据库', 'nosql'],status: 'published',created_at: new Date('2024-01-10'),views: 150},{title: '如何学习编程',content: '学习编程的方法和技巧...',author: 'admin',category: '技术',tags: ['编程', '学习', '技巧'],status: 'published',created_at: new Date('2024-01-12'),views: 89},{title: '北京旅游攻略',content: '北京著名景点介绍...',author: 'author1',category: '旅游',tags: ['北京', '旅游', '景点'],status: 'draft',created_at: new Date('2024-01-14'),views: 45}]);db.comments.insertMany([{post_title: 'MongoDB 入门指南',author: '读者A',content: '很好的教程,学习了!',created_at: new Date('2024-01-11')},{post_title: '如何学习编程',author: '读者B',content: '对我很有帮助,谢谢分享',created_at: new Date('2024-01-13')}]);print('博客数据库创建完成 ✓');// 3. 创建学校管理数据库print('3. 创建学校管理数据库...');db = db.getSiblingDB('school');db.students.insertMany([{student_id: 'S001',name: '小明',age: 18,grade: '高三',class: '1班',subjects: ['数学', '物理', '英语'],contact: {phone: '13800138002',email: 'xiaoming@school.com'},enrollment_date: new Date('2022-09-01')},{student_id: 'S002',name: '小红',age: 17,grade: '高二',class: '2班',subjects: ['语文', '历史', '英语'],contact: {phone: '13900139002',email: 'xiaohong@school.com'},enrollment_date: new Date('2023-09-01')}]);db.teachers.insertMany([{teacher_id: 'T001',name: '张老师',subject: '数学',years_experience: 10,classes: ['1班', '2班']},{teacher_id: 'T002',name: '李老师',subject: '英语',years_experience: 8,classes: ['1班', '3班']}]);db.courses.insertMany([{course_id: 'MATH001',name: '高等数学',teacher: '张老师',schedule: '周一 9:00-11:00',classroom: 'A101'},{course_id: 'ENG001',name: '大学英语',teacher: '李老师',schedule: '周三 14:00-16:00',classroom: 'B205'}]);print('学校数据库创建完成 ✓');// 创建索引print('4. 创建索引...');db = db.getSiblingDB('ecommerce');db.customers.createIndex({ customer_id: 1 }, { unique: true });db.products.createIndex({ product_id: 1 }, { unique: true });db.orders.createIndex({ order_id: 1 }, { unique: true });db.products.createIndex({ category: 1 });db.orders.createIndex({ order_date: -1 });db = db.getSiblingDB('blog');db.posts.createIndex({ tags: 1 });db.posts.createIndex({ created_at: -1 });db.posts.createIndex({ category: 1 });db = db.getSiblingDB('school');db.students.createIndex({ student_id: 1 }, { unique: true });db.teachers.createIndex({ teacher_id: 1 }, { unique: true });db.courses.createIndex({ course_id: 1 }, { unique: true });print('索引创建完成 ✓');// 显示创建结果print('');print('=== 数据库创建完成 ===');print('');var databases = ['ecommerce', 'blog', 'school'];var totalCollections = 0;var totalDocuments = 0;databases.forEach(function(dbName) {var dbObj = db.getSiblingDB(dbName);print('数据库: ' + dbName);var collections = dbObj.getCollectionNames();var dbCollections = 0;var dbDocuments = 0;collections.forEach(function(coll) {if (!coll.startsWith('system.')) {var count = dbObj[coll].countDocuments();print(' ├─ ' + coll + ': ' + count + ' 个文档');dbCollections++;dbDocuments += count;}});totalCollections += dbCollections;totalDocuments += dbDocuments;print(' └─ 总计: ' + dbCollections + ' 个集合, ' + dbDocuments + ' 个文档');print('');});print('=== 总体统计 ===');print('数据库数量: ' + databases.length);print('集合总数: ' + totalCollections);print('文档总数: ' + totalDocuments);print('');print(' 示例数据已就绪,可以开始使用 MongoDB 了!');"
}
# 简单的测试脚本(推荐先用这个)
create_simple_test_data() {log_step "创建简单的测试数据..."mongosh --port $MONGO_PORT --eval "print('=== 创建简单测试数据 ===');// 使用 test 数据库db = db.getSiblingDB('test');// 创建用户集合db.users.insertMany([{ name: '张三', age: 25, city: '北京', created: new Date() },{ name: '李四', age: 30, city: '上海', created: new Date() },{ name: '王五', age: 28, city: '深圳', created: new Date() }]);// 创建产品集合db.products.insertMany([{ name: '笔记本电脑', price: 5999, category: '电子产品', stock: 50 },{ name: '智能手机', price: 3999, category: '电子产品', stock: 100 },{ name: '书籍', price: 59, category: '文化用品', stock: 200 }]);print('测试数据创建完成!');print('数据库: ' + db.getName());print('集合: ' + db.getCollectionNames().join(', '));print('用户数量: ' + db.users.countDocuments());print('产品数量: ' + db.products.countDocuments());print('');print(' 现在可以开始使用 MongoDB 了!');print('试试这些命令:');print(' show dbs');print(' use test');print(' show collections');print(' db.users.find()');print(' db.products.find({category: \\\"电子产品\\\"})');"
}
show_usage_guide() {log_step "MongoDB 使用指南:"echo ""echo "1. 连接 MongoDB:"echo " mongosh --port $MONGO_PORT"echo ""echo "2. 查看所有数据库:"echo " show dbs"echo ""echo "3. 使用数据库:"echo " use test"echo " use ecommerce"echo " use blog"echo " use school"echo ""echo "4. 查看集合:"echo " show collections"echo ""echo "5. 查询数据:"echo " db.users.find()"echo " db.products.find()"echo " db.posts.find({status: 'published'})"echo ""echo "6. 格式化输出:"echo " db.users.find().pretty()"echo ""echo "7. 条件查询:"echo " db.products.find({price: {\$gt: 5000}})"echo " db.users.find({city: '北京'})"
}
main() {log_step "MongoDB 数据库初始化"echo "端口: $MONGO_PORT"echo ""# 先创建简单的测试数据log_info "第一步:创建简单测试数据..."if create_simple_test_data; thenlog_info "简单测试数据创建成功!"echo ""# 询问是否创建完整示例数据read -p "是否创建完整示例数据库?(y/n): " -n 1 -rechoif [[ $REPLY =~ ^[Yy]$ ]]; thenlog_info "第二步:创建完整示例数据库..."if create_sample_databases; thenlog_info "完整示例数据库创建成功!"elselog_error "完整示例数据库创建失败"fifielselog_error "测试数据创建失败,请检查 MongoDB 服务状态"exit 1fiecho ""log_info " MongoDB 数据初始化完成!"echo ""show_usage_guide
}
# 如果直接运行,执行主函数
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; thenmain "$@"
fi
生成执行过程


查看生成案例

状态检查脚本
#!/bin/bash
# MongoDB 状态检查脚本
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
# 日志函数
log_info() { echo -e "${GREEN}[信息]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[警告]${NC} $1"; }
log_error() { echo -e "${RED}[错误]${NC} $1"; }
log_step() { echo -e "${BLUE}[步骤]${NC} $1"; }
log_detail() { echo -e "${CYAN}[详情]${NC} $1"; }
# 打印分隔线
print_separator() {echo "================================================================"
}
# 打印标题
print_title() {echoprint_separatorecho -e "${BLUE}$1${NC}"print_separator
}
# 检查系统信息
check_system_info() {print_title "系统信息"# OS 信息if [[ -f /etc/os-release ]]; thensource /etc/os-releaseecho -e "操作系统: ${GREEN}$NAME $VERSION${NC}"echo -e "系统架构: ${GREEN}$(uname -m)${NC}"echo -e "内核版本: ${GREEN}$(uname -r)${NC}"elseecho -e "操作系统: ${YELLOW}$(cat /etc/redhat-release 2>/dev/null || echo "未知")${NC}"fi# 系统时间echo -e "系统时间: ${GREEN}$(date)${NC}"echo -e "运行时间: ${GREEN}$(uptime -p)${NC}"# 内存使用local mem_info=$(free -h | grep Mem)echo -e "内存使用: ${GREEN}$mem_info${NC}"# 磁盘使用echo -e "根分区使用: ${GREEN}$(df -h / | tail -1)${NC}"
}
# 检查 MongoDB 服务状态
check_mongodb_service() {print_title "MongoDB 服务状态"# 检查服务是否运行if systemctl is-active mongod >/dev/null 2>&1; thenecho -e "服务状态: ${GREEN}运行中 ✓${NC}"elseecho -e "服务状态: ${RED}未运行 ✗${NC}"fi# 检查是否启用开机自启if systemctl is-enabled mongod >/dev/null 2>&1; thenecho -e "开机自启: ${GREEN}已启用 ✓${NC}"elseecho -e "开机自启: ${YELLOW}未启用 ⚠${NC}"fi# 显示详细的服务状态log_detail "详细服务状态:"systemctl status mongod --no-pager --lines=5 || true
}
# 检查 MongoDB 进程
check_mongodb_process() {print_title "MongoDB 进程信息"local mongo_pids=$(pgrep mongod || true)if [[ -n "$mongo_pids" ]]; thenecho -e "MongoDB 进程数: ${GREEN}$(echo "$mongo_pids" | wc -l)${NC}"echo -e "进程PID: ${GREEN}$mongo_pids${NC}"# 显示进程详情for pid in $mongo_pids; dolog_detail "进程 $pid 详情:"ps -p $pid -o pid,ppid,user,%cpu,%mem,cmd --no-headers 2>/dev/null || truedoneelseecho -e "MongoDB 进程: ${RED}未找到 ✗${NC}"fi
}
# 检查端口监听
check_port_listening() {print_title "网络端口监听"local default_port="27017"local port=${1:-$default_port}echo -e "检查端口: ${CYAN}$port${NC}"# 使用 netstat 检查if netstat -tlnp 2>/dev/null | grep -q ":$port "; thenecho -e "端口状态: ${GREEN}已监听 ✓${NC}"netstat -tlnp 2>/dev/null | grep ":$port " | while read line; doecho -e "监听信息: ${GREEN}$line${NC}"doneelseecho -e "端口状态: ${RED}未监听 ✗${NC}"fi# 使用 ss 检查(备选)if command -v ss >/dev/null 2>&1; thenss -tlnp | grep -q ":$port " && {echo -e "SS 检查: ${GREEN}端口 $port 正在监听${NC}"} || {echo -e "SS 检查: ${RED}端口 $port 未监听${NC}"}fi
}
# 检查 MongoDB 配置文件
check_mongodb_config() {print_title "MongoDB 配置文件"local config_files=("/etc/mongod.conf""/etc/mongodb.conf""/usr/local/etc/mongod.conf")local found_config=""for config in "${config_files[@]}"; doif [[ -f "$config" ]]; thenfound_config="$config"echo -e "配置文件: ${GREEN}$config ✓${NC}"# 显示关键配置项log_detail "关键配置信息:"grep -E "^(dbPath|port|bindIp|logpath|storage|net|security)" "$config" | head -10 | while read line; doecho -e " ${CYAN}$line${NC}"donebreakfidoneif [[ -z "$found_config" ]]; thenecho -e "配置文件: ${YELLOW}未找到默认配置文件 ⚠${NC}"fi
}
# 检查数据目录和日志
check_directories() {print_title "数据目录和日志"# 尝试从配置文件获取目录local config_file="/etc/mongod.conf"local db_path=""local log_path=""if [[ -f "$config_file" ]]; thendb_path=$(grep 'dbPath:' "$config_file" | awk '{print $2}' | head -1)log_path=$(grep 'path:' "$config_file" | awk '{print $2}' | head -1)log_path=$(dirname "$log_path" 2>/dev/null || echo "")fi# 默认目录db_path=${db_path:-"/var/lib/mongodb"}log_path=${log_path:-"/var/log/mongodb"}echo -e "数据目录: ${CYAN}$db_path${NC}"if [[ -d "$db_path" ]]; thenlocal db_size=$(du -sh "$db_path" 2>/dev/null | cut -f1 || echo "未知")echo -e " 存在: ${GREEN}是 ✓${NC}"echo -e " 大小: ${GREEN}$db_size${NC}"echo -e " 权限: ${GREEN}$(ls -ld "$db_path" | awk '{print $1 " " $3 ":" $4}')${NC}"elseecho -e " 存在: ${RED}否 ✗${NC}"fiecho -e "日志目录: ${CYAN}$log_path${NC}"if [[ -d "$log_path" ]]; thenlocal log_size=$(du -sh "$log_path" 2>/dev/null | cut -f1 || echo "未知")echo -e " 存在: ${GREEN}是 ✓${NC}"echo -e " 大小: ${GREEN}$log_size${NC}"# 检查日志文件local log_file="$log_path/mongod.log"if [[ -f "$log_file" ]]; thenecho -e " 日志文件: ${GREEN}$log_file ✓${NC}"echo -e " 日志大小: ${GREEN}$(du -h "$log_file" | cut -f1)${NC}"echo -e " 最后更新: ${GREEN}$(stat -c %y "$log_file" 2>/dev/null | cut -d. -f1 || echo "未知")${NC}"elseecho -e " 日志文件: ${YELLOW}不存在 ⚠${NC}"fielseecho -e " 存在: ${RED}否 ✗${NC}"fi
}
# 检查 MongoDB 连接
check_mongodb_connection() {print_title "MongoDB 连接测试"local port=${1:-"27017"}# 检查 mongosh 或 mongo 命令local mongo_cmd=""if command -v mongosh >/dev/null 2>&1; thenmongo_cmd="mongosh"elif command -v mongo >/dev/null 2>&1; thenmongo_cmd="mongo"fiif [[ -n "$mongo_cmd" ]]; thenecho -e "客户端工具: ${GREEN}$mongo_cmd ✓${NC}"# 测试连接if timeout 5s $mongo_cmd --port $port --eval "db.version()" --quiet >/dev/null 2>&1; thenecho -e "连接测试: ${GREEN}成功 ✓${NC}"# 获取版本信息local version=$($mongo_cmd --port $port --eval "db.version()" --quiet 2>/dev/null)echo -e "MongoDB 版本: ${GREEN}$version${NC}"# 获取基本状态log_detail "数据库状态:"$mongo_cmd --port $port --eval "print('主机名: ' + db.serverStatus().host);print('运行时间: ' + db.serverStatus().uptime + ' 秒');print('连接数: ' + db.serverStatus().connections.current);print('数据库数量: ' + db.getMongo().getDBNames().length);" --quiet 2>/dev/null | while read line; doecho -e " ${CYAN}$line${NC}"done || trueelseecho -e "连接测试: ${RED}失败 ✗${NC}"echo -e "错误信息: ${RED}无法连接到 MongoDB 服务${NC}"fielseecho -e "客户端工具: ${RED}未找到 ✗${NC}"echo -e "连接测试: ${YELLOW}跳过 ⚠${NC}"fi
}
# 检查系统资源
check_system_resources() {print_title "系统资源使用"# CPU 使用率echo -e "CPU 使用率: ${GREEN}$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')%${NC}"# 内存使用详情log_detail "内存使用详情:"free -h | while read line; doecho -e " ${CYAN}$line${NC}"done# 磁盘使用详情log_detail "磁盘使用详情:"df -h | grep -E "(文件系统|^/dev/)" | head -5 | while read line; doecho -e " ${CYAN}$line${NC}"done
}
# 检查防火墙状态
check_firewall_status() {print_title "防火墙状态"local port=${1:-"27017"}# 检查 UFWif command -v ufw >/dev/null 2>&1; thenif ufw status | grep -q "Status: active"; thenecho -e "UFW 状态: ${GREEN}活跃${NC}"if ufw status | grep -q "$port"; thenecho -e "端口 $port: ${GREEN}已放行 ✓${NC}"elseecho -e "端口 $port: ${RED}未放行 ✗${NC}"fielseecho -e "UFW 状态: ${YELLOW}未激活${NC}"fi# 检查 FirewallDelif command -v firewall-cmd >/dev/null 2>&1; thenif systemctl is-active firewalld >/dev/null 2>&1; thenecho -e "FirewallD 状态: ${GREEN}活跃${NC}"if firewall-cmd --list-ports | grep -q "$port/tcp"; thenecho -e "端口 $port: ${GREEN}已放行 ✓${NC}"elseecho -e "端口 $port: ${RED}未放行 ✗${NC}"fielseecho -e "FirewallD 状态: ${YELLOW}未激活${NC}"fielseecho -e "防火墙: ${YELLOW}未检测到常用防火墙工具${NC}"fi
}
# 生成总结报告
generate_summary() {print_title "状态总结报告"local issues=0local warnings=0# 服务状态检查if ! systemctl is-active mongod >/dev/null 2>&1; thenecho -e "❌ ${RED}问题: MongoDB 服务未运行${NC}"((issues++))fi# 端口检查if ! netstat -tlnp 2>/dev/null | grep -q ":27017 "; thenecho -e "❌ ${RED}问题: 端口 27017 未监听${NC}"((issues++))fi# 连接检查if command -v mongosh >/dev/null 2>&1; thenif ! timeout 3s mongosh --port 27017 --eval "db.version()" --quiet >/dev/null 2>&1; thenecho -e "❌ ${RED}问题: 无法连接到 MongoDB${NC}"((issues++))fielseecho -e "⚠️ ${YELLOW}警告: 未找到 MongoDB 客户端工具${NC}"((warnings++))fi# 数据目录检查local config_file="/etc/mongod.conf"local db_path=""if [[ -f "$config_file" ]]; thendb_path=$(grep 'dbPath:' "$config_file" | awk '{print $2}' | head -1)fidb_path=${db_path:-"/var/lib/mongodb"}if [[ ! -d "$db_path" ]]; thenecho -e "⚠️ ${YELLOW}警告: 数据目录不存在${NC}"((warnings++))fi# 输出总结echoif [[ $issues -eq 0 && $warnings -eq 0 ]]; thenecho -e " ${GREEN}所有检查通过!MongoDB 状态正常。${NC}"elif [[ $issues -eq 0 ]]; thenecho -e "ℹ️ ${YELLOW}有 $warnings 个警告,但无严重问题。${NC}"elseecho -e " ${RED}发现 $issues 个问题,$warnings 个警告,需要处理。${NC}"fi
}
# 主函数
main() {echoprint_title "MongoDB 状态检查报告 - $(date)"check_system_infocheck_mongodb_servicecheck_mongodb_processcheck_port_listening "27017"check_mongodb_configcheck_directoriescheck_mongodb_connection "27017"check_system_resourcescheck_firewall_status "27017"generate_summaryechoprint_separatorecho -e "${GREEN}状态检查完成${NC}"print_separatorecho
}
# 脚本入口
if [[ $# -gt 0 && ($1 == "-h" || $1 == "--help") ]]; thenecho "使用方法: $0"echo "功能: 检查 MongoDB 的完整状态信息"exit 0
fi
main "$@"
状态执行过程



⚙️ 服务管理脚本
为了管理方便 封装了服务管理脚本
#!/bin/bash
# MongoDB 管理脚本
set -e
# 配置
CONFIG_FILE="/etc/mongod.conf"
SERVICE_NAME="mongod"
DATA_DIR=$(grep 'dbPath:' $CONFIG_FILE 2>/dev/null | awk '{print $2}' || echo "/var/lib/mongodb")
LOG_DIR=$(grep 'path:' $CONFIG_FILE 2>/dev/null | awk '{print $2}' | head -1 | xargs dirname || echo "/var/log/mongodb")
# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 日志函数
log_info() { echo -e "${GREEN}[信息]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[警告]${NC} $1"; }
log_error() { echo -e "${RED}[错误]${NC} $1"; }
# 显示使用说明
usage() {cat << EOF
使用方法: $0 {start|stop|restart|status|logs|backup|restore|clean}
命令说明:start 启动 MongoDB 服务stop 停止 MongoDB 服务restart 重启 MongoDB 服务status 查看服务状态logs 查看服务日志backup 备份 MongoDB 数据restore 恢复 MongoDB 数据clean 清理日志和临时文件
示例:$0 start$0 status$0 backup /backup/mongodb
EOF
}
# 检查服务状态
check_service() {if ! systemctl is-enabled $SERVICE_NAME >/dev/null 2>&1; thenlog_error "MongoDB 服务未安装或未启用"return 1fireturn 0
}
# 启动服务
start_service() {log_info "启动 MongoDB 服务..."# 创建 PID 文件目录 (服务器重启之后 /var/run/mongodb 会自行删除,或编写脚本服务器启动立刻生成)sudo mkdir -p /var/run/mongodbsudo chown mongodb:mongodb /var/run/mongodbsudo chmod 755 /var/run/mongodbsystemctl start $SERVICE_NAMEsystemctl is-active $SERVICE_NAME && log_info "服务启动成功" || log_error "服务启动失败"
}
# 停止服务
stop_service() {log_info "停止 MongoDB 服务..."systemctl stop $SERVICE_NAMEif systemctl is-active $SERVICE_NAME; thenlog_error "服务停止失败"return 1elselog_info "服务停止成功"fi
}
# 重启服务
restart_service() {log_info "重启 MongoDB 服务..."# 创建 PID 文件目录 (服务器重启之后 /var/run/mongodb 会自行删除,或编写脚本服务器启动立刻生成)sudo mkdir -p /var/run/mongodbsudo chown mongodb:mongodb /var/run/mongodbsudo chmod 755 /var/run/mongodbsystemctl restart $SERVICE_NAMEsystemctl is-active $SERVICE_NAME && log_info "服务重启成功" || log_error "服务重启失败"
}
# 查看状态
show_status() {echo "=== MongoDB 服务状态 ==="systemctl status $SERVICE_NAME --no-pager -lecho -e "\n=== 端口监听状态 ==="netstat -tlnp | grep mongod || echo "未检测到 MongoDB 端口监听"echo -e "\n=== 数据目录使用情况 ==="du -sh $DATA_DIR 2>/dev/null || echo "数据目录不存在: $DATA_DIR"echo -e "\n=== 日志目录使用情况 ==="du -sh $LOG_DIR 2>/dev/null || echo "日志目录不存在: $LOG_DIR"
}
# 查看日志
show_logs() {local lines=${1:-50}if [[ -f "$LOG_DIR/mongod.log" ]]; thentail -f -n $lines "$LOG_DIR/mongod.log"elsejournalctl -u $SERVICE_NAME -f -n $linesfi
}
# 备份数据
backup_data() {local backup_dir=${1:-"/backup/mongodb"}local timestamp=$(date +%Y%m%d_%H%M%S)local backup_path="$backup_dir/backup_$timestamp"log_info "开始备份 MongoDB 数据..."# 创建备份目录mkdir -p $backup_path# 检查 mongodump 命令if ! command -v mongodump &> /dev/null; thenlog_error "未找到 mongodump 命令,请安装 MongoDB 工具包"return 1fi# 执行备份if mongodump --out $backup_path > /dev/null 2>&1; thenlog_info "数据备份成功: $backup_path"# 备份配置文件cp $CONFIG_FILE $backup_path/# 创建备份信息文件cat > $backup_path/backup.info << EOF
备份时间: $(date)
MongoDB 版本: $(mongodump --version | head -1)
数据目录: $DATA_DIR
备份大小: $(du -sh $backup_path | cut -f1)
EOFlog_info "备份完成,位置: $backup_path"elselog_error "数据备份失败"return 1fi
}
# 恢复数据
restore_data() {local backup_path=$1if [[ -z "$backup_path" ]]; thenlog_error "请指定备份文件路径"return 1fiif [[ ! -d "$backup_path" ]]; thenlog_error "备份目录不存在: $backup_path"return 1filog_info "开始恢复 MongoDB 数据..."# 停止服务stop_service# 执行恢复if mongorestore $backup_path > /dev/null 2>&1; thenlog_info "数据恢复成功"# 启动服务start_serviceelselog_error "数据恢复失败"start_servicereturn 1fi
}
# 清理操作
cleanup() {log_info "开始清理操作..."# 清理日志文件 (保留最近7天)find $LOG_DIR -name "*.log*" -type f -mtime +7 -deletelog_info "日志文件清理完成"# 清理临时文件find /tmp -name "mongodb*" -type f -mtime +1 -deletelog_info "临时文件清理完成"# 清空 journal 目录 (谨慎操作)local journal_dir="$DATA_DIR/journal"if [[ -d "$journal_dir" ]]; thenfind $journal_dir -name "prealloc.*" -type f -deletelog_info "Journal 预分配文件清理完成"fi
}
# 主函数
main() {local command=$1local argument=$2case $command instart)check_service && start_service;;stop)check_service && stop_service;;restart)check_service && restart_service;;status)check_service && show_status;;logs)show_logs $argument;;backup)backup_data $argument;;restore)restore_data $argument;;clean)cleanup;;*)usageexit 1;;esac
}
# 脚本入口
if [[ $# -eq 0 ]]; thenusageexit 1
fi
main "$@"
快速安装方式
方法1:一键脚本安装
# 下载脚本
wget -O install-mongodb.sh https://raw.githubusercontent.com/example/install-mongodb/master/install-mongodb.sh
# 添加执行权限
chmod +x install-mongodb.sh
# 运行安装
sudo ./install-mongodb.sh
方法2:各系统快速安装
# Ubuntu/Debian
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt update
sudo apt install -y mongodb-org
sudo systemctl enable mongod && sudo systemctl start mongod
# CentOS/RHEL/Amazon Linux
cat > /etc/yum.repos.d/mongodb-org-6.0.repo << EOF
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
EOF
sudo yum install -y mongodb-org
sudo systemctl enable mongod && sudo systemctl start mongod
⚙️ 常用管理命令
# 服务管理
sudo systemctl start mongod # 启动
sudo systemctl stop mongod # 停止
sudo systemctl restart mongod # 重启
sudo systemctl status mongod # 查看状态
sudo systemctl enable mongod # 设置开机自启
# MongoDB连接
mongo --port 27017 -u admin -p --authenticationDatabase admin # 认证连接
mongo --port 27017 # 无认证连接(如果禁用认证)
# 数据库操作
mongo -u admin -p --eval "show dbs" # 查看数据库
mongo -u admin -p --eval "use mydb" # 切换数据库
mongo -u admin -p --eval "db.createCollection('users')" # 创建集合
# 用户管理
mongo -u admin -p --eval "
db.createUser({user: 'myuser',pwd: 'mypassword',roles: [{ role: 'readWrite', db: 'mydb' }]
})"
# 备份恢复
mongodump -u admin -p --out /backup/ # 备份
mongorestore -u admin -p /backup/ # 恢复
重要目录和文件
/var/lib/mongodb/ # 数据目录
/var/log/mongodb/ # 日志目录
├── mongod.log # 主日志文件
/etc/mongod/ # 配置目录
├── mongod.conf # 主配置文件
/var/run/mongodb/ # 运行时文件
├── mongod.pid # PID文件
常用配置修改
修改监听地址
sudo vi /etc/mongod/mongod.conf
# 修改:
net:bindIp: 0.0.0.0 # 允许所有IP连接
调整缓存大小
# 根据服务器内存调整
storage:wiredTiger: engineConfig: cacheSizeGB: 2
启用分片集群
sharding:clusterRole: shardsvr
配置OPLog大小
replication:oplogSizeMB: 1024
安装验证和测试
# 检查服务状态
sudo systemctl status mongod
# 检查端口监听
netstat -tulpn | grep 27017
ss -tulpn | grep 27017
# 测试连接
mongo --port 27017 -u admin -p --authenticationDatabase admin --eval "db.adminCommand('ping')"
# 查看版本信息
mongo --port 27017 -u admin -p --eval "db.version()"
# 性能测试
mongo --port 27017 -u admin -p --eval "
db.runCommand({serverStatus: 1})"
# 创建测试数据
mongo --port 27017 -u admin -p --authenticationDatabase admin << EOF
use testdb;
for (var i = 1; i <= 1000; i++) {db.users.insert({name: "用户" + i,age: Math.floor(Math.random() * 50) + 18,created: new Date()});
}
db.users.count();
db.users.find().limit(5);
EOF
客户端链接测试


这个脚本提供了完整的MongoDB安装方案,包括安全配置、性能优化集支持,适合生产环境使用!
