1. الغرض
عند إجراء صيانة قاعدة بيانات SQL Server، عندما يطلب منا رئيسنا نقل عشرات الجيجابايت من ملفات البيانات إلى خوادم أخرى ويتطلب الحد الأدنى من وقت التوقف عن العمل، هل لدينا أي خطط لتلبية هذه المتطلبات؟
هنا نفترض أن الجهازين ليسا في نفس غرفة الكمبيوتر، لذا يبدو الحل الذي نقدمه أكثر فائدة إذا كنت محظوظًا جدًا وكان الجهازان في نفس الشبكة المحلية، فتهانينا، يمكنك الحصول على المزيد من البرامج افعلها.
2. تحليل وتصميم الأفكار
في الواقع، تتميز البيئة التي نفترضها بخاصيتين: الأولى هي أن ملف قاعدة البيانات كبير نسبيًا؛ والثانية هي أن سرعة نقل الملفات لدينا قد تكون بطيئة نسبيًا. ربما لا يمكننا فعل أي شيء بشأن سرعة النقل، لكن يمكننا البدء من مشكلة حجم الملف ودمجها مع خصائص SQL Server، حتى يكون لدينا الحل التالي.
من أجل تقليل وقت التوقف عن العمل، نستخدم النسخ الاحتياطي الكامل والنسخ الاحتياطي التفاضلي لترحيل قاعدة البيانات خلال اليوم، وإجراء نسخة احتياطية كاملة (XXX_full.bak) لقاعدة البيانات التي تحتاج إلى ترحيل، ونسخ ملف النسخ الاحتياطي (يمكنك استخدامه). برنامج FTP هنا) تنفيذ استئناف نقطة التوقف) إلى الخادم الهدف للاستعادة، انتظر حتى بعد ساعات العمل وقم بإجراء نسخة احتياطية تفاضلية (XXX_diff.bak)، ثم انسخ هذه النسخة الاحتياطية التفاضلية إلى الخادم الهدف، وقم بإجراء الاستعادة التفاضلية بناءً على الاستعادة الكاملة .
وقت التوقف هنا = وقت النسخ الاحتياطي التفاضلي + وقت نقل ملف النسخ الاحتياطي التفاضلي + استعادة وقت ملف النسخ الاحتياطي التفاضلي، هل يجعلك وقت التوقف هذا تشعر أن هذه المرة قصيرة جدًا؟
3. النص المرجعي
انتبه إلى تعديل اسم قاعدة البيانات في البرنامج النصي أدناه، وكذلك المسار المطلق.
--1: النسخ الاحتياطي الكامل
أعلن @dbname varchar(100)
أعلن @sql nvarchar (الحد الأقصى)
تعيين @dbname = 'DataBaseName'
تعيين @sql = '
قاعدة بيانات النسخ الاحتياطي ['+@dbname+']
إلى القرص = ''D:DBBackup'+@dbname+'_full.bak''
مع NOFORMAT، NOINIT، NAME = '''+@dbname+' - نسخة احتياطية كاملة لقاعدة البيانات''،
تخطي، NOREWIND، NOUNLOAD، STATS = 10
يذهب'
اطبع @sql
- SQL التي تم إنشاؤها
--DataBaseName_full
قاعدة بيانات النسخ الاحتياطي [DataBaseName]
إلى القرص = 'D:DBBackupDataBaseName_full.bak'
مع NOFORMAT، NOINIT، NAME = 'DataBaseName-النسخ الاحتياطي الكامل لقاعدة البيانات'،
تخطي، نورويند، نونلود، إحصائيات = 10
يذهب
--2: النسخ الاحتياطي والاستعادة الكاملة
أعلن @dbname varchar(100)
أعلن @sql nvarchar (الحد الأقصى)
تعيين @dbname = 'DataBaseName'
تعيين @sql = '
--استعادة '+@dbname+'_full
استعادة قاعدة البيانات ['+@dbname+']
من القرص = ''D:DBBackup'+@dbname+'_full.bak'' مع ملف = 1،
نقل N''DataBase_Name'' إلى N''D:DataBase'+@dbname+'.mdf''،
انقل N''DataBase_Name_log'' إلى N''D:DataBase'+@dbname+'_log.ldf''،
NORECOVERY، NOUNLOAD، استبدال، STATS = 10
يذهب'
طباعة @sql
- SQL التي تم إنشاؤها
--استعادة DataBaseName_full
استعادة قاعدة البيانات [DataBaseName]
من القرص = 'D:DBBackupDataBaseName_full.bak' مع الملف = 1،
انقل N'DataBase_Name' إلى N'D:DataBaseDataBaseName.mdf'،
انقل N'DataBase_Name_log' إلى N'D:DataBaseDataBaseName_log.ldf'،
NORECOVERY، NOUNLOAD، استبدال، STATS = 10
يذهب
--3: النسخ الاحتياطي التفاضلي
أعلن @dbname varchar(100)
أعلن @sql nvarchar (الحد الأقصى)
تعيين @dbname = 'DataBaseName'
تعيين @sql = '
قاعدة بيانات النسخ الاحتياطي ['+@dbname+']
إلى القرص = N''D:DBBackup'+@dbname+'_diff.bak''
مع تفاضلي، NOFORMAT، NOINIT، NAME = N'''+@dbname+' - النسخ الاحتياطي لقاعدة البيانات التفاضلية''،
تخطي، نورويند، نونلود، إحصائيات = 10
يذهب
'
طباعة @sql
- SQL التي تم إنشاؤها
--DataBaseName_diff
قاعدة بيانات النسخ الاحتياطي [DataBaseName]
إلى القرص = N'D:DBBackupDataBaseName_diff.bak'
مع تفاضلي، NOFORMAT، NOINIT، NAME = N'DataBaseName-النسخ الاحتياطي لقاعدة البيانات التفاضلية'،
تخطي، نورويند، نونلود، إحصائيات = 10
يذهب
--4: النسخ الاحتياطي والاستعادة التفاضلي
أعلن @dbname varchar(100)
أعلن @sql nvarchar (الحد الأقصى)
تعيين @dbname = 'DataBaseName'
تعيين @sql = '
--استعادة '+@dbname+'_full
استعادة قاعدة البيانات ['+@dbname+']
من القرص = ''D:DBBackup'+@dbname+'_diff.bak'' مع الملف = 1،
NONOLOAD، الإحصائيات = 10
يذهب'
طباعة @sql
- SQL التي تم إنشاؤها
--استعادة DataBaseName_full
استعادة قاعدة البيانات [DataBaseName]
من القرص = 'D:DBBackupDataBaseName_diff.bak' مع الملف = 1،
NONOLOAD، الإحصائيات = 10
يذهب
4. حاشية
ربما ينبغي أن يكون هنا، لكنه غالبًا ما يأتي بنتائج عكسية في بعض الأحيان لا يصل حجم ملف قاعدة البيانات لدينا إلى عشرات الجيجابايت، فماذا يجب أن نفعل؟ هل هناك أي حلول أخرى؟
لقد قمت بنقل ملف بيانات بحجم 700 جيجا من قبل، ولكن تم إعطائي الوقت الكافي لنقله، وقمت بنقل البيانات إلى الخادم الجديد من خلال وظيفة قاعدة البيانات. وتتمثل ميزة ذلك في تحسين قاعدة البيانات السابقة، مثل تعيين معلمات قاعدة البيانات كأقسام الجدول، وترحيل البيانات بأقل تأثير ممكن على قاعدة البيانات السابقة. سأكتب العملية التفصيلية في المرة القادمة.
(المؤلف: استمع إلى الريح والمطر المصدر: http://gaizai.cnblogs.com/ )