یکی از چالش هایی که مدیران پایگاه داده بصورت مداوم با آن مواجه می باشند، پشتیبان گیری و بازگردانی دیتابیس ها می باشد. روش های مختلفی مانند نرم افزارهای جانبی، job نرم افزار sql و کوئری های مختلف برای اینکه پشتیبان گیری بصورت خودکار انجام شود وجود دارد، اما جهت بازگردانی دیتابیس ها اغلب بصورت تکی و با انجام چندین مرحله عملیات صورت می گیرد و در صورتیکه تعداد زیادی دیتابیس را بخواهید بازگردانی کنید، مجبور خواهید بود این مراحل را برای هر دیتابیس بصورت مجزا انجام دهید.
در این مقاله و با روش ذکر شده می توان تنها با خواندن محتویات یک دایرکتوری که برای فایل های پشتیبان وجود دارد، بازگردانی را انجام داد و بصورت همزمان و با اجرای یک کوئری کلیه دیتابیس های موجود در یک دایرکتوری را بازگردانی نمود.
جهت اجرای این کوئری به موارد زیر توجه نمائید:
مسیر فایل های پشتیبان جایگزین C:\Backup\ در متغیرهای Path و Path3 می شود.
عدد 10 حداکثر تعداد دیتابیس هایی که می خواهید بازگردانی کنید را مشخص می کند که می توانید آن را مطابق نیاز افزایش یا کاهش دهید.
توجه داشته باشید نام فایل های بکآپ و نام دیتابیس ها در صورتیکه قبلا در sql سرور وجود دارند لازم است یکسان باشد.
روش کار:
Sql Server Management را باز نموده و مطابق نیاز به لوکال یا سرور مورد نظر connect شوید.
گزینه New Query در منو بالای نرم افزار mssql را انتخاب نمائید.
کوئری زیر را کپی نمائید.
با توجه به موارد ذکر شده در مورد مسیر دهی و تعداد دیتابیس تغییرات را ایجاد نمائید.
سپس کوئری را اجرا کنید.
پس از گذشت مدت زمانی که بستگی به تعداد و حجم دیتابیس ها دارد، بازگردانی انجام خواهد شد.
Use [master] CREATE TABLE myFileList (FileNumber INT IDENTITY,FileName VARCHAR(256)) --Insert file list from directory to SQL Server DECLARE @Path varchar(256) = 'dir C:\Backup\' DECLARE @Path3 varchar(256) = 'C:\Backup\' DECLARE @Path2 varchar(256) DECLARE @Command varchar(1024) = @Path + ' /A-D /B' INSERT INTO myFileList EXEC MASTER.dbo.xp_cmdshell @Command Declare @bakdbname varchar(256) Declare @dbname varchar(256) Declare @numberdb int Declare @mainlen int set @numberdb=1 --Check the list while (@numberdb < 10) begin set @bakdbname = (SELECT FileName FROM myFileList where FileNumber = @numberdb) print @bakdbname set @mainlen = Len(@bakdbname) set @dbname = left(@bakdbname,@mainlen - 4) print @dbname SET @Path2 = @Path3 + @bakdbname ; print @Path2 ALTER DATABASE [@dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE RESTORE DATABASE @dbname FROM DISK = @Path2 WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 5 ALTER DATABASE [@dbname] SET MULTI_USER set @numberdb=@numberdb + 1 END GO --Clean up DROP TABLE myFileList GO