Archive for the ‘Database Administration’ Category

 

Log File Để Làm Gì

Khi bạn dùng Microsoft Word, bạn để ý thấy có một file tạm nằm cùng trong folder với file chính. Nếu windows bị shutdown đột ngột file tạm vẫn nằm ở đó, còn khi bạn soạn thảo xong và đóng Word lại thì file đó tự động bị xóa. File tạm này dùng cho các chức năng như autosave, recovery khi bị đóng đột ngột, undo… Log file trong SQL Server cũng có chức năng giống như file tạm đó, nhưng ở mức tinh vi hơn. Nó đóng góp rất nhiều vai trò trong tính năng ACID của hệ thống (ACID = Atom – nguyên tử, Consistency – toàn vẹn, Isolation – cô lập, và Durability – bền bỉ). Với Word thì đó chỉ là tính năng tiện lợi cho người dùng, còn với SQL Server thì đó là cam kết của hệ thống đối với dữ liệu và các giao dịch thực hiện trên nó.
Khi nhận được một lệnh cập nhật dữ liệu, các bước sau sẽ xảy ra bên trong hệ thống: … đọc tiếp »

Posted on 31/10/2014 by Vũ Huy Tâm | Categories: Bên trong SQL Server, Database Administration

Cấu Hình SQL Server Để Gửi Mail

Bài này nói về cách gửi email trong SQL Server bằng chức năng Database Mail. Chức năng cũ SQL Mail không còn được hỗ trợ nữa.
Việc đầu tiên là bạn cần bật chức năng Database Mail, bằng đoạn code sau:

SP_CONFIGURE 'show advanced options', 1;
GO
RECONFIGURE;
GO
SP_CONFIGURE 'Database Mail XPs', 1;
GO
RECONFIGURE
GO

Sau đó trong Management Studio, … đọc tiếp »

Posted on 18/8/2014 by Vũ Huy Tâm | Categories: Database Administration

Thiết Lập Cho xp_cmdshell

SQL Server là hệ quản trị dữ liệu, khả năng chính của nó là lưu trữ và truy xuất dữ liệu. Tuy nhiên đôi lúc bạn cần thực hiện một số thao tác của windows từ SQL Server, ví dụ khi bạn cần viết sql script để copy file từ folder này sang folder khác; hoặc tự động restore từ file backup mới nhất dựa theo ngày tạo (tên file không biết trước). SQL Server cung cấp thủ tục xp_cmdshell trong master database để làm việc này.
Để có thể gọi đến xp_cmdshell đòi hỏi một vài bước thiết lập.
Nếu bạn là DBA với quyền sysadmin, bạn cần cấu hình lại server để bật xp_cmdshell (khi SQL Server mới cài đặt tính năng này bị tắt): … đọc tiếp »

Posted on 14/3/2014 by Vũ Huy Tâm | Categories: Bảo mật, Database Administration, Uncategorized

Di chuyển Database File

Khi bạn cần chuyển database file (data file hoặc log file) sang ổ cứng khác để giải phóng không gian đĩa hiện tại, một cách hiển nhiên bạn có thể làm là backup database đó hoặc lấy file backup gần đây nhất, và restore lại trên cùng server với lựa chọn đặt file sang ổ đĩa mới. Bài viết Di Chuyển File Khi Khôi Phục Dữ liệu mô tả chi tiết cách làm này. Tuy nhiên trong suốt quá trình restore, database sẽ không truy cập được. Nếu database lớn, thời gian restore sẽ kéo dài gây gián đoạn sử dụng cho người dùng. Một cách làm đơn giản hơn là đặt database thành offline và copy file sang thư mục mới, như ví dụ dưới đây:

ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE --đóng hết các connection tới database
 
ALTER DATABASE MyDB SET OFFLINE --đặt database thành offline
 
ALTER DATABASE MyDB MODIFY FILE 
(
   Name = MyDB,
   Filename = 'N:\DATA\MyDB.MDF' --Giả dụ N: là ổ đĩa mới
)

