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

Thực hiện sao lưu và khôi phục cơ sở dữ liệu tự động với các phương tiện mặc định

Giới thiệu

Bạn có thể tìm thấy rất nhiều hướng dẫn về cách sao lưu và khôi phục cơ sở dữ liệu. Trong phần này, chúng tôi sẽ chỉ ra cách có thể thực hiện điều này bằng cách sử dụng phương tiện MS SQL Server mặc định.

Ví dụ này sẽ đề cập đến một số cách tiếp cận - từ việc kiểm tra tính toàn vẹn của cơ sở dữ liệu trước khi sao lưu nó đến khôi phục cơ sở dữ liệu từ bản sao lưu đã tạo trước đó.

Giải pháp

Trước tiên, hãy xem xét thuật toán tổng thể mà chúng tôi sẽ sử dụng để sao lưu cơ sở dữ liệu:

1) Xác định cơ sở dữ liệu nào cần được sao lưu
2) Kiểm tra tính toàn vẹn của cơ sở dữ liệu đã chọn
3) Tạo bản sao lưu (bản sao nhật ký giao dịch, phân biệt hoặc đầy đủ) cho từng cơ sở dữ liệu đã chọn
4) Kiểm tra các bản sao lưu đã tạo
5) Nén nhật ký giao dịch (nếu cần)

Dưới đây, bạn có thể tìm thấy một ví dụ triển khai của thuật toán này.

