Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cơ sở dữ liệu hệ thống SQL Server - Khôi phục cơ sở dữ liệu hệ thống

Trong các bài trước của loạt bài Cơ sở dữ liệu hệ thống SQL Server, chúng ta đã tìm hiểu mục đích của tất cả cơ sở dữ liệu Hệ thống SQL Server như một phần của quá trình cài đặt SQL Server và hiểu các phương pháp hay nhất được triển khai cho chúng. Chúng tôi cũng đã hiểu chi tiết hơn về cơ sở dữ liệu Tempdb và MSDB. Vì Sao lưu và Khôi phục cơ sở dữ liệu Hệ thống hơi khác so với Cơ sở dữ liệu Người dùng, chúng ta sẽ xem xét chi tiết cách Sao lưu cơ sở dữ liệu Hệ thống và Khôi phục cơ sở dữ liệu hệ thống từ Bản sao lưu trong bài viết này.

Cơ sở dữ liệu SQL sao lưu

Thuật ngữ Sao lưu đề cập đến việc sao chép dữ liệu bên trong cơ sở dữ liệu dưới dạng tệp sao lưu có thể được sử dụng để khôi phục hoặc khôi phục thêm dữ liệu.

A Sao lưu đầy đủ của cơ sở dữ liệu sẽ chứa các bản sao dữ liệu trên các Tệp dữ liệu và tệp Nhật ký để khôi phục dưới dạng cơ sở dữ liệu hoặc khôi phục tại thời điểm trong trường hợp có bất kỳ thảm họa hoặc lỗi thảm khốc nào. Do đó, các Bản sao lưu đầy đủ thường xuyên trên hệ thống cũng như cơ sở dữ liệu Người dùng là rất quan trọng.

Ngoài Sao lưu toàn bộ, SQL Server hỗ trợ một số tùy chọn Sao lưu khác như Sao lưu khác biệt, Sao lưu bản ghi giao dịch, Sao lưu tệp, v.v., nhưng chúng tôi sẽ không tập trung vào chúng vì nó nằm ngoài phạm vi của bài viết này.

Bản sao lưu cơ sở dữ liệu đầy đủ phải được lên lịch để thực thi định kỳ hoặc sau bất kỳ thay đổi cấu hình cụ thể nào. Mặc dù SQL Server có thể chấp nhận Bản sao lưu cơ sở dữ liệu đầy đủ trong các phần mở rộng tệp khác nhau, bạn nên lưu bản sao lưu đó dưới dạng tệp * .bak để phân loại và bảo trì dễ dàng hơn.

Cú pháp cơ sở dữ liệu Sao lưu có sẵn rất nhiều tùy chọn, nhưng chúng tôi sẽ chỉ tập trung vào các lệnh cơ bản cần thiết để thực hiện Sao lưu toàn bộ cơ sở dữ liệu bất kỳ. Cú pháp đầy đủ có trong bài viết MSDN.

Cú pháp CƠ SỞ DỮ LIỆU DỰ PHÒNG (tối thiểu)

BACKUP DATABASE <Database_name> 
TO DISK = <File_Path>
GO

Cơ sở dữ liệu người dùng sao lưu

Để sao lưu đầy đủ AdventureWorks cơ sở dữ liệu, chỉ cần thay thế Tên cơ sở dữ liệu Đường dẫn tệp trong lệnh CƠ SỞ DỮ LIỆU DỰ PHÒNG ở trên và thực thi nó:

BACKUP DATABASE [AdventureWorks] 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak'
GO

Cơ sở dữ liệu hệ thống sao lưu

Sử dụng lệnh BACKUP DATABASE ở trên, chúng ta có thể sao lưu toàn bộ cơ sở dữ liệu hệ thống, chẳng hạn như master, msdb và model:

BACKUP DATABASE master 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak'
GO
BACKUP DATABASE model 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak'
GO
BACKUP DATABASE msdb 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak'
GO

Chúng tôi có thể điều hướng đến đường dẫn thư mục ở trên và ở đó chúng tôi thấy Bản sao lưu cơ sở dữ liệu đầy đủ được tạo thành công cho cả cơ sở dữ liệu người dùng và cơ sở dữ liệu hệ thống:

Có thể sao lưu cơ sở dữ liệu tempdb không?

Hãy thử sao lưu toàn bộ cơ sở dữ liệu hệ thống tempdb bằng cách sử dụng cùng một cú pháp CƠ SỞ DỮ LIỆU DỰ PHÒNG:

BACKUP DATABASE tempdb 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\tempdb_Full.bak'
GO

