我目前正在努力使用 MS-SQL 備份/恢復。
情況:我有一個 Windows 服務正在運行,它會創建頻繁(每 15 分鐘)自動備份并傳送到網路存盤。
問題:資料庫包含許多時態表,我不喜歡備份歷史資料。
因此,我已將歷史記錄表移至第二個檔案組。
我需要的是一個只包含資料庫架構和主檔案組資料的備份。
我需要從那個備份中再次恢復一個功能齊全的資料庫。
此外,資料庫處于簡單的恢復模型中,正如我已經提到的,我需要通過 sql 命令來完成,并且不能使用 SSMS 來撰寫架構/資料的腳本,因為我正在以編程方式從 Windows 服務中執行此操作。
謝謝你的任何想法。
uj5u.com熱心網友回復:
我需要通過 sql 命令來完成,并且不能使用 SSMS 來撰寫模式/資料的腳本,因為我正在以編程方式從 Windows 服務中執行此操作。
您可以使用SMO API以編程方式撰寫架構/資料腳本,這正是 SSMS 所使用的。
uj5u.com熱心網友回復:
這是一個壞主意。如果您需要經常備份資料,則應使用完整恢復和日志備份。
在 SIMPLE 恢復中,所有讀寫檔案組都必須包含在備份中。
在完全恢復中,您提出的建議在技術上是可行的(最好的)。您可以備份 PRIMARY 檔案組,使用 recovery 將其還原,這將使所有輔助檔案組失效。然后在您的時態表上關閉 system_versioning 以使其可更新。
這是一個示例:
use master
drop database piecemealtest
go
/****** Object: Database [piecemealtest] Script Date: 12/15/2021 7:16:57 AM ******/
CREATE DATABASE [piecemealtest]
ON PRIMARY
( NAME = N'piecemealtest', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\piecemealtest.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ),
FILEGROUP [fg2]
( NAME = N'fg2', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\fg2.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'piecemealtest_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\piecemealtest_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
ALTER DATABASE [piecemealtest] SET RECOVERY full
go
backup database piecemealtest to disk='nul'
GO
go
use piecemealtest
go
CREATE TABLE DepartmentHistory
(
DeptID INT NOT NULL
, DeptName VARCHAR(50) NOT NULL
, ManagerID INT NULL
, ParentDeptID INT NULL
, SysStartTime DATETIME2 NOT NULL
, SysEndTime DATETIME2 NOT NULL
) on fg2;
GO
CREATE CLUSTERED COLUMNSTORE INDEX IX_DepartmentHistory
ON DepartmentHistory;
CREATE NONCLUSTERED INDEX IX_DepartmentHistory_ID_PERIOD_COLUMNS
ON DepartmentHistory (SysEndTime, SysStartTime, DeptID);
GO
CREATE TABLE Department
(
DeptID int NOT NULL PRIMARY KEY CLUSTERED
, DeptName VARCHAR(50) NOT NULL
, ManagerID INT NULL
, ParentDeptID INT NULL
, SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL
, SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL
, PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory));
go
insert into Department(DeptID,DeptName,ManagerId,ParentDeptID)
select object_id, 'dept' name, 0,0
from sys.objects
update Department set managerid = 4
update Department set managerid = 5
delete from Department where deptid %10 = 3
backup database piecemealtest filegroup='primary' to disk = 'piecemeal.primary.bak'
use master
drop database piecemealtest
restore database piecemealtest filegroup='PRIMARY' from disk= 'piecemeal.primary.bak' with partial, recovery
--Msg 3127, Level 16, State 1, Line 71
--The file 'fg2' of restored database 'piecemealtest' is being left in the defunct state because the database is using the simple recovery model and the file is marked for read-write access. Therefore, only read-only files can be recovered by piecemeal restore.
--RESTORE DATABASE ... FILE=<name> successfully processed 393 pages in 0.010 seconds (306.396 MB/sec).
use piecemealtest
select * from Department
update Department set managerid = 8 -- fails
--Msg 8653, Level 16, State 1, Line 78
--The query processor is unable to produce a plan for the table or view 'DepartmentHistory' because the table resides in a filegroup that is not online.
go
alter table Department set (system_versioning=off)
go
update Department set managerid = 8 -- works
uj5u.com熱心網友回復:
我會考慮創建另一個資料庫來從目標資料庫復制資料和物件,然后為這個新資料庫執行上述備份(每 15 分鐘)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/382459.html
標籤:sql-server 数据库备份
上一篇:使用SQL替換列中的一些不同單詞
