الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل يمكن عمل Backup كامل للسيرفر في ملف واحد؟

مغلق
بدأه adel_elgo في 18 مايو 2006 · 17 رد · 1,715 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هل يمكن عمل Backup و Restore

كامل للسيرفر بجميع قواعد البيانات الموجودة عليه

و ذلك عن طرق خطوة واحدة فقط

بمعني عمل Backup لجميع قواعد البيانات الموجودة علي السيرفر في ملف واحد مع امكانية عمل Restore لهذا الملف

ارجوا سرعة الرد

#2

أعتقد أن هذا اللينك فيه ما تريده

http://msdn.microsoft.com/library/?url=/li..._ba-bz_35ww.asp

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#3

اعتقد انه لا يمكن ذلك باستخدام الادوات الاساسية الموجودة داخل الsQL Server (ربما يكون هنالك اداة اضافية من شركة اخرى غير مايكروسوفت تقوم بذلك )الا اذا عملت Script و لكن تكون كل قاعدة بيانات لها ملف خاص بها في الBackup و الله اعلم

انظر هذه الاداة

http://www.red-gate.com/products/sql_backup/pro/index.htm

#4

اشكر الاخت enjyshahin علي هذا الرد

لكن هذه الطريقة تقوم بعمل ملف لكل قاعدة بيانات لكني اريد

عمل Backup لجميع قواعد البيانات الموجودة علي السيرفر في ملف واحد مع امكانية عمل Restore لهذا الملف

ايضا اشكر الاخ AbuZakaria

اعتقد ان هذه الاداة قوية وسوف اقوم بتجربتها إن شاء الله

لكنها ايضا كما اعتقد لا تقوم بالوظيفة التي اريدها

علي اي حال اشكركم جميعا علي تعاونكم معي

:)

#5

جرب هذا السكريبت

sp_msforeachdb 'Backup database ? to disk = ''C:\ServerBackup'' with Name= ''?'''

عند عمل ريستور من ال enterprise manager بعد اختيار الملف اضغط View contents لاستعادة قاعدة البيانات التي تريدها

تم تعديل هذه المشاركة بواسطة IUnknown في 20 مايو 2006 في 16:01

When all else fails, read the instructions.

If there is a possibility of several things going wrong the one that will cause the most damage will be the one to go wrong.

No Matter how many times you repeat, there will be someone not listening .

To beat the bureaucracy, make your problem their problem

55926083.png

#6

ما شاء الله عليك

اشكرك اخ IUnknown علي هذا الاستجابة

هذه الامر في غاية القوة في حال عمل backup

لكن هل من طريقه لعمل Restore بشكل مشابه

دون تحديد اسماء قواعد البيانات

ملحوظة علي الكود الخاص بك اخ IUnknown

EXEC sp_MSforeachdb
'IF N''?'' NOT IN(''tempdb'', ''distribution'', ''Northwind'', ''pubs'')
BEGIN
DECLARE @sql varchar(1000);
set @sql = ''BACKUP DATABASE '' + (''?'') + '' TO DISK =
''''D:\MSSQL2000\MSSQL\BACKUP'' + (''?'') + ''.bak'''' WITH INIT''
EXEC (@sql)
END'

ملحوظة وجدت ايضا اثناء بحثي بإحدي المواقع الاجنبية

هذا الكود يقوم بعمل لووب علي جميع قواعد البيانات الموجودة علي السيرفر و عمل Backup لكل قاعدة

مع إضافة تاريخ عمل الـ Backup الي اسم الملف

وضعتها فقط لكي يستفيد الجميع

هذا الكود

set quoted_identifier off
declare @query varchar(1000)
declare @path varchar(100)
declare @dbname varchar(128)
set @path ='c:\backup\'
declare DBcursor cursor for select name from sysdatabases where name not in ('master','msdb','tempdb','model')
open DBCursor
Fetch DBCursor into @dbname 
while @@fetch_status = 0
begin
set @query = 'backup database ' + @dbname+ ' to disk="' +@path+ @DBname+ '-'+replace(replace(convert (varchar(22),getdate(),120),':','-'),' ','-')+ '.bak" with init'
print @query
exec (@query)
Fetch DBCursor into @dbname 
end
close DBCursor
deallocate DBCursor

