কার্য
বড় টেবিলগুলির একটি গ্রুপ থেকে 13 মাসের রোলিং ছাড়া সমস্ত সংরক্ষণাগারটি সংরক্ষণ করুন। সংরক্ষণাগারযুক্ত ডেটা অবশ্যই অন্য একটি ডাটাবেসে সংরক্ষণ করতে হবে।
- ডাটাবেসটি সহজ পুনরুদ্ধার মোডে
- সারণীগুলি 50 মিলিয়ন সারি কয়েক বিলিয়ন এবং কিছু ক্ষেত্রে প্রতিটি কয়েকশ জিবি গ্রহণ করে।
- সারণীগুলি বর্তমানে বিভাজনযুক্ত নয়
- প্রতিটি টেবিলের একটি ক্রমবর্ধমান তারিখ কলামে একটি ক্লাস্টারড সূচক রয়েছে
- প্রতিটি টেবিলে অতিরিক্ত একটি-ক্লাস্টারযুক্ত সূচক থাকে
- সারণীতে সমস্ত ডেটা পরিবর্তনগুলি সন্নিবেশ করানো হয়
- লক্ষ্যটি প্রাথমিক ডাটাবেসের ডাউনটাইমকে হ্রাস করা।
- সার্ভারটি 2008 আর 2 এন্টারপ্রাইজ
"সংরক্ষণাগার" টেবিলটিতে প্রায় 1.1 বিলিয়ন সারি থাকবে, "লাইভ" টেবিলটি প্রায় 400 মিলিয়ন। স্পষ্টতই আর্কাইভ টেবিলটি সময়ের সাথে সাথে বৃদ্ধি পাবে, তবে আমি আশা করি লাইভ টেবিলটিও খুব দ্রুত যুক্তিসঙ্গতভাবে বৃদ্ধি পাবে। কমপক্ষে পরবর্তী কয়েক বছরে 50% বলুন।
আমি অ্যাজুরে স্ট্রেচ ডাটাবেসগুলি সম্পর্কে ভেবেছিলাম তবে দুর্ভাগ্যক্রমে আমরা ২০০৮ আর ২ তে আছি এবং সম্ভবত কিছুক্ষণ সেখানে থাকার সম্ভাবনা রয়েছে।
বর্তমান পরিকল্পনা
- একটি নতুন ডাটাবেস তৈরি করুন
- নতুন ডাটাবেসে মাসের মধ্যে বিভক্ত নতুন টেবিলগুলি তৈরি করুন (পরিবর্তিত তারিখটি ব্যবহার করে)।
- পার্টিশনযুক্ত টেবিলগুলিতে অতি সাম্প্রতিক 12-13 মাসের ডেটা সরান।
- দুটি ডাটাবেসের একটি নতুন নাম বদল করুন
- এখন "সংরক্ষণাগার" ডাটাবেস থেকে সরানো ডেটা মুছুন।
- "সংরক্ষণাগার" ডাটাবেসের প্রতিটি সারণী বিভাজন করুন।
- ভবিষ্যতে ডেটা আর্কাইভ করতে পার্টিশন অদলবদলগুলি ব্যবহার করুন।
- আমি বুঝতে পারি যে আমাকে সংরক্ষণাগারভুক্ত করার জন্য ডেটা বদল করতে হবে, সংরক্ষণাগার ডাটাবেসে সেই টেবিলটি অনুলিপি করতে হবে এবং তারপরে সংরক্ষণাগার টেবিলের মধ্যে এটিকে অদলবদল করতে হবে। এটি গ্রহণযোগ্য।
সমস্যা: আমি প্রাথমিক বিভাজনযুক্ত টেবিলগুলিতে ডেটা স্থানান্তরিত করার চেষ্টা করছি (আসলে আমি এখনও এটিতে ধারণার একটি প্রমাণ করছি)। আমি টিএফ 610 ( ডেটা লোডিং পারফরম্যান্স গাইড অনুসারে ) এবং INSERT...SELECT
প্রাথমিকভাবে এটি ন্যূনতমভাবে লগ করা হবে ভেবে ডেটা সরাতে একটি বিবৃতি ব্যবহার করার চেষ্টা করছি । দুর্ভাগ্যক্রমে প্রতিবার চেষ্টা করার পরে এটি সম্পূর্ণরূপে লগড।
এই মুহুর্তে আমি ভাবছি আমার সেরা বেট হ'ল এসএসআইএস প্যাকেজ ব্যবহার করে ডেটা স্থানান্তর করা। আমি এড়াতে চেষ্টা করছি যেহেতু আমি 200 টি টেবিল এবং স্ক্রিপ্টের মাধ্যমে আমি যে কোনও কিছুই করতে পারি যা আমি সহজেই উত্পন্ন এবং চালাতে পারি।
আমার সাধারণ পরিকল্পনায় আমি কি কিছু মিস করছি, এবং এসএসআইএস খুব দ্রুত ডেটা সরাতে এবং লগের সর্বনিম্ন ব্যবহারের সাথে (স্থান সম্পর্কিত উদ্বেগগুলি) আমার সেরা বাজি?
ডেটা কোড ছাড়াই ডেটা কোড
-- Existing structure
USE [Audit]
GO
CREATE TABLE [dbo].[AuditTable](
[Col1] [bigint] NULL,
[Col2] [int] NULL,
[Col3] [int] NULL,
[Col4] [int] NULL,
[Col5] [int] NULL,
[Col6] [money] NULL,
[Modified] [datetime] NULL,
[ModifiedBy] [varchar](50) NULL,
[ModifiedType] [char](1) NULL
);
-- ~1.4 bill rows, ~20% in the last year
CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
( [Modified] ASC )
GO
-- New DB & Code
USE Audit_New
GO
CREATE PARTITION FUNCTION ThirteenMonthPartFunction (datetime)
AS RANGE RIGHT FOR VALUES ('20150701', '20150801', '20150901', '20151001', '20151101', '20151201',
'20160101', '20160201', '20160301', '20160401', '20160501', '20160601',
'20160701')
CREATE PARTITION SCHEME ThirteenMonthPartScheme AS PARTITION ThirteenMonthPartFunction
ALL TO ( [PRIMARY] );
CREATE TABLE [dbo].[AuditTable](
[Col1] [bigint] NULL,
[Col2] [int] NULL,
[Col3] [int] NULL,
[Col4] [int] NULL,
[Col5] [int] NULL,
[Col6] [money] NULL,
[Modified] [datetime] NULL,
[ModifiedBy] [varchar](50) NULL,
[ModifiedType] [char](1) NULL
) ON ThirteenMonthPartScheme (Modified)
GO
CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
(
[Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO
CREATE NONCLUSTERED INDEX [AuditTable_Col1_Col2_Col3_Col4_Modified] ON [dbo].[AuditTable]
(
[Col1] ASC,
[Col2] ASC,
[Col3] ASC,
[Col4] ASC,
[Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO
কোড সরান
USE Audit_New
GO
DBCC TRACEON(610);
INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified