Nói chung
Tôi sẽ xem xét việc đọc thông tin cơ sở dữ liệu chủ chứa thông tin gì và tại sao bạn cần sao lưu cơ sở dữ liệu hệ thống (master, msdb, ...).
Tham khảo: Sao lưu và khôi phục cơ sở dữ liệu hệ thống (SQL Server) (Microsoft Docs)
cơ sở dữ liệu chủ
Cơ sở dữ liệu chủ chứa thông tin sau cho mỗi phiên bản SQL Server:
Cơ sở dữ liệu chủ ghi lại tất cả thông tin cấp hệ thống cho hệ thống Máy chủ SQL. Điều này bao gồm siêu dữ liệu trên toàn thể hiện như tài khoản đăng nhập , điểm cuối, máy chủ được liên kết và cài đặt cấu hình hệ thống. Trong SQL Server, các đối tượng hệ thống không còn được lưu trữ trong cơ sở dữ liệu chủ; thay vào đó, chúng được lưu trữ trong cơ sở dữ liệu tài nguyên. Ngoài ra, master là cơ sở dữ liệu ghi lại sự tồn tại của tất cả các cơ sở dữ liệu khác và vị trí của các tệp cơ sở dữ liệu đó và ghi lại thông tin khởi tạo cho SQL Server. Do đó, SQL Server không thể khởi động nếu cơ sở dữ liệu chủ không có sẵn.
( nhấn mạnh của tôi)
Tham khảo: Cơ sở dữ liệu chủ (Microsoft Docs)
Cơ sở dữ liệu msdb
Cơ sở dữ liệu msdb chứa thông tin sau của phiên bản SQL Server:
Cơ sở dữ liệu msdb được sử dụng bởi SQL Server Agent để lập lịch cảnh báo và công việc và bởi các tính năng khác như SQL Server Management Studio, Service Broker và Database Mail.
Ví dụ: SQL Server tự động duy trì lịch sử sao lưu và khôi phục trực tuyến hoàn chỉnh trong các bảng trong msdb . Thông tin này bao gồm tên của bên thực hiện sao lưu, thời gian sao lưu và các thiết bị hoặc tệp nơi lưu trữ bản sao lưu. SQL Server Management Studio sử dụng thông tin này để đề xuất kế hoạch khôi phục cơ sở dữ liệu và áp dụng bất kỳ bản sao lưu nhật ký giao dịch nào. Các sự kiện sao lưu cho tất cả các cơ sở dữ liệu được ghi lại ngay cả khi chúng được tạo bằng các ứng dụng tùy chỉnh hoặc công cụ của bên thứ ba.Ví dụ: nếu bạn sử dụng ứng dụng Microsoft Visual Basic gọi các đối tượng SQL Server Management Object (SMO) để thực hiện các hoạt động sao lưu, sự kiện được ghi vào bảng hệ thống msdb, nhật ký ứng dụng Microsoft Windows và nhật ký lỗi SQL Server. Để giúp bạn bảo vệ thông tin được lưu trữ trong msdb, chúng tôi khuyên bạn nên xem xét việc đặt nhật ký giao dịch msdb trên bộ lưu trữ chịu lỗi.
( nhấn mạnh của tôi)
Tham khảo: Cơ sở dữ liệu msdb (Microsoft Docs)
Phần kết luận
Nếu bạn sao lưu cơ sở dữ liệu chủ, thì tất cả thông tin đăng nhập cho ví dụ là an toàn. Tuy nhiên, nếu bạn muốn sao lưu riêng ( như trong: được sử dụng để chuyển thông tin đăng nhập sang các phiên bản khác nhau, được sử dụng để đặt lại mật khẩu) Đăng nhập SQL của phiên bản, thì bạn sẽ phải áp dụng một giải pháp khác.
Giải pháp sao lưu đăng nhập máy chủ SQL cá nhân
Danh sách tham khảo công cụ
Đã thêm tiền thưởng
Tham chiếu cuối cùng là một bài viết thú vị về cách xuất thủ công các thông tin đăng nhập SQL Server và mật khẩu được băm để tự chuyển chúng sang một phiên bản SQL Server mới. Bài viết liên quan đến việc tạo hai thủ tục được lưu trữ và sau đó chạy một để tạo thông tin.
Dưới đây là mã từ bài viết được giới thiệu để tạo hai thủ tục:
USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GO
IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary varbinary (256)
DECLARE @PWD_string varchar (514)
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)
DECLARE @defaultdb sysname
IF (@login_name IS NULL)
DECLARE login_curs CURSOR FOR
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
ELSE
DECLARE login_curs CURSOR FOR
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
PRINT 'No login(s) found.'
CLOSE login_curs
DEALLOCATE login_curs
RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT ''
SET @tmpstr = '-- Login: ' + @name
PRINT @tmpstr
IF (@type IN ( 'G', 'U'))
BEGIN -- NT authenticated account/group
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
END
ELSE BEGIN -- SQL Server authentication
-- obtain password and sid
SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
-- obtain password policy state
SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
IF ( @is_policy_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
END
IF ( @is_expiration_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
END
END
IF (@denylogin = 1)
BEGIN -- login is denied access
SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
END
ELSE IF (@hasaccess = 0)
BEGIN -- login exists but does not have access
SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
END
IF (@is_disabled = 1)
BEGIN -- login is disabled
SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
END
PRINT @tmpstr
END
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO
Khi bạn đã tạo các thủ tục được lưu trữ, hãy chạy sp_help_Vv_login để lấy thông tin.
EXEC sp_help_revlogin
Tập lệnh đầu ra mà thủ tục lưu trữ sp_help_Vvlogin tạo ra là tập lệnh đăng nhập. Tập lệnh đăng nhập này tạo thông tin đăng nhập có Mã định danh bảo mật gốc (SID) và mật khẩu gốc.
Tham khảo: Cách chuyển thông tin đăng nhập và mật khẩu giữa các phiên bản của SQL Server (bài viết Microsoft KB)
Thưởng thức