⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ushrinklog.pas

📁 在SQL Server企业管理器中无法收缩日志时可用此工具
💻 PAS
字号:
unit UShrinkLog;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB;

type
  TfrmConfigure = class(TForm)
    GroupBox1: TGroupBox;
    rbWindows: TRadioButton;
    rbSql: TRadioButton;
    btnConnect: TButton;
    btnClose: TButton;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    Label7: TLabel;
    txtSize: TEdit;
    Label8: TLabel;
    btnShrinkLog: TButton;
    GroupBox4: TGroupBox;
    mLogFile: TMemo;
    GroupBox5: TGroupBox;
    mDataFile: TMemo;
    GroupBox6: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label5: TLabel;
    txtServer: TEdit;
    txtUser: TEdit;
    txtPassword: TEdit;
    txtdatabase: TEdit;
    Label4: TLabel;
    cmbLogName: TComboBox;
    procedure btnConnectClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
    procedure btnShrinkLogClick(Sender: TObject);
    procedure txtSizeKeyPress(Sender: TObject; var Key: Char);
    procedure txtSizeExit(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure GetDatabaseInfo;
    procedure ShrinkLog;
    function  GetStoredProcSQL:string;
  end;

var
  frmConfigure: TfrmConfigure;

implementation
uses udm;
{$R *.dfm}

procedure TfrmConfigure.btnConnectClick(Sender: TObject);
begin
  dm.WindowsLogin := rbwindows.Checked;
  dm.strServer    := self.txtServer.Text ;
  dm.strUser      := self.txtUser.Text ;
  dm.strPassword  := self.txtPassword.Text ;
  dm.strdatabase  := self.txtdatabase.Text ;

  if(dm.ConnectionDataBase=false) then
  begin
    ShowMessage('不能按您提供的信息连接到SQL Server数据库!');
    exit;
  end;
  self.btnShrinkLog.Enabled := true;
  GetDatabaseInfo;
end;

procedure TfrmConfigure.btnCloseClick(Sender: TObject);
begin
  close;
end;

procedure TfrmConfigure.GetDatabaseInfo;
var
  i:integer;
  qry:TAdoquery;
begin
  qry:=dm.GetRecordSet('select groupid,size*8/1024 as size,name,filename from sysfiles');

  mDataFile.Lines.Clear ;
  mLogFile.Lines.Clear ;
  cmbLogName.Clear ;

  for i:=1 to qry.RecordCount do
  begin
    if qry.fieldbyname('groupid').AsInteger >0 then
    begin
      self.mDataFile.Lines.Add(trim(qry.fieldbyname('name').AsString)+
      ','+qry.fieldbyname('size').AsString+'m,'+
      trim(qry.fieldbyname('filename').AsString));
    end
    else
    begin
      self.mLogFile.Lines.Add(trim(qry.fieldbyname('name').AsString)+
      ','+qry.fieldbyname('size').AsString+'m,'+
      trim(qry.fieldbyname('filename').AsString));
      cmbLogName.Items.Add(trim(qry.fieldbyname('name').AsString));
    end;
    qry.Next ;
  end;
  qry.Close ;
  qry.Destroy ;
end;

procedure TfrmConfigure.ShrinkLog;
var
  qry:TAdoquery;
  proc:TAdoStoredProc;

begin
  dm.ExecSQL('if exists (select * from dbo.sysobjects where '+
  'id=object_id(N''[dbo].[shrinklog]'')  and '+
  'OBJECTPROPERTY(id, N''IsProcedure'') = 1) '+
  ' drop procedure [dbo].[shrinklog];');
  dm.ExecSQL('SET QUOTED_IDENTIFIER OFF');
  dm.ExecSQL('SET ANSI_NULLS OFF');

  qry:=TAdoquery.Create(self);
  qry.Connection := dm.Con;
  qry.sql.add(GetStoredProcSQL);
  qry.ExecSQL ;
  qry.Close ;
  qry.Destroy ;

  dm.ExecSQL('SET QUOTED_IDENTIFIER ON');
  dm.ExecSQL('SET ANSI_NULLS ON');
  
  proc:=TAdoStoredProc.Create(self);
  proc.Connection := dm.con;
  proc.ProcedureName := 'shrinklog';
  proc.Prepared := true;
  proc.Parameters.CreateParameter('@LogicalFileName',ftString,pdInput,
  200,cmbLogName.Text);
  proc.Parameters.CreateParameter('@NewSize',ftInteger,pdInput,
  8,strtoint(self.txtSize.Text));
  proc.ExecProc ;


end;

procedure TfrmConfigure.btnShrinkLogClick(Sender: TObject);
begin
  if cmblogname.Text ='' then
  begin
    showmessage('请选择日志名称!');
    exit;
  end;
  ShrinkLog;
end;

procedure TfrmConfigure.txtSizeKeyPress(Sender: TObject; var Key: Char);
begin
 if not (key in['0'..'9', '.', #8, #27, #13]) then
    key := #0;
end;

procedure TfrmConfigure.txtSizeExit(Sender: TObject);
begin
  if trim(txtsize.Text)='' then txtsize.Text :='1'; 
end;

function TfrmConfigure.GetStoredProcSQL: string;
var
  s:string;
begin
s:=s+'CREATE PROCEDURE shrinklog                                                            '+chr(13); 
s:=s+'@LogicalFileName varchar(200),                                                        '+chr(13);
s:=s+'@NewSize             int                                                              '+chr(13);
s:=s+' AS                                                                                   '+chr(13);
s:=s+'                                                                                      '+chr(13);
s:=s+'SET NOCOUNT ON                                                                        '+chr(13);
s:=s+'DECLARE  @MaxMinutes INT                                                              '+chr(13);
s:=s+'                                                                                      '+chr(13);
s:=s+'SELECT  @MaxMinutes = 10                                                              '+chr(13);
s:=s+'                                                                                      '+chr(13);
s:=s+'DECLARE @OriginalSize int                                                             '+chr(13);
s:=s+'SELECT @OriginalSize = size                                                           '+chr(13);
s:=s+'  FROM sysfiles                                                                       '+chr(13);
s:=s+'  WHERE name = @LogicalFileName                                                       '+chr(13);
s:=s+'SELECT ''Original Size of '' + db_name() + '' LOG is '' +                             '+chr(13);
s:=s+'        CONVERT(VARCHAR(30),@OriginalSize) + '' 8K pages or '' +                      '+chr(13);
s:=s+'        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + ''MB''                          '+chr(13);
s:=s+'  FROM sysfiles                                                                       '+chr(13);
s:=s+'  WHERE name = @LogicalFileName                                                       '+chr(13);
s:=s+'                                                                                      '+chr(13);
s:=s+'CREATE TABLE DummyTrans                                                               '+chr(13);
s:=s+'  (DummyColumn char (8000) not null)                                                  '+chr(13);
s:=s+'                                                                                      '+chr(13);
s:=s+'                                                                                      '+chr(13);
s:=s+'DECLARE @Counter   INT,                                                               '+chr(13);
s:=s+'        @StartTime DATETIME,                                                          '+chr(13);
s:=s+'        @TruncLog  VARCHAR(255)                                                       '+chr(13);
s:=s+'SELECT  @StartTime = GETDATE(),                                                       '+chr(13);
s:=s+'        @TruncLog = ''BACKUP LOG '' + db_name() + '' WITH TRUNCATE_ONLY''             '+chr(13);
s:=s+'                                                                                      '+chr(13);
s:=s+'DBCC SHRINKFILE (@LogicalFileName, @NewSize)                                          '+chr(13);
s:=s+'EXEC (@TruncLog)                                                                      '+chr(13);
s:=s+'-- Wrap the log if necessary.                                                         '+chr(13);
s:=s+'WHILE     @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE())                          '+chr(13);
s:=s+'      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)   '+chr(13);
s:=s+'      AND (@OriginalSize * 8 /1024) > @NewSize                                        '+chr(13);
s:=s+'  BEGIN -- Outer loop.                                                                '+chr(13);
s:=s+'    SELECT @Counter = 0                                                               '+chr(13);
s:=s+'    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))                   '+chr(13);
s:=s+'      BEGIN -- update                                                                 '+chr(13);
s:=s+'        INSERT DummyTrans VALUES (''Fill Log'')                                       '+chr(13);
s:=s+'        DELETE DummyTrans                                                             '+chr(13);
s:=s+'        SELECT @Counter = @Counter + 1                                                '+chr(13);
s:=s+'      END                                                                             '+chr(13);
s:=s+'    EXEC (@TruncLog)                                                                  '+chr(13);
s:=s+'  END                                                                                 '+chr(13);
s:=s+'SELECT ''Final Size of '' + db_name() + '' LOG is '' +                                '+chr(13);
s:=s+'        CONVERT(VARCHAR(30),size) + '' 8K pages or '' +                               '+chr(13);
s:=s+'        CONVERT(VARCHAR(30),(size*8/1024)) + ''MB''                                   '+chr(13);
s:=s+'  FROM sysfiles                                                                       '+chr(13);
s:=s+'  WHERE name = @LogicalFileName                                                       '+chr(13);
s:=s+'DROP TABLE DummyTrans                                                                 '+chr(13);
s:=s+'SET NOCOUNT OFF                                                                       '+chr(13);

  result:=s;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -