PDA

View Full Version : scrip کپی کردن دیتابیس



sadaf_
یک شنبه 07 اسفند 1390, 17:56 عصر
سلام
در sql یک امکانی هست که می توان دیتابیس را کپی کرد
من scrip این امکان را می خواستم
ممنون

Galawij
یک شنبه 07 اسفند 1390, 19:12 عصر
سلام،
روی نام بانک کلیک راست کنید، گزینه Tasks، از زیر منوی باز شده گزینه Generate Script. اگر از ورژن 2008 استفاده می کنید، می تونید داده های موجود در بانک را هم انتقال بدید.

sadaf_
دوشنبه 08 اسفند 1390, 09:13 صبح
اما من scrip می خوام که بتونم از برنامه ام این کار را انجام بدم
در گزینه task و copy database این فرایند رو به خوبی انجام می ده و حتی داده ها را هم می بره
لطفا کمکم کنین
ممنون

Galawij
دوشنبه 08 اسفند 1390, 09:45 صبح
شما می خواید از طریق برنامه از بانکتون، Back up بگیرید؟؟
این که تو زبانی که برنامه می نویسید، دستورات مربوطه را داره!!(script نمی خواد)

sadaf_
دوشنبه 08 اسفند 1390, 09:57 صبح
بکاپ نمی خوام بگیرم
می خوام با scrip یک دیتابیس ایجاد کنم و از دیتابیسی که در همون سرور وجود داره یک copy بریزم در دیتابیس جدید
منظورم از copy یعنی با وجود تمام داده ها و table و ... همه

Galawij
دوشنبه 08 اسفند 1390, 10:10 صبح
بکاپ نمی خوام بگیرم
می خوام با scrip یک دیتابیس ایجاد کنم و از دیتابیسی که در همون سرور وجود داره یک copy بریزم در دیتابیس جدید
منظورم از copy یعنی با وجود تمام داده ها و table و ... همه
خوب عزیز من همون روش اولی که گفتم (Generate script) همین کار را براتون می کنه، فقط باید تنظیماتش را رعایت کنید، برای داده ها هم باید ورژنتون 2008 باشه. خروجی اش را می تونید از نوع Script بذارید.
در ضمن از Role ها و Schema کپی نگیرید که موقعه اجرا خطا می ده!
راهی دیگه ای فعلاً به ذهن من نمی رسه!

sadaf_
دوشنبه 08 اسفند 1390, 10:14 صبح
sql من 2005
داده ها را چکار کنم؟

Arash_janusV3
دوشنبه 08 اسفند 1390, 10:17 صبح
درود
این کد را الان پیدا کردم اما sql ندارم که تست کنم
از دوستان خواهشمندم نظراتشون را بدهند

USE master

GO


DECLARE @DB varchar(200)

SET @DB = 'SourceDB'

-- the backup filename

DECLARE @BackupFile varchar(2000)

SET @BackupFile = 'c:\testing\SourceDBbackup.dat'

-- the new database name

DECLARE @TestDB varchar(200)

SET @TestDB = 'DestinationDB'

-- the new database files without .mdf/.ldf

DECLARE @RestoreFile varchar(2000)

SET @RestoreFile = 'c:\testing\destination'



-- ********************************************

-- no change below this line

-- ********************************************



DECLARE @query varchar(2000)

DECLARE @DataFile varchar(2000)

SET @DataFile = @RestoreFile + '.mdf'

DECLARE @LogFile varchar(2000)

SET @LogFile = @RestoreFile + '.ldf'

IF @DB IS NOT NULL

BEGIN

