Giới thiệu
Các tệp dữ liệu là các đối tượng vật lý cấu thành phần quan trọng nhất của hệ thống cơ sở dữ liệu vì chúng chứa dữ liệu thực tế. Bạn có thể coi cơ sở dữ liệu như một tập hợp các tệp dữ liệu. Một phiên bản cung cấp cho bạn phương tiện để gắn và truy cập các tệp như vậy.
Ở đây, quản lý tệp dữ liệu là hiểu cách theo dõi và thay đổi kích thước tệp dữ liệu hiện có cũng như cách thêm hoặc xóa tệp dữ liệu khỏi cơ sở dữ liệu.
Mã T-SQL cho các hoạt động này có trong tài liệu của Microsoft. Tuy nhiên, trong bài viết này, chúng tôi muốn thảo luận về các chiến thuật xoay quanh việc quản lý các tệp này cho những người trong chúng tôi, những người vẫn chạy cài đặt tại chỗ của SQL Server.
Các loại tệp dữ liệu và các vấn đề có thể xảy ra
Đối với mỗi cơ sở dữ liệu mới được tạo trong SQL Server, chúng ta phải tạo ít nhất hai tệp - một tệp dữ liệu chính và một tệp nhật ký.
- Tệp dữ liệu chính có phần mở rộng .MDF.
- Tệp nhật ký có phần mở rộng .LDF.
- Khi chúng tôi thêm các tệp dữ liệu vào cơ sở dữ liệu SQL Server, chúng tôi thường sử dụng phần mở rộng .NDF.
Lưu ý :Có thể tạo các tệp dữ liệu trong SQL Server mà không cần bất kỳ phần mở rộng nào, nhưng đó không phải là cách tốt nhất. Việc sử dụng .mdf, .ndf và .ldf giúp phân biệt các tệp này khi chúng tôi xem chúng ở cấp hệ điều hành.
Rõ ràng, các tệp dữ liệu được tạo khi bạn tạo cơ sở dữ liệu. Bạn có thể làm điều đó với TẠO CƠ SỞ DỮ LIỆU yêu cầu. Mặc dù có vẻ dễ dàng như vậy nhưng bạn nên lưu ý các vấn đề có thể xảy ra.
Tùy thuộc vào mức độ lớn của cơ sở dữ liệu và các tệp dữ liệu liên quan của nó, bạn có thể phải đối mặt với các vấn đề phân mảnh và các rắc rối khác về thời gian sao lưu và di chuyển dữ liệu của mình. Điều này xảy ra do các tệp dữ liệu không được định kích thước chính xác.
Hãy xem hình minh họa bên dưới. Nó hiển thị kết quả của việc thực hiện TẠO CƠ SỞ DỮ LIỆU và cung cấp tên của cơ sở dữ liệu (MyDB).
Liệt kê 1 hiển thị chi tiết cơ sở dữ liệu đã tạo:
-- Listing 1: Create Database Script
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Bạn có thể tự hỏi SQL Server lấy tất cả các tùy chọn đó từ đâu, vì tất cả những gì chúng tôi đã làm là phát hành MyDB TẠO CƠ SỞ DỮ LIỆU.
SQL Server sử dụng cài đặt cơ sở dữ liệu mô hình làm giá trị mặc định cho bất kỳ cơ sở dữ liệu mới nào được tạo trên phiên bản đó. Trong trường hợp này, chúng tôi thấy kích thước tệp ban đầu là 100MB. Tự động phát triển là 12MB và 64MB tương ứng cho các tệp dữ liệu và nhật ký.
Các vấn đề tiếp theo
Hàm ý của các cài đặt được đánh dấu trong Hình 1 là:
- Tệp dữ liệu chính bắt đầu từ kích thước 100MB. Nó là một kích thước nhỏ. Do đó, tùy thuộc vào mức độ hoạt động trong cơ sở dữ liệu, nó sẽ cần phải phát triển rất sớm.
- Bất cứ khi nào có nhu cầu autogrow tệp dữ liệu, máy chủ SQL cần có 128MB từ dung lượng có sẵn trên hệ điều hành. Một lần nữa, nó nhỏ, ngụ ý rằng cơ sở dữ liệu sẽ tự động đăng nhập thường xuyên . Tăng trưởng cơ sở dữ liệu là một hoạt động tốn kém có thể ảnh hưởng đến hiệu suất nếu nó xảy ra quá thường xuyên. Bên cạnh đó, sự tăng trưởng cơ sở dữ liệu thường xuyên có thể gây ra một hiện tượng gọi là phân mảnh, đến lượt nó, có khả năng gây ra sự suy giảm hiệu suất nghiêm trọng trên cơ sở dữ liệu. Một khía cạnh khác của việc đặt gia số thành giá trị cao có thể khiến các hoạt động tăng trưởng mất nhiều thời gian để hoàn thành, tùy thuộc vào hiệu suất của hệ thống lưu trữ cơ bản.
- Các tệp cơ sở dữ liệu có thể phát triển vô thời hạn. Có nghĩa là, với một khoảng thời gian đủ cho phép, các tệp này có thể chiếm hết dung lượng trên ổ đĩa mà chúng đang ngồi. Để di chuyển chúng, bạn yêu cầu một khối lượng bằng kích thước của chúng trở lên. Một tùy chọn khác là thêm dung lượng lưu trữ vào ổ khi các tệp này đang ở chế độ ngồi.
Đây là những vấn đề chính liên quan đến tùy thuộc vào các giá trị mặc định để tạo cơ sở dữ liệu.
Phân bổ trước
Với tác động hiệu suất của sự tăng trưởng, sẽ có ý nghĩa hơn nếu kích thước chính xác cơ sở dữ liệu khi bắt đầu dự án. Bằng cách này, chúng tôi đáp ứng các yêu cầu giải pháp cho tương lai gần.
Giả sử rằng chúng tôi biết cơ sở dữ liệu của chúng tôi cuối cùng sẽ có kích thước 1GB. Chúng tôi có thể phân bổ 1GB bộ nhớ khi dự án bắt đầu. Sau đó, cơ sở dữ liệu không bao giờ cần phát triển. Nó giúp loại bỏ các vấn đề phân mảnh do tăng trưởng cơ sở dữ liệu.
Liệt kê 2 hiển thị tập lệnh áp dụng cho phân bổ trước:
-- Listing 2: Create Database Script with Pre-allocation
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 1024MB , MAXSIZE = 2048MB, FILEGROWTH = 512MB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Chúng tôi đề cập đến 1GB dung lượng cho mục đích trình diễn. Thông thường, cơ sở dữ liệu sản xuất có thể yêu cầu 1TB. Vấn đề là:phân bổ không gian cần thiết ngay từ đầu. Sau đó, bạn loại bỏ hoặc giảm đáng kể nhu cầu tăng trưởng.
Bây giờ, chúng ta phải tự hỏi mình liệu chúng ta có thực sự muốn một tệp 1TB duy nhất trên ổ đĩa của chúng ta hay không. Sẽ là khôn ngoan nếu bạn chia nó thành nhiều phần nhỏ hơn. Khi các hoạt động song song, chẳng hạn như sao lưu, xảy ra, mỗi tệp sẽ được giải quyết bởi một luồng CPU duy nhất cho một hệ thống đa xử lý. Với một tệp duy nhất, nó sẽ không diễn ra suôn sẻ.
Một lần nữa, chúng tôi sửa đổi tập lệnh của mình để đáp ứng yêu cầu này trong Liệt kê 3:
-- Listing 3: Create Database Script with Pre-allocation and
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.mdf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB )
( NAME = N'MyDB03', FILENAME = N'C:\MSSQL\Data\MyDB03.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB04', FILENAME = N'C:\MSSQL\Data\MyDB04.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB05', FILENAME = N'C:\MSSQL\Data\MyDB05.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Thông tin bổ sung
Chúng tôi cũng nên đề cập rằng không có giá trị khi sử dụng phương pháp này cho các tệp nhật ký. Vấn đề là, SQL Server luôn ghi vào các tệp nhật ký một cách tuần tự. Ngoài ra, chúng tôi đã sử dụng phần mở rộng .ndf cho các tệp mới mà chúng tôi đang thêm.
Điều khoản MAXSIZE đảm bảo rằng các tệp dữ liệu của chúng tôi sẽ không phát triển vô thời hạn. Chúng tôi đã đặt cho mỗi tệp một tên logic và tên vật lý khác nhau - mệnh đề NAME chỉ định tên logic của tệp và mệnh đề FILENAME chỉ định tên vật lý.
Tạo cơ sở dữ liệu với các tệp dữ liệu lớn hơn sẽ mất nhiều thời gian hơn so với cách khác. Tôi có thể hợp lý hơn nếu tạo một cơ sở dữ liệu nhỏ trước, sau đó thao tác với nó bằng các lệnh thích hợp để thay đổi kích thước và thêm tệp, cho đến khi chúng ta thiết lập một cấu trúc cơ sở dữ liệu lý tưởng.
Bằng cách tạo cơ sở dữ liệu với các tùy chọn rõ ràng, chúng tôi đã giải quyết ba mối quan tâm được nêu ra trước đó trong bài viết này. Hình 2 cho thấy kết quả của phương pháp này:
Bây giờ chúng ta có một cơ sở dữ liệu được định cấu hình đúng cách để đáp ứng sự tăng trưởng dữ liệu trong một khoảng thời gian kéo dài mà không cần phải tăng trưởng tệp dữ liệu. Nó loại bỏ rủi ro phân mảnh và giúp đảm bảo quản lý tệp dữ liệu tốt hơn.
Quản lý tệp dữ liệu
Thay vì tạo bốn hoặc năm tệp dữ liệu trong câu lệnh CREATE DATABASE, chúng ta có thể sử dụng mệnh đề SỬA ĐỔI và THÊM của câu lệnh ALTER DATABASE T-SQL.
Một lần nữa, chúng ta bắt đầu với câu lệnh được hiển thị trong Liệt kê 4 bên dưới. Nó tạo ra một cơ sở dữ liệu duy nhất với tệp dữ liệu 100MB và tệp nhật ký đi kèm. Mục tiêu của chúng tôi là đảm bảo phân bổ trước bằng cách mở rộng tệp này và sau đó thêm các tệp khác.
-- Listing 4: Create Database Script
USE [master]
GO
IF EXISTS (SELECT * FROM sys.databases WHERE name='MyDB')
DROP DATABASE MyDB;
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Mở rộng tệp dữ liệu
Câu lệnh T-SQL mở rộng tệp dữ liệu được hiển thị trong Liệt kê 5. Nó chỉ định tên cơ sở dữ liệu, tên tệp, kích thước ban đầu và gia số mong muốn. Trong trường hợp này, chúng tôi đặt SQL Server phân bổ 1GB khi bắt đầu và sau đó phân bổ 512MB cho tất cả các lần tăng trưởng tự động tiếp theo.
-- Listing 5: Extend the Primary Datafile
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , FILEGROWTH = 524288KB )
GO
Liệt kê 6 cho thấy mã sẽ trông như thế nào nếu chúng tôi chỉ định MAXSIZE là 2GB:
-- Listing 6: Extend the Primary Datafile with Maximum Size
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB )
GO
Nếu chúng tôi đặt mệnh đề FILEGROWTH thành 0, chúng tôi đặt SQL Server KHÔNG tự động duyệt tệp dữ liệu . Trong trường hợp này, chúng tôi cần đưa ra các lệnh một cách rõ ràng để phát triển tệp dữ liệu hoặc thêm các tệp khác.
Thêm tệp dữ liệu
Liệt kê 7 cho thấy mã chúng tôi sử dụng để thêm tệp dữ liệu mới vào cơ sở dữ liệu. Lưu ý rằng chúng ta phải chỉ định lại tên tệp logic và tên tệp vật lý bao gồm đường dẫn đầy đủ.
Ngoài ra, chúng tôi có thể đặt tệp vật lý trên một ổ đĩa khác. Để làm được điều đó, chúng ta chỉ cần thay đổi đường dẫn.
-- Listing 7: Add Data Files to the Primary Filegroup
USE [master]
GO
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.ndf' , SIZE = 1048576KB , FILEGROWTH = 524288KB ) TO FILEGROUP [PRIMARY]
GO
Việc mở rộng và thêm các tệp dữ liệu cũng áp dụng cho trường hợp chúng tôi chọn tắt tự động phát triển cho cơ sở dữ liệu của chúng tôi (Xem Hình 4).
Sau đó, chúng ta cần mở rộng cơ sở dữ liệu theo cách thủ công bằng cách sử dụng các mã trên từ Liệt kê 5 hoặc 6 hoặc thêm tệp như trong Liệt kê 7.
Sử dụng Nhóm tệp
Nhóm tệp cho phép chúng tôi quản lý các bộ sưu tập tệp dữ liệu cùng nhau. Chúng ta có thể nhóm hợp lý một số tệp dữ liệu được lưu trữ trên các đĩa khác nhau hoặc các khối lượng khác nhau thành một nhóm tệp. Nhóm tệp đó tạo ra một lớp trừu tượng giữa các bảng và chỉ mục cũng như các tệp vật lý thực sự lưu trữ dữ liệu.
Do đó, nếu chúng ta tạo một bảng trên một nhóm tệp, thì dữ liệu trong bảng này sẽ được phân bổ trên tất cả các tệp dữ liệu được chỉ định cho nhóm tệp.
Cho đến thời điểm này, chúng tôi chỉ xử lý nhóm tệp CHÍNH. Liệt kê 8 cho thấy cách chúng ta có thể thêm tệp mới MyDB02 vào nhóm tệp, không phải nhóm tệp chính.
Câu lệnh đầu tiên sau khi thiết lập ngữ cảnh cơ sở dữ liệu để làm chủ sẽ tạo nhóm tệp mới FG01. Sau đó, câu lệnh tiếp theo sẽ thêm tệp vào nhóm tệp mới này với các tùy chọn tương tự như các tùy chọn được sử dụng trong Liệt kê 7.
-- Listing 8: Add Data Files to the Primary Filegroup
USE [master]
GO
ALTER DATABASE [MyDB] ADD FILEGROUP [FG01]
GO
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 102400KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB ) TO FILEGROUP [FG01]
GO
Giảm tệp dữ liệu
Hình 5 cho thấy kết quả của các hoạt động chúng tôi đã thực hiện cho đến nay. Chúng tôi có ba tệp dữ liệu. Hai trong số chúng nằm trong nhóm tệp CHÍNH và cái thứ ba nằm trong nhóm tệp FG01.
Ví dụ, giả sử chúng ta đã làm sai điều gì đó, đặt sai kích thước tệp. Sau đó, chúng ta có thể thả nhóm tệp bằng cách sử dụng mã sau trong Liệt kê 9:
-- Listing 9: Drop Data Files
USE [MyDB]
GO
ALTER DATABASE [MyDB] REMOVE FILE [MyDB02]
GO
Kết luận
Bài viết này đã khám phá các loại tệp cơ sở dữ liệu, các biến chứng có thể xảy ra do sự phát triển của tệp dữ liệu và các cách giải quyết vấn đề. Ngoài ra, chúng tôi đã kiểm tra các mã T-SQL để mở rộng tệp dữ liệu và thêm tệp dữ liệu mới vào cơ sở dữ liệu. Chúng tôi cũng đề cập đến việc sử dụng các nhóm tệp.
Mục tiêu của chúng tôi là đảm bảo rằng khi chúng tôi triển khai cơ sở dữ liệu, chúng tôi chuẩn bị cơ sở dữ liệu để lưu trữ tất cả dữ liệu cần thiết cho một ứng dụng cụ thể.
Tài liệu tham khảo
- Tệp Cơ sở dữ liệu và Nhóm tệp