关于数据库与事务日志的理解上的误区,希望得到各位老师指点,谢谢!

由于接触MSSQL不久,问题太多,而且比较乱,请各位老师们见谅。

我的理解:事务日志分为活动事务日志和不活动事务日志。活动事务日志是指自上次事务日志备份后对数据库所作的改动。

说明:数据库故障还原的模型是完全。备份数据库无论是完全或追加都是A文件和事务日志备份无论是覆盖或追加都是用B文件。

问题1:备份的事务日志加上当时活动的事务日志是否就是对数据库创建之后的所有更改操作的记录集?

问题2:如果问题1的答案为是的话,哪么事务日志文件就是慢慢变大,如果经常备份,那么增大的是备份的事务日志文件,否则就是数据库的事务日志文件。我如果去删除我不需要的那一部分日志,例如我一个星期前的事务日志我不再需要,假设我刚刚覆盖之前的事务日志方式备份完日务日志,我如何回收这一部分空间。

问题3:如果问题1的答案为否的话,备份事务日志时有覆盖与追加到某个文件两种方式。是否意味着覆盖方式是将自上次数据库备份之后对数据库所作的更改的所有记录,而追加则意味着自上次事务日志备份之后对数据库所作的任何更改。哪么在这种情况下,自完全备份数据库之后,再想恢复数据库到备份之前的某个时间有无可能?例如,我8:00覆盖备份日志,9:00追加备份日志,10:00完全备份数据库,11:00再覆盖备份日志,那么是否我在10:30最多可以将数据库恢复到8:00~10:00的状态,或11:00之后只能恢复到10:00~11:00之间任一时刻的状态。

问题4:接问题3,除了备份的数据库日志,数据库当前的事务日志是否也可以应用到恢复数据库上,例如我A服务器损坏,例如数据库所存放的磁盘损坏,但事务日志文件未损坏,我除了拷贝备份的数据库与备份的日志恢复到B服务器外,我如果想恢复到数据库故障的前一刻,我是不是拷贝该事务日志文件,再应用到B服务器上。

问题5:用Backup Log语句备份事务日志后(可能是完成或增量),事务日志文件还会继续增大吗?还是需要用backup log @databasename with No_log去显式说明。

问题6:恢复数据库的顺序为恢复数据库备份->恢复数据库差异的备份->恢复数据库日志备份->恢复数据库日志。例如,我8:00覆盖备份日志,9:00追加备份日志,10:00完全备份数据库,11:00再覆盖备份日志,12:00差异备份数据库,13:00追加备份日志,14:00主数据库文件损坏,我要恢复数据库到8:30、9:30、10:30、11:30、12:30、13:30、故障的前一刻的步骤各是如何!

问题7:未完成的事务就是BEGIN TRANSACTION之后未提交的事务,例如我用BCB写程序,用ADOConniton控件连接数据库并用BeginTrans()开始事务,那么我在客户端所作的更改,到底是在存放客户端内存到上还是存放在服务器端的内存上。或者这个BEGIN TRANSACTION只是在SQL语句中显示使用时事务时才算。

---------------------------------------------------------------

问题1:备份的事务日志加上当时活动的事务日志是否就是对数据库创建之后的所有更改操作的记录集?
备份事务日志之前一定会有一个完全备份或者还会有一些差异备份,总用完全备份太不值了
再加上备份的事务日志和当前活动的日志就构成了完全备份之后的所有的更改,用事务日志备份可以恢复到日志中的任何时间点

---------------------------------------------------------------

关于你的这个问题,看完了,头有些大,呵呵,整理一下发现,只是对数据库的事物日志当中的若干问题有些转筋,我把我知道的一些内容给你讲一下,可能你也知道这些内容,但是还是希望能对你有所帮助。如果想详细交流,可以发邮件给我。[email protected]

在备份的时候,首先要确定备份策略,其中包括完全备份,完全/增量备份,完全事务日志备份,完全/增量数据事务备份,文件组备份。根据不同的实际情况可以采取不同的办法。其中,如果数据库在一次完全备份后,进行多次增量备份,则每次增量备份都是备份自完全备份以来的变化,而非上次增量备份以来的变化。例如,星期一进行完全备份,星期二、三、四分别进行增量备份,这样星期二的增量备份是星期一到星期二的数据库的变化,星期三的增量备份拷贝的是星期一到星期三的数据库变化,星期四是星期一到星期四的数据库变化。在确定备份策略的时候,要注意以下几点:
1、保证将数据库两次备份间隔期间内的事物日志备份;
2、保证备份要保护的每个数据库;
3、保证备份MASTER数据库
4、保证备份MSdb数据库。

另外在你的帖子当中提到了一个事务日志增多的问题,在解决这个问题的时候,通常都是使用检查点这个概念的。清除旧的日志记录的过程称为日志截短。在最近检查点尚未提交的事务称为活动事务。包含活动事务的记录的日志部分称为活动部分,事务日志的活动部分在某些时候要用于恢复数据库,因此不允许截短。在事务日志活动部分开始处,日志记录的行顺序号称为最小恢复行顺序号MinLSN,它为以下LSN当中的最小值:
1,检查点的LSN
2,活动事务的BEGIN TRAN的纪录LSN
3,复制事务的BEGIN TRAN的纪录LSN。
再利用事务日志进行恢复的时候,至少要有一个数据库的完全备份或者增量备份,否则事务的变更没有任何的意义。

