Linux系统下SQL Server安装与配置指南,如何在Linux系统上轻松安装和配置SQL Server?,Linux也能运行SQL Server?手把手教你轻松搞定安装与配置!
在数字化转型浪潮中,数据库管理系统(DBMS)已成为企业IT架构的核心支柱,微软SQL Server作为全球领先的关系型数据库解决方案,凭借其卓越的性能、可靠的安全性和丰富的功能生态,长期占据企业级数据库市场的重要地位,传统上,SQL Server主要运行于Windows平台,但随着微软"拥抱开源"战略的深入实施,自SQL Server 2017起已全面支持Linux操作系统,为开发者提供了更灵活的部署选项,实现了跨平台的无缝迁移。
(微软SQL Server Linux版架构示意图)
本教程将系统讲解在Linux环境中部署SQL Server的全流程,涵盖系统准备、安装配置、性能优化及通过宝塔面板管理等关键环节,无论您是数据库管理员、后端开发者还是系统运维工程师,本指南都将成为您快速掌握Linux平台SQL Server部署的实用手册,我们不仅会介绍基础安装步骤,还将深入探讨生产环境的最佳实践和性能调优技巧。
系统准备
硬件与系统要求
在开始安装前,请确认您的Linux环境满足以下基本要求,这些要求根据微软官方文档和实际生产环境经验进行了优化调整:
组件 | 最低要求 | 生产环境建议 |
---|---|---|
操作系统 | RHEL/CentOS 7.3+或8.0+、SLES 12 SP3+或15 SP0+、Ubuntu 16.04/18.04/20.04 | RHEL/CentOS 8.x(长期支持版本) |
内存 | 2GB | 16GB+(根据数据库负载可扩展至32GB或更高) |
存储空间 | 6GB | SSD/NVMe存储,50GB+(建议使用独立的数据盘和日志盘) |
CPU | x64架构,2GHz双核 | 4核以上(建议支持AVX指令集) |
文件系统 | XFS/EXT4 | XFS(针对大文件和高并发场景优化) |
SWAP空间 | 无明确要求 | 建议为物理内存的1-1.5倍 |
注意事项:
- SQL Server on Linux目前不支持ARM架构,仅限x86_64环境
- 生产环境强烈建议禁用透明大页(THP),可通过命令
echo never > /sys/kernel/mm/transparent_hugepage/enabled
设置- 对于高并发场景,建议调整Linux内核参数,特别是文件描述符限制和TCP连接参数
宝塔面板预安装(可选)
对于偏好图形化管理的用户,推荐先安装宝塔面板,以下以CentOS 7为例演示安装过程:
# 安装必要依赖并下载安装脚本 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh # 执行安装并保留详细日志(便于问题排查) sh install.sh | tee /tmp/bt_install.log # 安装完成后检查服务状态 systemctl status bt
安装完成后访问面板:
- 访问地址:
http://<服务器IP>:8888
- 获取初始账号密码:执行
bt default
命令查看 - 安全建议:首次登录后立即修改默认密码,并在面板设置中启用双重认证
(宝塔面板管理界面示例)
SQL Server核心安装流程
安全认证准备
# 导入微软官方GPG密钥(确保软件包完整性) sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc # 验证密钥指纹(应显示"Microsoft (Release signing) <gpgsecurity@microsoft.com>") gpg --quiet --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-microsoft-asc # 清理现有软件包缓存 sudo yum clean all || sudo apt-get clean
配置软件仓库
根据不同Linux发行版选择对应命令:
RHEL/CentOS 7:
sudo curl -o /etc/yum.repos.d/mssql-server.repo \ https://packages.microsoft.com/config/rhel/7/mssql-server-2019.repo
RHEL/CentOS 8:
sudo curl -o /etc/yum.repos.d/mssql-server.repo \ https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo
Ubuntu 20.04:
sudo curl -o /etc/apt/sources.list.d/mssql-server.list \ https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list # 更新软件源元数据 sudo apt-get update
执行安装
CentOS/RHEL系统:
sudo yum install -y mssql-server
Ubuntu系统:
sudo apt-get install -y mssql-server
初始配置
sudo /opt/mssql/bin/mssql-conf setup
配置过程中需要:
-
选择版本(输入数字):
- Evaluation(评估版) - 180天试用期
- Developer(开发版) - 全功能免费版,仅限开发和测试环境
- Express(快速版) - 免费版,有限制(10GB数据库大小)
- Web版 - 针对Web托管优化
- Standard(标准版) - 中小型企业级
- Enterprise(企业版) - 全功能商业版
-
接受许可协议(输入"YES")
-
设置强密码(需满足:至少8字符,包含大小写字母、数字和特殊字符)
(SQL Server版本选择界面)
服务管理
# 检查详细运行状态(显示完整日志) systemctl status mssql-server --no-pager -l # 设置开机自启 sudo systemctl enable mssql-server # 重启服务(配置变更后需要) sudo systemctl restart mssql-server # 查看服务启动日志 journalctl -u mssql-server -n 50 --no-pager
防火墙配置
# 开放默认端口(1433/TCP) sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent sudo firewall-cmd --reload # 验证端口开放状态 sudo firewall-cmd --list-ports | grep 1433 # 对于Ubuntu系统使用ufw sudo ufw allow 1433/tcp sudo ufw reload
管理工具安装
命令行工具集
CentOS/RHEL:
sudo curl -o /etc/yum.repos.d/msprod.repo \ https://packages.microsoft.com/config/rhel/7/prod.repo sudo yum install -y mssql-tools unixODBC-devel
Ubuntu:
sudo curl -o /etc/apt/sources.list.d/msprod.list \ https://packages.microsoft.com/config/ubuntu/20.04/prod.list sudo apt-get update sudo apt-get install -y mssql-tools unixodbc-dev
环境变量配置
# 永久添加PATH(所有用户) echo 'export PATH="$PATH:/opt/mssql-tools/bin"' | sudo tee /etc/profile.d/mssql-tools.sh # 当前会话生效 source /etc/profile.d/mssql-tools.sh # 验证工具可用性 which sqlcmd which bcp
连接测试
# 基本连接测试 sqlcmd -S localhost -U sa -P '<您的密码>' # 带超时设置的连接(网络不稳定时有用) sqlcmd -S localhost -U sa -P '<密码>' -l 30
成功连接后执行示例查询:
-- 获取SQL Server版本信息 SELECT @@VERSION AS 'SQL Server Version'; -- 查看基础配置 SELECT name, value, value_in_use FROM sys.configurations WHERE name IN ('max server memory (MB)', 'cost threshold for parallelism', 'max degree of parallelism'); GO
宝塔面板集成方案
数据库管理插件
虽然宝塔原生不支持SQL Server,可通过以下方案实现图形化管理:
# 安装Adminer全能数据库管理工具(轻量级PHP解决方案) wget https://github.com/vrana/adminer/releases/download/v4.8.1/adminer-4.8.1-en.php \ -O /www/wwwroot/adminer.php # 设置适当权限 chown www:www /www/wwwroot/adminer.php chmod 644 /www/wwwroot/adminer.php
访问方式:http://<服务器IP>/adminer.php
连接参数:
- 系统:选择"SQL Server"
- 服务器:
localhost
- 用户名:
sa
- 密码:安装时设置的密码
端口转发配置
- 在宝塔面板创建新站点(建议使用独立域名或子域名)
- 进入"反向代理"设置
- 添加代理规则:
- 目标URL:
http://127.0.0.1:1433
- 发送域名:
$host
- 高级设置:添加以下头信息
Proxy-Connection: keep-alive X-Forwarded-For: $remote_addr
- 目标URL:
监控集成
通过宝塔的"计划任务"实现自动化监控:
#!/bin/bash # SQL Server健康检查脚本 LOG_FILE="/var/log/mssql-monitor.log" # 检查服务状态 if ! systemctl is-active --quiet mssql-server; then systemctl restart mssql-server echo "$(date) - SQL Server服务异常,已执行重启" >> $LOG_FILE # 可添加邮件或钉钉通知 fi # 检查资源使用 MEM_USAGE=$(ps -C sqlservr -o %mem --no-headers) CPU_USAGE=$(ps -C sqlservr -o %cpu --no-headers) if (( $(echo "$MEM_USAGE > 90" | bc -l) )); then echo "$(date) - 内存使用过高: $MEM_USAGE%" >> $LOG_FILE fi if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then echo "$(date) - CPU使用过高: $CPU_USAGE%" >> $LOG_FILE fi
高级配置指南
性能优化
# 调整内存限制(单位MB,建议为物理内存的70-80%) sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 12288 # 设置并行度(根据CPU核心数,通常4-8之间) sudo /opt/mssql/bin/mssql-conf set optimizer.maxdop 4 # 配置临时数据库位置(建议使用高性能存储) sudo mkdir -p /mnt/tempdb sudo chown mssql:mssql /mnt/tempdb sudo /opt/mssql/bin/mssql-conf set filelocation.mssqlsystemtempdb /mnt/tempdb # 启用即时文件初始化(提升数据文件创建速度) sudo /opt/mssql/bin/mssql-conf set filelocation.enableinstantfileinitialization 1
安全加固
# 强制加密所有连接 sudo /opt/mssql/bin/mssql-conf set network.forceencryption 1 # 更改默认端口(减少自动化攻击风险) sudo /opt/mssql/bin/mssql-conf set network.tcpport 11433 sudo firewall-cmd --zone=public --add-port=11433/tcp --permanent sudo firewall-cmd --reload # 启用登录审计(记录所有登录尝试) sudo mkdir -p /var/opt/mssql/audit sudo chown mssql:mssql /var/opt/mssql/audit sudo /opt/mssql/bin/mssql-conf set telemetry.userrequestedlocalauditdirectory /var/opt/mssql/audit # 限制SA账户远程登录(建议创建专用管理账户) sqlcmd -S localhost -U sa -P '<密码>' -Q " CREATE LOGIN [admin_user] WITH PASSWORD = '<强密码>'; ALTER SERVER ROLE [sysadmin] ADD MEMBER [admin_user];"
备份与恢复策略
自动化备份
#!/bin/bash # 数据库备份脚本 BACKUP_DIR="/var/opt/mssql/backup" LOG_FILE="/var/log/mssql-backup.log" DB_NAME="YourDB" SA_PASSWORD="<密码>" # 创建备份目录 mkdir -p $BACKUP_DIR chown mssql:mssql $BACKUP_DIR # 执行备份 echo "$(date) - 开始备份数据库 $DB_NAME" >> $LOG_FILE sqlcmd -S localhost -U sa -P $SA_PASSWORD -Q " BACKUP DATABASE [$DB_NAME] TO DISK='$BACKUP_DIR/${DB_NAME}_FULL_$(date +%Y%m%d_%H%M%S).bak' WITH COMPRESSION, STATS=5, CHECKSUM; GO" >> $LOG_FILE 2>&1 # 验证备份完整性 sqlcmd -S localhost -U sa -P $SA_PASSWORD -Q " RESTORE VERIFYONLY FROM DISK='$BACKUP_DIR/${DB_NAME}_FULL_$(date +%Y%m%d_%H%M%S).bak' WITH CHECKSUM; GO" >> $LOG_FILE 2>&1 # 清理旧备份(保留最近7天) find $BACKUP_DIR -name "${DB_NAME}_FULL_*.bak" -mtime +7 -exec rm {} \; echo "$(date) - 备份完成并清理旧文件" >> $LOG_FILE
灾难恢复
# 从备份恢复完整数据库 sqlcmd -S localhost -U sa -P '<密码>' -Q " RESTORE DATABASE [YourDB] FROM DISK='$BACKUP_DIR/YourDB_FULL_20230501.bak' WITH REPLACE, STATS=5, RECOVERY; GO" # 时间点恢复(需要完整备份+日志备份) sqlcmd -S localhost -U sa -P '<密码>' -Q " RESTORE DATABASE [YourDB] FROM DISK='$BACKUP_DIR/YourDB_FULL.bak' WITH NORECOVERY, REPLACE; RESTORE LOG [YourDB] FROM DISK='$BACKUP_DIR/YourDB_LOG.trn' WITH STOPAT='2023-05-01 12:00:00', RECOVERY; GO"
容器化部署方案(可选)
对于需要快速部署和弹性扩展的场景,推荐使用Docker方案:
# 拉取官方镜像(指定版本标签) sudo docker pull mcr.microsoft.com/mssql/server:2019-CU18-ubuntu-20.04 # 运行容器(生产环境建议添加资源限制) sudo docker run -d \ --name sqlserver \ --hostname sqlserver \ --restart unless-stopped \ -e 'ACCEPT_EULA=Y' \ -e 'SA_PASSWORD=<强密码>' \ -e 'MSSQL_PID=Enterprise' \ -p 1433:1433 \ -v /mnt/mssql/data:/var/opt/mssql/data \ -v /mnt/mssql/log:/var/opt/mssql/log \ -v /mnt/mssql/backup:/var/opt/mssql/backup \ --memory="16g" \ --cpus=4 \ mcr.microsoft.com/mssql/server:2019-CU18-ubuntu-20.04 # 验证容器状态 docker logs sqlserver -n 50
常见问题排查
连接问题
# 检查服务是否监听正确端口 sudo netstat -tulnp | grep sqlservr # 查看详细错误日志 tail -100 /var/opt/mssql/log/errorlog # 测试本地连接(绕过网络层) /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U sa -P '<密码>' # 检查防火墙规则 sudo iptables -L -n | grep 1433
性能问题
# 实时监控资源占用 top -p $(pgrep sqlservr) # 查询当前活动会话和阻塞情况 sqlcmd -S localhost -U sa -P '<密码>' -Q " SELECT session_id, login_name, status, cpu_time, memory_usage, reads, writes, logical_reads FROM sys.dm_exec_sessions WHERE is_user_process = 1; GO" # 检查等待统计 sqlcmd -S localhost -U sa -P '<密码>' -Q " SELECT wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC; GO"
通过本指南,您已全面掌握在Linux系统部署SQL Server的核心技术,从传统Windows平台到Linux环境的跨越,体现了现代数据库系统的跨平台趋势和云原生发展方向,建议进一步探索:
- 高可用方案:配置Always On可用性