Điểm quan trọng nhất trong đoạn lệnh trên là lệnh ALTER DATABASE thứ ba, lệnh này cập nhật system catalog để báo cho hệ thống biết file giờ nằm ở đâu. Bước tiếp theo bạn cần copy file MyDB.MDF từ thư mục hiện tại sang thư mục mới N:\DATA\, bước này nằm ngoài SQL Server và bạn cần dùng windows để copy. Sau khi copy xong, bạn quay lại Management Studio và chạy hai lệnh:

ALTER DATABASE MyDB SET ONLINE --đặt database trở lại online
 
ALTER DATABASE MyDB SET MULTI_USER --đặt trở lại chế độ nhiều người dùng

Đến đây bạn có thể xóa file MyDB.MDF ở folder cũ và quá trình như vậy là hoàn tất.

Posted on 24/2/2014 by Vũ Huy Tâm | Categories: Database Administration

Partition Bảng Đã Có Sẵn

Trong loạt bài về phân đoạn bảng và index, tôi đã giới thiệu về kiến trúc phân đoạn của SQL Server. Các ví dụ nêu trong các bài đó đều sử dụng bảng được tạo lần đầu và áp dụng phân đoạn lên nó. Một câu hỏi thường gặp là, làm thế nào để phân đoạn một bảng đã có sẵn dữ liệu? Bảng này có thể chưa được phân đoạn, hoặc đã được phân đoạn theo một cách khác, nay bạn muốn phân đoạn lại theo cách hợp lý hơn.
Có một cách làm thực ra rất đơn giản mà nếu bạn để ý một tẹo là thấy ngay, đó là trong SQL Server clustered index chính là bảng, nói cách khác là bảng được lưu trữ thành một cây index và cây này chính là clustered index. Vì vậy để phân đoạn bảng bạn chỉ việc phân đoạn clustered index của nó, bằng cách tạo lại clustered index trên partition scheme. … đọc tiếp »

Posted on 31/10/2013 by Vũ Huy Tâm | Categories: Database Administration, Index, Table partitioning

Di Chuyển File Khi Khôi Phục Dữ liệu

Khi bạn cần khôi phục (restore) database từ file backup từ một server khác, sự phân bố file trên server kia có thể khác với server này và khi restore bạn cần lưu ý đến điều đó. Ví dụ, trên server nguồn (server 1) data file nằm ở ổ E: và log file nằm ở ổ F:; trong khi server mà bạn đang restore lên (server 2) không có ổ E: và F: mà thay vào đó data file được chứa ở ổ P: và log file ở ổ Q:. Khi đó lệnh RESTORE thông thường sẽ gây ra thông báo lỗi:

RESTORE FILELISTONLY
FROM DISK='\\Server1\E$\Backup\TestDB.bak' 
--kết quả
--LogicalName	PhysicalName
--TestDB	E:\Data\TestDB.mdf
--TestDB_log	F:\Log\TestDB_log.LDF
 
RESTORE DATABASE TestDB
FROM DISK='\\Server1\E$\Backup\TestDB.bak'


Msg 5133, Level 16, State 1, Line 1
Directory lookup for the file “E:\Data\TestDB.mdf” failed with the operating system error 3(The system cannot find the path specified.).
Msg 3156, Level 16, State 3, Line 1
File ‘TestDB’ cannot be restored to ‘E:\Data\TestDB.mdf’. Use WITH MOVE to identify a valid location for the file.
Msg 5133, Level 16, State 1, Line 1
Directory lookup for the file “F:\Log\TestDB_log.LDF” failed with the operating system error 2(The system cannot find the file specified.).
Msg 3156, Level 16, State 3, Line 1
File ‘TestDB_log’ cannot be restored to ‘F:\Log\TestDB_log.LDF’. Use WITH MOVE to identify a valid location for the file.
Msg 3119, Level 16, State 1, Line 1
Problems were identified while planning for the RESTORE statement. Previous messages provide details.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

Lỗi dài dòng nhưng tóm lại là nó phàn nàn là không thể restore data file vào ổ E và log file vào ổ F như yêu cầu, và gợi ý dùng “WITH MOVE” để chọn địa điểm khác. Cách khắc phục là bạn đưa lựa chọn “WITH MOVE” vào lệnh RESTORE và cung cấp địa điểm thích hợp:

RESTORE DATABASE TestDB
FROM DISK='\\Server1\E$\Backup\TestDB.bak' 
WITH MOVE 'TestDB' TO 'P:\Data\TestDB.mdf',
MOVE 'TestDB_log' TO 'Q:\Log\TestDB_log.ldf'
Posted on 13/8/2013 by Vũ Huy Tâm | Categories: Database Administration

Các Thuộc Tính ACID

ACID là viết tắt của cụm từ Atomicity (nguyên tử), Consitency (nhất quán), Isolation (Cô lập), và Durability (Lâu bền). Đây là các thuộc tính mà mọi transaction đều được đảm bảo bởi SQL Server.
Atomicity: Thuộc tính này đảm bảo mỗi transaction là một khối duy nhất, được thực hiện trọn vẹn hoặc hoàn toàn không được thực hiện. Nếu có một lỗi nào đó xảy ra trong transaction, nó sẽ được quay trở lại (rollback) trạng thái ban đầu. Khi bạn gom nhiều lệnh vào một transaction (bao giữa BEGIN TRAN và COMMIT), sẽ chỉ có hai khả năng được phép xảy ra là, tất cả các lệnh này sẽ được thực hiện hoặc không có lệnh nào được thực hiện. Ở mức từng lệnh, SQL Server cũng đảm bảo tính atomicity, ví dụ một lệnh INSERT cho 10 bản ghi, nếu đang thêm được 5 bản ghi thì gặp lỗi, hệ thống sẽ hủy bỏ và không bản ghi nào được thêm. Nếu lệnh có kèm theo trigger, lỗi ở trigger cũng kéo theo lệnh bị hủy bỏ.
Khi bạn phát ra lệnh ROLLBACK, tất cả các lệnh đã thực hiện cũng bị quay lui và transaction trở lại trạng thái như trước khi thực hiện.
Consistency: SQL Server đảm bảo ở mọi thời điểm dữ liệu luôn luôn phải nhất quán, tức là tuân theo các ràng buộc đã được định nghĩa (ví dụ trường kiểu ngày phải chứa dữ liệu kiểu ngày, bản ghi bán hàng phải có mã sản phẩm hợp lệ…). Khi transaction được thực hiện, dữ liệu sau khi cập nhật cũng phải ở trạng thái nhất quán. Nếu transaction gây ra những vi phạm về ràng buộc dữ liệu, hệ thống sẽ không cho phép thực hiện tiếp và hủy bỏ toàn bộ transaction.
Isolation: Cũng như các hệ thống server khác, SQL Server có thể đáp ứng nhiều yêu cầu xảy ra đồng thời. Nhưng mỗi transaction được đảm bảo thực hiện trong một ngữ cảnh riêng biệt của nó và không bị ảnh hưởng bởi các transaction khác. Khi hai transaction cùng cập nhật một dữ liệu, SQL Server đảm bảo chúng được thực hiện tuần tự không dẫm lên chân của nhau.
Durability: Khi transaction thực hiện xong (đã commit), những cập nhật trở nên cố định và dữ liệu sẽ luôn luôn là như vậy. Khi hệ thống gặp sự cố bất ngờ, trong quá trình khôi phục lại nó sẽ đảm bảo khôi phục lại dữ liệu cho những transaction đã được commit.

Posted on 4/4/2013 by Vũ Huy Tâm | Categories: Database Administration

Filegroup Trong SQL Server

Filegroup là tên đặt cho một nhóm data file trong SQL Server. Filegroup không chứa dữ liệu, mà chỉ định nghĩa ở mức logic các data file nằm trong đó, và đến lượt các data file này mới thực chứa dữ liệu. Bạn có thể hình dung filegroup giống như một thư mục của Windows, và các data file thuộc về filegroup đó tương tự như các file trong thư mục. Khi bạn tạo một database, ở mức đơn giản nhất sẽ có hai file được tạo ra là một log file (.ldf) và một data file (.mdf). Tuy nhiên một điều có thể bạn ít để ý hơn là cũng có một filegroup được tạo ra cùng với nó: … đọc tiếp »

Posted on 8/8/2012 by Vũ Huy Tâm | Categories: Database Administration, Thiết kế database