SQL SERVER 只有ldf日志文件怎么恢复数据?

SQL SERVER 只有ldf日志文件怎么恢复数据?,第1张

参考下列说明:

/*--说明:

下面的代码演示了如何利用日志还原功能,将主数据库中的数据变化及时反馈到备用数据库中

备用数据库的数据可以随时用于查询,但不能被更新(备用数据库只读)。

--*/

--首先,创建一个演示用的数据库(主数据库)

CREATE DATABASE Db_test

ON

( NAME = Db_test_DATA,

      FILENAME = 'c:\Db_test.mdf' )

LOG ON

( NAME = Db_test_LOG,

   FILENAME = 'c:\Db_test.ldf')

GO

--对数据库进行备份

BACKUP DATABASE Db_test TO DISK='c:\test_data.bak' WITH FORMAT

GO

--把数据库还原成备用数据库(演示主数据库与这个备用数据库之间的同步)

RESTORE DATABASE Db_test_bak FROM DISK='c:\test_data.bak'

WITH REPLACE,STANDBY='c:\db_test_bak.ldf'

,MOVE 'Db_test_DATA' TO 'c:\Db_test_data.mdf'

,MOVE 'Db_test_LOG' TO 'c:\Db_test_log.ldf'

GO

--启动 SQL Agent 服务

EXEC master..xp_cmdshell 'net start sqlserveragent',no_output

GO

--创建主服务器数据训与备用服务器数据库之间同步的作业

DECLARE  @jogid uniqueidentifier

EXEC msdb..sp_add_job

@job_id = @jogid OUTPUT,

@job_name = N'数据同步处理'

--创建同步处理步骤

EXEC msdb..sp_add_jobstep

@job_id = @jogid,

@step_name = N'数据同步',

@subsystem = 'TSQL',

@command = N'

--主数据库中进行日志备份

BACKUP LOG Db_test TO DISK=''c:\test_log.bak'' WITH FORMAT

