PDA

View Full Version : حرفه ای: چگونه می توان backup در زمان های خاص از دیتابیس گرفت ؟



alireza_rashvand
یک شنبه 15 بهمن 1391, 18:24 عصر
سلام
ایا کسی می داند که چگونه می توان در زمان های خاص مثلا هر شب یا هر 6 ساعت سیستم خود یک backup از دیتابیس بگیرد .
البته زمان را کاربر مشخص کند .
برنامه وب می باشد C# Web
و دیتابیس : SqlServer2008
ممنون اگر کدی دارید در اختیار قرار دهید .
بدلیل وقت کم نتوانستم در سایت خوب در مورد سوالم جستجو کنم .
سپاس

ma.rad
یک شنبه 15 بهمن 1391, 18:32 عصر
برای انجام کارها در SQL SERVER به صورت خودکار باید JOB تعریف کرد. این کار میتواند به صورت دستی از داخل برنامه انجام شود یا اینکه برای آن Script نوشت و آن را اجرا کرد. یکی سوالات متداول این است که چگونه میتوانیم به صورت خودکار از SQL SERVER پشتیبانگیری کنیم، این کار با JOB ها قابل انجام است. در زیر چند Job کاربردی برای نمونه آورده شده است: Back up به صورت کامل : کد مثال برای تمام Job ها یک دایرکتوری به ازای هر پایگاه داده خواهد ساخت و از آن پشتیبانگیری میکند :

DECLARE @basePath varchar(300);
SET @basePath = N'M:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\';

DECLARE @db sysname;
DECLARE user_db_cursor CURSOR FOR
SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')
OPEN user_db_cursor
FETCH NEXT FROM user_db_cursor
INTO @db

WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @backupPath varchar(1000);
SET @backupPath = @basePath + @db + '\';

DECLARE @backupName varchar(1000);
DECLARE @time datetime2;
SET @time = SYSDATETIME();
SET @backupName = @db + '_backup_' + REPLACE(REPLACE(REPLACE(CONVERT(varchar, @time, 20),'-','_'),':',''),' ','_')
+ '_' + CAST(DATEPART(NANOSECOND, @time)/100 as varchar)

--Create sub-directory
EXECUTE master.dbo.xp_create_subdir @backupPath

DECLARE @backupFileName varchar(1000);
SET @backupFileName = @backupPath + @backupName + '.bak';

--Backup database
BACKUP DATABASE @db TO DISK=@backupFileName
WITH RETAINDAYS=14, NOFORMAT, NOINIT, NAME=@backupName ,
SKIP, REWIND, NOUNLOAD, STATS=10

CLOSE user_db_cursor
DEALLOCATE user_db_cursor

پشتیبان Differential :

DECLARE @basePath varchar(300);
SET @basePath = N'M:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\';

DECLARE @db sysname;
DECLARE user_db_cursor CURSOR FOR
SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')
OPEN user_db_cursor
FETCH NEXT FROM user_db_cursor
INTO @db

WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @backupPath varchar(1000);
SET @backupPath = @basePath + @db + '\';

DECLARE @backupName varchar(1000);
DECLARE @time datetime2;
SET @time = SYSDATETIME();
SET @backupName = @db + '_backup_' + REPLACE(REPLACE(REPLACE(CONVERT(varchar, @time, 20),'-','_'),':',''),' ','_')
+ '_' + CAST(DATEPART(NANOSECOND, @time)/100 as varchar)

--Create sub-directory
EXECUTE master.dbo.xp_create_subdir @backupPath

DECLARE @backupFileName varchar(1000);
SET @backupFileName = @backupPath + @backupName + '.bak';

--Backup database
BACKUP DATABASE @db TO DISK=@backupFileName
WITH DIFFERENTIAL, RETAINDAYS=14, NOFORMAT, NOINIT, NAME=@backupName ,
SKIP, REWIND, NOUNLOAD, STATS=10

CLOSE user_db_cursor
DEALLOCATE user_db_cursor

پشتیبان Transaction Log :

DECLARE @basePath varchar(300);
SET @basePath = N'M:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\';

DECLARE @db sysname;
DECLARE user_db_cursor CURSOR FOR
SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')
OPEN user_db_cursor
FETCH NEXT FROM user_db_cursor
INTO @db

WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @backupPath varchar(1000);
SET @backupPath = @basePath + @db + '\';