تم تعديل هذه المشاركة بواسطة adel_elgo في 20 مايو 2006 في 18:11

#7

بعد البحث وصلت الي ما يلي

الكود الخاص بالـ Backup الذي تفضل بوضعه الاخ IUnknown

وهو يعمل بشكل ممتاز

sp_msforeachdb 'Backup database ? to disk = ''C:\ServerBackup'' with Name= ''?'''

الكود الخاص بعمل Restore لهذا الملف

حيث وجدت بعض الاكواد علي احدي المواقع فقمت بتعديله لكي يناسب

الوظيفة التي اريدها من اجله

لكنه لا يعمل بشكل جيد :wacko:

لذلك ارجوا من الاخوة الاعضاء

ممن لديه اي ملاحظة علي هذا الكود فلا يبخل علينا بها

ALTER  PROC sp_RestoreFromAllFilesInDirectory
@SourceDirBackupFiles nvarchar(200), @DestDirDbFiles nvarchar(200)
AS

CREATE TABLE #bdev(
BackupName nvarchar(128),
BackupDescription nvarchar(255),
BackupType smallint,
ExpirationDate datetime,
Compressed tinyint,
Position smallint,
DeviceType tinyint,
UserName nvarchar(128),
ServerName nvarchar(128),
DatabaseName nvarchar(128),
DatabaseVersion int,
DatabaseCreationDate datetime,
BackupSize numeric(20,0),
FirstLSN numeric(25,0),
LastLSN numeric(25,0),
CheckpointLSN numeric(25,0),
DatabaseBackupLSN numeric(25,0),
BackupStartDate datetime,
BackupFinishDate datetime,
SortOrder smallint,
CodePage smallint,
UnicodeLocaleId int,
UnicodeComparisonStyle int,
CompatibilityLevel tinyint,
SoftwareVendorId int,
SoftwareVersionMajor int,
SoftwareVersionMinor int,
SoftwareVersionBuild int,
MachineName nvarchar(128),
Flags int,
BindingID uniqueidentifier,
RecoveryForkID uniqueidentifier,
Collation nvarchar(128))

DECLARE @DbName sysname
DECLARE @sql nvarchar(1000)