关于你最后的问题,你可以看看关于数据库加锁的概念。

欢迎其它各位同仁进行补充和指教。
---------------------------------------------------------------

问题1:备份的事务日志加上当时活动的事务日志是否就是对数据库创建之后的所有更改操作的记录集?

这个你数据库的选项设置有关,默认设置下就是所有操作的记录集.

---------------------------------------------------------------

数据库选项设置说明:
ALTER DATABASE

  1<databasename> RECOVERY <recovery_options>
  2<recovery_options>   
  3  
  4控制数据库恢复选项。   
  5  
  6RECOVERY FULL ¦ BULK_LOGGED ¦ SIMPLE   
  7如果指定为 FULL,系统将对介质错误提供完全保护。如果数据文件损坏,介质恢复可以还原所有已提交的事务。   
  8如果指定为 BULK_LOGGED,将在介质错误保护程度与某些大规模或大容量操作的最优性能及日志存储空间最少占用量之间进行权衡。这些操作包括 SELECT INTO、大容量装载操作(bcp 和 BULK INSERT)、CREATE INDEX 以及文本和图象操作(WRITETEXT 和 UPDATETEXT)。   
  9  
 10在大容量日志记录恢复模型下,对整个类只做最少的日志记录,并且无法逐个操作地控制日志记录行为。   
 11  
 12如果指定为 SIMPLE,系统将提供占用日志空间最小的备份策略。服务器故障恢复不再需要的日志空间可被自动重用。   
 13  
 14  
 15  
 16重要 简单恢复模型比其它两种模型更容易管理,但数据文件损坏时造成数据丢失的可能性更大。最近的数据库备份或差异数据库备份之后的更改都将丢失,必须手工重新输入。   
 17  
 18默认恢复模型由 model 数据库的恢复模型确定。若要更改新数据库的默认值,请用 ALTER DATABASE 设置 model 数据库的恢复选项。   
 19  
 20  
 21\---------------------------------------------------------------   
 22  
 23问题2:空间回收,即日志文件的压缩问题   
 24  
 25\--压缩日志及数据库文件大小   
 26  
 271.清空日志   
 28DUMP TRANSACTION 库名 WITH NO_LOG   
 29  
 302.截断事务日志:   
 31BACKUP LOG 数据库名 WITH NO_LOG   
 32  
 333.收缩数据库文件(如果不压缩,数据库的文件不会减小   
 34企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件   
 35\--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   
 36\--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   
 37  
 38也可以用SQL语句来完成   
 39\--收缩数据库   
 40DBCC SHRINKDATABASE(客户资料)   
 41  
 42\--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles   
 43DBCC SHRINKFILE(1)   
 44  
 454.为了最大化的缩小日志文件   
 46a.分离数据库:   
 47企业管理器--服务器--数据库--右键--分离数据库   
 48  
 49b.在我的电脑中删除LOG文件   
 50  
 51c.附加数据库:   
 52企业管理器--服务器--数据库--右键--附加数据库   
 53  
 54此法将生成新的LOG,大小只有500多K   
 55  
 56或用代码:   
 57下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。   
 58  
 59a.分离   
 60EXEC sp_detach_db @dbname = 'pubs'   
 61  
 62b.删除日志文件   
 63  
 64c.再附加   
 65EXEC sp_attach_single_file_db @dbname = 'pubs',   
 66@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'   
 67  
 68  
 69说明:   
 701,2步操作是截断日志,可以理解为回收了逻辑空间的占用,没有回收日志记录占用的磁盘空间(物理空间)   
 713,4步操作才是回收日志记录占用的磁盘空间(物理空间)   
 72  
 73\---------------------------------------------------------------   
 74  
 75问题3:   
 76补充问题1,任何收缩日志(截断日志)的操作(包括将数据库设置为自动收缩),都会清理日志文件,因此,如果在进行日志收缩之前,没有做日志备份的话.   
 77问题1的答案为否.   
 78\---------------------------------------------------------------   
 79  
 80问题4:   
 81  
 82日志文件可以应用于数据的恢复,下面是一个实例:   
 83  
 84下面是一篇介绍如何在数据库文件损坏(日志文件完好)情况下,进行恢复   
 85  
 86数据库文件损坏的时候如何恢复   
 871 建一个测试数据库test(数据库类型为完全)   
 882 建一个表,插入点记录   
 89create table a(c1 varchar(2))   
 90go   
 91insert into a values('aa')   
 92go   
 93insert into a values('bb')   
 94go   
 953 作完全备份,到文件test_1.bak   
 964 在作一点修改   
 97insert into a values('cc')   
 98go   
 99create table b(c1 int)   
100go   
101insert into b values(1)   
102go   
103insert into b values(2)   
104go   
1055 shutdown 数据库服务器   
1066 用ultraedit编辑数据库文件test_data.mdf,随便修改点字节内容   
1077 启动数据库,并且运行企业管理器,点开数据库,看到test变成灰色,而且显示置疑。   
108  
109\---------------------------------------------------------   
110太长,FAQ无法全部提交,</recovery_options></recovery_options></databasename>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus