用sql语句完成分离和附加数据库的措施

对于用Manage Studio自己看着界面操作就可以应付了。 分离数据库:
对于用存储过程来分离数据库,如果发现无法终止用户链接,可以使用ALTER
DATABASE命令,并利用一个能够中断已存在链接的终止选项来把数据库设置为SINGLE_USER模式,设置为SIGLE_USER代码如下:
ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK
IMMEDIATE下面是分离数据库的CMD命令 EXEC sp_detach_db
DatabaseName一旦一个数据库分离成功,从SQL
Server角度来看和删除这个数据库没有什么区别。 附加数据库:
对于附加数据库,可以使用sp_attach_db存储过程,或者使用带有FOR
ATTACH选项的CREATE DATABASE命令,在SQL
Server2005或更高的版本中推荐使用后者,前者是为了向前兼容,它正在逐渐淘汰,而后者更提供更多对文件的控制。
CREATE DATABASE databasename ON (FILENAME = ‘D:\Database\dbname.mdf’)
FOR ATTACH | FOR ATTACH_REBUILD_LOG
然而对于这样的附加,我们要注意几个地方。因为涉及到重建日志。
1.对于一个读/写数据库,如果含有一个可用的日志文件,无论使用FOR ATTACH
,还是使用FOR
ATTACH_REBULD_LOG,都是一样,都不会对此数据库重建日志文件。如果日志文件不可用或者物理上没有该日志文件,使用FOR
ATTACH或FOR
ATTACH_REBULID_LOG都会重建日志文件,所以如果我们复制一个带有大量日志文件的数据库到另一台服务器中,就可以只复制.mdf文件,不用复制日志文件,然后使用FOR
ATTACH_REBULD_LOG选项重建日志。条件是这台服务器将主要使用或只用改数据库的副本进行读操作。
2.对于一个只读数据库,就有点区别了,如果日志文件不可用,那么就不能更新主文件,所以也就不能重建日志,因此当我们附加一个只读数据库是,必须在FOR
ATTACH从句中指定日志文件。 如果使用附加数据库重建了日志文件。使用FOR
ATTACH_REBUILD_LOG会中断日志备份链,进行这种操作之前最好做一次数据库完全备份。
使用sp_detach_db存储过程一个好处就是可以保证一个数据库是被干净的关闭,那日志文件就不是附加数据库所必须的,我们可以使用FOR
ATTACH_REBUILD_LOG命令重建日志,得到一个最小的日志文件。也算是一种快速收缩一个大日志文件的方法。Author:兴百放
Web:Http://xbf321.cnblogs.com

有时候我们手头上的数据库可能只剩下了mdf文件,而日志文件丢失了或者损坏了,

  数据库紧急恢复过程

那么你可以尝试使用以下方法重建事务日志,注意sql 2Q不是这个语句

当数据库失效时,请记录下当前时间,然后遵循下面步骤进行恢复。

USE master;

 

GO

1.         备份数据库。

CREATE DATABASE nuke

成功,使用备份文件还原数据库,转第2步。

ON

失败,转第3步。

(FILENAME = ‘H:\Mdf-BackUp\Nuke.mdf’) –数据库文件所在

 

澳门金沙vip,—,(FILENAME =
‘H:\Mdf-BackUp\Nuke_Log.ldf’)—指定重建的日志文件路径

2.         还原数据库(在另一个服务器操作)

FOR ATTACH_REBUILD_LOG

(1)DECLARE @backup_device nvarchar(128), @log_backup_device nvarchar(128)

GO

set @backup_device = N’F:\database\myDb.bak’

当服务器因为硬件失败导致数据库失效时,可能出现以下错误:

 

文件激活失败。物理文件名称’f:\database\MyDb\MyDb_log.ldf’可能不正确。
由于数据库没有完全关闭,无法重新生成日志。

restore database MyDb

(其实这里需要注意的是,请在该位置生成这个文件.)

    from disk = @backup_device

可以尝试如下操作