Để xác định cơ sở dữ liệu nào cần được sao lưu, chúng tôi sẽ tạo bảng sau:

 SỬ DỤNG [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER BẢNG ONGOCREATE [srv]. [BackupSettings] ([DBID] [int] NOT NULL, [FullPathBackup] [nvarchar] (255) NOT NULL, [DiffPathBackup] [nvarchar] (255 ) NULL, [LogPathBackup] [nvarchar] (255) NULL, [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_BackupSettings] PRIMARY KEY CLUSTERED ([DBID] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]; GOALTER TABLE [srv]. [BackupSettings] ADD CONSTRAINT [DF_BackupSettings_InsertUTCDate] DEFAULT (getutcdate ()) FOR [GOUTCDate] 

Định danh cơ sở dữ liệu nằm trong cột đầu tiên, 'FullPathBackup' chứa đường dẫn để tạo bản sao lưu đầy đủ (ví dụ:'disk:\… \') và DiffPathBackup và LogPathBackup chứa đường dẫn đầy đủ để tạo các bản sao nhật ký giao dịch và khác biệt tương ứng. Nếu cột DiffPathBackup hoặc LogPathBackup trống, thì bản sao nhật ký giao dịch và / hoặc giao dịch khác biệt cho cơ sở dữ liệu này sẽ không được tạo.

Chúng tôi cũng có thể tạo một biểu diễn dựa trên bảng này:

 USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE xem [srv]. [vBackupSettings] asSELECT [DBID], DB_Name ([DBID]) as [DBName], [FullPathBackup], [DiffupPathBackup], [LogPath ] TỪ [srv]. [BackupSettings]; ĐI 

Biểu diễn này cho phép bạn kiểm tra hiệu quả cơ sở dữ liệu nào đang tham gia vào quá trình sao lưu.

Bây giờ, hãy tạo một biểu diễn hiển thị thông tin tệp cơ sở dữ liệu từ biểu diễn hệ thống sys.master_files:

 SỬ DỤNG [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE chế độ xem [inf]. [ServerDBFileInfo] asSELECT @@ Tên máy chủ AS Máy chủ, File_id, - Mã định danh tệp DB. Giá trị cơ sở cho file_id là 1 Type_desc, - Nhập mô tả tệp Tên là [Tên tệp], - Tên tệp lôgic DB LEFT (Tên_vật_lý, 1) Ổ AS, - Cờ ổ đĩa của vị trí tệp DB Tên_tệp, - Tệp đầy đủ tên trong OS RIGHT (physical_name, 3) AS Ext, - Phần mở rộng tệp Kích thước là CountPage, - Kích thước tệp hiện tại trong 8Kb trang tròn ((cast (Size * 8 as float)) / 1024,3) là SizeMb, - -Kích thước tập tin tính bằng Mb round ((cast (Size * 8 as float)) / 1024 / 1024,3) là SizeGb, - Kích thước tập tin trong trường hợp Gb khi is_percent_growth =0 rồi đến Growth * 8 khác 0 kết thúc là Growth, - Tăng trưởng tệp trong trường hợp trang 8Kb khi is_percent_growth =0 rồi làm tròn ((cast (Growth * 8 as float)) / 1024,3) kết thúc là GrowthMb, - Tăng trưởng tệp trong trường hợp Mb khi is_percent_growth =0 rồi làm tròn ((cast (Growth) * 8 là float)) / 1024 / 1024,3) kết thúc là GrowthGb, --Tăng trưởng tập tin trong trường hợp Gb khi is_percent_growth =1 rồi đến Tăng trưởng khác 0 kết thúc là GrowthPercent, --Tăng trưởng tập tin theo phần trăm is_percent_growth, - Thuộc tính tăng trưởng phần trăm database_id , DB_ Đặt tên (database_id) là [DB_Name], State, - Trạng thái tệp state_desc là StateDesc, - Mô tả trạng thái tệp is_media_read_only là IsMediaReadOnly, - Tệp nằm trên ổ đĩa dưới dạng chỉ đọc (0 - và để ghi) is_read_only as IsReadOnly , - tệp được gắn cờ là chỉ đọc (0 - và để ghi) is_sparse as IsSpace, - File thưa thớt is_name_reserved as IsNameReserved, - 1 - Tên tệp từ xa, có thể truy cập để sử dụng. - Cần thiết phải có bản sao lưu nhật ký trước khi sử dụng lại cùng tên (tên hoặc đối số vật lý) cho một tệp mới --0 - Tên tệp, không thể truy cập để sử dụng create_lsn làm CreateLsn, - Số đăng ký giao dịch trong nhật ký (LSN) được sử dụng để tạo tệp drop_lsn dưới dạng DropLsn, - LSN được sử dụng để xóa tệp read_only_lsn dưới dạng ReadOnlyLsn, - LSN được nhóm tệp chứa tệp sử dụng để thay đổi kiểu "đọc và ghi" thành "đọc -chỉ "(thay đổi mới nhất) read_write_lsn dưới dạng ReadWriteLsn, - LSN được nhóm tệp chứa tệp sử dụng để thay đổi loại" chỉ đọc "thành" đọc và ghi "(thay đổi mới nhất) diff_base_lsn dưới dạng DifferentialBaseLsn, - -Một cơ sở cho các bản sao lưu vi sai. Các phạm vi dữ liệu đã được thay đổi sau khi LSN được đưa vào bản sao lưu khác biệt. ffere_base_guid as DifferentialBaseGuid, - Định danh duy nhất của bản sao lưu cơ sở sẽ được sử dụng để tạo một bản sao khác biệt. ffere_base_time as DifferentialBaseTime, - Thời gian tương ứng với diff_base_lsn redo_start_lsn as RedoStartLsn, - LSN được sử dụng để xác định thời điểm bắt đầu làm lại tiếp theo --Là NULL, ngoại trừ các trường hợp trong đó state =RESTORING hoặc state =RECOVERY_PENDING redo_stork_forkStart - -Giá trị nhận dạng độc đáo cho điểm ngã ba khôi phục - giá trị đối sốfirst_fork_guid của bản sao lưu được khôi phục tiếp theo phải bằng giá trị này redo_target_lsn dưới dạng RedoTargetLsn, - LSN đóng vai trò là điểm dừng cho chế độ "trực tuyến" làm lại trong tệp này - Là NULL, ngoại trừ các trường hợp trong đó state =RESTORING hoặc state =RECOVERY_PENDING redo_target_fork_guid là RedoTargetForkGuid, - Ngã ba phục hồi mà vùng chứa có thể được khôi phục. Được sử dụng cùng với redo_target_lsn backup_lsn dưới dạng BackupLsn - LSN của dữ liệu gần đây nhất hoặc bản sao lưu khác biệt của tệpFROM sys.master_files - database_files; GO 

Để tạo các bản sao lưu đầy đủ, hãy triển khai quy trình được lưu trữ sau:

[expand title =” “]

 USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER QUY TRÌNH ONGOALTER [srv]. [RunFullBackupDB] @ClearLog bit =1 - chỉ định xem có nên giảm kích thước nhật ký giao dịch hay khôngASBEGIN / * Tạo bản sao lưu DB đầy đủ và kiểm tra tính toàn vẹn của DB trước * / ĐẶT SỐ TÀI KHOẢN BẬT; khai báo @dt datetime =getdate (); khai báo @year int =YEAR (@dt); khai báo @month int =MONTH (@dt); khai báo @day int =DAY (@dt); khai báo @hour int =DatePart (giờ, @dt); khai báo @minute int =DatePart (phút, @dt); khai báo @second int =DatePart (thứ hai, @dt); khai báo @pathBackup nvarchar (255); khai báo @pathstr nvarchar (255); khai báo @DBName nvarchar (255); khai báo @backupName nvarchar (255); khai báo @sql nvarchar (max); khai báo @backupSetId là int; khai báo @FileNameLog nvarchar (255); khai báo bảng @tbllog ([DBName] [nvarchar] (255) NOT NULL, [FileNameLog] [nvarchar] (255) NOT NULL); khai báo bảng @tbl ([DBName] [nvarchar] (255) NOT NULL, [FullPathBackup] [nvarchar] (255) NOT NULL); - Truy xuất tên DB và đường dẫn đầy đủ để tạo bản sao lưu đầy đủ chèn vào @tbl ([DBName], [FullPathBackup]) select DB_NAME ([DBID]), [FullPathBackup] from [srv]. [BackupSettings]; - Truy xuất tên DB và tên của các nhật ký giao dịch (vì một DB có thể có nhiều nhật ký) chèn vào @tbllog ([DBName], [FileNameLog]) chọn t. [DBName], tt. [FileName] as [FileNameLog ] từ @tbl dưới dạng t tham gia bên trong [inf]. [ServerDBFileInfo] dưới dạng tt trên t. [DBName] =DB_NAME (tt. [database_id]) trong đó tt. [type_desc] ='LOG'; - tuần tự xử lý từng DB mà chúng ta đã nhận trước đó trong khi (tồn tại (chọn top (1) 1 từ @tbl)) begin set @ backupSetId =NULL; select top (1) @ DBName =[DBName], @ pathBackup =[FullPathBackup] from @tbl; set @ example @ sqldat.com + N'_Full_backup _ '+ cast (@year as nvarchar (255)) + N' _ '+ cast (@month as nvarchar (255)) + N' _ '+ cast (@day as nvarchar (255)) - + N'_ '- + ép kiểu (@hour dưới dạng nvarchar (255)) + N' _ '+ ép kiểu (@minute dưới dạng nvarchar (255)) + N' _ '+ ép kiểu (@ thứ hai là nvarchar (255)); set @ example @ sqldat.comexample @ sqldat.com + N'.bak '; - kiểm tra DB để tìm toàn vẹn set @ sql =N'DBCC CHECKDB (N '+ N' '' '[email protected]+N''''+N') VỚI NO_INFOMSGS '; thực thi (@sql); - thực thi quy trình tạo bản sao lưu set @ sql =N'BACKUP DATABASE ['[email protected]+N'] TO DISK =N'+N'''''[email protected]+N''''+ N 'WITH NOFORMAT, NOINIT, NAME =N'+N''''[email protected]+N''''+ N', CHECKSUM, STOP_ON_ERROR, SKIP, REWIND, COMPRESSION, STATS =10; '; thực thi (@sql); - kiểm tra bản sao lưu mà chúng tôi đã tạo, chọn @backupSetId =position from msdb..backupset where [email protected] and backup_set_id =(select max (backup_set_id) from msdb..backupset where [email protected]); set @ sql =N'Lỗi xác minh. Sao lưu thông tin cho cơ sở dữ liệu "'[email protected]+'" không tìm thấy. '; nếu @backupSetId là null begin raiserror (@sql, 16, 1) end else begin set @ sql =N'RESTORE XÁC MINH CHỈ TỪ ĐĨA =N'+'''''[email protected]+N'''''+N ' VỚI FILE ='+ ép kiểu (@backupSetId là nvarchar (255)); thực thi (@sql); end - nén các bản ghi giao dịch DB nếu (@ ClearLog =1) bắt đầu trong khi (tồn tại (chọn top (1) 1 từ @tbllog trong đó [DBName] [email protected])) bắt đầu chọn top (1) @ FileNameLog =FileNameLog từ @tbllog nơi [email protected]; set @ sql =N'USE ['[email protected]+N']; '+ N' DBCC SHRINKFILE (N'+N''''[email protected]+N''''+N ', 0 , TRUNCATEONLY) '; thực thi (@sql); xóa khỏi @tbllog nơi [email protected][email protected]; end end xóa khỏi @tbl where [DBName] [email protected]; endENDGO 

[/ mở rộng]

Theo mã, chúng ta có thể thấy rằng quy trình này cung cấp giải pháp cho các bước còn lại của thuật toán tạo bản sao lưu.

Các thủ tục tạo bản sao khác biệt và bản sao nhật ký giao dịch được thực hiện theo cách tương tự:

[expand title =” “]

 SỬ DỤNG [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER QUY TRÌNH ONGOALTER [srv]. [RunDiffBackupDB] @ClearLog bit =1 - chỉ định xem có nên giảm kích thước nhật ký giao dịch hay khôngASBEGIN / * Tạo bản sao lưu DB khác biệt * / SET NOCOUNT ON; khai báo @dt datetime =getdate (); khai báo @year int =YEAR (@dt); khai báo @month int =MONTH (@dt); khai báo @day int =DAY (@dt); khai báo @hour int =DatePart (giờ, @dt); khai báo @minute int =DatePart (phút, @dt); khai báo @second int =DatePart (thứ hai, @dt); khai báo @pathBackup nvarchar (255); khai báo @pathstr nvarchar (255); khai báo @DBName nvarchar (255); khai báo @backupName nvarchar (255); khai báo @sql nvarchar (max); khai báo @backupSetId là int; khai báo @FileNameLog nvarchar (255); khai báo bảng @tbl ([DBName] [nvarchar] (255) NOT NULL, [DiffPathBackup] [nvarchar] (255) NOT NULL); khai báo bảng @tbllog ([DBName] [nvarchar] (255) NOT NULL, [FileNameLog] [nvarchar] (255) NOT NULL); - Truy xuất tên DB và đường dẫn đầy đủ để tạo các bản sao lưu khác biệt chèn vào @tbl ([DBName], [DiffPathBackup]) chọn DB_NAME ([DBID]), [DiffPathBackup] từ [srv]. [BackupSettings] trong đó [DiffPathBackup] không rỗng; - Truy xuất tên DB và tên đầy đủ của các tệp nhật ký giao dịch (vì một DB có thể có nhiều nhật ký) chèn vào @tbllog ([DBName], [FileNameLog]) chọn t. [DBName], tt. [FileName] as [FileNameLog] từ @tbl dưới dạng t tham gia bên trong [inf]. [ServerDBFileInfo] dưới dạng tt trên t. [DBName] =DB_NAME (tt. [Database_id]) trong đó tt. [Type_desc] ='LOG'; - tuần tự xử lý từng DB mà chúng ta đã nhận trước đó trong khi (tồn tại (chọn top (1) 1 từ @tbl)) begin set @ backupSetId =NULL; select top (1) @ DBName =[DBName], @ pathBackup =[DiffPathBackup] from @tbl; set @ example @ sqldat.com + N'_Diff_backup _ '+ cast (@year as nvarchar (255)) + N' _ '+ cast (@month as nvarchar (255)) + N' _ '+ cast (@day as nvarchar (255)) + N'_ '+ cast (@hour as nvarchar (255)) + N' _ '+ cast (@minute as nvarchar (255)) + N' _ '+ cast (@second as nvarchar ( 255)); set @ example @ sqldat.comexample @ sqldat.com + N'.bak '; - kiểm tra DB để tìm toàn vẹn set @ sql =N'DBCC CHECKDB (N '+ N' '' '[email protected]+N''''+N') VỚI NO_INFOMSGS '; thực thi (@sql); - thực thi quy trình sao lưu set @ sql =N'BACKUP DATABASE ['[email protected]+N'] TO DISK =N'+N''''[email protected]+N''''+ N ' VỚI KHÁC BIỆT, NOFORMAT, NOINIT, NAME =N'+N''''[email protected]+N''''+ N ', CHECKSUM, STOP_ON_ERROR, SKIP, REWIND, COMPRESSION, STATS =10;'; thực thi (@sql); - kiểm tra bản sao lưu mà chúng ta vừa tạo chọn @backupSetId =position from msdb..backupset where [email protected] and backup_set_id =(select max (backup_set_id) from msdb..backupset where [email protected]); set @ sql =N'Lỗi xác minh. Sao lưu thông tin cho cơ sở dữ liệu "'[email protected]+'" không tìm thấy. '; nếu @backupSetId là null begin raiserror (@sql, 16, 1) end else begin set @ sql =N'RESTORE XÁC MINH CHỈ TỪ ĐĨA =N'+'''''[email protected]+N'''''+N ' VỚI FILE ='+ ép kiểu (@backupSetId là nvarchar (255)); thực thi (@sql); end - nén các bản ghi giao dịch DB nếu (@ ClearLog =1) bắt đầu trong khi (tồn tại (chọn top (1) 1 từ @tbllog trong đó [DBName] [email protected])) bắt đầu chọn top (1) @ FileNameLog =FileNameLog từ @tbllog nơi [email protected]; set @ sql =N'USE ['[email protected]+N']; '+ N' DBCC SHRINKFILE (N'+N''''[email protected]+N''''+N ', 0 , TRUNCATEONLY) '; thực thi (@sql); xóa khỏi @tbllog nơi [email protected][email protected]; end end xóa khỏi @tbl where [DBName] [email protected]; endENDGO 

[/ mở rộng]

Vì việc kiểm tra tính toàn vẹn của cơ sở dữ liệu chiếm rất nhiều tài nguyên, chúng tôi có thể bỏ qua nó trong khi tạo một bản sao lưu khác biệt.

[expand title =” “]

 SỬ DỤNG [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER QUY TRÌNH ONGOALTER [srv]. [RunLogBackupDB] @ClearLog bit =1 - xác định xem có nên giảm kích thước nhật ký giao dịch khôngASBEGIN / * Sao lưu nhật ký giao dịch DB * / BẬT SỐ KHOẢN BẬT; khai báo @dt datetime =getdate (); khai báo @year int =YEAR (@dt); khai báo @month int =MONTH (@dt); khai báo @day int =DAY (@dt); khai báo @hour int =DatePart (giờ, @dt); khai báo @minute int =DatePart (phút, @dt); khai báo @second int =DatePart (thứ hai, @dt); khai báo @pathBackup nvarchar (255); khai báo @pathstr nvarchar (255); khai báo @DBName nvarchar (255); khai báo @backupName nvarchar (255); khai báo @sql nvarchar (max); khai báo @backupSetId là int; khai báo @FileNameLog nvarchar (255); khai báo bảng @tbl ([DBName] [nvarchar] (255) NOT NULL, [LogPathBackup] [nvarchar] (255) NOT NULL); khai báo bảng @tbllog ([DBName] [nvarchar] (255) NOT NULL, [FileNameLog] [nvarchar] (255) NOT NULL); - Khôi phục tên DB và đường dẫn đầy đủ để tạo bản sao lưu của nhật ký giao dịch với mô hình khôi phục không đơn giản (ghi đầy đủ hoặc hàng loạt). Hệ thống DB cũng bị loại trừ chèn vào @tbl ([DBName], [LogPathBackup]) chọn DB_NAME (b. [DBID]), b. [LogPathBackup] từ [srv]. [BackupSettings] dưới dạng b tham gia bên trong sys.databases như d trên b. [DBID] =d. [database_id] trong đó d.recovery_model <3 và DB_NAME ([DBID]) không có trong (N'master ', N'tempdb', N'model ', N'msdb', N ' ReportServer ', N'ReportServerTempDB') và [LogPathBackup] không rỗng; - Truy xuất tên DB và tên đầy đủ của các tệp nhật ký giao dịch (vì một DB có thể có nhiều nhật ký) chèn vào @tbllog ([DBName], [FileNameLog]) chọn t. [DBName], tt. [FileName] as [FileNameLog] từ @tbl dưới dạng t tham gia bên trong [inf]. [ServerDBFileInfo] dưới dạng tt trên t. [DBName] =DB_NAME (tt. [Database_id]) trong đó tt. [Type_desc] ='LOG'; - tuần tự xử lý từng DB mà chúng ta đã nhận trước đó trong khi (tồn tại (chọn top (1) 1 từ @tbl)) begin set @ backupSetId =NULL; select top (1) @ DBName =[DBName], @ pathBackup =[LogPathBackup] from @tbl; set @ example @ sqldat.com + N'_Log_backup _ '+ cast (@year as nvarchar (255)) + N' _ '+ cast (@month as nvarchar (255)) + N' _ '+ cast (@day as nvarchar (255)) + N'_ '+ cast (@hour as nvarchar (255)) + N' _ '+ cast (@minute as nvarchar (255)) + N' _ '+ cast (@second as nvarchar ( 255)); set @ example @ sqldat.comexample @ sqldat.com + N'.trn '; - thực thi bộ quy trình sao lưu @ sql =N'BACKUP LOG ['[email protected]+N'] TO DISK =N'+N''''[email protected]+N''''+ N ' VỚI NOFORMAT, NOINIT, NAME =N'+N''''[email protected]+N''''+ N ', CHECKSUM, STOP_ON_ERROR, SKIP, REWIND, COMPRESSION, STATS =10;'; thực thi (@sql); --Kiểm tra bản sao lưu nhật ký giao dịch mà chúng ta vừa tạo chọn @backupSetId =position from msdb..backupset where [email protected] and backup_set_id =(select max (backup_set_id) from msdb..backupset where [email protected]); set @ sql =N'Lỗi xác minh. Sao lưu thông tin cho cơ sở dữ liệu "'[email protected]+'" không tìm thấy. '; nếu @backupSetId là null begin raiserror (@sql, 16, 1) end else begin set @ sql =N'RESTORE XÁC MINH CHỈ TỪ ĐĨA =N'+'''''[email protected]+N'''''+N ' VỚI FILE ='+ ép kiểu (@backupSetId là nvarchar (255)); thực thi (@sql); end - nén các bản ghi giao dịch DB nếu (@ ClearLog =1) bắt đầu trong khi (tồn tại (chọn top (1) 1 từ @tbllog trong đó [DBName] [email protected])) bắt đầu chọn top (1) @ FileNameLog =FileNameLog từ @tbllog nơi [email protected]; set @ sql =N'USE ['[email protected]+N']; '+ N' DBCC SHRINKFILE (N'+N''''[email protected]+N''''+N ', 0 , TRUNCATEONLY) '; thực thi (@sql); xóa khỏi @tbllog nơi [email protected][email protected]; end end xóa khỏi @tbl where [DBName] [email protected]; endENDGO 

[/ mở rộng]

Như đã nói ở trên, kiểm tra tính toàn vẹn của cơ sở dữ liệu là một công việc đòi hỏi nhiều tài nguyên. Kết hợp với thực tế là các bản sao lưu nhật ký giao dịch thường cần được tạo khá thường xuyên, điều này cho chúng tôi lý do để bỏ qua việc kiểm tra tính toàn vẹn trong khi tạo bản sao nhật ký giao dịch.

Cũng xin lưu ý rằng các bản sao lưu đầy đủ của cơ sở dữ liệu ‘master’, ‘msdb’ và ‘model’ cần phải được thực hiện định kỳ.

Để tự động hóa quy trình tạo bản sao lưu, bạn chỉ cần thực hiện lệnh gọi các quy trình đã triển khai trước đó vào Trình lập lịch tác vụ của Windows, công việc đại lý hoặc bất kỳ dịch vụ tương tự nào có sẵn.

Bạn sẽ cần đặt riêng tần suất cuộc gọi cho từng quy trình đó dựa trên các đỉnh tải, cao nguyên hoạt động, v.v.

Cách tiếp cận cơ bản như sau:

1) Tạo bản sao lưu đầy đủ mỗi ngày một lần
2) Tạo các bản sao lưu khác biệt sau mỗi 2-4 giờ
3) Tạo bản sao lưu nhật ký giao dịch cứ sau 5-60 phút

