2026年Ubuntu上管理SQL Server完整指南(2026)

一、SQL Server on Ubuntu概述

SQL Server是微软推出的关系型数据库管理系统,从SQL Server 2017开始支持Linux平台,包括Ubuntu。这为开发者提供了更多选择,可以在Linux环境中使用熟悉的SQL Server功能。

1.1 SQL Server on Ubuntu的优势

  • 跨平台兼容:同一套技能在Windows和Linux上通用
  • 成本优化:Linux服务器成本通常低于Windows
  • 容器化支持:可轻松部署到Docker容器
  • 性能优秀:在Linux上表现出色
  • 企业级功能:支持高可用、备份恢复、安全特性等

1.2 适用场景

场景 说明
Web应用后端 ASP.NET、Node.js、Python应用的数据存储
数据仓库 大数据分析和报表
开发测试 本地开发环境或CI/CD流水线
混合云部署 与Azure云服务无缝集成

二、安装SQL Server on Ubuntu

2.1 系统要求

  • Ubuntu 18.04/20.04/22.04 LTS
  • 至少2GB内存(推荐4GB以上)
  • 至少6GB磁盘空间
  • x64架构处理器

2.2 安装步骤

第一步:导入GPG密钥

wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

第二步:添加SQL Server仓库

# Ubuntu 20.04
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)"

# Ubuntu 22.04
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list)"

第三步:安装SQL Server

sudo apt update
sudo apt install -y mssql-server

第四步:配置SQL Server

sudo /opt/mssql/bin/mssql-conf setup

按提示选择版本(Developer版免费)、设置SA密码。

第五步:验证安装

systemctl status mssql-server

2.3 安装命令行工具

# 导入密钥
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

# 添加工具仓库
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list

# 安装工具
sudo apt update
sudo apt install -y mssql-tools unixodbc-dev

# 添加到PATH
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

三、SQL Server服务管理

3.1 服务基本操作

# 启动服务
sudo systemctl start mssql-server

# 停止服务
sudo systemctl stop mssql-server

# 重启服务
sudo systemctl restart mssql-server

# 查看状态
sudo systemctl status mssql-server

# 开机自启
sudo systemctl enable mssql-server

# 禁用开机自启
sudo systemctl disable mssql-server

3.2 服务配置管理

# 查看当前配置
sudo /opt/mssql/bin/mssql-conf list

# 更改TCP端口(默认1433)
sudo /opt/mssql/bin/mssql-conf set network.tcpport 1434
sudo systemctl restart mssql-server

# 更改数据目录
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /var/opt/mssql/data
sudo systemctl restart mssql-server

# 更改日志目录
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /var/opt/mssql/log
sudo systemctl restart mssql-server

3.3 内存配置

# 设置内存限制(单位MB)
sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 2048
sudo systemctl restart mssql-server

四、数据库管理操作

4.1 连接SQL Server

# 使用sqlcmd连接
sqlcmd -S localhost -U SA -P 'YourPassword123'

# 指定端口连接
sqlcmd -S localhost,1433 -U SA -P 'YourPassword123'

# 使用Windows认证(加入域后)
sqlcmd -S localhost -E

4.2 创建和管理数据库

创建数据库

CREATE DATABASE TestDB;
GO

-- 查看所有数据库
SELECT name, database_id, create_date FROM sys.databases;
GO

创建表

USE TestDB;
GO

CREATE TABLE Users (
    ID INT PRIMARY KEY IDENTITY(1,1),
    Username NVARCHAR(50) NOT NULL,
    Email NVARCHAR(100),
    CreatedAt DATETIME DEFAULT GETDATE()
);
GO

插入数据

INSERT INTO Users (Username, Email) VALUES ('user1', 'user1@example.com');
INSERT INTO Users (Username, Email) VALUES ('user2', 'user2@example.com');
GO

查询数据

SELECT * FROM Users;
GO

4.3 备份和恢复

完整备份

BACKUP DATABASE TestDB TO DISK = '/var/opt/mssql/backup/TestDB.bak'
WITH FORMAT, MEDIANAME = 'SQLServerBackups', NAME = 'Full Backup of TestDB';
GO

差异备份

BACKUP DATABASE TestDB TO DISK = '/var/opt/mssql/backup/TestDB_diff.bak'
WITH DIFFERENTIAL, NAME = 'Differential Backup of TestDB';
GO

恢复数据库

RESTORE DATABASE TestDB FROM DISK = '/var/opt/mssql/backup/TestDB.bak'
WITH REPLACE, RECOVERY;
GO

4.4 自动化备份脚本

#!/bin/bash
# backup_sqlserver.sh

BACKUP_DIR="/var/opt/mssql/backup"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="TestDB"

# 创建备份目录
sudo mkdir -p $BACKUP_DIR

# 执行备份
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'YourPassword123' \
-Q "BACKUP DATABASE [$DB_NAME] TO DISK='$BACKUP_DIR/${DB_NAME}_${DATE}.bak' WITH FORMAT, NAME='Full Backup'"

# 删除7天前的备份
find $BACKUP_DIR -name "*.bak" -mtime +7 -delete

echo "Backup completed: ${DB_NAME}_${DATE}.bak"

添加到crontab:

# 每天凌晨2点备份
0 2 * * * /home/user/backup_sqlserver.sh >> /var/log/sqlserver_backup.log 2>&1

