我有一张表(比方说,AUDIT),数据可以追溯到10年前。很少查询超过1年的数据,完整备份开始耗时太长。所以,我决定使用表分区和部分备份,所以如果(何时!)我需要恢复数据库,我可以先恢复经常查询的数据,然后再恢复旧的数据。
我在其日期时间列(AUDIT_DT)上对AUDIT表进行了分区,从旧数据中分割出最近12个月。 PRIMARY分区保留最近12个月,而OLD_AUDIT_ARCHIVE(只读)分区包含的所有数据都早于此。
我已经走到了这一步。
因此,从现在开始的一个月,我想以类似的方式重新分配数据,同时尽量减少数据移动。我想我需要创建一个临时表,并将一个月的数据切换到它,但是如何将登台表数据切换到OLD_AUDIT_ARCHIVE分区?我的目标是将PRIMARY和OLD_AUDIT_ARCHIVE之间的边界日期向前移动一个月(例如,从201年2月1日 3 到201年3月1日),同时尽量减少数据移动
答案 0 :(得分:1)
我这样做的方式是:
最大的问题是你是否可以按照上面的链接中的描述划分交换机;为了让它发挥作用,有许多事情必须是真实的。即便如此,我还是要对它进行一次测试。最糟糕的问题是我得到了一个范围子集错误,因为我错误地定义了新分区。
编辑:事实上,我忘记了一些步骤。当我这样做时,我在旧表WITH (DROP_EXISTING = ON)
上重新创建聚簇索引,在步骤5之后和步骤6之前重新创建新的分区方案。
代码示例:
create partition function dateRange1 (date)
as range left for values ('2014-02-01')
create partition function dateRange2 (date)
as range left for values ('2014-03-01')
create partition scheme testScheme1 as partition daterange1
ALL TO ([PRIMARY])
create partition scheme testScheme2 as partition daterange2
ALL TO ([PRIMARY])
create table dbo.dates (dt date);
create clustered index CX_date ON dbo.dates (dt) ON testScheme1 (dt)
insert into dates
select dateadd(day, n, '2013-12-31')
from NUMS
where n < 366
create table dbo.dates_new (dt date);
create clustered index CX_date2 ON dbo.dates_new (dt) ON testScheme2 (dt)
alter table dbo.dates switch partition 1 to dbo.dates_new partition 1
insert into dates_new
select dt from dates where dt <= '2014-03-01'
delete from dates where dt <= '2014-03-01'
create clustered index CX_date ON dbo.dates (dt) WITH (DROP_EXISTING = ON) ON testScheme2 (dt)
alter table dbo.dates switch partition 2 to dbo.dates_new partition 2
select * from dbo.dates
select * from dates_new
exec sp_rename 'dbo.dates', 'dates_old';
exec sp_rename 'dbo.dates_new', 'dates';
select * from dbo.dates
select * from dates_old
drop table dates_old