Như chúng ta đã thảo luận trong các bài viết trước, tempdb là cơ sở dữ liệu duy nhất mà Sao lưu không thể lấy được . Cơ sở dữ liệu tempdb sẽ được tạo mới bất cứ khi nào các dịch vụ SQL Server được khởi động. Do đó, nếu có bất kỳ sự cố nào với tempdb, việc khởi động lại dịch vụ SQL Server sẽ giúp giải quyết chúng.

Khôi phục cơ sở dữ liệu

Khôi phục cơ sở dữ liệu từ Sao lưu đầy đủ (*. Bak) sẽ đưa cơ sở dữ liệu trở lại với dữ liệu hoàn chỉnh hoặc “khôi phục” cơ sở dữ liệu về một thời điểm. Lệnh RESTORE cũng có thể được sử dụng để khôi phục Tệp, Nhóm tệp hoặc Nhật ký Giao dịch, nhưng nó không thuộc phạm vi của bài viết hiện tại.

Để khôi phục Bản sao lưu toàn bộ cơ sở dữ liệu , chúng ta có thể sử dụng cú pháp dưới đây. Lưu ý:Tương tự như lệnh BACKUP, lệnh RESTORE có nhiều tùy chọn, nhưng chúng tôi sẽ chỉ áp dụng cho những tùy chọn cơ bản. Bạn có thể tìm thông tin chi tiết về các tùy chọn đó trong một bài báo MSDN chuyên dụng.

Cú pháp KHÔI PHỤC CƠ SỞ DỮ LIỆU

RESTORE DATABASE <Database_Name> 
FROM  DISK = <File Path>
WITH  REPLACE
GO

Khôi phục cơ sở dữ liệu người dùng

Để khôi phục AdventureWorks cơ sở dữ liệu từ Bản sao lưu đầy đủ mà chúng tôi đã thực hiện trước đó, chúng tôi có thể sử dụng lệnh KHÔI PHỤC CƠ SỞ DỮ LIỆU, thay thế cho Tên cơ sở dữ liệu Đường dẫn tệp như hình dưới đây:

RESTORE DATABASE [AdventureWorks] 
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak' 
WITH REPLACE
GO

Khôi phục cơ sở dữ liệu mô hình

Hãy thử khôi phục cơ sở dữ liệu hệ thống mô hình bằng lệnh KHÔI PHỤC CƠ SỞ DỮ LIỆU:

RESTORE DATABASE model 
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak' 
WITH REPLACE
GO

Có thể khôi phục thành công sao lưu cơ sở dữ liệu mô hình bằng lệnh RESTORE DATABASE mặc định.

Khôi phục cơ sở dữ liệu chính

Bây giờ, hãy thử khôi phục Cơ sở dữ liệu chính của hệ thống bằng lệnh KHÔI PHỤC CƠ SỞ DỮ LIỆU:

RESTORE DATABASE master 
FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak' 
WITH  REPLACE
GO

Nó gây ra một lỗi cho biết rằng phiên bản SQL Server sẽ chạy ở chế độ một người dùng để khôi phục cơ sở dữ liệu chính. Như thông báo lỗi cho biết, chúng tôi cần khởi động phiên bản SQL Server của mình ở chế độ một người dùng và sau đó thử khôi phục cơ sở dữ liệu chính.

Để khởi động phiên bản SQL Server ở chế độ một người dùng, chúng tôi có thể áp dụng một trong các phương pháp sau:

  • Dấu nhắc lệnh
  • Tham số khởi động SQL Server trong Trình quản lý cấu hình SQL Server.

Phương pháp tiếp cận bằng dấu nhắc lệnh

Để khởi động phiên bản SQL Server ở chế độ một người dùng thông qua dấu nhắc lệnh, hãy mở Dấu nhắc lệnh bằng Chạy với tư cách quản trị viên tùy chọn như hình dưới đây:

Sau khi hoàn tất, hãy nhập lệnh:

NET STOP <SQL_Server_Service_Name>

SQL_Server_Service_Name có thể được lấy qua Trình quản lý cấu hình SQL Server hoặc services.msc

Trình quản lý cấu hình máy chủ SQL

Services.msc

Vì Dịch vụ máy chủ SQL của chúng tôi là phiên bản mặc định, chúng tôi có thể sử dụng tên MSSQLSERVER như đã đánh dấu ở trên. Sau khi nhập, nó sẽ yêu cầu xác nhận để dừng tất cả các dịch vụ phụ thuộc. Chúng tôi cũng có thể dừng Dịch vụ tác nhân SQL Server bằng cách nhập Y cho .

Khi Dịch vụ SQL Server bị dừng, chúng tôi có thể khởi động nó ở chế độ một người dùng. Chạy lệnh dưới đây trong đó / m nghĩa là khởi động Dịch vụ SQL Server ở chế độ một người dùng.

NET START MSSQLSERVER /m

Khi nó được thực hiện, chúng tôi có thể cố gắng khôi phục cơ sở dữ liệu chính. Chạy lệnh RESTORE BACKUP như trước:

Bằng cách khởi động SQL Server Instance ở chế độ Một người dùng, chúng tôi có thể khôi phục thành công cơ sở dữ liệu hệ thống chính từ Bản sao lưu cơ sở dữ liệu đầy đủ đã biết gần đây nhất mà không gặp bất kỳ sự cố nào. Do đó, chúng ta đã biết rằng để khôi phục cơ sở dữ liệu chính, phiên bản SQL Server phải ở chế độ Một người dùng.

Với phiên bản SQL Server ở chế độ Một người dùng, chỉ một người dùng có thể kết nối và sau khi các hoạt động Khôi phục của chúng tôi hoàn tất, chúng tôi cần thay đổi nó trở lại chế độ Nhiều người dùng bằng cách Dừng phiên bản SQL Server và khởi động phiên bản SQL Server mà không có tùy chọn / m như hình minh họa dưới đây:

NET STOP MSSQLSERVER
NET START MSSQLSERVER

Sau khi bắt đầu ở chế độ bình thường hoặc chế độ Nhiều người dùng, tất cả người dùng có thể kết nối với phiên bản SQL Server và thực hiện các hoạt động của họ. Chúng tôi cũng có thể xác minh rằng cơ sở dữ liệu chính đã được khôi phục vào thời điểm Sao lưu toàn bộ được thực hiện và mọi thay đổi cấu hình được thực hiện sau đó cần được thực hiện lại.

Một số điều cần lưu ý khi Phiên bản SQL Server ở Chế độ một người dùng:

  • Khi phiên bản SQL Server ở chế độ một người dùng, chỉ một phiên người dùng có thể kết nối với phiên bản đó. Do đó, hãy đảm bảo rằng Dịch vụ SQL Server Agent và tất cả các dịch vụ khác liên quan đến SQL Server đều ở trạng thái đã dừng tình trạng. Nếu không, những kết nối đó có thể được thiết lập trước và nếu điều đó xảy ra, chúng tôi không thể kết nối với SQL Server để khôi phục cơ sở dữ liệu.
  • Trong khi kết nối qua SSMS ở chế độ một người dùng, hãy ngắt kết nối Trình khám phá đối tượng và chỉ kết nối qua Cửa sổ truy vấn. Nếu một kết nối được thiết lập từ Object Explorer, một kết nối sẽ được thiết lập. Do đó, bạn không thể kết nối từ Cửa sổ truy vấn. Tham khảo ảnh chụp màn hình bên dưới - nó trình bày cách chỉ kết nối cửa sổ Truy vấn mới mà không cần kết nối qua Object Explorer:

Tham số khởi động máy chủ SQL trong trình quản lý cấu hình

Những người cảm thấy thoải mái hơn với GUI thay vì dấu nhắc lệnh có thể áp dụng phương pháp dưới đây.

1). Mở Trình quản lý cấu hình máy chủ SQL bằng cách nhập MSSQLManager13.msc vào dấu nhắc lệnh. Ở đây, 13 đề cập đến SQL Server 2016, vì vậy hãy sử dụng các số tương ứng chính xác cho các phiên bản SQL Server khác:

  • SQL Server 2012 - SQLServerManager11.msc
  • SQL Server 2014 - SQLServerManager12.msc
  • SQL Server 2016 - SQLServerManager13.msc
  • SQL Server 2017 - SQLServerManager14.msc
  • Máy chủ SQL 2019 - SQLServerManager15.msc

2). Mở rộng Dịch vụ SQL Server :

3). Nhấp chuột phải vào Dịch vụ SQL Server được xác định là SQL Server (MSSQLSERVER) > Thuộc tính .

4). Chọn Tham số khởi động tab menu.

5). Nhấp vào -m trong mục Chỉ định tham số khởi động , sau đó nhấp vào Thêm để khởi động Dịch vụ SQL Server ở chế độ Một người dùng.

6). Nhấp vào OK và khởi động lại Dịch vụ SQL Server để khởi động Dịch vụ SQL Server ở chế độ Một người dùng.

Để sửa đổi phiên bản SQL Server từ chế độ Một người dùng sang chế độ Nhiều người dùng hoặc chế độ bình thường sau khi khôi phục cơ sở dữ liệu chính, chỉ cần Nhấp vào tham số -m từ Tham số hiện có s , Nhấp vào Xóa và khởi động lại dịch vụ SQL Server.

Khôi phục cơ sở dữ liệu MSDB

Bây giờ, hãy thử khôi phục bản sao lưu cơ sở dữ liệu hệ thống msdb bằng lệnh PHỤC HỒI CƠ SỞ DỮ LIỆU mặc định:

RESTORE DATABASE msdb 
FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak' 
WITH  REPLACE
GO

Nỗ lực này mang lại cho chúng tôi một lỗi cho biết Không thể lấy được quyền truy cập độc quyền vì cơ sở dữ liệu đang được sử dụng . Thông báo lỗi này cho biết rằng một số quy trình khác đang sử dụng msdb . Do đó, chúng ta cần áp dụng một trong các cách tiếp cận dưới đây để khôi phục cơ sở dữ liệu msdb một cách chính xác:

  • Khởi động Phiên bản hoặc Dịch vụ Máy chủ SQL ở chế độ một người dùng như chúng tôi đã làm trước đó để tránh bất kỳ ai kết nối và truy cập msdb cơ sở dữ liệu.
  • Hoặc mang theo msdb cơ sở dữ liệu sang chế độ một người dùng mà không cần bất kỳ người dùng nào kết nối với nó.

Vì chúng tôi biết cách chuyển Phiên bản hoặc Dịch vụ SQL Server sang chế độ một người dùng trong khi khôi phục cơ sở dữ liệu hệ thống chính, chúng tôi sẽ thử tùy chọn thứ hai bằng cách thay đổi cơ sở dữ liệu msdb thành Chế độ một người dùng để khôi phục bản sao lưu cơ sở dữ liệu msdb.

Chạy lệnh dưới đây:

USE [master]
GO
ALTER DATABASE [msdb] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

Quan trọng :Việc thực thi lệnh trên có thể không thành công trong các trường hợp sau:

  • Dịch vụ SQL Server Agent đang hoạt động. Để khắc phục sự cố, hãy dừng Dịch vụ tác nhân SQL Server và thử lại.
  • Mọi phiên Người dùng được kết nối với cơ sở dữ liệu msdb. Chúng tôi có thể tìm ra các kết nối đang hoạt động với msdb hoặc cơ sở dữ liệu khác bằng cách sử dụng truy vấn dưới đây:
use master
GO
select spid
from sys.sysprocesses
where dbid = db_id('msdb')

Nếu truy vấn này mang lại bất kỳ kết quả nào, nó chỉ ra rằng một số phiên người dùng được kết nối với cơ sở dữ liệu msdb. Trong trường hợp này, chúng ta nên giết các phiên đó bằng lệnh KILL và thay thế spid thu được từ việc thực thi truy vấn ở trên:

KILL <spid>

Khi không có phiên nào được kết nối với msdb cơ sở dữ liệu, chúng tôi sẽ có thể đưa thành công cơ sở dữ liệu msdb vào chế độ một người dùng. Bất cứ khi nào cơ sở dữ liệu ở chế độ Một người dùng, chúng tôi sẽ có thể thấy từ (Một người dùng) được hiển thị gần cơ sở dữ liệu như được đánh dấu bên dưới cho cơ sở dữ liệu msdb:

Hãy thử khôi phục msdb cơ sở dữ liệu hiện đang sử dụng lệnh RESTORE DATABASE của chúng tôi:

Với cơ sở dữ liệu msdb ở chế độ một người dùng, chúng tôi có thể khôi phục msdb cơ sở dữ liệu thành công từ bản sao lưu đầy đủ tốt được biết đến gần đây nhất của msdb cơ sở dữ liệu. Việc khôi phục cơ sở dữ liệu từ bản sao lưu theo mặc định sẽ đưa nó về chế độ nhiều người dùng và nếu nó vẫn ở chế độ Một người dùng vì bất kỳ lý do gì, chúng tôi có thể thực hiện lệnh dưới đây để đưa nó trở lại chế độ nhiều người dùng:

USE [master]
GO
ALTER DATABASE [msdb] SET MULTI_USER
GO

Xây dựng lại cơ sở dữ liệu hệ thống

