提交sql server 脚本

This commit is contained in:
陈益 2025-09-01 23:44:57 +08:00
parent c571b670c3
commit a9b9dcdcec
7 changed files with 594 additions and 0 deletions

View File

@ -0,0 +1,217 @@
# SQL Server 2022 Linux Docker Compose 部署指南
## 概述
这是一个完整的SQL Server 2022 Linux Docker Compose部署方案包含数据库初始化、用户管理、性能优化等配置。
## 文件结构
```
├── docker-compose-sqlserver.yml # Docker Compose 配置文件
├── sqlserver.env # 环境变量配置文件
├── sqlserver/ # SQL Server 相关目录
│ ├── init/ # 初始化脚本目录
│ │ ├── 01-create-database.sql # 创建数据库和表
│ │ ├── 02-create-user.sql # 创建用户和权限
│ │ └── 03-performance-config.sql # 性能优化配置
│ ├── data/ # 数据文件目录
│ ├── logs/ # 日志文件目录
│ ├── backup/ # 备份文件目录
│ └── web-config/ # Web管理界面配置
└── SQLServer-README.md # 本说明文档
```
## 快速开始
### 1. 配置环境变量
复制并修改环境变量文件:
```bash
cp sqlserver.env .env
```
编辑 `.env` 文件,修改以下关键配置:
```bash
# 修改SA密码必须
SQLSERVER_SA_PASSWORD=YourStrong@Password123!
# 修改端口(可选,避免冲突)
SQLSERVER_PORT=1433
# 选择SQL Server版本
SQLSERVER_EDITION=Developer # 免费开发版本
```
### 2. 启动服务
```bash
# 启动SQL Server
docker-compose -f docker-compose-sqlserver.yml --env-file .env up -d
# 查看服务状态
docker-compose -f docker-compose-sqlserver.yml ps
# 查看日志
docker-compose -f docker-compose-sqlserver.yml logs -f sqlserver
```
### 3. 连接数据库
#### 使用 sqlcmd 连接
```bash
# 进入容器
docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123!'
# 或者直接执行SQL
docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123!' -Q "SELECT name FROM sys.databases"
```
#### 使用外部工具连接
- **服务器**: `localhost` 或你的服务器IP
- **端口**: `1433`(或你在.env中配置的端口
- **用户名**: `sa`
- **密码**: 你在.env中配置的密码
- **数据库**: `SampleDB`(初始化脚本创建的示例数据库)
## 配置说明
### SQL Server 版本选择
`sqlserver.env` 中配置 `SQLSERVER_EDITION`
- `Developer`: 免费开发版本(推荐用于开发环境)
- `Express`: 免费轻量版本
- `Standard`: 标准版
- `Enterprise`: 企业版
### 资源限制
默认配置:
- CPU限制: 4核心
- 内存限制: 8GB
- 数据目录: `./sqlserver/data`
- 日志目录: `./sqlserver/logs`
### 网络配置
- 默认端口: 1433
- 网络子网: 172.24.0.0/16
- 容器间通信: 通过 `sqlserver-net` 网络
## 初始化脚本说明
### 01-create-database.sql
- 创建 `SampleDB` 示例数据库
- 创建 `Users` 示例表
- 插入示例数据
- 创建 `GetActiveUsers` 存储过程
### 02-create-user.sql
- 创建 `appuser` 应用程序用户
- 配置用户权限
- 授予必要的数据库权限
### 03-performance-config.sql
- 配置最大内存使用量
- 设置最大并行度
- 启用查询存储
- 创建性能监控视图
## 常用操作
### 备份数据库
```bash
# 创建备份
docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123!' -Q "BACKUP DATABASE SampleDB TO DISK = '/var/opt/mssql/backup/SampleDB.bak'"
```
### 恢复数据库
```bash
# 恢复备份
docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123!' -Q "RESTORE DATABASE SampleDB FROM DISK = '/var/opt/mssql/backup/SampleDB.bak'"
```
### 查看性能统计
```bash
# 查看性能统计
docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Password123!' -d SampleDB -Q "SELECT * FROM PerformanceStats"
```
### 停止和清理
```bash
# 停止服务
docker-compose -f docker-compose-sqlserver.yml down
# 停止并删除数据卷(谨慎使用)
docker-compose -f docker-compose-sqlserver.yml down -v
```
## 故障排除
### 常见问题
1. **容器启动失败**
- 检查密码是否符合复杂度要求
- 确保端口没有被占用
- 查看容器日志: `docker-compose logs sqlserver`
2. **连接失败**
- 确认防火墙设置
- 检查网络配置
- 验证用户名和密码
3. **性能问题**
- 调整内存限制
- 检查磁盘空间
- 查看性能监控视图
### 日志查看
```bash
# 查看SQL Server日志
docker-compose -f docker-compose-sqlserver.yml logs sqlserver
# 查看系统日志
docker exec -it sqlserver-2022 cat /var/opt/mssql/log/errorlog
```
## 安全建议
1. **修改默认密码**: 使用强密码
2. **限制网络访问**: 配置防火墙规则
3. **定期备份**: 设置自动备份策略
4. **监控访问**: 启用审计日志
5. **更新补丁**: 定期更新SQL Server镜像
## 扩展功能
### 添加更多数据库
`sqlserver/init/` 目录下创建新的 `.sql` 文件,它们将按文件名顺序执行。
### 集成其他服务
可以将此SQL Server配置集成到现有的Docker Compose网络中
```yaml
networks:
- your-existing-network
```
## 许可证
SQL Server 2022 Developer Edition 可免费用于开发和测试环境。生产环境请确保使用适当的许可证。
## 支持
如有问题,请查看:
- [SQL Server 2022 官方文档](https://docs.microsoft.com/en-us/sql/sql-server/)
- [Docker Hub SQL Server 页面](https://hub.docker.com/_/microsoft-mssql-server)

View File

@ -0,0 +1,91 @@
version: '3.8'
services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest
container_name: sqlserver-2022
hostname: sqlserver-2022
restart: unless-stopped
privileged: true
ports:
- "${SQLSERVER_PORT}:1433"
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=${SQLSERVER_SA_PASSWORD}
- MSSQL_PID=${SQLSERVER_EDITION}
- TZ=Asia/Shanghai
volumes:
- sqlserver-data:/var/opt/mssql
- sqlserver-logs:/var/opt/mssql/log
- ./sqlserver/init:/docker-entrypoint-initdb.d
- ./sqlserver/backup:/var/opt/mssql/backup
deploy:
resources:
limits:
cpus: "4.0"
memory: 8g
reservations:
cpus: "2.0"
memory: 4g
networks:
- sqlserver-net
healthcheck:
test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SQLSERVER_SA_PASSWORD} -Q 'SELECT 1' || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
stdin_open: true
tty: true
# SQL Server Management Studio (可选基于Web的管理界面)
sqlserver-web:
image: mcr.microsoft.com/mssql/server:2022-latest
container_name: sqlserver-web
hostname: sqlserver-web
restart: unless-stopped
ports:
- "${SQLSERVER_WEB_PORT}:8080"
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=${SQLSERVER_SA_PASSWORD}
- MSSQL_PID=${SQLSERVER_EDITION}
- TZ=Asia/Shanghai
volumes:
- ./sqlserver/web-config:/var/opt/mssql/web-config
depends_on:
sqlserver:
condition: service_healthy
networks:
- sqlserver-net
command: >
/bin/bash -c "
# 安装SQL Server Web管理工具
apt-get update && apt-get install -y curl wget &&
# 这里可以添加Web管理界面的安装脚本
echo 'SQL Server Web management interface ready' &&
tail -f /dev/null
"
networks:
sqlserver-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.24.0.0/16
gateway: 172.24.0.1
volumes:
sqlserver-data:
driver: local
driver_opts:
type: none
o: bind
device: ./sqlserver/data
sqlserver-logs:
driver: local
driver_opts:
type: none
o: bind
device: ./sqlserver/logs

View File

@ -0,0 +1,40 @@
# SQL Server 2022 Linux Docker Compose 环境变量配置
# SQL Server 配置
# 端口配置
SQLSERVER_PORT=1433
SQLSERVER_WEB_PORT=8080
# 认证配置
# SA用户密码请修改为强密码
SQLSERVER_SA_PASSWORD=YourStrong@Password123!
# SQL Server 版本配置
# 可选值: Developer, Express, Standard, Enterprise, EnterpriseCore
# Developer: 免费开发版本
# Express: 免费轻量版本
# Standard: 标准版
# Enterprise: 企业版
SQLSERVER_EDITION=Developer
# 时区配置
TZ=Asia/Shanghai
# 资源限制配置
# CPU限制核心数
SQLSERVER_CPU_LIMIT=4.0
SQLSERVER_CPU_RESERVATION=2.0
# 内存限制GB
SQLSERVER_MEMORY_LIMIT=8g
SQLSERVER_MEMORY_RESERVATION=4g
# 数据目录配置
SQLSERVER_DATA_DIR=./sqlserver/data
SQLSERVER_LOG_DIR=./sqlserver/logs
SQLSERVER_BACKUP_DIR=./sqlserver/backup
SQLSERVER_INIT_DIR=./sqlserver/init
# 网络配置
SQLSERVER_NETWORK_SUBNET=172.24.0.0/16
SQLSERVER_NETWORK_GATEWAY=172.24.0.1

View File

@ -0,0 +1,75 @@
-- SQL Server 2022 初始化脚本
-- 创建示例数据库和用户
-- 创建示例数据库
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'SampleDB')
BEGIN
CREATE DATABASE SampleDB;
PRINT '数据库 SampleDB 创建成功';
END
ELSE
BEGIN
PRINT '数据库 SampleDB 已存在';
END
GO
-- 使用 SampleDB 数据库
USE SampleDB;
GO
-- 创建示例表
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='Users' AND xtype='U')
BEGIN
CREATE TABLE Users (
Id INT IDENTITY(1,1) PRIMARY KEY,
Username NVARCHAR(50) NOT NULL UNIQUE,
Email NVARCHAR(100) NOT NULL,
CreatedDate DATETIME2 DEFAULT GETDATE(),
IsActive BIT DEFAULT 1
);
PRINT '表 Users 创建成功';
END
ELSE
BEGIN
PRINT '表 Users 已存在';
END
GO
-- 插入示例数据
IF NOT EXISTS (SELECT * FROM Users WHERE Username = 'admin')
BEGIN
INSERT INTO Users (Username, Email) VALUES
('admin', 'admin@example.com'),
('user1', 'user1@example.com'),
('user2', 'user2@example.com');
PRINT '示例数据插入成功';
END
ELSE
BEGIN
PRINT '示例数据已存在';
END
GO
-- 创建存储过程
IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'GetActiveUsers')
BEGIN
EXEC('
CREATE PROCEDURE GetActiveUsers
AS
BEGIN
SET NOCOUNT ON;
SELECT Id, Username, Email, CreatedDate
FROM Users
WHERE IsActive = 1
ORDER BY CreatedDate DESC;
END
');
PRINT '存储过程 GetActiveUsers 创建成功';
END
ELSE
BEGIN
PRINT '存储过程 GetActiveUsers 已存在';
END
GO
PRINT 'SQL Server 初始化完成!';

View File

@ -0,0 +1,43 @@
-- 创建应用程序用户和权限配置
-- 创建应用程序用户
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = 'appuser')
BEGIN
CREATE LOGIN appuser WITH PASSWORD = 'AppUser@Password123!';
PRINT '登录用户 appuser 创建成功';
END
ELSE
BEGIN
PRINT '登录用户 appuser 已存在';
END
GO
-- 在 SampleDB 数据库中创建用户
USE SampleDB;
GO
IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = 'appuser')
BEGIN
CREATE USER appuser FOR LOGIN appuser;
PRINT '数据库用户 appuser 创建成功';
END
ELSE
BEGIN
PRINT '数据库用户 appuser 已存在';
END
GO
-- 授予权限
-- 授予对 Users 表的读写权限
GRANT SELECT, INSERT, UPDATE, DELETE ON Users TO appuser;
PRINT '授予 Users 表权限成功';
-- 授予执行存储过程的权限
GRANT EXECUTE ON GetActiveUsers TO appuser;
PRINT '授予存储过程执行权限成功';
-- 授予创建表的权限(如果需要)
GRANT CREATE TABLE TO appuser;
PRINT '授予创建表权限成功';
PRINT '用户权限配置完成!';

