Trong SQL Server, quá trình phục hồi cơ sở dữ liệu là một quá trình quan trọng để đảm bảo tính nhất quán và an toàn của dữ liệu. Tuy nhiên, đôi khi có thể xảy ra tình huống cơ sở dữ liệu SQL Server bị mắc kẹt ở trạng thái đang phục hồi như hình bên dưới đây. Điều này có thể xảy ra khi quá trình phục hồi gặp lỗi hoặc bị gián đoạn, dẫn đến việc cơ sở dữ liệu không thể hoàn thành quá trình phục hồi. Trong bài viết này, tui sẽ chỉ ra những lý do tại sao một cơ sở dữ liệu SQL Server đang ở trạng thái phục hồi và cách mà bạn có thể truy cập vào một cơ sở dữ liệu đang ở trạng thái phục hồi(Restoring…). Đây không phải là một vấn đề phổ biến, nhưng khi nó xảy ra, nó có thể làm cho bạn đau đầu đến mức bối rối tay chân. Trong bài viết này, tui sẽ xem xét các nguyên nhân khác nhau và các giải pháp cụ thể để giải quyết vấn đề này. Lưu ý: Các các giải pháp dưới đây sẽ hoạt động cho bất kỳ phiên bản SQL Server nào.
Cơ sở dữ liệu Microsoft SQL Server ở trạng thái RESTORING sau khi Restore
Thường thì trạng thái khôi phục xảy ra khi bạn đang khôi phục một cơ sở dữ liệu. Dưới đây là ví dụ về điều này. Tui sẽ tạo một file backup full database (.bak file) và một file backup Log (.bak file) bằng cách chạy mã T-SQL như bên dưới trong SQL Server Management Studio (SSMS).
BACKUP DATABASE [earnings] TO DISK = N'c:\sql\earnings.bak' WITH NOFORMAT, NOINIT, NAME = N'earnings-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO BACKUP LOG [earnings] TO DISK = N'C:\sql\earnings_LogBackup_2018-06-02_12-42-07.bak' WITH NOFORMAT, NOINIT, NAME = N'earnings_LogBackup_2018-06-02_12-42-07', SKIP, NOREWIND, NOUNLOAD, STATS = 10
Sau khi đã có các bản backup của SQL Server, chúng ta sẽ bắt đầu quá trình restore. Để khôi phục toàn bộ và các file backup Log, chúng ta cần sử dụng tùy chọn NORECOVERY cho phần khôi phục toàn bộ. Vì vậy, nếu tui chỉ restore full backup như sau:
RESTORE DATABASE [earnings] FROM DISK = N'c:\sql\earnings.bak' WITH NORECOVERY, NOUNLOAD, STATS = 10
Thì lúc này cơ sở dữ liệu bây giờ sẽ ở trạng thái Restoring. Nếu chúng ta quên khôi phục các bản sao lưu bổ sung, cơ sở dữ liệu sẽ bị mắc kẹt ở chế độ này. Để hoàn tất việc khôi phục và truy cập vào cơ sở dữ liệu, chúng ta cần thực hiện lệnh khôi phục cho file backup Log như sau:
RESTORE LOG [earnings]
FROM DISK = N'c:\sql\earnings_LogBackup_2018-06-02_12-42-07.bak'
Cơ sở dữ liệu SQL Server ở trạng thái RESTORING sau khi sao lưu ghi nhật ký với tùy chọn NORECOVERY
Một lý do khác khiến cơ sở dữ liệu của bạn lâm vào tình trạng khôi phục là khi bạn sao lưu phần cuối của ghi nhật ký mà có sử dụng tùy chọn NORECOVERY như ví dụ dưới đây.
BACKUP DATABASE [earnings] TO DISK = N'c:\sql\earnings.bak' WITH NOFORMAT, NOINIT, NAME = N'earnings-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO BACKUP LOG [earnings] TO DISK = N'C:\sql\earnings_LogBackup_2018-06-02_12-42-07.bak' WITH NOFORMAT, NOINIT, NAME = N'earnings_LogBackup_2018-06-02_12-42-07', SKIP, NOREWIND, NOUNLOAD, NORECOVERY, STATS = 10
Điều này sẽ làm cho cơ sở dữ liệu chuyển sang trạng thái Restoring.Để khắc phục vấn đề này, bạn có thể khôi phục các bản backup database như được hiển thị ở ví dụ trên.
Làm cho cơ sở dữ liệu SQL Server ở trạng thái khôi phục trở nên truy cập được mà không cần khôi phục bản sao lưu
Nếu cơ sở dữ liệu bị mắc kẹt ở trạng thái đang khôi phục và bạn không có bản sao lưu bổ sung để khôi phục, bạn có thể khôi phục cơ sở dữ liệu bằng cách sử dụng lệnh sau:
RESTORE DATABASE [earnings] WITH RECOVERY
Sau khi bạn thực hiện lệnh này, cơ sở dữ liệu sẽ có thể sử dụng.
Cơ sở dữ liệu SQL Server ở trạng thái khôi phục cho Database Mirroring
Một lý do khác khiến cơ sở dữ liệu của bạn ở trạng thái khôi phục là nó là một phần của Database Mirroring của SQL Server.* Database Mirroring là một giải pháp cho phép bạn có tính sẵn cao cho cơ sở dữ liệu của mình. Nếu có sự cố với cơ sở dữ liệu chính trên máy chủ chính, cơ sở dữ liệu replica phụ trên một máy chủ khác sẽ tiếp quản các hoạt động của cơ sở dữ liệu. Cơ sở dữ liệu chính là máy chủ Principal, cơ sở dữ liệu replica là máy chủ Mirror và tùy chọn bạn có thể có thêm một máy chủ Mirror khác.* Dưới đây là một ví dụ. Chúng ta có thể thấy2 hình bên dưới đây, hình ở phía trên là máy chủ Principal là nơi có thể truy cập vào cơ sở dữ liệu. Ở phía bên dưới, chúng ta có thể thấy rằng Mirror đang ở trạng thái khôi phục.
Trong Database Mirroring, máy chủ Mirror ở trạng thái khôi phục cho đến khi thực hiện một Failover. Để truy cập vào cơ sở dữ liệu SQL Server đang ở trạng thái khôi phục khi nó là một phần của Database Mirroring, bạn có thể thực hiện một quá trình failover thủ công hoặc tự động từ Principal sang Mirror.
Đôi khi cơ sở dữ liệu ở trạng thái Restoring sau khi khởi động lại máy hoặc vì một lý do khác.
Thông thường, điều này xảy ra với các cơ sở dữ liệu lớn khi một giao dịch dài đang tiếp diễn và xảy ra một sự cố không mong muốn như tắt hoặc khởi động lại máy chủ. Nếu bạn gặp vấn đề này, hãy thử cách sau đây trước:
RESTORE DATABASE [databasename] WITH RECOVERY
Nếu bạn nhận được thông báo lỗi rằng cơ sở dữ liệu đang được sử dụng, hãy thử đặt người dùng vào chế độ single user mode:
USE master;
GO ALTER DATABASE Database_name
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
Sau đó, hãy thử lại lệnh khôi phục với lệnh restore with recovery. Sau khi đã khôi phục thành công, bạn có thể đặt lại chế độ nhiều người dùng bằng cách sử dụng lệnh T-SQL sau đây:
USE master;
GO ALTER DATABASE Database_name
SET MULTI_USER;
GO