Đối với bất kỳ Sản xuất lý tưởng nào môi trường, điều quan trọng là phải có Bản sao lưu đầy đủ cơ sở dữ liệu Hệ thống để khôi phục cơ sở dữ liệu hệ thống mà không bị mất dữ liệu trong trường hợp người dùng nhầm lẫn ngẫu nhiên hoặc Cơ sở dữ liệu bị hỏng hoặc Khôi phục sau thảm họa.

Trong trường hợp xấu nhất, nếu không thể khởi động Dịch vụ SQL Server thì trước tiên chúng tôi cần thử khôi phục cơ sở dữ liệu hệ thống từ Bản sao lưu đầy đủ đã biết gần đây nhất và nếu chúng tôi không có sẵn Bản sao lưu đầy đủ và không thể khởi động Dịch vụ máy chủ SQL, thì chúng tôi chỉ còn lại một tùy chọn cuối cùng, tức là Xây dựng lại cơ sở dữ liệu hệ thống. Lưu ý :Việc xây dựng lại cơ sở dữ liệu hệ thống sẽ xóa tất cả các cấu hình cấp Máy chủ được lưu trữ trên tất cả cơ sở dữ liệu hệ thống và chúng tôi có thể mất tất cả các cấu hình Cấp máy chủ / phiên bản như Thông tin đăng nhập, cấu hình SQL Server Agent, các chi tiết quan trọng khác được lưu trữ trên cơ sở dữ liệu hệ thống mà chúng tôi đã thấy trong các bài viết trước của mình.

Hãy xem nhanh cách xây dựng lại cơ sở dữ liệu hệ thống (Như đã đề cập ở trên, quá trình này nên được thực hiện như một biện pháp cuối cùng để khôi phục phiên bản SQL Server trong trường hợp không có bản sao lưu đầy đủ của cơ sở dữ liệu hệ thống).

Để xây dựng lại cơ sở dữ liệu hệ thống, chúng tôi cần phương tiện Cài đặt Máy chủ SQL, được gắn hoặc sao chép vào Máy chủ nơi Phiên bản máy chủ SQL của chúng tôi được cài đặt. Sau khi hoàn tất, chúng ta nên làm theo các bước sau:

  1. Trong Command Prompt, điều hướng đến đường dẫn chứa tệp thiết lập SQL Server (setup.exe):

    C:\ Program Files \ Microsoft SQL Server \ 130 \ Setup Bootstrap \ SQLServer2016
  2. Thực hiện lệnh dưới đây, thay thế tất cả các tham số bằng các giá trị hợp lệ. Giá trị ACTION =REBUILDDATABASE biểu thị rằng tất cả cơ sở dữ liệu hệ thống sẽ được xây dựng lại sau khi thực hiện lệnh đó.
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName]

Các thông số sẽ được thay đổi bao gồm:

  • InstanceName - Tên phiên bản của SQL Server, trong trường hợp của chúng tôi là RRJ
  • Tài khoản - tên tài khoản sysadmin, trong trường hợp của chúng tôi là sa
  • StrongPassword - mật khẩu mạnh cho sa tài khoản sysadmin.
  • CollationName - Tên đối chiếu của cơ sở dữ liệu SQL Server nếu cần được thay đổi.

Kết luận

Chúng tôi đã học cách Sao lưu và Khôi phục cơ sở dữ liệu Người dùng và Hệ thống cũng như hiểu các biện pháp bổ sung cần thiết để Khôi phục cơ sở dữ liệu Hệ thống như cơ sở dữ liệu hệ thống chính và msdb. Trong trường hợp thiếu Bản sao lưu đầy đủ của cơ sở dữ liệu Hệ thống, chúng tôi cũng đã học cách Xây dựng lại cơ sở dữ liệu Hệ thống từ phương tiện Cài đặt SQL Server và hiểu các mất mát dữ liệu liên quan đến cấu hình trong khi xây dựng lại cơ sở dữ liệu hệ thống. Tóm lại, chúng tôi đã gián tiếp hiểu được tầm quan trọng của việc lập lịch Sao lưu đầy đủ cho cơ sở dữ liệu Hệ thống ngoài cơ sở dữ liệu Người dùng.

Cảm ơn bạn đã dành thời gian, và chúng ta sẽ sớm gặp lại với một bài viết thú vị khác.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server JSON_Modify, Làm thế nào để Cập nhật tất cả?

  2. Ví dụ về DATEDIFF () trong SQL Server

  3. Cách tối ưu để nối / tổng hợp các chuỗi

  4. Nhận AVG bỏ qua giá trị Null hoặc Zero

  5. Cách TRY_CAST () hoạt động trong SQL Server