数据库的在线还原实例解析

--数据库的在线还原(读写文件组完整恢复模式) 

IF DB_ID('PRG') IS NOT NULL

DROP DATABASE PRG;

GO 

CREATE DATABASE PRG

ON PRIMARY(NAME=db_data,FILENAME='c:/1.mdf'),

FILEGROUP FG(NAME=db_data_fg,FILENAME='c:/2.ndf')

LOG ON(NAME=db_log,FILENAME='c:/1.ldf')

GO 

--在主文件组下创建表T

CREATE TABLE PRG.dbo.T(ID INT PRIMARY KEY) ON [PRIMARY];

--插入记录

INSERT INTO PRG.dbo.T SELECT 1

GO 

--主文件组在线,那么就视为数据库在线

--创建文件db_data_fg备份

BACKUP DATABASE PRG FILE='db_data_fg' TO DISK='c:/1.bak' WITH FORMAT 

--进行在先还原,指定NORECOVERY 以后,就只能按顺序进行前滚,同时文件离线还原状态.

RESTORE DATABASE PRG FILE='db_data_fg' FROM DISK='c:/1.bak' WITH NORECOVERY 

--创建表失败,因为离线

CREATE TABLE PRG.dbo.T1(ID INT PRIMARY KEY) ON fg; 

--主文件组不受影响,因为只是FG离线还原,只有企业版才支持哈.这种情况下生产环境中,不至于数据库全部挂了.

SELECT * FROM PRG.dbo.T 

--备份日志,使用COPY_ONLY,因为是要获取的日志是离线状态时候的,COPY_ONLY仅复制备份是在SQL Server 2005 中引入的,用于在执行特殊目的的备份(例如在联机文件还原前备份日志)时使用

--如果是只读文件的话,明显不会出现差异数据,所以不需要日志备份了

--简单恢复模式的话,日志都不能备份,所以也是一样

--顺便提一句,如果数据库是文件损坏,而且损坏时候都在线,要使用NO_TRUNCATE获取日志

BACKUP LOG PRG TO DISK='c:/2.bak' WITH FORMAT,COPY_ONLY; 

--恢复LOG

RESTORE LOG PRG FROM DISK='c:/2.bak' WITH RECOVERY 

--FG终于在线了,恭喜下,创建一个T1表

CREATE TABLE PRG.dbo.T1(ID INT PRIMARY KEY) ON fg;

GO 

DROP DATABASE PRG;

你可能感兴趣的:(sql,数据库,server,table,database,insert,disk)