1. 为什么需要SQL Server 2025一键部署脚本
在Linux环境下手动部署SQL Server 2025需要经历至少17个关键步骤——从添加微软官方仓库到配置TCP端口,每个环节都可能成为新手卡壳的拦路虎。我去年为某金融客户部署测试环境时,光是处理locale和字符集冲突就浪费了整整一个工作日。这正是我们需要自动化部署脚本的根本原因。
SQL Server 2025作为微软最新的数据库引擎版本,在Linux上的安装流程相比Windows版有显著差异。官方文档要求管理员依次执行:
- 导入GPG密钥
- 添加apt/yum仓库
- 安装特定版本的mssql-server包
- 运行初始配置向导
- 设置SA密码复杂度
- 调整内存限制等参数
手动操作不仅耗时,还容易因遗漏步骤导致服务启动失败。通过Shell脚本实现一键部署,可以将平均部署时间从40分钟压缩到90秒,同时保证环境的一致性。这对于需要频繁创建测试环境的DevOps团队尤其重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖检查
2.1 系统兼容性验证
SQL Server 2025目前官方支持以下Linux发行版:
- Ubuntu 20.04/22.04 LTS
- RHEL 8.x/9.x
- SLES 15 SP3+
在脚本开头必须加入系统检测逻辑:
bash复制#!/bin/bash
# 检查发行版
if [ -f /etc/os-release ]; then
. /etc/os-release
case $ID in
ubuntu)
if [[ "$VERSION_ID" != "20.04" && "$VERSION_ID" != "22.04" ]]; then
echo "错误:仅支持Ubuntu 20.04/22.04"
exit 1
fi
;;
rhel|centos)
if [[ "$VERSION_ID" != 8* && "$VERSION_ID" != 9* ]]; then
echo "错误:仅支持RHEL/CentOS 8.x/9.x"
exit 1
fi
;;
*)
echo "错误:不支持的Linux发行版"
exit 1
;;
esac
else
echo "无法确定Linux发行版"
exit 1
fi
2.2 硬件资源检测
SQL Server 2025最低要求:
- 内存:至少4GB(生产环境建议16GB+)
- 磁盘:10GB可用空间(数据文件另计)
- CPU:x64架构,支持AVX指令集
推荐在脚本中加入资源检查:
bash复制# 检查内存
mem_total=$(grep MemTotal /proc/meminfo | awk '{print $2}')
if [ "$mem_total" -lt 4000000 ]; then
echo "警告:内存不足4GB,可能导致性能问题"
fi
# 检查磁盘
disk_free=$(df -k / | tail -1 | awk '{print $4}')
if [ "$disk_free" -lt 10000000 ]; then
echo "错误:根分区剩余空间不足10GB"
exit 1
fi
# 检查AVX支持
if ! grep -q avx /proc/cpuinfo; then
echo "错误:CPU不支持AVX指令集"
exit 1
fi
3. 核心部署流程实现
3.1 仓库配置自动化
不同发行版的仓库配置差异很大,需要分支处理:
bash复制case $ID in
ubuntu)
# 导入微软GPG密钥
curl -s https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc >/dev/null
# 添加APT仓库
sudo add-apt-repository "$(curl -s https://packages.microsoft.com/config/ubuntu/$VERSION_ID/mssql-server-2025.list)"
# 更新包索引
sudo apt-get update
;;
rhel|centos)
# 安装yum-utils
sudo yum install -y yum-utils
# 添加YUM仓库
sudo yum-config-manager --add-repo https://packages.microsoft.com/config/rhel/$VERSION_ID/mssql-server-2025.repo
# 清理缓存
sudo yum clean all
;;
esac
3.2 静默安装与配置
通过环境变量实现无人值守安装:
bash复制# 设置SA密码(实际使用时应从安全位置获取)
export MSSQL_SA_PASSWORD="ComplexP@ssw0rd123!"
# 安装核心包
case $ID in
ubuntu)
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mssql-server
;;
rhel|centos)
sudo yum install -y mssql-server
;;
esac
# 运行初始配置
sudo MSSQL_SA_PASSWORD=$MSSQL_SA_PASSWORD \
MSSQL_PID=Developer \
/opt/mssql/bin/mssql-conf -n setup accept-eula
重要提示:生产环境绝对不要硬编码密码!应该通过密钥管理服务获取,或在运行时提示用户输入。
4. 高级配置与优化
4.1 内存限制调整
默认配置可能不适合高负载环境,建议根据物理内存动态调整:
bash复制# 计算推荐内存配置(单位MB)
total_mem_mb=$((mem_total / 1024))
sql_mem=$((total_mem_mb * 70 / 100)) # 使用70%物理内存
# 应用配置
sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb $sql_mem
4.2 TCP端口与防火墙
确保默认1433端口可访问:
bash复制# 开放防火墙(针对不同发行版)
case $ID in
ubuntu)
sudo ufw allow 1433/tcp
sudo ufw reload
;;
rhel|centos)
sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reload
;;
esac
# 启用TCP协议
sudo /opt/mssql/bin/mssql-conf set network.tcpport 1433
4.3 日志轮转设置
防止日志文件无限增长:
bash复制# 配置错误日志轮转
sudo tee /etc/logrotate.d/mssql <<'EOF'
/var/opt/mssql/log/errorlog {
weekly
rotate 12
compress
missingok
notifempty
copytruncate
}
EOF
5. 部署后验证与排错
5.1 服务状态检查
实现自动化的健康检查:
bash复制# 等待服务启动(最多30秒)
for i in {1..30}; do
if systemctl is-active --quiet mssql-server; then
break
fi
sleep 1
done
# 验证服务状态
if ! systemctl is-active --quiet mssql-server; then
echo "错误:SQL Server服务启动失败"
journalctl -u mssql-server -n 50 --no-pager
exit 1
fi
# 基本连接测试
if ! /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$MSSQL_SA_PASSWORD" -Q "SELECT @@VERSION"; then
echo "错误:无法连接到SQL Server实例"
exit 1
fi
5.2 常见问题处理
在脚本中内置常见错误的解决方案:
bash复制# 检查locale配置(中文环境常见问题)
if [ "$(locale | grep -E 'LANG=|LC_ALL=' | grep -v '=en_US.UTF-8')" != "" ]; then
echo "检测到非英文locale,可能引发安装问题"
echo "临时设置为en_US.UTF-8..."
export LC_ALL=en_US.UTF-8
fi
# 处理旧版本冲突
if rpm -qa | grep -q mssql-server-2019 || dpkg -l | grep -q mssql-server-2019; then
echo "检测到旧版SQL Server,建议先卸载..."
read -p "是否继续?[y/N]" -n 1 -r
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
6. 完整脚本整合与安全增强
将各模块整合为完整脚本时,需要特别注意:
- 添加执行权限检查
- 实现参数化配置
- 增加日志记录功能
最终脚本开头应包含:
bash复制#!/bin/bash
set -euo pipefail # 严格错误处理
# 日志记录
LOG_FILE="/tmp/sqlserver_install_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG_FILE") 2>&1
# 检查root权限
if [ "$(id -u)" -ne 0 ]; then
echo "请使用root用户或通过sudo运行此脚本"
exit 1
fi
# 参数处理
while getopts "p:" opt; do
case $opt in
p) SA_PASSWORD="$OPTARG" ;;
*) echo "用法: $0 [-p SA密码]" ; exit 1 ;;
esac
done
# 密码复杂度检查
validate_password() {
local pw=$1
[[ ${#pw} -ge 8 ]] &&
[[ "$pw" =~ [A-Z] ]] &&
[[ "$pw" =~ [a-z] ]] &&
[[ "$pw" =~ [0-9] ]] &&
[[ "$pw" =~ [!@#\$%^\&*] ]]
}
if [ -z "${SA_PASSWORD:-}" ]; then
read -s -p "请输入SA密码(需包含大小写字母、数字和特殊字符):" SA_PASSWORD
echo
if ! validate_password "$SA_PASSWORD"; then
echo "密码不符合复杂度要求"
exit 1
fi
fi
脚本结尾可以添加部署结果报告:
bash复制# 输出部署摘要
echo ""
echo "=== SQL Server 2025 部署完成 ==="
echo "版本信息:"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$SA_PASSWORD" -Q "SELECT @@VERSION" -h-1
echo ""
echo "监听端口:"
sudo /opt/mssql/bin/mssql-conf get network.tcpport
echo ""
echo "内存限制(MB):"
sudo /opt/mssql/bin/mssql-conf get memory.memorylimitmb
echo ""
echo "重要提示:"
echo "1. 默认SA密码已设置为提供的值"
echo "2. 防火墙已开放1433端口"
echo "3. 安装日志保存在 $LOG_FILE"
echo "4. 建议立即更改SA密码"
在实际使用这个脚本时,我发现几个容易忽略但至关重要的细节:首先是在RHEL系统上,SELinux可能会阻止SQL Server访问必要的资源,需要额外执行semanage port -a -t sqlsrv_port_t -p tcp 1433;其次是Ubuntu系统在非英文环境下,安装过程中可能因为locale问题导致进度条显示异常,但不影响实际安装结果;最后是在虚拟机环境中,需要特别注意虚拟磁盘的IO性能设置,否则数据库初始化阶段可能耗时远超预期。