五、性能优化

5.1 系统层面优化

# 调整文件描述符限制
echo "* soft nofile 65536" | sudo tee -a /etc/security/limits.conf
echo "* hard nofile 65536" | sudo tee -a /etc/security/limits.conf

# 禁用透明大页
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled

# 调整swappiness
echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

5.2 SQL Server配置优化

-- 查看当前配置
sp_configure;

-- 启用高级选项
sp_configure 'show advanced options', 1;
RECONFIGURE;
GO

-- 设置最大内存(MB)
sp_configure 'max server memory', 4096;
RECONFIGURE;
GO

-- 设置最大并行度
sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
GO

5.3 索引优化

-- 创建索引
CREATE INDEX IX_Users_Email ON Users(Email);
GO

-- 查看索引碎片
SELECT 
    OBJECT_NAME(ind.OBJECT_ID) AS TableName,
    ind.name AS IndexName,
    indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats
INNER JOIN sys.indexes ind ON ind.object_id = indexstats.object_id AND ind.index_id = indexstats.index_id;
GO

-- 重建索引
ALTER INDEX IX_Users_Email ON Users REBUILD;
GO

六、安全管理

6.1 防火墙配置

# 开放SQL Server端口
sudo ufw allow 1433/tcp
sudo ufw reload

# 查看规则
sudo ufw status

6.2 修改SA密码

-- 使用sqlcmd连接后执行
ALTER LOGIN SA WITH PASSWORD = 'NewStrongPassword123!';
GO

6.3 创建新用户

-- 创建登录名
CREATE LOGIN appuser WITH PASSWORD = 'StrongPassword123!';
GO

-- 创建数据库用户
USE TestDB;
CREATE USER appuser FOR LOGIN appuser;
GO

-- 授予权限
ALTER ROLE db_datareader ADD MEMBER appuser;
ALTER ROLE db_datawriter ADD MEMBER appuser;
GO

6.4 启用SSL加密

# 生成证书
openssl req -x509 -nodes -newkey rsa:2048 -keyout mssql.key -out mssql.pem -days 365

# 设置权限
sudo chown mssql:mssql mssql.key mssql.pem
sudo chmod 600 mssql.key

# 配置SQL Server使用证书
sudo /opt/mssql/bin/mssql-conf set network.tlscert /path/to/mssql.pem
sudo /opt/mssql/bin/mssql-conf set network.tlskey /path/to/mssql.key
sudo /opt/mssql/bin/mssql-conf set network.tlsprotocols 1.2
sudo /opt/mssql/bin/mssql-conf set network.forceencryption 1

sudo systemctl restart mssql-server

七、监控和日志

7.1 查看日志

# SQL Server日志目录
sudo tail -f /var/opt/mssql/log/errorlog

# 查看最近100行
sudo tail -100 /var/opt/mssql/log/errorlog

7.2 性能监控

-- 查看活动连接
SELECT 
    DB_NAME(dbid) AS DatabaseName,
    COUNT(dbid) AS NumberOfConnections,
    loginame AS LoginName
FROM sys.sysprocesses
GROUP BY dbid, loginame;
GO

-- 查看慢查询
SELECT 
    qs.execution_count,
    qs.total_logical_reads,
    qs.total_logical_writes,
    qs.total_elapsed_time / 1000 AS total_elapsed_time_ms,
    SUBSTRING(qt.text, (qs.statement_start_offset/2)+1, 
        ((CASE qs.statement_end_offset
            WHEN -1 THEN DATALENGTH(qt.text)
            ELSE qs.statement_end_offset
        END - qs.statement_start_offset)/2) + 1) AS query_text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_elapsed_time DESC;
GO

八、常见问题解答

Q1: SQL Server无法启动怎么办?

A: 检查以下几点:
1. 查看错误日志:sudo tail -f /var/opt/mssql/log/errorlog
2. 检查内存是否足够:free -h
3. 检查端口是否被占用:sudo netstat -tlnp | grep 1433
4. 检查权限:sudo ls -la /var/opt/mssql/

Q2: 如何远程连接SQL Server?

A: 确保以下配置:
1. 防火墙开放1433端口
2. SQL Server监听正确的IP(默认监听所有)
3. SQL Server启用TCP/IP协议

Q3: 如何卸载SQL Server?

A:

sudo systemctl stop mssql-server
sudo apt remove mssql-server
sudo rm -rf /var/opt/mssql

Q4: 如何迁移数据库到Ubuntu?

A: 使用以下方法:
1. 在Windows上备份:BACKUP DATABASE ... TO DISK
2. 将.bak文件传输到Ubuntu
3. 在Ubuntu上恢复:RESTORE DATABASE ... FROM DISK

九、总结

在Ubuntu上管理SQL Server需要掌握安装配置、服务管理、数据库操作、性能优化和安全管理等核心技能。本文提供了从安装到运维的完整指南,帮助您在Linux环境中高效使用SQL Server。

推荐学习资源
– 微软官方文档:learn.microsoft.com/sql
– SQL Server GitHub示例:github.com/microsoft/sql-server-samples
– 社区论坛:dba.stackexchange.com

注:本文基于SQL Server 2022 on Ubuntu 20.04/22.04编写,具体版本可能略有差异。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注