--备用数据库中还原主数据库的日志备份(应用主数据库中的最新变化

--实际应该时主数据库备份与备用数据库的还原作业应该分别在主服务器和备用服务器上建立,并且备份文件应该放在主服务器和备用都能访问的共享目录中

RESTORE LOG Db_test_bak FROM DISK=''c:\test_log.bak'' WITH STANDBY=''c:\test_log.ldf''',

@retry_attempts = 5,

@retry_interval = 5

--创建调度(每分钟执行一次)

EXEC msdb..sp_add_jobschedule

@job_id = @jogid,

@name = N'时间安排',

@freq_type=4,

@freq_interval=1,

@freq_subday_type=0x4,

@freq_subday_interval=1,

@freq_recurrence_factor=1

-- 添加目标服务器

EXEC msdb.dbo.sp_add_jobserver

@job_id = @jogid,

@server_name = N'(local)'

GO

--通过上述处理,主数据库与备用数据库之间的同步关系已经设置完成

--下面开始测试是否能实现同步

--在主数据库中创建一个测试用的表

CREATE TABLE Db_test.dbo.TB_test(ID int)

GO

--等待1分钟30秒(由于同步的时间间隔设置为1分钟,所以要延时才能看到效果)

WAITFOR DELAY '00:01:30'

GO

--查询一下备用数据库,看看同步是否成功

SELECT * FROM Db_test_bak.dbo.TB_test

/*--结果:

ID         

-----------

(所影响的行数为 0 行)

--*/

--测试成功

GO

--最后删除所有的测试

DROP DATABASE Db_test,Db_test_bak

EXEC msdb..sp_delete_job @job_name=N'数据同步处理'

GO

/*===========================================================*/

/*--服务器档机处理说明

使用这种方式建立的数据库同步,当主数据库不可用时(例如,主数据库损坏或者停机检修)

可以使用以下两种方法使备用数据库可用。

--*/

--1. 如果主数据库损坏,无法备份出最新的日志,可以直接使用下面的语句使备用数据库可读写(丢失最近一次日志还原后的所有数据)。

--RESTORE LOG Db_test_bak WITH RECOVERY

--2. 如果主数据库可以备份出最新日志,则可以使用下面的语句。

--先备份主数据库的最新的事务日志

--BACKUP LOG Db_test TO DISK=''c:\test_log.bak'' WITH FORMAT

--再在备用数据库中恢复最新的事务日志,并且使备用数据库可读写(升级为主数据库)

--RESTORE LOG Db_test_bak FROM DISK='c:\test_log.bak'

简单地说:

你的sql服务要使用指定的windows用户登陆, 而不能使用"本地系统帐户"

用于登陆sql服务的用户要求对共享目录具有所有权限

 如果你的电脑没有加入到域, 还必须保证源和目标服务器的sql服务设置的登陆用户是一样的(用户名和密码都一样)

网络备份主要是权限设置问题, 参考下面的备份文件共享目录权限设置方法去解决目录的共享权限就可以了

下面假设是假设A服务器上的数据库备份到B服务器上的共享目录权限设置(两台服务器应该在局域网内,允许目录共享访问)::

机器A,B创建一个同名的windows用户,用户组设置为administrators,并设置相同的密码,做为备份文件夹文件夹的有效访问用户, *** 作:

我的电脑

--控制面板

--管理工具

--计算机管理

--用户和组

--右键用户

--新建用户

--建立一个隶属于administrator组的登陆windows的用户

在B机器器上,新建一个共享目录,做为备份文件的存放目录, *** 作:

我的电脑--D:\ 新建一个目录,名为: BAK

--右键这个新建的目录

--属性--共享

--选择"共享该文件夹"

--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户具有对该文件夹的所有权限

--确定

设置 MSSQLSERVER 及 SQLSERVERAGENT 服务的启动用户

开始--程序--管理工具--服务

--右键 MSSQLSERVER

--属性--登陆--选择"此账户"

--输入或者选择第一步中创建的windows登录用户名

--"密码"中输入该用户的密码

--确定

--同样的方法设置 SQLSERVERAGENT

在A机器上完成对B机器BAK目录的映射

查询分析器中执行下面的语句,检验是否成功:

  exec master..xp_cmdshell 'dir 映射的盘符'

A服务器上做备份计划

备注:创建一个新的用户只是为了让MSSQLSERVER服务的启动帐户与共享目录的有效访问同名且密码相同,这样才能通过验证(所以你也可以用其他有效的用户来代替,只需要满足用户名和密码相同,并且拥有足够的权限)

数据库文件损坏的时候利用日志恢复

1 建一个测试数据库test(数据库类型为完全)

2 建一个表,插入点记录

create table a(c1 varchar(2))

go

insert into a values('aa')

go

insert into a values('bb')

go

3 作完全备份,到文件test_1.bak

4 在作一点修改

insert into a values('cc')

go

create table b(c1 int)

go

insert into b values(1)

go

insert into b values(2)

go

5 shutdown 数据库服务器

6 用ultraedit编辑数据库文件test_data.mdf,随便修改点字节内容

7 启动数据库,并且运行企业管理器,点开数据库,看到test变成灰色,而且显示置

疑。

8 运行isql -SLocalhost -Usa -P

1>backup log test TO DISK='D:\Program Files\Microsoft SQL

Server\MSSQL\BACKUP\t

est_2.bak' WITH NO_TRUNCATE

2>go

已处理 2 页,这些页属于数据库 'test' 的文件 'TEST_Log'(位于文件 1 上)。

BACKUP LOG *** 作成功地处理了 2 页,花费了 0.111 秒(0.087 MB/秒)。

9 进行恢复最老的完全备份

1>RESTORE DATABASE test FROM DISK='D:\Program Files\Microsoft SQL

Server\MSSQL\

BACKUP\test_1.bak' WITH NORECOVERY

2>go

已处理 96 页,这些页属于数据库 'test' 的文件 'TEST_Data'(位于文件 1 上)。

已处理 1 页,这些页属于数据库 'test' 的文件 'TEST_Log'(位于文件 1 上)。

RESTORE DATABASE *** 作成功地处理了 97 页,花费了 0.107 秒(7.368 MB/秒)。

10 恢复最近的日志

1>RESTORE LOG test FROM DISK='D:\Program Files\Microsoft SQL

Server\MSSQL\BACKU

P\test_2.bak' WITH RECOVERY

2>go

已处理 2 页,这些页属于数据库 'test' 的文件 'TEST_Log'(位于文件 1 上)。

RESTORE LOG *** 作成功地处理了 2 页,花费了 0.056 秒(0.173 MB/秒)。

数据已经完全恢复了,可以使用了。

select * from a

go

select * from b

go

c1

----

aa

bb

cc

有老的备份的话

1 backup log db TO DISK='e:\db2.bak' WITH NO_TRUNCATE

2 恢复最老的完全备份

RESTORE DATABASE db FROM DISK='e:\db1.bak' WITH NORECOVERY

3 恢复最近的日志

RESTORE LOG db FROM DISK='e:\db2.bak' WITH RECOVERY


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6759026.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-27
下一篇2023-03-27

发表评论

登录后才能评论

评论列表(0条)

    保存