Xin lưu ý rằng thông thường các cơ sở dữ liệu tham gia vào hệ thống truy cập nhanh và an toàn. Và, nếu sau này sử dụng bản sao lưu nhật ký giao dịch, điều tối quan trọng là không can thiệp vào quy trình. Cụ thể hơn, điều này có nghĩa là không nên tạo các bản sao nhật ký giao dịch bằng nhiều quy trình khác nhau - nếu điều này xảy ra, chuỗi sao lưu từ các bản sao này sẽ bị mất.

Ở đây, chúng ta đã thấy các ví dụ về từng cơ sở dữ liệu được xử lý tuần tự, từng cơ sở một. Tuy nhiên, chúng ta có thể đạt được quá trình xử lý song song trong môi trường sản xuất - cho phép thực hiện đồng thời một số bản sao dự phòng. Điều này có thể được tiếp cận theo một số cách khác nhau. Ví dụ:bằng cách gọi thủ tục được lưu trữ sau:

 SỬ DỤNG [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER QUY TRÌNH ONGOCREATE [inf]. [RunAsyncExecute] (@sql nvarchar (max), @jobname nvarchar (57) =null, @database nvarchar (128) =null, @owner nvarchar (128) =null, @owner nvarchar ( 128) =null) AS BEGIN / * Thực thi gói không đồng bộ thông qua công việc của Tác nhân RunAsyncExecute - thực thi không đồng bộ lệnh T-SQL hoặc sản phẩm được lưu trữ 2012 Antonin Foller, Phần mềm Motobit, www.motobit.com http://www.motobit.com/ tips / detpg_async-execute-sql / * / BẬT SỐ KHOẢN; khai báo @id uniqueidentifier; --Tạo tên công việc duy nhất nếu tên không được chỉ định nếu (@ tên công việc là null) set @ jobname =''; đặt @jobname =@jobname + '_async_' + convert (varchar (64), NEWID ()); if (@owner là null) set @owner ='sa'; --Tạo công việc mới, thực thi ID công việc msdb..sp_add_job @jobname, @ example @ sqldat.com, @ example @ sqldat.com OUTPUT; --Chỉ định máy chủ công việc cho lệnh thực thi msdb..sp_add_jobserver @ example @ sqldat.com; - Chỉ định bước đầu tiên của công việc - lệnh SQL - (@ on_success_action =3 ... Chuyển đến bước tiếp theo) thực thi msdb..sp_add_jobstep @ example @ sqldat.com, @ step_name ='Step1', @command =@sql, @database_name =@database, @on_success_action =3; --Chỉ định bước tiếp theo của công việc - xóa công việc khai báo @deletecommand varchar (200); set @deletecommand ='thực thi msdb..sp_delete_job @job_name =' '' [email protected]+ '' ''; thực thi msdb..sp_add_jobstep @ example @ sqldat.com, @ step_name ='Step2', @command =@deletecommand; - Bắt đầu công việc thực thi msdb..sp_start_job @ example @ sqldat.com; KẾT THÚC ĐI 

Ở đây, sự không đồng bộ đạt được bằng cách tạo động các công việc Agent, thực thi và xóa chúng sau đó.

Bây giờ, hãy xem thuật toán chung để khôi phục cơ sở dữ liệu từ các bản sao lưu đã tạo trước đó trong một môi trường khác / thử nghiệm:

1) Xác định cơ sở dữ liệu nào cần được khôi phục và vị trí của các bản sao lưu của chúng
2) Khôi phục cơ sở dữ liệu
3) Kiểm tra tính toàn vẹn của cơ sở dữ liệu được khôi phục

