论文部分内容阅读
摘 要:MS SQL Server用事务(Transaction)来跟踪数据库的一切变化,日志文件则用来记录事务对数据库的所有更新操作,它在数据库恢复技术中起着非常重要的作用。本文将以登记日志文件为技术要点,简要讨论MS SQL Server数据库的安全备份与恢复策略。
关键词:MS SQL Server 数据库恢复 备份 日志文件
中图分类号:G250.74 文献标识码:A 文章编号:1673-8454(2008)07-0083-02
一、问题的提出
数据库是高校校园网、电子商务网站、ERP系统等基于网络的大型信息化平台的基础,数据库服务器则掌握着交易记录、商业事务和账号数据等敏感数据以及战略上或专业的信息,一旦遭到攻击或毁坏,将会带来巨大的损失。
我们知道,事务是MS SQL Server的工作单元,MS SQL Server用事务(Transaction)来跟踪所有数据库的变化。一个事务包含一条或多条作为整体执行的T-SQL语句。[1] 而每个数据库都有自己的事务日志(Transaction Log),即系统表(Syslogs),日志文件则用来记录事务对数据库所有的更新操作,它在数据库恢复技术中起着非常重要的作用。当数据库毁坏后,利用日志文件对已完成的事务进行重做处理,对故障发生时尚未完成的事务进行撤消处理,这样能够以较高的效率将数据库恢复到故障前某一时刻的正确状态,且能保证较高的安全性。然而目前,很多数据库服务器都是和WEB服务器隔离开的,管理员几乎很少查看数据库日志文件。
为了确保被毁坏数据库中大部分信息的恢复,我们必须重视数据库的管理与维护工作,定期进行数据库备份是防止系统发生故障最稳妥的方法。数据库的安全备份/恢复策略固然有多种,但MS SQL Server数据库系统一旦崩溃,其原先的备份数据是很难恢复的,因为MS SQL Server不像其他数据库可以直接拷贝数据文件,其恢复都是靠日志文件来完成,所以,日志文件丢失是一件非常危险的事情,很有可能导致数据库彻底毁坏。[2]
二、MS SQL Server的安全备份及恢复策略
下面,我们将以MS SQL Server为例,讨论利用日志文件进行数据库备份与恢复的技术要点。
1.利用无活动事务的日志备份数据库
正常方式下,我们要备份一个数据库,首先要先将该数据库从运行的数据服务器中断开,或者停掉整个数据库服务器,然后复制文件。
卸下数据库的命令:sp_detach_db 数据库名
连接数据库的命令:sp_attach_db或者sp_attach_ single_file_db
假设数据库为mydb,其数据文件为mydb_data.mdf,日志文件为mydb_log.ldf。
则备份、恢复该数据库的命令为:
卸下数据库:sp_detach_db ′mydb′
连接数据库:
sp_attach_db ′mydb′,′C:\Program Files\Microsoft SQL Server\MSSQL\Data\ mydb_data.mdf′,′C:\Program Files\ Microsoft SQL Server\MSSQL\Data\ mydb_log.ldf′
sp_attach_single_file_db ′mydb′,′C:\Program Files\ Microsoft SQL Server\MSSQL\Data\mydb_data.mdf’
2.利用包含活动事务的日志恢复数据库
由于种种原因,我们的系统中可能仅仅保留了备份的mdf文件,如果该mdf文件是当前数据库产生的,那么使用sp_attach_db或者sp_attach_single_file_db可以恢复数据库。[3] 但如果数据库文件是从其他计算机上复制过来的,当含有活动事务的日志丢失时,上述方法也许就行不通了,我们会看到类似下面的错误信息:
“服务器:消息 1517,级别 16,状态 2,行 1
未能打开新数据库′mydb′;CREATE DATABASE将终止;设备激活错误;物理文件名′d:\mydb_log.ldf′可能有误”。
对于这种情况,我们可采用如下方法:
(1)使用默认方式在SQL Server Enterprise Manager中建立一个供恢复使用的数据库(如mydb);
(2)停掉数据库服务器;
(3)将刚才生成的数据库的日志文件mydb_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件mydb_data.mdf;
(4)启动数据库服务器,此时会看到数据库mydb的状态为“置疑”,这时不能对此数据库进行任何操作;
(5)设置数据库,允许直接操作系统表。此操作可以在SQL Server Enterprise Manager中选择数据库服务器,即用鼠标右键选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中,也可以使用如下语句来实现:
use master
go
sp_configure ′allow updates′,1
go
reconfigure with override
go
(6)设置mydb为紧急修复模式:update sysdatabase set status=-32768 where dbid=DB_ID(′mydb′),此时可以在SQL Server Enterprise Manager中看到该数据库处于“只读\置疑\脱机\紧急模式”,但仅仅能够看到数据库中的系统表;
(7)下面执行真正的恢复操作,重建数据库日志文件:
dbcc rebuild_log(′mydb′,′C:\Program Files\Microsoft SQL Server\MSSQL\Data\mydb_log.ldf′),
执行过程中如果遇到下列提示信息:
“服务器:消息2630,级别16,状态1,行1,未能排它地锁定数据库以执行该操作,DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系”,说明其它程序正在使用该数据库,如果刚才在第6步中使用SQL Server Enterprise Manager打开了mydb库的系统表,那么退出SQL Server Enterprise Manager就可以了。
(8)验证数据库一致性
dbcc checkdb(′mydb′)
一般执行结果如下:
“CHECKDB 发现了0个分配错误和0个一致性错误(在数据库 ′mydb′ 中);DBCC 执行完毕;如果 DBCC 输出了错误信息,请与系统管理员联系”;
(9)设置数据库为正常状态
sp_dboption ′mydb′,′dbo use only′,′false′
如果没有出错,那么现在就可以正常使用恢复后的数据库了;
(10)最后,将步骤5中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager中恢复,也可以使用如下语句完成:
sp_configure ′allow updates′,0
go
reconfigure with override
go
三、后记
利用日志文件恢复数据库的前提是系统中保留着数据库的备份,而很多用户难以养成定期手动备份的习惯,建议使用MS SQL Server的“自动备份数据库”功能,具体操作如下:
打开企业管理器,在控制台根目录中依次打开Microsoft SQL Server→SQL Server组,双击打开服务器;在工具菜单选择“数据库维护计划器”,点击“下一步”选择要进行自动备份的数据,继续点击“下一步”更新数据优化信息并检查数据完整性。再点击“下一步”指定数据库维护计划(默认的是1周备份一次),选择“每天备份”后点击“确定”。接着,可以在E盘新建一个目录(如:E:\databak),选择“使用此目录”,并依据具体要求确定删除早于多少天前的备份(一般设定为4-7天)。最后,点击“下一步”指定事务日志备份计划,并维护计划的历史记录(这里最好用默认的选项)。系统此时很可能会提示“SQL Server Agent服务未启动”,需要完成计划设定并打开状态栏中的SQL绿色图标,在服务中选择SQL Server Agent,点击“运行”,选择“当启动OS时自动启动服务”。这时,数据库计划已经成功地运行了,它将按照上面的设置进行自动备份。
数据库在使用一段时间后,其日志也将日益庞大。对于新建的数据库,日志文件的大小一般应为数据库大小的30%,而日志的大小也取决于数据库修改的频繁程度,即依赖于用户如何操作数据库。[4] 我们可以为Server添加一个作业,让它定期运行,为数据库日志文件“减肥”。压缩日志的思想是删除非活动记录,从而减少日志文件所占用的物理空间。当压缩日志时,首先应将旧记录标记为非活动状态,然后将带有非活动标记的记录彻底删除。压缩工作应尽量选在系统不是非常繁忙的时段进行,否则有可能影响数据库性能。
参考文献:
[1]程云志等.数据库原理与SQL Server2005应用教程[M].北京:机械工业出版社,2006.
[2]王征,李家兴等. SQL Server2005实用教程[M].北京:清华大学出版社,2006.
[3]朱虹,史凌云,张勇.多级安全数据库系统推理问题研究[J].计算机工程与应用,2004(13):179-183.
[4]李黎民,秦小麟.安全数据库概述与前瞻[J].计算机系统应用,2005(5):91-93.
关键词:MS SQL Server 数据库恢复 备份 日志文件
中图分类号:G250.74 文献标识码:A 文章编号:1673-8454(2008)07-0083-02
一、问题的提出
数据库是高校校园网、电子商务网站、ERP系统等基于网络的大型信息化平台的基础,数据库服务器则掌握着交易记录、商业事务和账号数据等敏感数据以及战略上或专业的信息,一旦遭到攻击或毁坏,将会带来巨大的损失。
我们知道,事务是MS SQL Server的工作单元,MS SQL Server用事务(Transaction)来跟踪所有数据库的变化。一个事务包含一条或多条作为整体执行的T-SQL语句。[1] 而每个数据库都有自己的事务日志(Transaction Log),即系统表(Syslogs),日志文件则用来记录事务对数据库所有的更新操作,它在数据库恢复技术中起着非常重要的作用。当数据库毁坏后,利用日志文件对已完成的事务进行重做处理,对故障发生时尚未完成的事务进行撤消处理,这样能够以较高的效率将数据库恢复到故障前某一时刻的正确状态,且能保证较高的安全性。然而目前,很多数据库服务器都是和WEB服务器隔离开的,管理员几乎很少查看数据库日志文件。
为了确保被毁坏数据库中大部分信息的恢复,我们必须重视数据库的管理与维护工作,定期进行数据库备份是防止系统发生故障最稳妥的方法。数据库的安全备份/恢复策略固然有多种,但MS SQL Server数据库系统一旦崩溃,其原先的备份数据是很难恢复的,因为MS SQL Server不像其他数据库可以直接拷贝数据文件,其恢复都是靠日志文件来完成,所以,日志文件丢失是一件非常危险的事情,很有可能导致数据库彻底毁坏。[2]
二、MS SQL Server的安全备份及恢复策略
下面,我们将以MS SQL Server为例,讨论利用日志文件进行数据库备份与恢复的技术要点。
1.利用无活动事务的日志备份数据库
正常方式下,我们要备份一个数据库,首先要先将该数据库从运行的数据服务器中断开,或者停掉整个数据库服务器,然后复制文件。
卸下数据库的命令:sp_detach_db 数据库名
连接数据库的命令:sp_attach_db或者sp_attach_ single_file_db
假设数据库为mydb,其数据文件为mydb_data.mdf,日志文件为mydb_log.ldf。
则备份、恢复该数据库的命令为:
卸下数据库:sp_detach_db ′mydb′
连接数据库:
sp_attach_db ′mydb′,′C:\Program Files\Microsoft SQL Server\MSSQL\Data\ mydb_data.mdf′,′C:\Program Files\ Microsoft SQL Server\MSSQL\Data\ mydb_log.ldf′
sp_attach_single_file_db ′mydb′,′C:\Program Files\ Microsoft SQL Server\MSSQL\Data\mydb_data.mdf’
2.利用包含活动事务的日志恢复数据库
由于种种原因,我们的系统中可能仅仅保留了备份的mdf文件,如果该mdf文件是当前数据库产生的,那么使用sp_attach_db或者sp_attach_single_file_db可以恢复数据库。[3] 但如果数据库文件是从其他计算机上复制过来的,当含有活动事务的日志丢失时,上述方法也许就行不通了,我们会看到类似下面的错误信息:
“服务器:消息 1517,级别 16,状态 2,行 1
未能打开新数据库′mydb′;CREATE DATABASE将终止;设备激活错误;物理文件名′d:\mydb_log.ldf′可能有误”。
对于这种情况,我们可采用如下方法:
(1)使用默认方式在SQL Server Enterprise Manager中建立一个供恢复使用的数据库(如mydb);
(2)停掉数据库服务器;
(3)将刚才生成的数据库的日志文件mydb_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件mydb_data.mdf;
(4)启动数据库服务器,此时会看到数据库mydb的状态为“置疑”,这时不能对此数据库进行任何操作;
(5)设置数据库,允许直接操作系统表。此操作可以在SQL Server Enterprise Manager中选择数据库服务器,即用鼠标右键选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中,也可以使用如下语句来实现:
use master
go
sp_configure ′allow updates′,1
go
reconfigure with override
go
(6)设置mydb为紧急修复模式:update sysdatabase set status=-32768 where dbid=DB_ID(′mydb′),此时可以在SQL Server Enterprise Manager中看到该数据库处于“只读\置疑\脱机\紧急模式”,但仅仅能够看到数据库中的系统表;
(7)下面执行真正的恢复操作,重建数据库日志文件:
dbcc rebuild_log(′mydb′,′C:\Program Files\Microsoft SQL Server\MSSQL\Data\mydb_log.ldf′),
执行过程中如果遇到下列提示信息:
“服务器:消息2630,级别16,状态1,行1,未能排它地锁定数据库以执行该操作,DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系”,说明其它程序正在使用该数据库,如果刚才在第6步中使用SQL Server Enterprise Manager打开了mydb库的系统表,那么退出SQL Server Enterprise Manager就可以了。
(8)验证数据库一致性
dbcc checkdb(′mydb′)
一般执行结果如下:
“CHECKDB 发现了0个分配错误和0个一致性错误(在数据库 ′mydb′ 中);DBCC 执行完毕;如果 DBCC 输出了错误信息,请与系统管理员联系”;
(9)设置数据库为正常状态
sp_dboption ′mydb′,′dbo use only′,′false′
如果没有出错,那么现在就可以正常使用恢复后的数据库了;
(10)最后,将步骤5中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager中恢复,也可以使用如下语句完成:
sp_configure ′allow updates′,0
go
reconfigure with override
go
三、后记
利用日志文件恢复数据库的前提是系统中保留着数据库的备份,而很多用户难以养成定期手动备份的习惯,建议使用MS SQL Server的“自动备份数据库”功能,具体操作如下:
打开企业管理器,在控制台根目录中依次打开Microsoft SQL Server→SQL Server组,双击打开服务器;在工具菜单选择“数据库维护计划器”,点击“下一步”选择要进行自动备份的数据,继续点击“下一步”更新数据优化信息并检查数据完整性。再点击“下一步”指定数据库维护计划(默认的是1周备份一次),选择“每天备份”后点击“确定”。接着,可以在E盘新建一个目录(如:E:\databak),选择“使用此目录”,并依据具体要求确定删除早于多少天前的备份(一般设定为4-7天)。最后,点击“下一步”指定事务日志备份计划,并维护计划的历史记录(这里最好用默认的选项)。系统此时很可能会提示“SQL Server Agent服务未启动”,需要完成计划设定并打开状态栏中的SQL绿色图标,在服务中选择SQL Server Agent,点击“运行”,选择“当启动OS时自动启动服务”。这时,数据库计划已经成功地运行了,它将按照上面的设置进行自动备份。
数据库在使用一段时间后,其日志也将日益庞大。对于新建的数据库,日志文件的大小一般应为数据库大小的30%,而日志的大小也取决于数据库修改的频繁程度,即依赖于用户如何操作数据库。[4] 我们可以为Server添加一个作业,让它定期运行,为数据库日志文件“减肥”。压缩日志的思想是删除非活动记录,从而减少日志文件所占用的物理空间。当压缩日志时,首先应将旧记录标记为非活动状态,然后将带有非活动标记的记录彻底删除。压缩工作应尽量选在系统不是非常繁忙的时段进行,否则有可能影响数据库性能。
参考文献:
[1]程云志等.数据库原理与SQL Server2005应用教程[M].北京:机械工业出版社,2006.
[2]王征,李家兴等. SQL Server2005实用教程[M].北京:清华大学出版社,2006.
[3]朱虹,史凌云,张勇.多级安全数据库系统推理问题研究[J].计算机工程与应用,2004(13):179-183.
[4]李黎民,秦小麟.安全数据库概述与前瞻[J].计算机系统应用,2005(5):91-93.