导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

请教各位大侠一个问题,关乎小弟前程!!!

zl13 2004-08-30 03:47:00
使用那些方式可以将整个database在最短的时间内完整的转移到另一台database server,请大家帮忙,我想知道mssql和oracle的执行命令
...全文
131 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rivey 2004-08-31
and(@dbname like '%,'+name+',%' or @dbname like name+',%' or @dbname like '%,'+name)
'%,' ',%'
这部分是实现什么功能的?
回复
rouqu 2004-08-31
考题?
回复
rivey 2004-08-31
学习..

又够 我半天研究的了..呵呵
回复
--上面的方法不包括用户移植,如果要移植用户,还要做下面的工作:

--1.生成安全性中的用户(在源服务器的企业管理器中执行)
sql200企业管理器
--右键任意数据库
--所有任务
--生成SQL脚本
--<选项>中,"安全性选项",选择"包含创建数据库及用户权限","编写 SQL Server 登录(Windows NT 和 SQL Server 登录)脚本"
--其他所有的选项保持默认值
--然后确定,将其保存成一个.sql文件

--2.在恢复数据库前,在目标服务器的查询分析器中执行上面的sql文件,完成用户的移植
回复
--将上面备份的目录复制到目标服务器,并在目标服务器的master数据库中创建下面的存储过程,然后用它来恢复所有的用户数据库.

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_RestoreDb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_RestoreDb]
GO

/*--恢复指定目录下的所有数据库

恢复的数据库名为备份文件名(不含扩展名)
备份文件的扩展名固定为.bak

--邹建 2003.10(引用请保留此信息)--*/

/*--调用示例
--恢复指定目录下的所有数据库
exec p_RestoreDb @bkpath='c:\'

--恢复指定目录下的指定数据库
exec p_RestoreDb @bkpath='c:\',@bkfile='客户资料,xzkh_new'
--*/
create proc p_RestoreDb
@bkpath nvarchar(1000)='', --定义备份文件的存放目录,默认为SQL的备份目录
@bkfile nvarchar(4000)='', --定义要恢复的备份文件名,不含扩展名
@dbpath nvarchar(260)='', --恢复后的数据库存放目录,不指定则为SQL的默认数据目录
@overexist bit=1, --是否覆盖已经存在的数据库,仅@retype为'DB'/'DBNOR'是有效
@killuser bit=1 --是否关闭用户使用进程,仅@overexist=1时有效
as
declare @sql varchar(8000),@dbname sysname