WITH REPLACE , file=5

强制附加数据库
a)         新建一个同名数据库
CREATE DATABASE [MyDb_temp] 
ON (NAME=MyDb_temp,FILENAME = N’F:\temp\MyDb.mdf’ )
LOG ON (NAME=MyDb_temp_Log, FILENAME = N’F:\temp\MyDb_log.ldf’)
b)         停止SqlServer
c)         将备份的数据库覆盖F:\temp\MyDb.mdf
d)         启动SqlServer,(MyDb_temp将变为不可用)
查看数据库状态
SELECT * FROM SYS.DATABASES
SELECT * FROM sys.database_recovery_status 
e)         将数据库改为紧急恢复模式
ALTER   DATABASE   MyDb   SET   EMERGENCY 
f)   修复数据库
DBCC CheckDB (‘MyDb’)
g)         将数据库改为但用户模式
ALTER   DATABASE   MyDb   SET   SINGLE_USER 
h)         再带参数修复数据库
DBCC CheckDB (‘MyDb’,  
REPAIR_REBUILD)—此处请注意, REPAIR_REBUILD可能无效,我改用了REPAIR_ALLOW_DATA_LOSS参数,如此操作下去就不需要去执行
第二步了;
i)           将数据库改为正常模式
ALTER   DATABASE   MyDb   SET   ONLINE
如果无法创建数据库日志,i步骤将失败,这时候如果能看到数据库表,和进行Select操作,转第2步。

(2)根据事务日志来恢复到具体某个时间点

如果一切成功了,但是实际看数据库属性可能发现,日志文件在另外一个地方,此时可以把数据库进行分离,分离的时候请钩选(“删除连接”)选项,删除对应路径下的日志文件,然后按照文章开头的办法重建日志.那样数据库文件和日志文件就在一起了.

–首先基于一个完全备份点开始做事务日志还原,注意[NORECOVERY]参数

2.         提取数据库数据
a)   创建一个新的临时数据库
b)   导出数据
执行 SELECT ‘SELECT * INTO MyDb2..’+name+’ FROM ‘+ name FROM
sys.objects WHERE TYPE = ‘U’ AND name!=’sysdiagrams’
产生数据导出语句,执行他们,将数据复制到新数据库
c)   导出存储过程:待续
d)   导出触发器:待续
e)   导出函数:待续
f)   导出自定义数据类型:待续
g)   导出用户:待续
h)   将新数据库还原到目标服务器
备份/还原这个新建的数据库到目标服务器
i)   修复孤立用户(SQL 2005 版)
a)   EXEC sp_change_users_login ‘Auto_Fix’, ‘GameServer’;
b)   EXEC sp_change_users_login ‘Auto_Fix’, ‘backoffice’;
c)   EXEC sp_change_users_login ‘Auto_Fix’, ‘adminsoft’;
j)           修复数据库拥有者
EXEC sp_changedbowner ‘sa’

    RESTORE database (数据库名) from 完全备份设备名with REPLACE,NORECOVERY,

    MOVE ‘MyDb’ TO ‘D:\FMyDb_0606.mdf’,

    MOVE ‘FMyDb_Log’ TO ‘D:\FMyDb_Log_0606.ldf’

 

    –开始事务日志

    A.查看事务日志点:RESTORE
HEADERONLY from disk=’事务日志的备份的文件完全路径或备份设备名’

 

    B.开始恢复

    restore LOG 数据库名from事务日志备份设备名with FILE=1, NORECOVERY

    restore LOG 数据库名from事务日志备份设备名with FILE=2, NORECOVERY

    restore LOG 数据库名from事务日志备份设备名with FILE=3,NORECOVERY   –倒数第二个备份日志

    restore LOG 数据库名from事务日志备份设备名with FILE=4,RECOVERY –最后一个备份日志

 

 

执行失败的话,转下一步。

 

3.         复制数据库mdb, ldf文件。

执行 net stop mssqlserver 停止SQL Server服务,复制数据库mdb, ldf文件。