DECLARE @backupName varchar(1000);
DECLARE @time datetime2;
SET @time = SYSDATETIME();
SET @backupName = @db + '_backup_' + REPLACE(REPLACE(REPLACE(CONVERT(varchar, @time, 20),'-','_'),':',''),' ','_')
+ '_' + CAST(DATEPART(NANOSECOND, @time)/100 as varchar)

--Create sub-directory
EXECUTE master.dbo.xp_create_subdir @backupPath

DECLARE @backupFileName varchar(1000);
SET @backupFileName = @backupPath + @backupName + '.trn';

--Backup database
BACKUP LOG @db TO DISK=@backupFileName
WITH RETAINDAYS=14, NOFORMAT, NOINIT, NAME=@backupName ,
SKIP, REWIND, NOUNLOAD, STATS=10

CLOSE user_db_cursor
DEALLOCATE user_db_cursor

اجرای Job Agent Task در SQL SERVER :

EXEC msdb.dbo.sp_start_job '<job name>';

نکته : این عملیات به کمک SQL Server Agent انجام میشود. اطمینان حاصل کنیدکه سرویس مربوط به آن run است.

ma.rad
یک شنبه 15 بهمن 1391, 18:33 عصر
این هم مراحل به صورت ویزاردی:
۱. با راست کلیک روی بانک اطلاعاتی مورد نظر، گزینه Tasks\Backup را انتخاب کنید.
۲. نوع Backup را انتخاب کنید. Full حجم زیادی از هارد را مصرف خواهد کرد و به ازای هر backup گیری یک فایل ایحاد می‌کند. در حالی که Differntial استفاده بهینه‌تری از فضای هارد داشته و فقط یک فایل ایجاد می‌کند. (ترجیحا از نوع Differntial استفاده شود)
۳. در قسمت Destination در پایین صفحه، مسیر مورد نظر برای پشتیبان گیری مشخص می‌شود.
۴. در بالای همین صفحه روی فلش کنار دکمه Script کلیک میکنیم و از منوی باز شده گزینه Script action to job را باز میکنیم.
۵. در صفحه باز شده و در قسمت سمت چپ صفحه از بخش Select a page‌ گزینه Schedules‌ را انتخاب میکنیم.
۶. در همین صفحه روی دکمه New‌ کلیک میکنیم.
۷. صفحه جدیدی به نام New Job Schedule باز خواهد شد.
۸. در این صفحه بعد از نام گذاری، تنظیمات لازم و دلخواه در رابطه با زمانبندی Back Up گیری را انجام میدهیم.
۹. در اینجا با کلیک روی دکمه OK صفحه را بسته تا صفحه New Job مجددا نمایش داده شود.
۱۰. با کلیک روی Notifications و تیک زدن چک باکس Write to … یک Notify تعریف کنید. نوع این Notify را When the job completes تعریف کنید.
۱۱. دکمه Ok را کلیک کنید تا به صفحه تعریف Backup برگردید.
۱۲. دکمه Ok این صفحه را هم کلیک کنید تا صفحه بسته شود.
۱۳. پایان

alireza_rashvand
دوشنبه 16 بهمن 1391, 17:49 عصر
سپاس از جوابی که دادید .
ایا می توان job را با storeprocedured ساخت(پیاده سازی کرد) و زمان ذخیره و مکان قایل را به ان داد ؟
اگر کدی دارید لطفا در اختیار قرار دهید
باسپاس دوباره

ordebehesht
دوشنبه 16 بهمن 1391, 18:05 عصر
دوستان لطف کنین کدهاتون رو تو تگهای مربوطه قرار بدین تا خوانا تر یشه

ma.rad
دوشنبه 16 بهمن 1391, 18:19 عصر
بله می شه ، الان حس توضیح نیست:
http://barnamenevis.org/showthread.php?71609-backup-%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%AA%D9%88%D9%85%D8%A7%D8%AA%DB%8C%DA%A9-%D8%AF%D8%B1-sqlserver

alireza_rashvand
دوشنبه 16 بهمن 1391, 18:29 عصر
خیلی ممنون
من هم وقتم تمام شده و رفتم که فردا برگردم
امید وارم تا ان زمان حس شما نیز برگردد !!
بازهم ممنون که جواب دادید .
خدانگهدار

ma.rad
سه شنبه 17 بهمن 1391, 16:26 عصر
اینو نگاه کنی متوجه می شی:


USE [master]
GO
/****** Object: StoredProcedure [dbo].[sp_BackupDatabase] Script Date: 02/07/2012 11:40:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author: Edgewood Solutions
-- Create date: 2007-02-07
-- Description: Backup Database
-- Parameter1: databaseName
-- Parameter2: backupType F=full, D=differential, L=log
-- =============================================
CREATE PROCEDURE [dbo].[sp_BackupDatabase]
@databaseName sysname, @backupType CHAR(1)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @sqlCommand NVARCHAR(1000)
DECLARE @dateTime NVARCHAR(20)

SELECT @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),111),'/','') +
REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')

IF @backupType = 'F'
SET @sqlCommand = 'BACKUP DATABASE [' + @databaseName +
'] TO DISK = ''C:\Backup\' + @databaseName + '_Full_' + @dateTime + '.BAK'''

IF @backupType = 'D'
SET @sqlCommand = 'BACKUP DATABASE [' + @databaseName +
'] TO DISK = ''C:\Backup\' + @databaseName + '_Diff_' + @dateTime + '.BAK'' WITH DIFFERENTIAL'

IF @backupType = 'L'
SET @sqlCommand = 'BACKUP LOG [' + @databaseName +
'] TO DISK = ''C:\Backup\' + @databaseName + '_Log_' + @dateTime + '.TRN'''

EXECUTE sp_executesql @sqlCommand
END



و مثلا نوع F

EXEC TestDatabase.dbo.sp_BackupDatabase 'master', 'F'
GO
EXEC TestDatabase.dbo.sp_BackupDatabase 'model', 'F'
GO
EXEC TestDatabase.dbo.sp_BackupDatabase 'msdb', 'F'
GO
QUIT

alireza_rashvand
سه شنبه 17 بهمن 1391, 16:39 عصر
این کد شما دو پرامتر دارد.
1- نام و 2 -نوع
البته اگر اشتباه کردم لطفا بیشتر توضیح دهید
زمان را در این کد توضیح می دهید .
منظورم خود کد نیست .
مثلا اگر بخواهیم هر شب ساعت 12 بکاب گرفته شود چه کنیم اگر بخواهیم کاربر این زمان را مشخص کند چی ؟
لازم به ذکر است که کد بسیار ساده را نوشتم ولی در زمان مشخص نبود فقط زمانی که فراخوانی می شود ذخیره می کرد ایا می توان ان را بهینه کرد ؟



ALTER PROCEDURE [dbo].[backup_me]
(@db_name nvarchar(50),@disk nvarchar(300))
AS
BEGIN
backup database @db_name TO disk=@disk
END


با سپاس دوباره

ma.rad
سه شنبه 17 بهمن 1391, 17:03 عصر
اصلا موضوع همینه زمان یه پارامتر که می تونید از کاربر هم بگیرید

alireza_rashvand
سه شنبه 17 بهمن 1391, 17:19 عصر
ایا یک بار اجرا کنیم خود دیتابیس را تنظیم می کند؟
این کد چکار می کند؟

SELECT @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),111),'/','') +
REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')

ma.rad
سه شنبه 17 بهمن 1391, 17:28 عصر
ایا یک بار اجرا کنیم خود دیتابیس را تنظیم می کند؟
این کد چکار می کند؟

SELECT @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),111),'/','') +
REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')


بله فقط زمان باید جایی ذخیره بشه
وقتی از تاریخ وزمان برای ذخیره به عنوان نام فایل و از این قبیل صحبت ها استفاده می شه کاراکتر "/"و ":" با چیزای دیگه جایگزین می شه

alireza_rashvand
سه شنبه 17 بهمن 1391, 17:51 عصر
چیزی که شما نوشته اید تقریبا همان فایل من البته با کمی تغییرات
ولی به نظر من هنوز زمان مشخص نمی شود بلکه زمان سیستم را با نام فایلی که به ان می دهیم می جسباند و ذخیره می کند همین .
اگر اشتبا ه کردم لطفا بگویید .
شاید سوالم درست نگفته ام :
می خواهم این کد در ساعت مشخص اجرا شود .(Schedule)

alireza_rashvand
سه شنبه 17 بهمن 1391, 18:06 عصر
کدی که من در قسمت ویزاد رفتم در بکاب و انجام مسیر ذخیره فایل را مشخص کردم بعد در بالای صفحه جاب را زدم و برای ان جاب زمان مشخصی را انتخاب (ساعت 12 شب هر روز ) بعد ok را زدم صفحه بکاب را نیز ok کردم روی جاب کلید راست و اسکریپت ان را کریئیت کردم این کدها را نشان داد حال می توان بجای زمان و مکان این فایل پرارمتر قرار داد سوال اینجاست که چگونه و اینکه چگونه این فایل را در یک استورپروسیجر پیاده سازی و اجرا کنم . لینک که در بالا دادید را دنبال کردم ولی خیلی متوجه نشدم (سوادم جواب نداد) ایا شما دوست عزیز (ma.rad)و دوستان دیگر می توانند جواب من را بدهند :
پیشاپیش از همه دوستان تشکر می کنم (بسیار مسئله حیاتیست )


USE [msdb]
GO

/****** Object: Job [Back Up Database - jetton_] Script Date: 02/05/2013 18:33:04 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 02/05/2013 18:33:04 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Back Up Database - jetton_',
@enabled=1,
@notify_level_eventlog=3,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'No description available.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'ZEITOON\Administrator', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [1] Script Date: 02/05/2013 18:33:04 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'1',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'BACKUP DATABASE [jetton] TO DISK = N''D:\ZEITOON\PlatFormSource\backUpMSSQL\Backup'' WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N''jetton-Differential Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
',
@database_name=N'master',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'settime',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20130205,
@active_end_date=99991231,
@active_start_time=120000,
@active_end_time=235959,
@schedule_uid=N'1a81627f-ced1-4d75-82a7-5947c32122eb'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:


البته فکر کنم بتوان کد را به گونه ای تغییر داد که بجایی که اد کند ویرایش کند ولی بازهم نمی دانم چکونه .

ordebehesht
سه شنبه 17 بهمن 1391, 19:23 عصر
ببینم دوست من شما میخوای خود sql این کار رو کنه یا کدی درج کنی که خود کد این کار رو کنه اگه میخوای کد برنامت این کار رو کنه از تایمر استفاده کن ولی نه sql قرار اینکار رو کنه تو تالار مربوطش بپرسین بهتر به نتیجه میرسین

ma.rad
سه شنبه 17 بهمن 1391, 19:46 عصر
کدی که من در قسمت ویزاد رفتم در بکاب و انجام مسیر ذخیره فایل را مشخص کردم بعد در بالای صفحه جاب را زدم و برای ان جاب زمان مشخصی را انتخاب (ساعت 12 شب هر روز ) بعد ok را زدم صفحه بکاب را نیز ok کردم روی جاب کلید راست و اسکریپت ان را کریئیت کردم این کدها را نشان داد حال می توان بجای زمان و مکان این فایل پرارمتر قرار داد سوال اینجاست که چگونه و اینکه چگونه این فایل را در یک استورپروسیجر پیاده سازی و اجرا کنم . لینک که در بالا دادید را دنبال کردم ولی خیلی متوجه نشدم (سوادم جواب نداد) ایا شما دوست عزیز (ma.rad)و دوستان دیگر می توانند جواب من را بدهند :
پیشاپیش از همه دوستان تشکر می کنم (بسیار مسئله حیاتیست )
البته فکر کنم بتوان کد را به گونه ای تغییر داد که بجایی که اد کند ویرایش کند ولی بازهم نمی دانم چکونه .

تبدیل کدهای بالا به sp:
http://www.codeproject.com/Tips/499829/Create-job-to-export-Stored-Procedure-daily

اینم بد نیست:
http://www.codeproject.com/Articles/47308/SQL-Server-Express-Automated-Backup-Console-Applic

اگر بازم نشد بگو یه نمونه درست کنم بزارم

alireza_rashvand
سه شنبه 27 فروردین 1392, 16:53 عصر
سلام
متاسفانه مشکل بنده هنوز پابرجاست
کسی هست که بتواند مشکل بنده را حل کند ؟
یک با دیگر طرح مسئله می کنم :
ایا می توان کار کرد که مدیر سایت زمان خاصی را set کند و پس از ان در همان زمان از دیتابیس یک بکاب جدید گرفته شود .
الان فقط می تواند دکمه ای را کلیک کند و با نام خواسته شده یک بکاب از دیتابیس گرفته ذخیره شود .
سپاس