if isnull(@bkpath,'')=''
begin
select @bkpath=rtrim(reverse(filename)) from master..sysfiles where name='master'
select @bkpath=substring(@bkpath,charindex('\',@bkpath)+1,4000)
,@bkpath=reverse(substring(@bkpath,charindex('\',@bkpath),4000))+'BACKUP\'
end
else if right(@bkpath,1)<>'\' set @bkpath=@bkpath+'\'

--得到恢复后的数据库存放目录
if isnull(@dbpath,'')=''
begin
select @dbpath=rtrim(reverse(filename)) from master..sysfiles where name='master'
select @dbpath=reverse(substring(@dbpath,charindex('\',@dbpath),4000))
end
else if right(@dbpath,1)<>'\' set @dbpath=@dbpath+'\'

--得到指定目录下的所有备份文件
create table #t(fname varchar(260),depth int,isf bit)
insert into #t exec master..xp_dirtree @bkpath,1,1

if isnull(@bkfile,'')=''
declare tb cursor local for select fn=left(fname,patindex('%.bak',fname)-1) from #t
where isf=1 and fname like '%.bak' --取.bak文件
else
begin
set @bkfile=','+replace(@bkfile,',','.bak,')+'.bak,'
declare tb cursor local for select fn=left(fname,patindex('%.bak',fname)-1) from #t
where isf=1 and fname like '%.bak' and @bkfile like '%,'+fname+',%'
end

--恢复数据库处理
open tb
fetch next from tb into @dbname
while @@fetch_status=0
begin
--生成数据库恢复语句
set @sql='restore database '+@dbname
+' from disk='''+@bkpath+@dbname+'.bak'''
+' with RECOVERY'
+case when @overexist=1 then ',replace' else '' end

--添加移动逻辑文件的处理
--从备份文件中获取逻辑文件名
declare @lfn nvarchar(128),@tp char(1),@i int

--创建临时表,保存获取的信息
create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
--从备份文件中获取信息
insert into #tb exec('restore filelistonly from disk='''+@bkpath+@dbname+'.bak''')
declare #f cursor local for select ln,tp from #tb order by tp
open #f
fetch next from #f into @lfn,@tp
set @i=0
while @@fetch_status=0
begin
select @sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@dbname+cast(@i as varchar)
+case @tp when 'D' then '.mdf''' else '.ldf''' end
,@i=@i+1
fetch next from #f into @lfn,@tp
end
close #f
deallocate #f
drop table #tb

--关闭用户进程处理
if @overexist=1 and @killuser=1
begin
declare @spid varchar(20)
declare #spid cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #spid
fetch next from #spid into @spid
while @@fetch_status=0
begin
exec('kill '+@spid)
fetch next from #spid into @spid
end
close #spid
deallocate #spid
end

--恢复数据库
exec(@sql)
fetch next from tb into @dbname
end
close tb
deallocate tb
go
回复
--如果楼主是要对整个实例的多个数据库进行迁移,用下面的两个存储过程,即安全,又快



--处理过程

--1.新建一个目录,用来保存备份的数据库,然后在master数据库中创建此存储过程,并调用它来完成用户数据库的备份.

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_backupdb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_backupdb]
GO

/*--备份所有数据库

备份的文件名为数据库名+.bak

--邹建 2003.10(引用请保留此信息)--*/

/*--调用示例

--备份所有用户数据库
exec p_backupdb @bkpath='c:\',@dbname=''

--备份指定数据库
exec p_backupdb @bkpath='c:\',@dbname='客户资料,xzkh_new'
--*/
create proc p_backupdb
@bkpath nvarchar(260)='', --备份文件的存放目录,不指定则使用SQL默认的备份目录
@dbname nvarchar(4000)='' --要备份的数据库名称列表,不指定则备份所有用户数据库
as
declare @sql varchar(8000)

--检查参数
if isnull(@bkpath,'')=''
begin
select @bkpath=rtrim(reverse(filename)) from master..sysfiles where name='master'
select @bkpath=substring(@bkpath,charindex('\',@bkpath)+1,4000)
,@bkpath=reverse(substring(@bkpath,charindex('\',@bkpath),4000))+'BACKUP\'
end
else if right(@bkpath,1)<>'\' set @bkpath=@bkpath+'\'

--得到要备份的数据库列表
if isnull(@dbname,'')=''
declare tb cursor local for
select name from master..sysdatabases where name not in('master','tempdb','model','msdb')
else
declare tb cursor local for
select name from master..sysdatabases
where name not in('master','tempdb','model','msdb')
and(@dbname like '%,'+name+',%' or @dbname like name+',%' or @dbname like '%,'+name)

--备份处理
open tb
fetch next from tb into @dbname
while @@fetch_status=0
begin
set @sql='backup database '+@dbname
+' to disk='''+@bkpath+@dbname
+'.bak'' with init'
exec(@sql)
fetch next from tb into @dbname
end
close tb
deallocate tb
go

回复
附加比备份/还原快,但不安全,很多网友遇到用正常分离的数据文件附加不上的情况
备份/还原是最安全,也相对来说比较快的.
回复
zhangzs8896 2004-08-30
同意 libin_ftsafe(子陌红尘)
回复
tongyizh 2004-08-30
同意,附加的速度比还原快多了
回复
xiaoxiangqing 2004-08-30
sqlserver最快的方法是
1.备份-----恢复
2.分離-----附加
sqlserver其它的方法是
用sqlserver自帶的導入導出

回复
子陌红尘 2004-08-30
SQL Server可以通过1、备份/恢复;2、分离/附加等方法来实现
有关SQL Server 2000备份/恢复的资料可以查阅论坛的精华区;

分离/附加:
/-----------------------------------------------------------------------------/
sp_detach_db
从服务器分离数据库,并可以选择在分离前在所有的表上运行 UPDATE STATISTICS。

语法
sp_detach_db [ @dbname = ] 'dbname'
[ , [ @skipchecks = ] 'skipchecks' ]

参数
[@dbname =] 'dbname'

要分离的数据库名称。dbname 的数据类型为 sysname,默认值为 NULL。

[@skipchecks =] 'skipchecks'

skipchecks 的数据类型为 nvarchar(10),默认值为 NULL。如果为 true,则跳过 UPDATE STATISTICS。如果为 false,则运行 UPDATE STATISTICS。对于要移动到只读媒体上的数据库,此选项很有用。

返回代码值
0(成功)或 1(失败)

结果集


/-----------------------------------------------------------------------------/
sp_attach_db
将数据库附加到服务器。

语法
sp_attach_db [ @dbname = ] 'dbname'
, [ @filename1 = ] 'filename_n' [ ,...16 ]

参数
[@dbname =] 'dbname'

要附加到服务器的数据库的名称。该名称必须是唯一的。dbname 的数据类型为 sysname,默认值为 NULL。

[@filename1 =] 'filename_n'

数据库文件的物理名称,包括路径。filename_n 的数据类型为 nvarchar(260),默认值为 NULL。最多可以指定 16 个文件名。参数名称以 @filename1 开始,递增到 @filename16。文件名列表至少必须包括主文件,主文件包含指向数据库中其它文件的系统表。该列表还必须包括数据库分离后所有被移动的文件。

返回代码值
0(成功)或 1(失败)

结果集

/-----------------------------------------------------------------------------/
/*******************************************************************************/

Oracle转移最简单的办法是冷备份/恢复

有关资料可以查阅本论坛Oracle精华区
回复
老宛 2004-08-30
把sql server服务停止掉,然后把所有的用户数据库的mdf和ldf文件拷贝到另一台服务器上,然后附加数据库,也可以
回复
tx1icenhe 2004-08-30
备份-----恢复
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告