View File

@ -0,0 +1,60 @@
-- SQL Server 性能优化配置
-- 启用即时文件初始化(需要重启服务)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
PRINT '高级选项已启用';
-- 配置最大内存使用量(根据容器内存限制调整)
-- 这里设置为4GB可以根据实际需要调整
EXEC sp_configure 'max server memory (MB)', 4096;
RECONFIGURE;
PRINT '最大内存设置为 4GB';
-- 配置最大并行度根据CPU核心数调整
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
PRINT '最大并行度设置为 4';
-- 启用查询存储SQL Server 2016+
USE SampleDB;
GO
-- 启用查询存储
ALTER DATABASE SampleDB SET QUERY_STORE = ON;
ALTER DATABASE SampleDB SET QUERY_STORE (
OPERATION_MODE = READ_WRITE,
CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),
DATA_FLUSH_INTERVAL_SECONDS = 900,
INTERVAL_LENGTH_MINUTES = 60,
MAX_STORAGE_SIZE_MB = 1000,
QUERY_CAPTURE_MODE = AUTO,
SIZE_BASED_CLEANUP_MODE = AUTO
);
PRINT '查询存储已启用';
-- 创建性能监控视图
USE SampleDB;
GO
IF NOT EXISTS (SELECT * FROM sys.views WHERE name = 'PerformanceStats')
BEGIN
EXEC('
CREATE VIEW PerformanceStats AS
SELECT
GETDATE() AS CheckTime,
(SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1) AS ActiveConnections,
(SELECT COUNT(*) FROM sys.dm_exec_requests WHERE status IN (''running'', ''runnable'', ''suspended'')) AS ActiveRequests,
(SELECT SUM(pages_kb) FROM sys.dm_os_memory_clerks WHERE type = ''MEMORYCLERK_SQLBUFFERPOOL'') / 1024 AS BufferPoolMB
');
PRINT '性能监控视图创建成功';
END
ELSE
BEGIN
PRINT '性能监控视图已存在';
END
GO
PRINT '性能优化配置完成!';

View File

@ -0,0 +1,68 @@
#!/bin/bash
# SQL Server 2022 Linux Docker Compose 启动脚本
echo "=========================================="
echo "SQL Server 2022 Linux Docker Compose 启动脚本"
echo "=========================================="
# 检查是否存在环境变量文件
if [ ! -f ".env" ]; then
echo "警告: 未找到 .env 文件"
echo "正在从 sqlserver.env 创建 .env 文件..."
cp sqlserver.env .env
echo "请编辑 .env 文件,特别是修改 SQLSERVER_SA_PASSWORD"
echo "然后重新运行此脚本"
exit 1
fi
# 检查Docker是否运行
if ! docker info > /dev/null 2>&1; then
echo "错误: Docker 未运行,请先启动 Docker"
exit 1
fi
# 检查Docker Compose是否可用
if ! command -v docker-compose &> /dev/null; then
echo "错误: docker-compose 未安装"
exit 1
fi
echo "正在启动 SQL Server 2022..."
echo ""
# 创建必要的目录
echo "创建目录结构..."
mkdir -p sqlserver/data sqlserver/logs sqlserver/backup sqlserver/web-config
# 启动服务
echo "启动 Docker Compose 服务..."
docker-compose -f docker-compose-sqlserver.yml --env-file .env up -d
# 等待服务启动
echo "等待 SQL Server 启动..."
sleep 10
# 检查服务状态
echo ""
echo "检查服务状态..."
docker-compose -f docker-compose-sqlserver.yml ps
echo ""
echo "=========================================="
echo "启动完成!"
echo "=========================================="
echo ""
echo "连接信息:"
echo " 服务器: localhost"
echo " 端口: $(grep SQLSERVER_PORT .env | cut -d'=' -f2)"
echo " 用户名: sa"
echo " 密码: $(grep SQLSERVER_SA_PASSWORD .env | cut -d'=' -f2)"
echo " 示例数据库: SampleDB"
echo ""
echo "常用命令:"
echo " 查看日志: docker-compose -f docker-compose-sqlserver.yml logs -f sqlserver"
echo " 停止服务: docker-compose -f docker-compose-sqlserver.yml down"
echo " 进入容器: docker exec -it sqlserver-2022 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P '$(grep SQLSERVER_SA_PASSWORD .env | cut -d'=' -f2)'"
echo ""
echo "详细说明请查看 SQLServer-README.md"