INSERT #bdev
EXEC('RESTORE HEADERONLY FROM DISK = ''' + @SourceDirBackupFiles + '''')

DECLARE qqq CURSOR FOR
SELECT DatabaseName FROM #bdev
OPEN qqq
FETCH NEXT FROM qqq INTO @DbName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'RESTORE DATABASE ' + @DbName + ' FROM DISK = ''' + @DestDirDbFiles + ''' WITH MOVE '
end
CLOSE qqq
DEALLOCATE qqq
GO

و للإستدعاء البروسيديور

exec sp_RestoreFromAllFilesInDirectory 'c:\ServerBackup', 'c:\2\'

ملحوظة

'c:\ServerBackup' هو مسار ملف الـ Backup

'c:\2\' هو المسار الذي سيتم تخزين قاعدة البيانات به

تم تعديل هذه المشاركة بواسطة adel_elgo في 21 مايو 2006 في 08:57

#8

الاخ العزيز

مرفق كود الاسترجاعز قد يكون معقدا بعض الشيئ ولكنه يفي بالغرض

سأترك لك مهمة استثناء قواعد بيانات النظام ;)

Set NOCOUNT ON /* backup devices*/
CREATE TABLE #bdev(BackupName nvarchar(128),BackupDescription nvarchar(255),BackupType smallint,ExpirationDate datetime,Compressed tinyint,Position smallint,DeviceType tinyint,UserName nvarchar(128),ServerName nvarchar(128),DatabaseName nvarchar(128),DatabaseVersion int,DatabaseCreationDate datetime,BackupSize numeric(20,0),FirstLSN numeric(25,0),LastLSN numeric(25,0),CheckpointLSN numeric(25,0),DatabaseBackupLSN numeric(25,0),BackupStartDate datetime,BackupFinishDate datetime,SortOrder smallint,CodePage smallint,UnicodeLocaleId int,UnicodeComparisonStyle int,CompatibilityLevel tinyint,SoftwareVendorId int,SoftwareVersionMajor int,SoftwareVersionMinor int,SoftwareVersionBuild int,MachineName nvarchar(128),Flags int,BindingID uniqueidentifier,RecoveryForkID uniqueidentifier,Collation nvarchar(128))
/*data files and log files*/
CREATE TABLE #dbfiles(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0))
declare @dirfile varchar(1000)
declare @sql varchar(1000)
declare @tmpsql varchar(1000)
declare @DbName  varchar(128)
declare @LogicalName varchar(128) 
declare @PhysicalName varchar(260)
declare @pos smallint
declare @type char(1)
declare @fname varchar(1000)
declare @DestDirDbFiles varchar(260)
set @dirfile='c:\ServerBackup'
set @DestDirDbFiles ='C:\Program Files\Microsoft SQL Server\MSSQL\Data'
--Get database name from RESTORE HEADERONLY
INSERT #bdev
EXEC('RESTORE HEADERONLY FROM DISK = ''' + @dirfile + '''')
declare curDBs cursor for SELECT DatabaseName,Position FROM #bdev open curDBs
fetch next from curDBs into @DbName ,@pos
while @@fetch_status = 0
begin SET @sql = 'RESTORE DATABASE ' + @DbName + ' FROM DISK = ''' + @dirfile + ''' WITH MOVE '
    --Get information about database files from backup device into temp table
    TRUNCATE TABLE #dbfiles
    set @tmpsql = 'RESTORE FILELISTONLY FROM DISK = ''' + @dirfile + ''' with File =' + cast(@pos as varchar(3))+ ''
    INSERT #dbfiles  EXEC( @tmpsql )
    declare dbfiles cursor for select LogicalName, PhysicalName, type from #dbfiles OPEN dbfiles
    FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type
    --For each database file that the database uses
    WHILE @@FETCH_STATUS = 0
    BEGIN SET @sql = @sql + '''' + @LogicalName + ''' TO ''' + @DestDirDbFiles + '\' + @LogicalName
        IF @type = 'D'
            SET @sql = @sql + '.mdf'', MOVE '
        ELSE IF @type = 'L'
            SET @sql = @sql + '.ldf'''
        FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type
    END
    --Here's the actual RESTORE command
    PRINT @sql
    --Remove the comment below if you want the procedure to actually execute the restore command.
    --EXEC(@sql)
    CLOSE dbfiles
    DEALLOCATE dbfiles
    fetch next from curDBs into @DbName ,@pos
end
close curDBs
deallocate curDBs
drop table #dbfiles
drop table #bdev

تم التعديل ليلائم طلبك

تم تعديل هذه المشاركة بواسطة IUnknown في 21 مايو 2006 في 09:20

When all else fails, read the instructions.

If there is a possibility of several things going wrong the one that will cause the most damage will be the one to go wrong.

No Matter how many times you repeat, there will be someone not listening .

To beat the bureaucracy, make your problem their problem

55926083.png

#10

اخي IUnknown

عندما اقوم بعمل Backup بواسطة

sp_msforeachdb 'Backup database ? to disk = ''C:\ServerBackup'' with Name= ''?'''

ثم اقوم بعمل Restore بواسطة الكود الموجود في المشاركة رقم 8

يعطيني الكثير من الاخطاء

علما بانني قمت بتعديل الجزء الخاص بإستعاد قواعد النظام

وذلك كما يلي

IF @DbName NOT IN('tempdb', 'distribution', 'Northwind', 'pubs', 'master', 'model', 'msdb')
BEGIN PRINT @sql
EXEC(@sql)
END

تم تعديل هذه المشاركة بواسطة adel_elgo في 21 مايو 2006 في 12:29

#11

الأخ عادل؛

هل من الممكن عمل if بدلا من in

ارجو ارسال الأخطاء حتى استطيع معاجتها

When all else fails, read the instructions.

If there is a possibility of several things going wrong the one that will cause the most damage will be the one to go wrong.

No Matter how many times you repeat, there will be someone not listening .

To beat the bureaucracy, make your problem their problem

55926083.png

#12

اخ IUnknown

قمت بعمل عدد 2 قاعدة بيانات و هما Test1 و Test2

قمت بعمل Backup

ثم قمت بتنفيذ كود الـ Restore

و ذلك بعد حذف قواعد البيانات من سيرفر

فاعطاني هذه الخطأ

RESTORE DATABASE test1 FROM DISK = 'c:\ServerBackup' WITH MOVE 'test1_Data' TO 'D:\Program Files\Microsoft SQL Server\MSSQL\Data\test1_Data.mdf', MOVE 'test1_Log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL\Data\test1_Log.ldf'
Server: Msg 3234, Level 16, State 2, Line 1
Logical file 'test1_Data' is not part of database 'test1'. Use RESTORE FILELISTONLY to list the logical file names.
Server: Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.
RESTORE DATABASE test2 FROM DISK = 'c:\ServerBackup' WITH MOVE 'test2_Data' TO 'D:\Program Files\Microsoft SQL Server\MSSQL\Data\test2_Data.mdf', MOVE 'test2_Log' TO 'D:\Program Files\Microsoft SQL Server\MSSQL\Data\test2_Log.ldf'
Server: Msg 3234, Level 16, State 2, Line 1
Logical file 'test2_Data' is not part of database 'test2'. Use RESTORE FILELISTONLY to list the logical file names.
Server: Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

تم تعديل هذه المشاركة بواسطة adel_elgo في 21 مايو 2006 في 16:59

#13

الأخ عادل

الكود الذي ارفقته في البدايه ليس 100% bullet prooft اي انه يجب ان يحتوي على العديد من الـ Validations والتي لا يتسع المجال لذكرها

مثلا هل انت متأكد ان المسار D:\Program Files\Microsoft SQL Server\MSSQL\Data\ l موجود

When all else fails, read the instructions.

If there is a possibility of several things going wrong the one that will cause the most damage will be the one to go wrong.

No Matter how many times you repeat, there will be someone not listening .

To beat the bureaucracy, make your problem their problem

55926083.png

#14

اخي العزيز شكرا علي تواصلك معي :)

