一、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编写,具体版本可能略有差异。