萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

SQL 基礎教程(一):CREATE DATABASE 與 DROP DATABASE 語法詳解與最佳實踐

數據庫是數據管理的容器,創建與刪除是 DBA 與開發者的日常核心操作。本文詳細講解 SQL Server 中 CREATE DATABASE 的完整語法選項(文件組、文件規範、自動增長、上限)、DROP DATABASE 的執行前提與風險控制,並提供生產環境參數化腳本模板與避坑指南。

一、CREATE DATABASE:完整語法與參數詳解

1. 最簡語法(自動使用默認路徑/大小/增長)

CREATE DATABASE [DatabaseName];

適用:測試環境、快速原型。生產環境嚴禁使用,將導致文件置於系統盤、默認 1MB/10% 增長引發碎片與性能問題。

2. 生產級完整語法模板

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;                              -- 信任位(安全關閉)

3. 核心參數最佳實踐

參數建議值/策略理由
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:刪除操作與風險控制

1. 基本語法

DROP DATABASE [DatabaseName] [ ,...n ] ;

2. 執行前提條件(任一不滿足將報錯)

  • 無用戶連接:數據庫處於單用戶模式 (ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE) 或無活躍會話。
  • 無數據庫快照:需先刪除所有關聯快照。
  • 非系統數據庫:master、model、msdb、tempdb 不可刪除。
  • 非當前上下文:執行 DROP 時當前連接不在目標數據庫中。

3. 安全刪除標準流程

-- 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

4. 物理文件清理

DROP DATABASE 會自動刪除所有關聯物理文件(.mdf、.ndf、.ldf)。若需保留文件(如遷移數據),請改用 DETACH DATABASE。

三、進階主題:文件組、文件流、含 FILESTREAM/FILETABLE 的創建

1. 多文件組創建示例

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 );

2. 啟用 FILESTREAM(非結構化大對象存儲)

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

五、自動化腳本模板(PowerShell + dbatools)

# 需安裝 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 的基本功。刪除操作雖簡單,但「備份驗證、斷連強制、快照清理」三步曲不可省略。建議將本文模板納入團隊代碼規範,所有數據庫創建走代碼評審流程。

copyright © 萬盛學電腦網 all rights reserved