اقتباس
الكود الذي ارفقته في البدايه ليس 100% bullet prooft اي انه يجب ان يحتوي على العديد من الـ Validations والتي لا يتسع المجال لذكرها

مثلا هل انت متأكد ان المسار D:\Program Files\Microsoft SQL Server\MSSQL\Data\ l موجود

نعم انا متاكد من هذا المسار

#15

لا شكر على واجب يا أخي

عموما لقد أدركت الخطأ

في جمله الاسترجاع لم احدد رقم الملف (رقم قاعدة البيانات داخل ملف الحفظ الاحتياطي)

add this statement

with File = cast(@pos as varchar(3))

اسف لعدم الكتابة بالكامل فسوف اغادر الآن

اراك غدا

تم تعديل هذه المشاركة بواسطة IUnknown في 21 مايو 2006 في 18:17

When all else fails, read the instructions.

If there is a possibility of several things going wrong the one that will cause the most damage will be the one to go wrong.

No Matter how many times you repeat, there will be someone not listening .

To beat the bureaucracy, make your problem their problem

55926083.png

#16

اخ IUnknown

انا لا اعرف ماذا قول لكي اشكرك علي تعاونك معي بصرف النظر عن ان هناك اي اخطاء ام لا

سعدت جدا بتواصلك معي :)

#17

إشتغلت (h)

بفضل الله اولا ثم الاخ IUnknown

لذلك سأقوم بتلخيص الموضوع في نقطتين

الاولي - عمل Backup لجميع قواعد البيانات الموجودة علي السيرفر

sp_msforeachdb 'Backup database ? to disk = ''C:\ServerBackup'' with Name= ''?'''

الثانية - عمل Restore لذلك الملف الموجود علي المسار ''C:\ServerBackup''

طبعا بعد حذف قواعد البيانات التي تم إنشائها علي السيرفر

