当我想制作数据库的副本时,我总是创建一个新的空数据库,然后将现有数据库的备份还原到其中。 但是,我想知道这是否真的是最不容易出错,最简单,最有效的方法吗?

===============>>#1 票数:7

可以跳过创建空数据库的步骤。 您可以在还原过程中创建新数据库。

这实际上是我知道克隆数据库的最简单和最好的方法。 您可以通过编写备份和还原过程的脚本来消除错误,而不是通过SQL Server Management Studio运行它

您还可以探索其他两个选项:

  1. 分离数据库,复制.mdf文件并重新附加。
  2. 使用SQL Server Integration Services(SSIS)复制所有对象

我建议坚持备份和恢复,并在必要时自动化。

===============>>#2 票数:4

这是我过去使用的动态sql脚本。 它可以进一步修改,但它将为您提供基础知识。 我更喜欢编写脚本来避免使用Management Studio犯错误:


Declare @OldDB varchar(100)
Declare @NewDB varchar(100)
Declare @vchBackupPath varchar(255)
Declare @query varchar(8000)


/*Test code to implement 
Select @OldDB = 'Pubs'
Select @NewDB = 'Pubs2'
Select @vchBackupPath = '\\dbserver\C$\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\pubs.bak'
*/

SET NOCOUNT ON;

Select @query = 'Create Database ' + @NewDB
exec(@query)

Select @query = '
Declare @vBAKPath varchar(256)
declare @oldMDFName varchar(100)
declare @oldLDFName varchar(100)
declare @newMDFPath varchar(100)
declare @newLDFPath varchar(100)
declare @restQuery varchar(800)

select @vBAKPath = ''' + @vchBackupPath + '''
select @oldLDFName = name from ' + @OldDB +'.dbo.sysfiles where filename like ''%.ldf%''
select @oldMDFName = name from  ' + @OldDB +'.dbo.sysfiles where filename like ''%.mdf%''
select @newMDFPath = physical_name from ' + @NewDB +'.sys.database_files where type_desc = ''ROWS''
select @newLDFPath = physical_name from ' + @NewDB +'.sys.database_files where type_desc = ''LOG''

select @restQuery = ''RESTORE DATABASE ' + @NewDB + 
' FROM DISK = N'' + '''''''' + @vBAKpath + '''''''' + 
'' WITH MOVE N'' + '''''''' + @oldMDFName + '''''''' +  
'' TO N'' + '''''''' + @newMDFPath + '''''''' +  
'', MOVE N'' + '''''''' + @oldLDFName + '''''''' +  
'' TO N'' + '''''''' + @newLDFPath + '''''''' +  
'', NOUNLOAD, REPLACE, STATS = 10''

exec(@restQuery)
--print @restQuery'


exec(@query)





===============>>#3 票数:3 已采纳

备份和恢复是我所知道的最直接的方式。 您必须小心服务器之间,因为恢复的数据库不附带安全凭据。

===============>>#4 票数:0

发布到提供程序功能对我来说非常有用。 请参阅Scott Gu的博客文章

如果您需要在展鹏软件的工具,一些真正健壮的外观在这里 ......如果你是做多的SQL可言,这些都是值得的$$。

===============>>#5 票数:0

::================ BackUpAllMyDatabases.cmd ============= START
::BackUpAllMyDatabases.cmd
:: COMMAND LINE BATCH SCRIPT FOR TAKING BACKUP OF ALL DATABASES 

::RUN THE SQL SCRIPT VIA THE COMMAND LINE WITH LOGGING 
sqlcmd -S localhost -e  -i "BackUpAllMyDatabases.sql" -o Result_Of_BackUpAllMyDatabases.log

::VIEW THE RESULTS
Result_Of_BackUpAllMyDatabases.log

::pause
::================ BackUpAllMyDatabases.cmd ============= END


--=================================================BackUpAllMyDatabases.sql start
DECLARE @DBName varchar(255)

DECLARE @DATABASES_Fetch int

DECLARE DATABASES_CURSOR CURSOR FOR
    select
        DATABASE_NAME   = db_name(s_mf.database_id)
    from
        sys.master_files s_mf
    where
       -- ONLINE
        s_mf.state = 0 

       -- Only look at databases to which we have access
    and has_dbaccess(db_name(s_mf.database_id)) = 1 

        -- Not master, tempdb or model
    --and db_name(s_mf.database_id) not in ('Master','tempdb','model')
    group by s_mf.database_id
    order by 1

OPEN DATABASES_CURSOR

FETCH NEXT FROM DATABASES_CURSOR INTO @DBName

WHILE @@FETCH_STATUS = 0
BEGIN
    declare @DBFileName varchar(256)    
    set @DBFileName = @DbName + '_' + replace(convert(varchar, getdate(), 112), '-', '.') + '.bak'
--REMEMBER TO PUT HERE THE TRAILING \ FOR THE DIRECTORY !!!
    exec ('BACKUP DATABASE [' + @DBName + '] TO  DISK = N''D:\DATA\BACKUPS\' + 
        @DBFileName + ''' WITH NOFORMAT, INIT,  NAME = N''' + 
        @DBName + '-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD,  STATS = 100')

    FETCH NEXT FROM DATABASES_CURSOR INTO @DBName
END

CLOSE DATABASES_CURSOR
DEALLOCATE DATABASES_CURSOR

--BackUpAllMyDatabases==========================end

--======================RestoreDbFromFile.sql start
-- Restore database from file
-----------------------------------------------------------------
use master
go

declare @backupFileName varchar(100), @restoreDirectory varchar(100),
@databaseDataFilename varchar(100), @databaseLogFilename varchar(100),
@databaseDataFile varchar(100), @databaseLogFile varchar(100),
@databaseName varchar(100), @execSql nvarchar(1000)

-- Set the name of the database to restore
set @databaseName = 'ReplaceDataBaseNameHere'
-- Set the path to the directory containing the database backup
set @restoreDirectory = 'ReplaceRestoreDirectoryHere' -- such as 'c:\temp\'

-- Create the backup file name based on the restore directory, the database name and today's date

@backupFileName = @restoreDirectory + @databaseName + '-' + replace(convert(varchar, getdate(), 110), '-', '.') + '.bak'


-- set @backupFileName = 'D:\DATA\BACKUPS\server.poc_test_fbu_20081016.bak'

-- Get the data file and its path
select @databaseDataFile = rtrim([Name]),
@databaseDataFilename = rtrim([Filename])
from master.dbo.sysaltfiles as files
inner join
master.dbo.sysfilegroups as groups
on

files.groupID = groups.groupID
where DBID = (
select dbid
from master.dbo.sysdatabases
where [Name] = @databaseName
)

-- Get the log file and its path
select @databaseLogFile = rtrim([Name]),
@databaseLogFilename = rtrim([Filename])
from master.dbo.sysaltfiles as files
where DBID = (
select dbid
from master.dbo.sysdatabases
where [Name] = @databaseName
)
and
groupID = 0

print 'Killing active connections to the "' + @databaseName + '" database'

-- Create the sql to kill the active database connections
set @execSql = ''
select @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '
from master.dbo.sysprocesses
where db_name(dbid) = @databaseName
and
DBID <> 0
and
spid <> @@spid
exec (@execSql)

print 'Restoring "' + @databaseName + '" database from "' + @backupFileName + '" with '
print ' data file "' + @databaseDataFile + '" located at "' + @databaseDataFilename + '"'
print ' log file "' + @databaseLogFile + '" located at "' + @databaseLogFilename + '"'

set @execSql = '
restore database [' + @databaseName + ']
from disk = ''' + @backupFileName + '''
with
file = 1,
move ''' + @databaseDataFile + ''' to ' + '''' + @databaseDataFilename + ''',
move ''' + @databaseLogFile + ''' to ' + '''' + @databaseLogFilename + ''',
norewind,
nounload,
replace'

exec sp_executesql @execSql

exec('use ' + @databaseName)
go

-- If needed, restore the database user associated with the database
/*
exec sp_revokedbaccess 'myDBUser'
go

exec sp_grantdbaccess 'myDBUser', 'myDBUser'
go

exec sp_addrolemember 'db_owner', 'myDBUser'
go

use master
go
*/
--======================RestoreDbFromFile.sql

  ask by Dan translate from so

未解决问题?本站智能推荐:

8回复

复制数据库的最佳方法(SQL Server 2008)

愚蠢的问题-在要使用生产服务器中的实例刷新开发服务器的环境中,复制实例的最佳方法是什么? 我已经完成了备份-还原,但是我听说过detach-copy-attach,甚至有人告诉我他只是在文件系统之间复制数据文件。 这三种(或两种,最后一种听起来有些可疑)是否被接受? 我的理解是
2回复

创建每晚复制SQL Server数据库的最佳方法

我想创建一个每天晚上运行的工作。 我有一个数据库(MyDatabase),我想用(MyDatabase_Stage)复制/替换我的登台数据库。 我认为最简单的方法是执行与SQL Server代理相关的操作,但是我以前从未做过这样的事情。 什么是进行此设置和测试的最佳实践和最简单的方法?
3回复

如果列中有数据,更改SQL Server数据库中列类型的最佳方法是什么?

如果我有下表: 此刻name的类型为varchar(10) ,value的类型为bit 。 我想更改此表,以便该值实际上是nvarchar(3) ,并且我不想在更改期间丢失任何信息。 因此,最后我想要一个看起来像这样的表: 将此列从一种类型转换为另一种类型,并根据预定转换
7回复

允许用户即时向其数据库添加列的最佳方法是什么? [关闭]

我们正在考虑设计一个管理联系信息的应用程序。 客户的一个要求是允许其powerusers或admin-type staff通过UI向数据库添加列。 客户无法直接访问数据库(即,他们无法使用SSMS打开并进行更改)。 我看到控件1)输入字段名称,2)输入数据类型,3)选择要添加字段的
3回复

部署SQL Server数据库的最佳版本中性方法是什么?

在开发框中,我始终运行最新版本的SQL Server。 我经常将数据库从开发箱部署到实时/临时区域进行审查或测试。 我已经做过很多次了,这一直是一个痛苦的过程,但是我意识到我需要找到一种更简单,更可靠和一致的方式来执行此基本操作。 我通常只使用WebMatrix进行部署,并且运行良好,
1回复

将增量从一个数据库复制到另一个数据库的最佳策略

我有一个带有表A的交易数据库TD。我还有一个带有表B的报表数据库RD。在列和数据类型方面,表B与表A完全相似。 我需要将表A复制到表B中 : 有关表A的详细信息:1)表A是一个事务表,每天都会添加新的事务。 2)另外,表A每天都有对现有交易的更新,其中有一个称为updatedate
1回复

SQL Server数据库远程传输-最佳方法

我有两个数据库,一个在远程服务器上,另一个在本地。 (SQL Server 2008年) 我的本地服务器上的数据库具有完整的结构设置,但没有数据。 我想将数据从远程服务器复制到我的服务器,我想知道执行此操作的最佳方法。 我遇到的主要问题是我对远程数据库的用户权限有限。 我无法读
3回复

每小时自动恢复数据库的最佳方法

我有一个演示站点,任何人都可以登录并测试管理界面。 我想每小时刷新SQL 2008数据库中的所有数据并从原始数据中恢复它。 Red Gate Software有一些很棒的工具,但是它们现在超出了我的预算。 我可以简单地制作数据库数据文件的备份副本,然后使用ac#console
1回复

避免数据库设计中列过多和复杂的最佳方法

库存物品: 此类库存项目以及所有这些都需要存储在发票表中 如何使用适当的RDBMS将它们存储在数据库中。 根据我的意见,每个列表都包含一个主表并使用JOINS进行检索。 但是,向数据库中添加太多表可能有点复杂。 当针对发票存储所有这些信息时,这种规范化存在一些问题。
4回复

存储数据库中的电子邮件ID列表的最佳数据类型是什么?

我的要求是将emailIds列表存储在一个列中,这样做的最佳数据类型是什么? 我的专栏就像EmailTo,EmailCC,EmailBCC,我需要在其中存储ID列表。 另外,帮助我了解数据类型的大小 。 我正在使用SQL服务器。