【问题标题】:How to do automatic data archiving in SQL Server?如何在 SQL Server 中进行自动数据归档?
【发布时间】:2010-08-11 08:09:45
【问题描述】:

我有一张桌子,我每天都想对其进行自动归档。因此,为了每天清楚,我想获取当天生成的信息并将其移动到另一个分区(同一个表)而不是另一个存档表中。那是因为我希望通过与新数据相同的查询来访问旧数据。

我使用的是 SQL Server 2005,我已阅读 http://msdn.microsoft.com/en-us/library/ms345146(SQL.90).aspx 文章,但不知道如何编写分区函数来满足我的需求。

所以我希望存在的解决方案应该是一次性配置,不需要任何进一步的干扰。你有什么建议吗?

【问题讨论】:

  • 您可能会在 serverfault.com 上获得更好、更多的答案 - 系统管理员和数据库管理员常去的地方......
  • 或 dba.stackexchange.com

标签: sql-server sql-server-2005 partitioning continuous archiving


【解决方案1】:

您可以使用分区表轻松做到这一点;下面的示例脚本——它创建了一个临时数据库 TestDB;如果您不想使用它将数据库更改为其他内容。它在最后清理自己 如果您按原样运行脚本 创建数据库; 添加基于Bit的分区功能。 创建一个表TestTable;应用分区函数 将 3 个“实时”行插入到表中 通过从 sys.partitions 中选择详细信息显示 3 行都在其中一个分区表中 然后更新其中一条记录以使其存档 从 sys.partitions 重新选择信息以显示记录已移至第二个架构。

您需要做的就是设置一个流程来归档记录。

USE master;
GO
--- Step 1 : Create New Test Database with two different filegroups.
IF EXISTS (
SELECT name
FROM sys.databases
WHERE name = N'TestDB')
DROP DATABASE TestDB;
GO
CREATE DATABASE TestDB
ON PRIMARY
(NAME='TestDB_Part1',
FILENAME=
'c:\sqldata\TestDB_Part1.mdf',
SIZE=3,
MAXSIZE=100,
FILEGROWTH=1 ),
FILEGROUP TestDB_Part2
(NAME = 'TestDB_Part2',
FILENAME =
'c:\sqldata\TestDB_Part2.ndf',
SIZE =3,
MAXSIZE=100,
FILEGROWTH=1 );
GO



USE TestDB;
GO
--- Step 2 : Create Partition Range Function
CREATE PARTITION FUNCTION TestDB_PartitionRange (Bit)
AS RANGE right FOR
VALUES (1);
GO

CREATE PARTITION SCHEME TestDB_PartitionScheme
AS PARTITION TestDB_PartitionRange
TO ([PRIMARY], TestDB_Part2);
GO


CREATE TABLE TestTable
(Archived Bit NOT NULL,
Date DATETIME)
ON TestDB_PartitionScheme (Archived);
GO


INSERT INTO TestTable (Archived, Date) 
VALUES (0,'2010-01-01');
INSERT INTO TestTable (Archived, Date) 
VALUES (0,'2010-02-01');
INSERT INTO TestTable (Archived, Date) 
VALUES (0,'2010-03-01');
GO

SELECT * FROM TestTable;


SELECT * FROM sys.partitions
WHERE OBJECT_NAME(OBJECT_ID)='TestTable';

update TestTable 
set Archived = 1 where Date = '2010-03-01'

SELECT * FROM sys.partitions
WHERE OBJECT_NAME(OBJECT_ID)='TestTable';


use master
go
drop database testdb

【讨论】:

  • 是的,我已经实现了这样的解决方案,但我不想每天运行一些工作,这会改变旧行以重新分区表。我想要一个配置,使用哪个 sql server 会每天自动创建新分区或类似的东西。有可能吗?
  • 我不确定你是如何归档你的工人的;每次您将标志设置为已归档时,上面的示例都会移动分区。如果您想要存档数据的天间隔分区(我认为您可以拥有 40k 个分区);您需要提前一年预构建分区函数(并在一年内更新它),以便按日期拆分。完成后您需要查看索引策略,因为 1000 多个分区通常会导致碎片问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
相关资源
最近更新 更多