Set NOCOUNT ON /* backup devices*/
CREATE TABLE #bdev(BackupName nvarchar(128),BackupDescription nvarchar(255),BackupType smallint,ExpirationDate datetime,Compressed tinyint,Position smallint,DeviceType tinyint,UserName nvarchar(128),ServerName nvarchar(128),DatabaseName nvarchar(128),DatabaseVersion int,DatabaseCreationDate datetime,BackupSize numeric(20,0),FirstLSN numeric(25,0),LastLSN numeric(25,0),CheckpointLSN numeric(25,0),DatabaseBackupLSN numeric(25,0),BackupStartDate datetime,BackupFinishDate datetime,SortOrder smallint,CodePage smallint,UnicodeLocaleId int,UnicodeComparisonStyle int,CompatibilityLevel tinyint,SoftwareVendorId int,SoftwareVersionMajor int,SoftwareVersionMinor int,SoftwareVersionBuild int,MachineName nvarchar(128),Flags int,BindingID uniqueidentifier,RecoveryForkID uniqueidentifier,Collation nvarchar(128))
/*data files and log files*/
CREATE TABLE #dbfiles(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0))
declare @dirfile varchar(1000)
declare @sql varchar(1000)
declare @tmpsql varchar(1000)
declare @DbName varchar(128)
declare @LogicalName varchar(128) 
declare @PhysicalName varchar(260)
declare @pos smallint
declare @type char(1)
declare @fname varchar(1000)
declare @DestDirDbFiles varchar(260)
set @dirfile='c:\ServerBackup'
set @DestDirDbFiles ='D:\Program Files\Microsoft SQL Server\MSSQL\Data'
--Get database name from RESTORE HEADERONLY
INSERT #bdev
EXEC('RESTORE HEADERONLY FROM DISK = ''' + @dirfile + '''')
declare curDBs cursor for SELECT DatabaseName,Position FROM #bdev open curDBs
fetch next from curDBs into @DbName ,@pos
while @@fetch_status = 0
begin SET @sql = 'RESTORE DATABASE ' + @DbName + ' FROM DISK = N''' + @dirfile + ''' WITH FILE =' + cast(@pos as varchar(3)) + ' , NOUNLOAD, STATS = 10, RECOVERY, REPLACE, MOVE '
--Get information about database files from backup device into temp table
TRUNCATE TABLE #dbfiles
set @tmpsql = 'RESTORE FILELISTONLY FROM DISK = ''' + @dirfile + ''' with File =' + cast(@pos as varchar(3))+ ''
INSERT #dbfiles EXEC( @tmpsql )
declare dbfiles cursor for select LogicalName, PhysicalName, type from #dbfiles OPEN dbfiles
FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type
--For each database file that the database uses
WHILE @@FETCH_STATUS = 0
BEGIN SET @sql = @sql + '''' + @LogicalName + ''' TO ''' + @DestDirDbFiles + '\' + @LogicalName
IF @type = 'D'
SET @sql = @sql + '.mdf'', MOVE '
ELSE IF @type = 'L'
SET @sql = @sql + '.ldf'''
FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type
END
IF @DbName NOT IN('tempdb', 'distribution', 'Northwind', 'pubs', 'master', 'model', 'msdb')
BEGIN PRINT @sql
EXEC(@sql)
END 
CLOSE dbfiles
DEALLOCATE dbfiles
fetch next from curDBs into @DbName ,@pos
end
close curDBs
deallocate curDBs
drop table #dbfiles
drop table #bdev

تم تعديل هذه المشاركة بواسطة adel_elgo في 21 مايو 2006 في 20:43

#18

جربت استخدام الامر :

sp_msforeachdb 'Backup database ? to disk = ''C:\ServerBackup'' with Name= ''?'''

ولم ينفع ظهرت لي رسالة :

Msg 3201, Level 16, State 1, Server NEWSERVER\MSSQLSERVER, Line 1

Cannot open backup device 'c:\backup\'. Device error or device off-line. See the SQL Server error log for more details.

Msg 3013, Level 16, State 1, Server NEWSERVER\MSSQLSERVER, Line 1

BACKUP DATABASE is terminating abnormally.

هذا الموضوع مغلق.

مواضيع مشابهة