Bây giờ, chúng ta sẽ xem xét việc triển khai một thuật toán khôi phục cơ sở dữ liệu từ một bản sao lưu đầy đủ. Đối với một bản sao khác biệt, quy trình cũng tương tự - điểm khác biệt duy nhất là bản sao lưu đầy đủ cần được khôi phục trước tiên, sau đó là bản sao khác biệt.

Để xác định cơ sở dữ liệu nào sẽ được khôi phục, cũng như vị trí của các bản sao lưu của chúng, hãy tạo hai bảng như được hiển thị bên dưới:

 USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]. [RestoreSettings] ([DBName] [nvarchar] (255) NOT NULL, [FullPathRestore] [nvarchar] (255) NOT NULL, [DiffPathRestore] [nvarchar ] (255) NOT NULL, [LogPathRestore] [nvarchar] (255) NOT NULL, [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_RestoreSettings] PRIMARY KEY CLUSTERED ([DBName] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, STATISTICS_NORECOMPUTE =OFF , IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]; GOALTER TABLE [srv]. [RestoreSettings] ADD CONSTRAINT [DF_RestoreSettings_InsertUTCDate] DEFAULT (getcdate) FOR / pre> 

Ở đây, mục đích của các cột tương tự như mục đích từ bảng [srv]. [BackupSettings]. Sự khác biệt duy nhất là đường dẫn đầy đủ sẽ được sử dụng để xác định vị trí các bản sao lưu để khôi phục chứ không phải để tạo các bản sao mới.

 USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]. [RestoreSettingsDetail] ([Row_GUID] [uniqueidentifier] NOT NULL, [DBName] [nvarchar] (255) NOT NULL, [SourcePathRestore] [nvarchar ) NOT NULL, TargetPathRestore [nvarchar] (255) NOT NULL, [Ext] [nvarchar] (255) NOT NULL, [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_RestoreSettingsDetail] PRIMARY KEY CLUSTERED ([Row_GUID] ASC) VỚI ( PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]; GOALTER TABLE [srv]. [Restore_RowtingsDetail] ADD CONSTRAINT (mới) FOR [Row_GUID]; MỤC TIÊU BẢNG [srv]. [RestoreSettingsDetail] THÊM CONSTRAINT [DF_RestoreSettingsDetail_InsertUTCDate] DEFAULT (getutcdate ()) FOR [InsertUTCDate]; GO 

Bảng này là cần thiết để xác định tên tệp hoàn chỉnh của cơ sở dữ liệu đang được khôi phục, sau đó được sử dụng để chuyển tiếp (ví dụ:[SourcePathRestore] ='Tên tệp logic' và [TargetPathRestore] ='disk:\… \ Tên tệp vật lý ', while [Ext] =' Phần mở rộng tệp ')

Trên thực tế, chúng tôi có thể xác định tên lôgic của các tệp cơ sở dữ liệu bằng cách sử dụng truy vấn sau:

 KHÔI PHỤC LỌC LỌC TỪ DISK ='disk:\ ... \ backup copy.BAK'; 

Lấy thông tin về các bản sao lưu nằm trong tệp có thể được thực hiện theo cách này:

 KHÔI PHỤC HEADERONLYFROM DISK ='disk:\ ... \ backup copy.BAK'; 

Tiếp theo, chúng tôi triển khai một quy trình được lưu trữ được sử dụng để khôi phục cơ sở dữ liệu từ một bản sao lưu đầy đủ và kiểm tra tính toàn vẹn của dữ liệu:

[expand title =” “]

 SỬ DỤNG [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER QUY TRÌNH ONGOALTER [srv]. [RunFullRestoreDB] ASBEGIN / * Khôi phục DB từ bản sao lưu đầy đủ và kiểm tra tính toàn vẹn của DB * / BẬT SỐ KHOẢN BẬT; khai báo @dt datetime =DateAdd (day, -2, getdate ()); khai báo @year int =YEAR (@dt); khai báo @month int =MONTH (@dt); khai báo @day int =DAY (@dt); khai báo @hour int =DatePart (giờ, @dt); khai báo @minute int =DatePart (phút, @dt); khai báo @second int =DatePart (thứ hai, @dt); khai báo @pathBackup nvarchar (255); khai báo @pathstr nvarchar (255); khai báo @DBName nvarchar (255); khai báo @backupName nvarchar (255); khai báo @sql nvarchar (max); khai báo @backupSetId là int; khai báo @FileNameLog nvarchar (255); khai báo @SourcePathRestore nvarchar (255); khai báo @TargetPathRestore nvarchar (255); khai báo @Ext nvarchar (255); khai báo bảng @tbl ([DBName] [nvarchar] (255) NOT NULL, [FullPathRestore] [nvarchar] (255) NOT NULL); khai báo bảng @tbl_files ([DBName] [nvarchar] (255) NOT NULL, [SourcePathRestore] [nvarchar] (255) NOT NULL, [TargetPathRestore] [nvarchar] (255) NOT NULL, [Ext] [nvarchar] (255) CÓ GIÁ TRỊ ); - truy xuất danh sách tên DB và đường dẫn đến các bản sao lưu đầy đủ chèn vào @tbl ([DBName], [FullPathRestore]) select [DBName], [FullPathRestore] from [srv]. [RestoreSettings]; - truy xuất thông tin chi tiết về vị trí tệp DB mới chèn vào @tbl_files ([DBName], [SourcePathRestore], [TargetPathRestore], [Ext]) chọn [DBName], [SourcePathRestore], [TargetPathRestore], [Ext] từ [ srv]. [RestoreSettingsDetail]; - xử lý từng DB mà chúng ta đã nhận trước đó trong khi (tồn tại (chọn top (1) 1 từ @tbl)) begin set @ backupSetId =NULL; select top (1) @ DBName =[DBName], @ pathBackup =[FullPathRestore] from @tbl; set @ example @ sqldat.com + N'_Full_backup _ '+ cast (@year as nvarchar (255)) + N' _ '+ cast (@month as nvarchar (255)) + N' _ '+ cast (@day as nvarchar (255)) - + N'_ '- + ép kiểu (@hour dưới dạng nvarchar (255)) + N' _ '+ ép kiểu (@minute dưới dạng nvarchar (255)) + N' _ '+ ép kiểu (@ thứ hai là nvarchar (255)); set @ example @ sqldat.comexample @ sqldat.com + N'.bak '; - tạo truy vấn dự phòng và thực thi nó đặt @ sql =N'RESTORE DATABASE ['[email protected]+N'_Restore] FROM DISK =N'+N''''[email protected]+N' '' '+ N' VỚI TẬP TIN =1, '; while (tồn tại (chọn top (1) 1 từ @tbl_files trong đó [DBName] [email protected])) bắt đầu chọn top (1) @ SourcePathRestore =[SourcePathRestore], @ TargetPathRestore =[TargetPathRestore], @ Ext =[Ext] từ @tbl_files nơi [DBName] [email protected]; set @ example @ sqldat.com + N 'MOVE N'+N''''[email protected]+N''''+N' TO N'+N''''[email protected]+N ' _Restore.'[email protected]+N''''+N ','; xóa khỏi @tbl_files nơi [DBName] [email protected] và [SourcePathRestore] [email protected] và [Ext] [email protected]; end set @ example @ sqldat.com + N 'NOUNLOAD, REPLACE, STATS =5'; thực thi (@sql); - kiểm tra DB để tìm toàn vẹn set @ sql =N'DBCC CHECKDB (N '+ N' '' '[email protected]+'_Restore'+N''''+N') VỚI NO_INFOMSGS '; thực thi (@sql); xóa khỏi @tbl nơi [DBName] [email protected]; endEND 

[/ mở rộng]

Để chỉ định bản sao lưu đầy đủ nào nên được sử dụng để khôi phục, một tên tệp có cấu trúc đặc biệt được sử dụng:

_Full_backup_ _ _ .bak

Để tự động hóa quá trình khôi phục cơ sở dữ liệu này, lệnh gọi của thủ tục được lưu trữ mà chúng tôi đã triển khai phải được đặt vào Bộ lập lịch tác vụ Windows, công việc Tác nhân hoặc bất kỳ dịch vụ có sẵn nào tương tự.

Bạn có thể xem các bản sao lưu cơ sở dữ liệu gần đây nhất bằng cách sử dụng biểu diễn sau:

 USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE VIEW [inf]. [vServerLastBackupDB] aswith backup_cte as (select bs. [database_name], backup_type =case bs. [type] khi 'D' rồi 'cơ sở dữ liệu' khi 'L 'then' log 'khi' tôi 'rồi đến' vi phân 'khác' khác 'kết thúc, bs. [first_lsn], bs. [last_lsn], bs. [backup_start_date], bs. [backup_finish_date], cast (bs. [backup_size] dưới dạng thập phân (18,3)) / 1024/1024 dưới dạng BackupSizeMb, rownum =row_number () over (phân vùng theo bs. [database_name], nhập thứ tự theo bs. [backup_finish_date] desc), LogicalDeviceName =bmf. [logic_device_name], PhysicalDeviceName =bmf. [physical_device_name], bs. [server_name], bs. [user_name] FROM msdb.dbo.backupset bs INNER JOIN msdb.dbo.backupmediafamily bmf ON [bs]. [media_set_id] =[bmf]. [media_set_id]) chọn [server_name] làm [ServerName], [database_name] as [DBName], [user_name] as [USerName], [backup_type] as [BackupType], [backup_start_date] as [BackupStartDate], [backup_finish_date] as [BackupFinishDate], [BackupSizeMb], - kích thước không nén [LogicalDeviceName], [PhysicalDeviceName], [first_lsn] là [FirstLSN], [last_lsn] là [LastLSN] từ backup_ctewhere rownum =1; 

Kết quả

Trong hướng dẫn này, chúng tôi đã xem xét việc triển khai quy trình sao lưu tự động trên một máy chủ và kết quả là khôi phục trên một máy chủ khác (ví dụ:máy chủ thử nghiệm).

Phương pháp này cho phép chúng tôi tự động hóa quá trình tạo bản sao lưu, để kiểm tra các bản sao lưu bằng cách khôi phục chúng và tinh chỉnh các quy trình được hiển thị ở trên.

Nguồn:

Sao lưu
Khôi phục
Thiết lập sao lưu
CHECKDB
SHRINKFILE
sys.master_files


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết hợp trong Transact-SQL

  2. Cách cài đặt Kubernetes bằng Kubeadm

  3. Tham dự Hội nghị thượng đỉnh PASS ở Charlotte?

  4. Hướng dẫn dữ liệu:Sử dụng các chức năng của cửa sổ

  5. Toán tử SET T-SQL Phần 2:INTERSECT và EXCEPT