SET @query = 'BACKUP DATABASE ' + @DB + ' TO DISK = ' + QUOTENAME(@BackupFile, '''')

EXEC (@query)

END



IF EXISTS(SELECT * FROM sysdatabases WHERE name = @TestDB)

BEGIN

SET @query = 'DROP DATABASE ' + @TestDB

EXEC (@query)

END

RESTORE HEADERONLY FROM DISK = @BackupFile

DECLARE @File int

SET @File = @@ROWCOUNT

-- This always returned 0 for me but the

-- RESTORE call returned the number

-- of rows associated with the backup. Strange...



DECLARE @Data varchar(500)

DECLARE @Log varchar(500)

SET @query = 'RESTORE FILELISTONLY FROM DISK = ' + QUOTENAME(@BackupFile , '''')

CREATE TABLE #restoretemp

(

LogicalName varchar(500),

PhysicalName varchar(500),

Type varchar(10),

FilegroupName varchar(200),

Size int,

MaxSize bigint,

FileID bigint,

CreateLSN numeric(25,0),

DropLSN numeric(25,0),

UniqueId uniqueidentifier,

ReadOnlyLSN numeric(25,0),

ReadWriteLSN numeric(25,0),

BackupSizeInBytes bigint,

SourceBlockSize int,

FileGroupId int,

LogGroupGUID uniqueidentifier,

DifferentialBaseLSN numeric(25,0),

DifferentialBaseGUID uniqueidentifier,

IsReadOnly bit,

IsPresent bit

)

INSERT #restoretemp EXEC (@query)

SELECT @Data = LogicalName FROM #restoretemp WHERE type = 'D'

SELECT @Log = LogicalName FROM #restoretemp WHERE type = 'L'

PRINT @Data

PRINT @Log

TRUNCATE TABLE #restoretemp

DROP TABLE #restoretemp



SET @query = 'RESTORE DATABASE ' + @TestDB + ' FROM DISK = ' + QUOTENAME(@BackupFile, '''') +

' WITH MOVE ' + QUOTENAME(@Data, '''') + ' TO ' + QUOTENAME(@DataFile, '''') + ', MOVE ' +

QUOTENAME(@Log, '''') + ' TO ' + QUOTENAME(@LogFile, '''') + ', FILE = 1, RECOVERY'



EXEC (@query)



GO

sadaf_
دوشنبه 08 اسفند 1390, 16:08 عصر
لطفا راهنمایی کنین

tiphooo
دوشنبه 08 اسفند 1390, 17:07 عصر
با اسکریپت backup بگیر و با اسکریپت با یک نام دیگر restore کن
اگر می خواهی کل دیتابیس با کل مشخصات کپی بشه ساده ترین و امن ترین راه است

sadaf_
سه شنبه 09 اسفند 1390, 09:55 صبح
درود
این کد را الان پیدا کردم اما sql ندارم که تست کنم
از دوستان خواهشمندم نظراتشون را بدهند

USE master

GO


DECLARE @DB varchar(200)

SET @DB = 'SourceDB'

-- the backup filename

DECLARE @BackupFile varchar(2000)

SET @BackupFile = 'c:\testing\SourceDBbackup.dat'

-- the new database name

DECLARE @TestDB varchar(200)

SET @TestDB = 'DestinationDB'

-- the new database files without .mdf/.ldf

DECLARE @RestoreFile varchar(2000)

SET @RestoreFile = 'c:\testing\destination'



-- ********************************************

-- no change below this line

-- ********************************************



DECLARE @query varchar(2000)

DECLARE @DataFile varchar(2000)

SET @DataFile = @RestoreFile + '.mdf'

DECLARE @LogFile varchar(2000)

SET @LogFile = @RestoreFile + '.ldf'

IF @DB IS NOT NULL

BEGIN

SET @query = 'BACKUP DATABASE ' + @DB + ' TO DISK = ' + QUOTENAME(@BackupFile, '''')

EXEC (@query)

END



IF EXISTS(SELECT * FROM sysdatabases WHERE name = @TestDB)

BEGIN

SET @query = 'DROP DATABASE ' + @TestDB

EXEC (@query)

END

RESTORE HEADERONLY FROM DISK = @BackupFile

DECLARE @File int

SET @File = @@ROWCOUNT

-- This always returned 0 for me but the

-- RESTORE call returned the number

-- of rows associated with the backup. Strange...



DECLARE @Data varchar(500)

DECLARE @Log varchar(500)

SET @query = 'RESTORE FILELISTONLY FROM DISK = ' + QUOTENAME(@BackupFile , '''')

CREATE TABLE #restoretemp

(

LogicalName varchar(500),

PhysicalName varchar(500),

Type varchar(10),

FilegroupName varchar(200),

Size int,

MaxSize bigint,

FileID bigint,

CreateLSN numeric(25,0),

DropLSN numeric(25,0),

UniqueId uniqueidentifier,

ReadOnlyLSN numeric(25,0),

ReadWriteLSN numeric(25,0),

BackupSizeInBytes bigint,

SourceBlockSize int,

FileGroupId int,

LogGroupGUID uniqueidentifier,

DifferentialBaseLSN numeric(25,0),

DifferentialBaseGUID uniqueidentifier,

IsReadOnly bit,

IsPresent bit

)

INSERT #restoretemp EXEC (@query)

SELECT @Data = LogicalName FROM #restoretemp WHERE type = 'D'

SELECT @Log = LogicalName FROM #restoretemp WHERE type = 'L'

PRINT @Data

PRINT @Log

TRUNCATE TABLE #restoretemp

DROP TABLE #restoretemp



SET @query = 'RESTORE DATABASE ' + @TestDB + ' FROM DISK = ' + QUOTENAME(@BackupFile, '''') +

' WITH MOVE ' + QUOTENAME(@Data, '''') + ' TO ' + QUOTENAME(@DataFile, '''') + ', MOVE ' +

QUOTENAME(@Log, '''') + ' TO ' + QUOTENAME(@LogFile, '''') + ', FILE = 1, RECOVERY'



EXEC (@query)



GO



من از این دستور چیزی نفهمیدم
خواهشا کمکم کنین

tiphooo
سه شنبه 09 اسفند 1390, 14:56 عصر
این کد ابتدا از دیتابیس اصلی Backup گرفته و سپس با یک نام دیگر Restore کرده شاید کوتاهتر از این هم می شد نوشت که به راحتی قابل درک باشد ولی ظاهرا شما خودتون هم بدتون نمیاد کارتون پیجیده بشه