數據庫是數據管理的容器,創建與刪除是 DBA 與開發者的日常核心操作。本文詳細講解 SQL Server 中 CREATE DATABASE 的完整語法選項(文件組、文件規範、自動增長、上限)、DROP DATABASE 的執行前提與風險控制,並提供生產環境參數化腳本模板與避坑指南。
CREATE DATABASE [DatabaseName];
適用:測試環境、快速原型。生產環境嚴禁使用,將導致文件置於系統盤、默認 1MB/10% 增長引發碎片與性能問題。
CREATE DATABASE [MyApp_Prod]
ON PRIMARY
(
NAME = N'MyApp_Prod_Data', -- 邏輯文件名
FILENAME = N'E:\SQLData\MyApp_Prod_Data.mdf', -- 物理路徑(專用數據盤)
SIZE = 10240MB, -- 初始大小:預分配業務預估 6-12 個月容量
MAXSIZE = UNLIMITED, -- 或具體上限如 500GB
FILEGROWTH = 512MB -- 固定增長量,禁用百分比(碎片化風險)
)
LOG ON
(
NAME = N'MyApp_Prod_Log',
FILENAME = N'F:\SQLLog\MyApp_Prod_Log.ldf', -- 物理路徑(專用日志盤,隔離 IO)
SIZE = 2048MB,
MAXSIZE = 100GB,
FILEGROWTH = 256MB
)
WITH
CONTAINMENT = NONE, -- 部分獨立數據庫 (Contained DB) 可設 PARTIAL
DEFAULT_FULLTEXT_LANGUAGE = 1033, -- 全文檢索默認語言
DB_CHAINING OFF, -- 跨數據庫所有權鏈(安全關閉)
TRUSTWORTHY OFF; -- 信任位(安全關閉)
| 參數 | 建議值/策略 | 理由 |
|---|---|---|
| SIZE (初始大小) | 預估 6-12 個月數據增長總量 | 避免頻繁自動增長導致文件碎片、I/O 暴增、業務卡頓 |
| FILEGROWTH (增長量) | 固定值:數據文件 256-1024MB,日志文件 128-512MB | 百分比增長不可控,大表增長時單次耗時極長;固定值可預測 |
| MAXSIZE | 數據文件 UNLIMITED(磁盤配額控制);日志文件設上限防佔滿磁盤 | 日志失控會導致磁盤滿、數據庫掛起 |
| 文件路徑分離 | 數據 (MDF/NDF) 、日志 (LDF) 、TempDB、備份 分別掛載不同物理磁盤/RAID 組 | 消除 IO 爭搶,故障域隔離 |
| 多文件組 | 大型庫建議:PRIMARY (系統表)、DATA (用戶表)、INDEX (非聚簇索引)、ARCHIVE (歷史數據) | 文件組級別備份/恢復、分層存儲 (熱數據 SSD、冷數據 HDD) |
| 瞬間文件初始化 (IFI) | 授予 SQL Server 服務賬號 SE_MANAGE_VOLUME_NAME 權限 (執行策略: 服務賬號 -> 本地安全策略 -> 分配用戶權限 -> 執行卷維護任務) | 數據文件創建/擴展跳過零填充,秒級完成 TB 級擴展;日志文件不適用 |
DROP DATABASE [DatabaseName] [ ,...n ] ;
ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE) 或無活躍會話。-- 1. 確認備份可用性
RESTORE VERIFYONLY FROM DISK = '...last_full.bak';
-- 2. 切換上下文
USE master;
GO
-- 3. 強制斷開連接並進入單用戶模式
ALTER DATABASE [MyApp_Prod] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 4. 刪除數據庫快照(如有)
-- DROP DATABASE [MyApp_Prod_Snapshot_...];
-- 5. 執行刪除
DROP DATABASE [MyApp_Prod];
GO
DROP DATABASE 會自動刪除所有關聯物理文件(.mdf、.ndf、.ldf)。若需保留文件(如遷移數據),請改用 DETACH DATABASE。
CREATE DATABASE [DW_Prod]
ON PRIMARY
( NAME = DW_Prod_Sys, FILENAME = 'E:\Data\DW_Prod_Sys.mdf', SIZE = 100MB, FILEGROWTH = 50MB ),
FILEGROUP [DATA] DEFAULT -- 設置為默認文件組
( NAME = DW_Prod_Data, FILENAME = 'E:\Data\DW_Prod_Data.ndf', SIZE = 50GB, FILEGROWTH = 5GB ),
FILEGROUP [INDEX]
( NAME = DW_Prod_Idx, FILENAME = 'F:\Index\DW_Prod_Idx.ndf', SIZE = 20GB, FILEGROWTH = 2GB ),
FILEGROUP [ARCHIVE] READ_ONLY -- 歷史歸檔唯讀,備份可跳過
( NAME = DW_Prod_Arc, FILENAME = 'G:\Archive\DW_Prod_Arc.ndf', SIZE = 100GB, FILEGROWTH = 10GB )
LOG ON
( NAME = DW_Prod_Log, FILENAME = 'L:\Log\DW_Prod_Log.ldf', SIZE = 10GB, FILEGROWTH = 1GB );
CREATE DATABASE [FS_DB]
ON PRIMARY
( NAME = FS_DB_Data, FILENAME = 'E:\Data\FS_DB_Data.mdf', SIZE = 100MB ),
FILEGROUP [FS_FG] CONTAINS FILESTREAM
( NAME = FS_DB_FS, FILENAME = 'E:\FSData\FS_DB_FS' ) -- 目錄而非文件
LOG ON
( NAME = FS_DB_Log, FILENAME = 'F:\Log\FS_DB_Log.ldf', SIZE = 100MB )
WITH FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = 'FS_DB');
前提:實例級啟用 FILESTREAM(配置管理器 → FILESTREAM 標籤 → 勾選所有選項)。
| 錯誤代碼/現象 | 原因 | 解決 |
|---|---|---|
| Msg 1801: Database 'xxx' already exists | 同名數據庫已存在 | DROP 現有或更換名稱 |
| Msg 5133: Directory lookup failed | 路徑不存在、權限不足、路徑含中文/特殊字符 | 創建目錄、授予服務賬號修改權限、使用純 ASCII 路徑 |
| Msg 1823: A database snapshot exists | 存在快照未刪除 | 先 DROP SNAPSHOT |
| Msg 3702: Cannot drop database in use | 有活躍連接 | ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE |
| 自動增長頻繁觸發 | 初始 SIZE 過小、FILEGROWTH 百分比/過小 | 調大 SIZE、改固定值 FILEGROWTH、啟用 IFI |
# 需安裝 dbatools: Install-Module dbatools
$params = @{
SqlInstance = 'PROD-SQL-01'
Name = 'MyApp_Prod'
DataFilePath = 'E:\SQLData'
LogFilePath = 'F:\SQLLog'
DataFileSize = '10GB'
LogFileSize = '2GB'
DataFileGrowth= '512MB'
LogFileGrowth = '256MB'
Collation = 'Chinese_PRC_CI_AS'
Owner = 'sa'
}
New-DbaDatabase @params -EnableException
dbatools 自動處理 IFI 權限檢查、路徑創建、多文件組、權限授予,極大降低人為錯誤。
CREATE DATABASE 看似簡單,實則決定了數據庫生命週期的 IO 性能、可維護性、擴展性與災難恢復能力。將「預分配空間、固定增長、文件分離、IFI 啟用、多文件組分層」內化為肌肉記憶,配合自動化腳本交付,是專業 DBA 的基本功。刪除操作雖簡單,但「備份驗證、斷連強制、快照清理」三步曲不可省略。建議將本文模板納入團隊代碼規範,所有數據庫創建走代碼評審流程。