今天,刚刚知道有事务日志这个概念,而且在数据库频繁而长期的运行过程中,事务日志很可能因为写满,导致数据库无法插入新的纪录。于是百度了一下事务日志,学习了一下基本的概念和操作。

1.什么是事务日志?

       顾名思意,数据文件主要存储数据库的数据,包括数据库内容结构,数据页,索引页等等。而事务日志,则主要是用来保存数据库修改记录的,如下图:

   

事务处理 java 事务处理日志_事务处理 java

SQL Server的工作原理为什么这样呢?为什么不把数据立刻写入数据文件呢?原因很简单:为了得到更高的效率和性能。数据文件为了适应新的数据可能会扩展,可能会重新分配页,分配新空间等等。而日志都是连续被记录的,所以记录事务日志要快得多。这也就是为什么我们通过推荐把物理磁盘单独划分一区用来存储事务日志的原因了,这样可以使磁盘在读写上最大程序的保持自然连续。数据文件的读写有很大的随机性。

2.恢复模式

数据库的备份和还原操作发生在“恢复模式”的上下文中。恢复模式是数据库属性,它控制如何记录事务,事务日志是否需要(以及允许)备份,以及可以使用哪些还原操作。恢复模式旨在控制事务日志维护。有三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式。通常,数据库使用完整恢复模式或简单恢复模式。

  

事务处理 java 事务处理日志_sql server_02

3.查看或更改数据库的恢复模式

  1. 连接到相应的 Microsoft SQL Server 数据库引擎 实例之后,在对象资源管理器中,单击服务器名称以展开服务器树。
  2. 展开“数据库”,然后根据数据库的不同,选择用户数据库,或展开“系统数据库”,再选择系统数据库。
  3. 右键单击该数据库,再单击“属性”,这将打开“数据库属性”对话框。
  4. 在“选择页”窗格中,单击“选项”。
  5. 当前恢复模式显示在“恢复模式”列表框中。
  6. 也可以从列表中选择不同的模式来更改恢复模式。可以选择“完整”“大容量日志”“简单”。
    4.事务日志写满应该如何处理?
    /*--特别注意 
    请按步骤进行,未进行前面的步骤,请不要做后面的步骤 
    否则可能损坏你的数据库. 
    一般不建议做第4,6两步 
    第4步不安全,有可能损坏数据库或丢失数据 
    第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复. 
    --*/ 
    --下面的所有库名都指你要处理的数据库的库名 
    1.清空日志 
    DUMP     TRANSACTION     库名     WITH     NO_LOG        
     
    2.截断事务日志: 
    BACKUP   LOG   库名   WITH   NO_LOG 
    3.收缩数据库文件(如果不压缩,数据库的文件不会减小 
    企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件 
    --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 
    --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 

    也可以用SQL语句来完成 
    --收缩数据库 
    DBCC   SHRINKDATABASE(库名) 

    --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select   *   from   sysfiles 
    DBCC   SHRINKFILE(1) 

    4.为了最大化的缩小日志文件(如果是sql   7.0,这步只能在查询分析器中进行) 
    a.分离数据库: 
    企业管理器--服务器--数据库--右键--分离数据库 

    b.在我的电脑中删除LOG文件 

    c.附加数据库: 
    企业管理器--服务器--数据库--右键--附加数据库 

    此法将生成新的LOG,大小只有500多K 

    或用代码:   
    下面的示例分离   pubs,然后将   pubs   中的一个文件附加到当前服务器。 

    a.分离 
    EXEC   sp_detach_db   @dbname   =   '库名 ' 

    b.删除日志文件 

    c.再附加 
    EXEC   sp_attach_single_file_db   @dbname   =   '库名 ',   
          @physname   =   'c:\Program   Files\Microsoft   SQL   Server\MSSQL\Data\库名.mdf ' 

    5.为了以后能自动收缩,做如下设置: 
    企业管理器--服务器--右键数据库--属性--选项--选择 "自动收缩 " 

    --SQL语句设置方式: 
    EXEC   sp_dboption   '库名 ',   'autoshrink ',   'TRUE '

    6.如果想以后不让它日志增长得太大 
    企业管理器--服务器--右键数据库--属性--事务日志 
    --将文件增长限制为xM(x是你允许的最大数据文件大小) 

    --SQL语句的设置方式: 
    alter   database   库名   modify   file(name=逻辑文件名,maxsize=20) 


5.完整模式下,事务日志写满最好的处理方式----日志备份


设置事务日志传送

  启用“事务日志传送”,数据库右键菜单,选择属性,切换到“事务日志传送”,选项卡,勾选"将此数据库其用为日志传送配置中的主数据库",启用“事务日志传送”。

事务处理 java 事务处理日志_microsoft_03


事务日志备份:点击“备份设置”,可以打开“事务日志备份设置”窗体。

辅助数据库:点击“添加”,可以打开“辅助数据库设置”窗体。

配置“事务日志备份”


事务处理 java 事务处理日志_服务器_04

       备份文件夹的网络路径:此处填写备份服务器上建立的用于存放事务日志备份的文件夹的网络路径。这里说明一下,将备份文件夹放在了备份服务器上,但这不是必需的,也可以将备份文件夹放在数据库服务器上,或者放在第三台服务器上,只要保证此文件夹能从网络上被数据库服务器和备份服务器访问即可。

  备份作业─作业名称:此例中命名为"jklDW事务日志备份:事务日志备份作业",然后设置计划。


事务处理 java 事务处理日志_服务器_05

名称:命名为"jklDW事务日志备份:事务日志备份作业"。

  频率:设为"每天每小时"执行一次。因为此例中备份的是数据仓库,数据每天更新一次,频率没有必要设置得太高。如果是业务系统,则可以设置得短一些,保证数据安全。