标签:input 启用 模式 定义 save chain setevent imp mat
跟踪
--============================================================================ --新建两个目录 D:\InOut\TraceDB D:\InOut\TraceLog\ --建数据库,建跟踪执行时间超过1.5秒的语句及SP --建作业,每天在固定时间将跟踪文件导入数据库 --============================================================================ USE [master] GO /****** Object: Database [TraceDB] Script Date: 2017/2/15 11:16:02 ******/ CREATE DATABASE [TraceDB] CONTAINMENT = NONE ON PRIMARY ( NAME = N‘TraceDB‘, FILENAME = N‘D:\inout\TraceDB\TraceDB.mdf‘ , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 102400KB ) LOG ON ( NAME = N‘TraceDB_log‘, FILENAME = N‘D:\inout\TraceDB\TraceDB_log.ldf‘ , SIZE = 20416KB , MAXSIZE = 2048GB , FILEGROWTH = 102400KB ) GO --ALTER DATABASE [TraceDB] SET COMPATIBILITY_LEVEL = 120 --GO IF (1 = FULLTEXTSERVICEPROPERTY(‘IsFullTextInstalled‘)) begin EXEC [TraceDB].[dbo].[sp_fulltext_database] @action = ‘enable‘ end GO ALTER DATABASE [TraceDB] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [TraceDB] SET ANSI_NULLS OFF GO ALTER DATABASE [TraceDB] SET ANSI_PADDING OFF GO ALTER DATABASE [TraceDB] SET ANSI_WARNINGS OFF GO ALTER DATABASE [TraceDB] SET ARITHABORT OFF GO ALTER DATABASE [TraceDB] SET AUTO_CLOSE OFF GO ALTER DATABASE [TraceDB] SET AUTO_SHRINK OFF GO ALTER DATABASE [TraceDB] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [TraceDB] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [TraceDB] SET CURSOR_DEFAULT GLOBAL GO ALTER DATABASE [TraceDB] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [TraceDB] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [TraceDB] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [TraceDB] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [TraceDB] SET ENABLE_BROKER GO ALTER DATABASE [TraceDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [TraceDB] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [TraceDB] SET TRUSTWORTHY OFF GO ALTER DATABASE [TraceDB] SET ALLOW_SNAPSHOT_ISOLATION OFF GO ALTER DATABASE [TraceDB] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [TraceDB] SET READ_COMMITTED_SNAPSHOT OFF GO ALTER DATABASE [TraceDB] SET HONOR_BROKER_PRIORITY OFF GO ALTER DATABASE [TraceDB] SET RECOVERY FULL GO ALTER DATABASE [TraceDB] SET MULTI_USER GO ALTER DATABASE [TraceDB] SET PAGE_VERIFY CHECKSUM GO ALTER DATABASE [TraceDB] SET DB_CHAINING OFF GO ALTER DATABASE [TraceDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) GO ALTER DATABASE [TraceDB] SET TARGET_RECOVERY_TIME = 0 SECONDS GO ALTER DATABASE [TraceDB] SET DELAYED_DURABILITY = DISABLED GO EXEC sys.sp_db_vardecimal_storage_format N‘TraceDB‘, N‘ON‘ GO USE [TraceDB] GO /****** Object: UserDefinedFunction [dbo].[Split] Script Date: 2017/2/15 11:16:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --表值函数用以截取字符串 --如果为其添加一列主键id,则其顺序就会固定了 create FUNCTION [dbo].[Split](@text NVARCHAR(max)) RETURNS @tempTable TABLE(value NVARCHAR(1000)) AS BEGIN DECLARE @StartIndex INT --开始查找的位置 DECLARE @FindIndex INT --找到的位置 DECLARE @Content VARCHAR(4000) --找到的值 --初始化一些变量 SET @StartIndex = 1 --T-SQL中字符串的查找位置是从1开始的 SET @FindIndex=0 --开始循环查找字符串逗号 WHILE(@StartIndex <= LEN(@Text)) BEGIN --查找字符串函数 CHARINDEX 第一个参数是要找的字符串 -- 第二个参数是在哪里查找这个字符串 -- 第三个参数是开始查找的位置 --返回值是找到字符串的位置 SELECT @FindIndex = CHARINDEX(‘,‘ ,@Text,@StartIndex) --判断有没找到 没找到返回0 IF(@FindIndex =0 OR @FindIndex IS NULL) BEGIN --如果没有找到就表示找完了 SET @FindIndex = LEN(@Text)+1 END --截取字符串函数 SUBSTRING 第一个参数是要截取的字符串 -- 第二个参数是开始的位置 -- 第三个参数是截取的长度 SET @Content =SUBSTRING(@Text,@StartIndex,@FindIndex-@StartIndex) --初始化下次查找的位置 SET @StartIndex = @FindIndex+1 --把找的的值插入到要返回的Table类型中 INSERT INTO @tempTable (Value) VALUES (@Content) END RETURN END GO /****** Object: Table [dbo].[CommandLog] Script Date: 2017/2/15 11:16:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[CommandLog]( [ID] [int] IDENTITY(1,1) NOT NULL, [DatabaseName] [sysname] NULL, [SchemaName] [sysname] NULL, [ObjectName] [sysname] NULL, [ObjectType] [char](2) NULL, [IndexName] [sysname] NULL, [IndexType] [tinyint] NULL, [StatisticsName] [sysname] NULL, [PartitionNumber] [int] NULL, [ExtendedInfo] [xml] NULL, [Command] [nvarchar](max) NOT NULL, [CommandType] [nvarchar](60) NOT NULL, [StartTime] [datetime] NOT NULL, [EndTime] [datetime] NULL, [ErrorNumber] [int] NULL, [ErrorMessage] [nvarchar](max) NULL, CONSTRAINT [PK_CommandLog] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object: Table [dbo].[TraceLog] Script Date: 2017/2/15 11:16:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[TraceLog]( [RowNumber] [int] IDENTITY(0,1) NOT NULL, [EventClass] [int] NULL, [Duration] [bigint] NULL, [TextData] [ntext] NULL, [SPID] [int] NULL, [BinaryData] [image] NULL, [CPU] [int] NULL, [EndTime] [datetime] NULL, [ObjectName] [nvarchar](128) NULL, [StartTime] [datetime] NULL, [Reads] [bigint] NULL, [Writes] [bigint] NULL, [DataBaseName] [nvarchar](256) NULL, [ApplicationName] [nvarchar](256) NULL, [HostName] [nvarchar](256) NULL, PRIMARY KEY CLUSTERED ( [RowNumber] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO /****** Object: StoredProcedure [dbo].[CommandExecute] Script Date: 2017/2/15 11:16:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[CommandExecute] @Command nvarchar(max), @CommandType nvarchar(max), @Mode int, @Comment nvarchar(max) = NULL, @DatabaseName nvarchar(max) = NULL, @SchemaName nvarchar(max) = NULL, @ObjectName nvarchar(max) = NULL, @ObjectType nvarchar(max) = NULL, @IndexName nvarchar(max) = NULL, @IndexType int = NULL, @StatisticsName nvarchar(max) = NULL, @PartitionNumber int = NULL, @ExtendedInfo xml = NULL, @LogToTable bit, @Exec bit AS BEGIN SET NOCOUNT ON DECLARE @StartMessage nvarchar(max) DECLARE @EndMessage nvarchar(max) DECLARE @ErrorMessage nvarchar(max) DECLARE @ErrorMessageOriginal nvarchar(max) DECLARE @StartTime datetime DECLARE @EndTime datetime DECLARE @StartTimeSec datetime DECLARE @EndTimeSec datetime DECLARE @ID int DECLARE @Error int DECLARE @ReturnCode int SET @Error = 0 SET @ReturnCode = 0 ---------------------------------------------------------------------------------------------------- --// Check core requirements //-- ---------------------------------------------------------------------------------------------------- IF @LogToTable = 1 AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = ‘U‘ AND schemas.[name] = ‘dbo‘ AND objects.[name] = ‘CommandLog‘) BEGIN SET @ErrorMessage = ‘The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.‘ + CHAR(13) + CHAR(10) + ‘ ‘ RAISERROR(@ErrorMessage,16,1) WITH NOWAIT SET @Error = @@ERROR END IF @Error <> 0 BEGIN SET @ReturnCode = @Error GOTO ReturnCode END ---------------------------------------------------------------------------------------------------- --// Check input parameters //-- ---------------------------------------------------------------------------------------------------- IF @Command IS NULL OR @Command = ‘‘ BEGIN SET @ErrorMessage = ‘The value for the parameter @Command is not supported.‘ + CHAR(13) + CHAR(10) + ‘ ‘ RAISERROR(@ErrorMessage,16,1) WITH NOWAIT SET @Error = @@ERROR END IF @CommandType IS NULL OR @CommandType = ‘‘ OR LEN(@CommandType) > 60 BEGIN SET @ErrorMessage = ‘The value for the parameter @CommandType is not supported.‘ + CHAR(13) + CHAR(10) + ‘ ‘ RAISERROR(@ErrorMessage,16,1) WITH NOWAIT SET @Error = @@ERROR END IF @Mode NOT IN(1,2) OR @Mode IS NULL BEGIN SET @ErrorMessage = ‘The value for the parameter @Mode is not supported.‘ + CHAR(13) + CHAR(10) + ‘ ‘ RAISERROR(@ErrorMessage,16,1) WITH NOWAIT SET @Error = @@ERROR END IF @Error <> 0 BEGIN SET @ReturnCode = @Error GOTO ReturnCode END ---------------------------------------------------------------------------------------------------- --// Log initial information //-- ---------------------------------------------------------------------------------------------------- SET @StartTime = GETDATE() SET @StartTimeSec = CONVERT(datetime,CONVERT(nvarchar,@StartTime,120),120) IF @LogToTable=0 BEGIN SET @StartMessage = ‘Date and time: ‘ + CONVERT(nvarchar,@StartTimeSec,120) + CHAR(13) + CHAR(10) SET @StartMessage = @StartMessage + ‘Command: ‘ + @Command IF @Comment IS NOT NULL SET @StartMessage = @StartMessage + CHAR(13) + CHAR(10) + ‘Comment: ‘ + @Comment SET @StartMessage = REPLACE(@StartMessage,‘%‘,‘%%‘) RAISERROR(@StartMessage,10,1) WITH NOWAIT END IF @LogToTable = 1 BEGIN INSERT INTO dbo.CommandLog (DatabaseName, SchemaName, ObjectName, ObjectType, IndexName, IndexType, StatisticsName, PartitionNumber, ExtendedInfo, CommandType, Command, StartTime) VALUES (@DatabaseName, @SchemaName, @ObjectName, @ObjectType, @IndexName, @IndexType, @StatisticsName, @PartitionNumber, @ExtendedInfo, @CommandType, @Command, @StartTime) END SET @ID = SCOPE_IDENTITY() ---------------------------------------------------------------------------------------------------- --// Execute command //-- ---------------------------------------------------------------------------------------------------- IF @Mode = 1 AND @Exec = 1 BEGIN EXECUTE(@Command) SET @Error = @@ERROR SET @ReturnCode = @Error END IF @Mode = 2 AND @Exec =1 BEGIN BEGIN TRY EXECUTE(@Command) END TRY BEGIN CATCH SET @Error = ERROR_NUMBER() SET @ReturnCode = @Error SET @ErrorMessageOriginal = ERROR_MESSAGE() SET @ErrorMessage = ‘Msg ‘ + CAST(@Error AS nvarchar) + ‘, ‘ + ISNULL(@ErrorMessageOriginal,‘‘) RAISERROR(@ErrorMessage,16,1) WITH NOWAIT END CATCH END ---------------------------------------------------------------------------------------------------- --// Log completing information //-- ---------------------------------------------------------------------------------------------------- SET @EndTime = GETDATE() SET @EndTimeSec = CONVERT(datetime,CONVERT(varchar,@EndTime,120),120) IF @LogToTable=0 BEGIN SET @EndMessage = ‘Outcome: ‘ + CASE WHEN @Exec = 0 THEN ‘Not Executed‘ WHEN @Error = 0 THEN ‘Succeeded‘ ELSE ‘Failed‘ END + CHAR(13) + CHAR(10) SET @EndMessage = @EndMessage + ‘Duration: ‘ + CASE WHEN DATEDIFF(ss,@StartTimeSec, @EndTimeSec)/(24*3600) > 0 THEN CAST(DATEDIFF(ss,@StartTimeSec, @EndTimeSec)/(24*3600) AS nvarchar) + ‘.‘ ELSE ‘‘ END + CONVERT(nvarchar,@EndTimeSec - @StartTimeSec,108) + CHAR(13) + CHAR(10) --SET @EndMessage = @EndMessage + ‘Date and time: ‘ + CONVERT(nvarchar,@EndTimeSec,120) + CHAR(13) + CHAR(10) + ‘ ‘ SET @EndMessage = REPLACE(@EndMessage,‘%‘,‘%%‘) RAISERROR(@EndMessage,10,1) WITH NOWAIT END IF @LogToTable = 1 BEGIN UPDATE dbo.CommandLog SET EndTime = @EndTime, ErrorNumber = CASE WHEN @Exec = 0 THEN NULL ELSE @Error END, ErrorMessage = @ErrorMessageOriginal WHERE ID = @ID END ReturnCode: IF @ReturnCode <> 0 BEGIN RETURN @ReturnCode END ---------------------------------------------------------------------------------------------------- END GO /****** Object: StoredProcedure [dbo].[DataBaseBackup] Script Date: 2017/2/15 11:16:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /****** Object: StoredProcedure [dbo].[DataBaseBackup] Script Date: 2015/11/5 9:06:43 ******/ create PROCEDURE [dbo].[DataBaseBackup] @databases NVARCHAR(1000) , @directory NVARCHAR(MAX) = ‘X:\Backup‘ , @BackupType NVARCHAR(MAX) ,/*FULL,DIFF,LOG*//*简写:D,I,L*/ @Verify BIT = 1 , @Compress BIT = 1 , @copyOnly BIT = 0 , @LogToTable BIT = 0, @exec BIT = 0 AS BEGIN SET NOCOUNT ON; DECLARE @Description NVARCHAR(MAX) = NULL , @NumberOfFiles INT = NULL , @CheckSum BIT = 0 , @OverrideBackupPreference NVARCHAR(MAX) = 0 , @ReadWriteFileGroups NVARCHAR(MAX) = 0 , @Threads INT = NULL , @NoRecovery NVARCHAR(MAX) = 0; -- 声明变量 BEGIN DECLARE @Version NUMERIC(18, 10); DECLARE @Cluster NVARCHAR(MAX); DECLARE @StartMessage NVARCHAR(MAX); DECLARE @EndMessage NVARCHAR(MAX); DECLARE @DatabaseMessage NVARCHAR(MAX); DECLARE @ErrorMessage NVARCHAR(MAX); DECLARE @Error INT; DECLARE @ReturnCode INT; DECLARE @CurrentBackupSet TABLE ( ID INT IDENTITY PRIMARY KEY , VerifyCompleted BIT , VerifyOutput INT ); DECLARE @CurrentFiles TABLE ( [Type] NVARCHAR(MAX) , FilePath NVARCHAR(MAX) ); DECLARE @CurrentDirectories TABLE ( ID INT PRIMARY KEY , DirectoryPath NVARCHAR(MAX) , CleanupDate DATETIME , CleanupMode NVARCHAR(MAX) , CreateCompleted BIT , CleanupCompleted BIT , CreateOutput INT , CleanupOutput INT ); -- 存放选择的数据库 DECLARE @SelectedDatabases TABLE ( DatabaseName NVARCHAR(MAX) , DatabaseType NVARCHAR(MAX) , Selected BIT ); DECLARE @DirectoryInfo TABLE ( FileExists BIT , FileIsADirectory BIT , ParentDirectoryExists BIT ); -- 存放所有数据库 DECLARE @tmpDatabases TABLE ( ID INT IDENTITY , DatabaseName NVARCHAR(MAX) , DatabaseNameFS NVARCHAR(MAX) , DatabaseType NVARCHAR(MAX) , Selected BIT , Completed BIT , PRIMARY KEY ( Selected, Completed, ID ) ); -- 存放备份目录 DECLARE @Directories TABLE ( ID INT PRIMARY KEY , DirectoryPath NVARCHAR(MAX) , Mirror BIT , Completed BIT ); DECLARE @CurrentRootDirectoryID INT; DECLARE @CurrentRootDirectoryPath NVARCHAR(4000); DECLARE @CurrentDBID INT; DECLARE @CurrentDatabaseID INT; DECLARE @CurrentDatabaseName NVARCHAR(MAX); DECLARE @CurrentBackupType NVARCHAR(MAX); DECLARE @CurrentFileExtension NVARCHAR(MAX); DECLARE @CurrentFileNumber INT; -- 生成的文件名 DECLARE @fileName NVARCHAR(MAX); DECLARE @CurrentDifferentialBaseLSN NUMERIC(25, 0); DECLARE @CurrentDifferentialBaseIsSnapshot BIT; DECLARE @CurrentLogLSN NUMERIC(25, 0); DECLARE @CurrentLatestBackup DATETIME; DECLARE @CurrentDatabaseNameFS NVARCHAR(MAX); DECLARE @CurrentDirectoryID INT; DECLARE @CurrentDirectoryPath NVARCHAR(MAX); DECLARE @CurrentFilePath NVARCHAR(MAX); DECLARE @CurrentDate DATETIME; DECLARE @CurrentCleanupDate DATETIME; DECLARE @CurrentIsDatabaseAccessible BIT; DECLARE @CurrentAvailabilityGroup NVARCHAR(MAX); DECLARE @CurrentAvailabilityGroupRole NVARCHAR(MAX); DECLARE @CurrentAvailabilityGroupBackupPreference NVARCHAR(MAX); DECLARE @CurrentIsPreferredBackupReplica BIT; DECLARE @CurrentDatabaseMirroringRole NVARCHAR(MAX); DECLARE @CurrentLogShippingRole NVARCHAR(MAX); DECLARE @CurrentBackupSetID INT; DECLARE @CurrentIsMirror BIT; DECLARE @CurrentCommand01 NVARCHAR(MAX); DECLARE @CurrentCommand03 NVARCHAR(MAX); DECLARE @CurrentCommand04 NVARCHAR(MAX); DECLARE @CurrentCommandOutput01 INT; DECLARE @CurrentCommandOutput03 INT; DECLARE @CurrentCommandOutput04 INT; DECLARE @CurrentCommandType01 NVARCHAR(MAX); DECLARE @CurrentCommandType03 NVARCHAR(MAX); DECLARE @CurrentCommandType04 NVARCHAR(MAX); END; SET @Version = CAST(LEFT(CAST(SERVERPROPERTY(‘ProductVersion‘) AS NVARCHAR(MAX)), CHARINDEX(‘.‘, CAST(SERVERPROPERTY(‘ProductVersion‘) AS NVARCHAR(MAX))) - 1) + ‘.‘ + REPLACE(RIGHT(CAST(SERVERPROPERTY(‘ProductVersion‘) AS NVARCHAR(MAX)), LEN(CAST(SERVERPROPERTY(‘ProductVersion‘) AS NVARCHAR(MAX))) - CHARINDEX(‘.‘, CAST(SERVERPROPERTY(‘ProductVersion‘) AS NVARCHAR(MAX)))), ‘.‘, ‘‘) AS NUMERIC(18, 10)); IF @Version >= 11 BEGIN SELECT @Cluster = cluster_name FROM sys.dm_hadr_cluster; END; WITH db1 ( dbname ) AS ( SELECT value AS dbname FROM dbo.Split(@databases) ), db2 AS ( SELECT CASE WHEN dbname LIKE ‘-%‘ THEN RIGHT(dbname, LEN(dbname) - 1) ELSE dbname END AS dbname, CASE WHEN dbname LIKE ‘-%‘ THEN 0 ELSE 1 END AS selected FROM db1 ), db3 AS ( SELECT CASE WHEN dbname IN ( ‘ALL_DATABASES‘, ‘SYSTEM_DATABASES‘, ‘USER_DATABASES‘ ) THEN ‘%‘ ELSE dbname END AS dbname, CASE WHEN dbname = ‘SYSTEM_DATABASES‘ THEN ‘S‘ WHEN dbname = ‘USER_DATABASES‘ THEN ‘U‘ ELSE NULL END AS DatabaseType, selected FROM db2 ) INSERT INTO @SelectedDatabases ( DatabaseName, DatabaseType, Selected ) SELECT dbname, DatabaseType, selected FROM db3 OPTION ( MAXRECURSION 0 ); INSERT INTO @tmpDatabases ( DatabaseName, DatabaseNameFS, DatabaseType, Selected, Completed ) SELECT [name] AS DatabaseName, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([name], ‘\‘, ‘‘), ‘/‘, ‘‘), ‘:‘, ‘‘), ‘*‘, ‘‘), ‘?‘, ‘‘), ‘"‘, ‘‘), ‘<‘, ‘‘), ‘>‘, ‘‘), ‘|‘, ‘‘), ‘ ‘, ‘‘) AS DatabaseNameFS, CASE WHEN name IN ( ‘master‘, ‘msdb‘, ‘model‘ ) THEN ‘S‘ ELSE ‘U‘ END AS DatabaseType, 0 AS Selected, 0 AS Completed FROM sys.databases WHERE [name] <> ‘tempdb‘ AND source_database_id IS NULL ORDER BY [name] ASC; -- 先添加要备份的数据库 UPDATE tmpDatabases SET tmpDatabases.Selected = SelectedDatabases.Selected FROM @tmpDatabases tmpDatabases INNER JOIN @SelectedDatabases SelectedDatabases ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName, ‘_‘, ‘[_]‘) AND ( tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL ) WHERE SelectedDatabases.Selected = 1; -- 再排除不要备份的数据库 UPDATE tmpDatabases SET tmpDatabases.Selected = SelectedDatabases.Selected FROM @tmpDatabases tmpDatabases INNER JOIN @SelectedDatabases SelectedDatabases ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName, ‘_‘, ‘[_]‘) AND ( tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL ) WHERE SelectedDatabases.Selected = 0; IF @databases IS NULL OR NOT EXISTS ( SELECT * FROM @SelectedDatabases ) OR EXISTS ( SELECT * FROM @SelectedDatabases WHERE DatabaseName IS NULL OR DatabaseName = ‘‘ ) BEGIN SET @ErrorMessage = ‘The value for the parameter @Databases is not supported.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@ErrorMessage,16,1) WITH NOWAIT; SET @Error = @@ERROR; END; ---------------------------------------------------------------------------------------------------- --// Check database names //-- ---------------------------------------------------------------------------------------------------- SET @ErrorMessage = ‘‘; SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ‘, ‘ FROM @tmpDatabases WHERE Selected = 1 AND DatabaseNameFS = ‘‘ ORDER BY DatabaseName ASC; IF @@ROWCOUNT > 0 BEGIN SET @ErrorMessage = ‘The names of the following databases are not supported: ‘ + LEFT(@ErrorMessage, LEN(@ErrorMessage) - 1) + ‘.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@ErrorMessage,16,1) WITH NOWAIT; SET @Error = @@ERROR; END; SET @ErrorMessage = ‘‘; SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ‘, ‘ FROM @tmpDatabases WHERE UPPER(DatabaseNameFS) IN ( SELECT UPPER(DatabaseNameFS) FROM @tmpDatabases GROUP BY UPPER(DatabaseNameFS) HAVING COUNT(*) > 1 ) AND UPPER(DatabaseNameFS) IN ( SELECT UPPER(DatabaseNameFS) FROM @tmpDatabases WHERE Selected = 1 ) AND DatabaseNameFS <> ‘‘ ORDER BY DatabaseName ASC OPTION ( RECOMPILE ); IF @@ROWCOUNT > 0 BEGIN SET @ErrorMessage = ‘The names of the following databases are not unique in the file system: ‘ + LEFT(@ErrorMessage, LEN(@ErrorMessage) - 1) + ‘.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@ErrorMessage,16,1) WITH NOWAIT; SET @Error = @@ERROR; END; INSERT INTO @Directories ( ID, DirectoryPath, Completed ) SELECT ROW_NUMBER() OVER ( ORDER BY value ASC ) AS ID, value, 0 FROM dbo.Split(@directory) OPTION ( MAXRECURSION 0 ); IF EXISTS ( SELECT * FROM @Directories WHERE ( NOT ( DirectoryPath LIKE ‘_:‘ OR DirectoryPath LIKE ‘_:\%‘ OR DirectoryPath LIKE ‘\\%\%‘ ) OR DirectoryPath IS NULL OR LEFT(DirectoryPath, 1) = ‘ ‘ OR RIGHT(DirectoryPath, 1) = ‘ ‘ ) ) BEGIN SET @ErrorMessage = ‘The value for the parameter @Directory is not supported.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@ErrorMessage,16,1) WITH NOWAIT; SET @Error = @@ERROR; END; -- 校验备份目录 WHILE EXISTS ( SELECT * FROM @Directories WHERE Completed = 0 ) BEGIN SELECT TOP 1 @CurrentRootDirectoryID = ID, @CurrentRootDirectoryPath = DirectoryPath FROM @Directories WHERE Completed = 0 ORDER BY ID ASC; INSERT INTO @DirectoryInfo ( FileExists, FileIsADirectory, ParentDirectoryExists ) EXECUTE [master].dbo.xp_fileexist @CurrentRootDirectoryPath; IF NOT EXISTS ( SELECT * FROM @DirectoryInfo WHERE FileExists = 0 AND FileIsADirectory = 1 AND ParentDirectoryExists = 1 ) BEGIN SET @ErrorMessage = ‘The directory ‘ + @CurrentRootDirectoryPath + ‘ does not exist.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@ErrorMessage,16,1) WITH NOWAIT; SET @Error = @@ERROR; END; UPDATE @Directories SET Completed = 1 WHERE ID = @CurrentRootDirectoryID; SET @CurrentRootDirectoryID = NULL; SET @CurrentRootDirectoryPath = NULL; DELETE FROM @DirectoryInfo; END; IF @Compress IS NULL BEGIN SELECT @Compress = CASE WHEN EXISTS ( SELECT * FROM sys.configurations WHERE name = ‘backup compression default‘ AND value_in_use = 1 ) THEN 1 ELSE 0 END; END; IF @NumberOfFiles IS NULL BEGIN SELECT @NumberOfFiles = ( SELECT COUNT (*) FROM @Directories ); END; IF @BackupType NOT IN ( ‘FULL‘, ‘DIFF‘, ‘LOG‘ ) OR @BackupType IS NULL BEGIN SET @ErrorMessage = ‘The value for the parameter @BackupType is not supported.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@ErrorMessage,16,1) WITH NOWAIT; SET @Error = @@ERROR; END; IF @Error <> 0 BEGIN --SET @ErrorMessage = ‘The documentation is available at https://ola.hallengren.com/sql-server-backup.html.‘ + CHAR(13) + CHAR(10) + ‘ ‘ --RAISERROR(@ErrorMessage,16,1) WITH NOWAIT SET @ReturnCode = @Error; GOTO Logging; END; WHILE EXISTS ( SELECT * FROM @tmpDatabases WHERE Selected = 1 AND Completed = 0 ) BEGIN SELECT TOP 1 @CurrentDBID = ID, @CurrentDatabaseName = DatabaseName, @CurrentDatabaseNameFS = DatabaseNameFS FROM @tmpDatabases WHERE Selected = 1 AND Completed = 0 ORDER BY ID ASC; SET @CurrentDatabaseID = DB_ID(@CurrentDatabaseName); IF DATABASEPROPERTYEX(@CurrentDatabaseName, ‘Status‘) = ‘ONLINE‘ BEGIN IF EXISTS ( SELECT * FROM sys.database_recovery_status WHERE database_id = @CurrentDatabaseID AND database_guid IS NOT NULL ) BEGIN SET @CurrentIsDatabaseAccessible = 1; END; ELSE BEGIN SET @CurrentIsDatabaseAccessible = 0; END; END; SELECT @CurrentDifferentialBaseLSN = differential_base_lsn FROM sys.master_files WHERE database_id = @CurrentDatabaseID AND [type] = 0 AND [file_id] = 1; IF DATABASEPROPERTYEX(@CurrentDatabaseName, ‘Status‘) = ‘ONLINE‘ BEGIN SELECT @CurrentLogLSN = last_log_backup_lsn FROM sys.database_recovery_status WHERE database_id = @CurrentDatabaseID; END; SET @CurrentBackupType = @BackupType; IF @Version >= 11 AND @Cluster IS NOT NULL BEGIN SELECT @CurrentAvailabilityGroup = availability_groups.name, @CurrentAvailabilityGroupRole = dm_hadr_availability_replica_states.role_desc, @CurrentAvailabilityGroupBackupPreference = UPPER(availability_groups.automated_backup_preference_desc) FROM sys.databases databases INNER JOIN sys.availability_databases_cluster availability_databases_cluster ON databases.group_database_id = availability_databases_cluster.group_database_id INNER JOIN sys.availability_groups availability_groups ON availability_databases_cluster.group_id = availability_groups.group_id INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON availability_groups.group_id = dm_hadr_availability_replica_states.group_id AND databases.replica_id = dm_hadr_availability_replica_states.replica_id WHERE databases.name = @CurrentDatabaseName; END; IF @Version >= 11 AND @Cluster IS NOT NULL AND @CurrentAvailabilityGroup IS NOT NULL BEGIN SELECT @CurrentIsPreferredBackupReplica = sys.fn_hadr_backup_is_preferred_replica(@CurrentDatabaseName); END; SELECT @CurrentDatabaseMirroringRole = UPPER(mirroring_role_desc) FROM sys.database_mirroring WHERE database_id = @CurrentDatabaseID; IF EXISTS ( SELECT * FROM msdb.dbo.log_shipping_primary_databases WHERE primary_database = @CurrentDatabaseName ) BEGIN SET @CurrentLogShippingRole = ‘PRIMARY‘; END; ELSE IF EXISTS ( SELECT * FROM msdb.dbo.log_shipping_secondary_databases WHERE secondary_database = @CurrentDatabaseName ) BEGIN SET @CurrentLogShippingRole = ‘SECONDARY‘; END; IF @LogToTable=0 begin -- Set database message SET @DatabaseMessage = ‘Date and time: ‘ + CONVERT(NVARCHAR, GETDATE(), 120) + CHAR(13) + CHAR(10); SET @DatabaseMessage = @DatabaseMessage + ‘Database: ‘ + QUOTENAME(@CurrentDatabaseName) + CHAR(13) + CHAR(10); SET @DatabaseMessage = @DatabaseMessage + ‘Status: ‘ + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName, ‘Status‘) AS NVARCHAR) + CHAR(13) + CHAR(10); SET @DatabaseMessage = @DatabaseMessage + ‘Standby: ‘ + CASE WHEN DATABASEPROPERTYEX(@CurrentDatabaseName, ‘IsInStandBy‘) = 1 THEN ‘Yes‘ ELSE ‘No‘ END + CHAR(13) + CHAR(10); SET @DatabaseMessage = @DatabaseMessage + ‘Updateability: ‘ + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName, ‘Updateability‘) AS NVARCHAR) + CHAR(13) + CHAR(10); SET @DatabaseMessage = @DatabaseMessage + ‘User access: ‘ + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName, ‘UserAccess‘) AS NVARCHAR) + CHAR(13) + CHAR(10); IF @CurrentIsDatabaseAccessible IS NOT NULL SET @DatabaseMessage = @DatabaseMessage + ‘Is accessible: ‘ + CASE WHEN @CurrentIsDatabaseAccessible = 1 THEN ‘Yes‘ ELSE ‘No‘ END + CHAR(13) + CHAR(10); SET @DatabaseMessage = @DatabaseMessage + ‘Recovery model: ‘ + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName, ‘Recovery‘) AS NVARCHAR) + CHAR(13) + CHAR(10); IF @CurrentAvailabilityGroup IS NOT NULL SET @DatabaseMessage = @DatabaseMessage + ‘Availability group: ‘ + @CurrentAvailabilityGroup + CHAR(13) + CHAR(10); IF @CurrentAvailabilityGroup IS NOT NULL SET @DatabaseMessage = @DatabaseMessage + ‘Availability group role: ‘ + @CurrentAvailabilityGroupRole + CHAR(13) + CHAR(10); IF @CurrentAvailabilityGroup IS NOT NULL SET @DatabaseMessage = @DatabaseMessage + ‘Availability group backup preference: ‘ + @CurrentAvailabilityGroupBackupPreference + CHAR(13) + CHAR(10); IF @CurrentAvailabilityGroup IS NOT NULL SET @DatabaseMessage = @DatabaseMessage + ‘Is preferred backup replica: ‘ + CASE WHEN @CurrentIsPreferredBackupReplica = 1 THEN ‘Yes‘ WHEN @CurrentIsPreferredBackupReplica = 0 THEN ‘No‘ ELSE ‘N/A‘ END + CHAR(13) + CHAR(10); IF @CurrentDatabaseMirroringRole IS NOT NULL SET @DatabaseMessage = @DatabaseMessage + ‘Database mirroring role: ‘ + @CurrentDatabaseMirroringRole + CHAR(13) + CHAR(10); IF @CurrentLogShippingRole IS NOT NULL SET @DatabaseMessage = @DatabaseMessage + ‘Log shipping role: ‘ + @CurrentLogShippingRole + CHAR(13) + CHAR(10); IF @CurrentBackupType = ‘DIFF‘ SET @DatabaseMessage = @DatabaseMessage + ‘Differential base is snapshot: ‘ + CASE WHEN @CurrentDifferentialBaseIsSnapshot = 1 THEN ‘Yes‘ WHEN @CurrentDifferentialBaseIsSnapshot = 0 THEN ‘No‘ ELSE ‘N/A‘ END + CHAR(13) + CHAR(10); SET @DatabaseMessage = REPLACE(@DatabaseMessage, ‘%‘, ‘%%‘) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END /*-- 需要满足以下条件 * 数据库状态为在线 * 数据库允许访问 * 数据库不是备库 * 不是简单恢复模式下的日志备份 * 不是无基准的差异备份 * 不是对master库做差异或日志备份 * 如果在可用性组中,不对辅助副本做常规备份(仅支持复制备份),且需要备份首选项允许备份, * 不对日志传输的主库做日志备份(会截断日志) * */ IF DATABASEPROPERTYEX(@CurrentDatabaseName, ‘Status‘) <> ‘ONLINE‘ OR ( @CurrentIsDatabaseAccessible IS NOT NULL AND @CurrentIsDatabaseAccessible <> 1 ) OR @BackupType IS NULL BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ is not accessible.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF DATABASEPROPERTYEX(@CurrentDatabaseName, ‘IsInStandBy‘) = 1 OR @BackupType IS NULL BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ is in Standby.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF @CurrentBackupType = ‘LOG‘ AND @CurrentLogLSN IS NULL BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ never full backup.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF @CurrentBackupType = ‘LOG‘ AND ( DATABASEPROPERTYEX(@CurrentDatabaseName, ‘Recovery‘) = ‘SIMPLE‘) BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ Recovery mode is SIMPLE ,it‘‘s can‘‘t backup log.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF @CurrentBackupType = ‘DIFF‘ AND @CurrentDifferentialBaseLSN IS NULL BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ backup type is DIFF but never backup database full.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF @CurrentBackupType IN ( ‘DIFF‘, ‘LOG‘ ) AND @CurrentDatabaseName = ‘master‘ BEGIN SET @DatabaseMessage = ‘database is master,it is support full backup type only.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF @CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = ‘FULL‘ AND @copyOnly = 0 AND ( @CurrentAvailabilityGroupRole <> ‘PRIMARY‘ OR @CurrentAvailabilityGroupRole IS NULL ) BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ is in Availability Group and it‘‘s not Primary,it is support full backup type copy only.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF @CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = ‘FULL‘ AND @copyOnly = 1 AND ( @CurrentIsPreferredBackupReplica <> 1 OR @CurrentIsPreferredBackupReplica IS NULL ) AND @OverrideBackupPreference = 0 BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ is in Availability Group ,but it‘‘s not preferred backup replica and @OverrideBackupPreference is not.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF @CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = ‘DIFF‘ AND ( @CurrentAvailabilityGroupRole <> ‘PRIMARY‘ OR @CurrentAvailabilityGroupRole IS NULL ) BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ is in Availability Group and it‘‘s not Primary,it‘‘s not support diff backup type.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF @CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = ‘LOG‘ AND @copyOnly = 0 AND ( @CurrentIsPreferredBackupReplica <> 1 OR @CurrentIsPreferredBackupReplica IS NULL ) AND @OverrideBackupPreference = 0 BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ is in Availability Group ,but it‘‘s not preferred backup replica and @OverrideBackupPreference is not.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF ( @CurrentLogShippingRole = ‘PRIMARY‘ AND @CurrentLogShippingRole IS NOT NULL ) AND @CurrentBackupType = ‘LOG‘ BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ is in log shipping role ,and it‘‘s Primary,it‘‘s not support backup log.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF @CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = ‘LOG‘ AND @copyOnly = 1 AND ( @CurrentAvailabilityGroupRole <> ‘PRIMARY‘ OR @CurrentAvailabilityGroupRole IS NULL ) BEGIN SET @DatabaseMessage = ‘database ‘ + @CurrentDatabaseName + ‘ is in Availability Group ,and it‘‘s not Primary,it is support backup copy only.‘ + CHAR(13) + CHAR(10) + ‘ ‘; RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT; END; IF DATABASEPROPERTYEX(@CurrentDatabaseName, ‘Status‘) = ‘ONLINE‘ AND ( @CurrentIsDatabaseAccessible = 1 OR @CurrentIsDatabaseAccessible IS NULL ) AND DATABASEPROPERTYEX(@CurrentDatabaseName, ‘IsInStandBy‘) = 0 AND NOT ( @CurrentBackupType = ‘LOG‘ AND ( DATABASEPROPERTYEX(@CurrentDatabaseName, ‘Recovery‘) = ‘SIMPLE‘ OR @CurrentLogLSN IS NULL ) ) AND NOT ( @CurrentBackupType = ‘DIFF‘ AND @CurrentDifferentialBaseLSN IS NULL ) AND NOT ( @CurrentBackupType IN ( ‘DIFF‘, ‘LOG‘ ) AND @CurrentDatabaseName = ‘master‘ ) AND NOT ( @CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = ‘FULL‘ AND @copyOnly = 0 AND ( @CurrentAvailabilityGroupRole <> ‘PRIMARY‘ OR @CurrentAvailabilityGroupRole IS NULL ) ) AND NOT ( @CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = ‘FULL‘ AND @copyOnly = 1 AND ( @CurrentIsPreferredBackupReplica <> 1 OR @CurrentIsPreferredBackupReplica IS NULL ) AND @OverrideBackupPreference = 0 ) AND NOT ( @CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = ‘DIFF‘ AND ( @CurrentAvailabilityGroupRole <> ‘PRIMARY‘ OR @CurrentAvailabilityGroupRole IS NULL ) ) AND NOT ( @CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = ‘LOG‘ AND @copyOnly = 0 AND ( @CurrentIsPreferredBackupReplica <> 1 OR @CurrentIsPreferredBackupReplica IS NULL ) AND @OverrideBackupPreference = 0 ) AND NOT ( @CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = ‘LOG‘ AND @copyOnly = 1 AND ( @CurrentAvailabilityGroupRole <> ‘PRIMARY‘ OR @CurrentAvailabilityGroupRole IS NULL ) ) AND NOT ( ( @CurrentLogShippingRole = ‘PRIMARY‘ AND @CurrentLogShippingRole IS NOT NULL ) AND @CurrentBackupType = ‘LOG‘ ) BEGIN SET @CurrentDate = GETDATE(); SELECT @CurrentFileExtension = CASE WHEN @CurrentBackupType = ‘FULL‘ THEN ‘bak‘ WHEN @CurrentBackupType = ‘DIFF‘ THEN ‘bak‘ WHEN @CurrentBackupType = ‘LOG‘ THEN ‘trn‘ END; INSERT INTO @CurrentDirectories ( ID, DirectoryPath, CreateCompleted, CleanupCompleted ) SELECT ROW_NUMBER() OVER ( ORDER BY ID ), DirectoryPath + ‘\‘ + ( @CurrentBackupType ) + CASE WHEN RIGHT(DirectoryPath, 1) = ‘\‘ THEN ‘‘ ELSE ‘\‘ END + @CurrentDatabaseNameFS + CASE WHEN @BackupType = ‘LOG‘ THEN ‘\‘ + REPLACE(CONVERT(VARCHAR(7), GETDATE(), 120), ‘-‘, ‘‘) ELSE ‘‘ END, 0, 0 FROM @Directories ORDER BY ID ASC; IF EXISTS ( SELECT * FROM @CurrentDirectories ) BEGIN SET @CurrentFileNumber = 0; WHILE @CurrentFileNumber < @NumberOfFiles BEGIN SET @CurrentFileNumber = @CurrentFileNumber + 1; SELECT @CurrentDirectoryPath = DirectoryPath FROM @CurrentDirectories WHERE @CurrentFileNumber >= 1 AND @CurrentFileNumber <= ( SELECT @NumberOfFiles / COUNT (*) FROM @CurrentDirectories ); SET @fileName = CASE WHEN @CurrentAvailabilityGroup IS NOT NULL THEN UPPER(@Cluster) --+ ‘$‘ + @CurrentAvailabilityGroup ELSE REPLACE(CAST(SERVERPROPERTY(‘servername‘) AS nvarchar),‘\‘,‘$‘) END + ‘_‘ + @CurrentDatabaseNameFS + ‘_‘ + UPPER(@CurrentBackupType) + CASE WHEN @copyOnly = 1 THEN ‘_COPY_ONLY‘ ELSE ‘‘ END + ‘_‘ + REPLACE(REPLACE(REPLACE(( CONVERT(NVARCHAR, @CurrentDate, 120) ), ‘-‘, ‘‘), ‘ ‘, ‘_‘), ‘:‘, ‘‘) + CASE WHEN @NumberOfFiles > 1 AND @NumberOfFiles <= 9 THEN ‘_‘ + CAST(@CurrentFileNumber AS NVARCHAR) WHEN @NumberOfFiles >= 10 THEN ‘_‘ + RIGHT(‘0‘ + CAST(@CurrentFileNumber AS NVARCHAR), 2) ELSE ‘‘ END + ‘.‘ + @CurrentFileExtension; SET @CurrentFilePath = @CurrentDirectoryPath + ‘\‘ + @fileName; INSERT INTO @CurrentFiles ( [Type], FilePath ) SELECT ‘DISK‘, @CurrentFilePath; SET @CurrentDirectoryPath = NULL; SET @CurrentFilePath = NULL; END; INSERT INTO @CurrentBackupSet ( VerifyCompleted ) SELECT 0; END; -- Create directory WHILE EXISTS ( SELECT * FROM @CurrentDirectories WHERE CreateCompleted = 0 ) BEGIN SELECT TOP 1 @CurrentDirectoryID = ID, @CurrentDirectoryPath = DirectoryPath FROM @CurrentDirectories WHERE CreateCompleted = 0 ORDER BY ID ASC; SET @CurrentCommandType01 = ‘xp_create_subdir‘; SET @CurrentCommand01 = ‘DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_create_subdir N‘‘‘ + REPLACE(@CurrentDirectoryPath, ‘‘‘‘, ‘‘‘‘‘‘) + ‘‘‘ IF @ReturnCode <> 0 RAISERROR(‘‘Error creating directory.‘‘, 16, 1)‘; EXECUTE @CurrentCommandOutput01 = [dbo].[CommandExecute] @Command = @CurrentCommand01, @CommandType = @CurrentCommandType01, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Exec = @exec; SET @Error = @@ERROR; IF @Error <> 0 SET @CurrentCommandOutput01 = @Error; IF @CurrentCommandOutput01 <> 0 SET @ReturnCode = @CurrentCommandOutput01; UPDATE @CurrentDirectories SET CreateCompleted = 1, CreateOutput = @CurrentCommandOutput01 WHERE ID = @CurrentDirectoryID; SET @CurrentDirectoryID = NULL; SET @CurrentDirectoryPath = NULL; SET @CurrentCommand01 = NULL; SET @CurrentCommandOutput01 = NULL; SET @CurrentCommandType01 = NULL; END; -- Perform a backup IF NOT EXISTS ( SELECT * FROM @CurrentDirectories WHERE CreateOutput <> 0 OR CreateOutput IS NULL ) BEGIN SELECT @CurrentCommandType03 = CASE WHEN @CurrentBackupType IN ( ‘DIFF‘, ‘FULL‘ ) THEN ‘BACKUP_DATABASE‘ WHEN @CurrentBackupType = ‘LOG‘ THEN ‘BACKUP_LOG‘ END; SELECT @CurrentCommand03 = CASE WHEN @CurrentBackupType IN ( ‘DIFF‘, ‘FULL‘ ) THEN ‘BACKUP DATABASE ‘ + QUOTENAME(@CurrentDatabaseName) WHEN @CurrentBackupType = ‘LOG‘ THEN ‘BACKUP LOG ‘ + QUOTENAME(@CurrentDatabaseName) END; IF @ReadWriteFileGroups = 1 AND @CurrentDatabaseName <> ‘master‘ SET @CurrentCommand03 = @CurrentCommand03 + ‘ READ_WRITE_FILEGROUPS‘; SET @CurrentCommand03 = @CurrentCommand03 + ‘ TO‘; SELECT @CurrentCommand03 = @CurrentCommand03 + ‘ ‘ + [Type] + ‘ = N‘‘‘ + REPLACE(FilePath, ‘‘‘‘, ‘‘‘‘‘‘) + ‘‘‘‘ + CASE WHEN ROW_NUMBER() OVER ( ORDER BY FilePath ASC ) <> @NumberOfFiles THEN ‘,‘ ELSE ‘‘ END FROM @CurrentFiles ORDER BY FilePath ASC; SET @CurrentCommand03 = @CurrentCommand03 + ‘ WITH ‘; IF @CheckSum = 1 SET @CurrentCommand03 = @CurrentCommand03 + ‘CHECKSUM‘; IF @CheckSum = 0 SET @CurrentCommand03 = @CurrentCommand03 + ‘NO_CHECKSUM‘; IF @Compress = 1 SET @CurrentCommand03 = @CurrentCommand03 + ‘, COMPRESSION‘; IF @Compress = 0 AND @Version >= 10 SET @CurrentCommand03 = @CurrentCommand03 + ‘, NO_COMPRESSION‘; IF @CurrentBackupType = ‘DIFF‘ SET @CurrentCommand03 = @CurrentCommand03 + ‘, DIFFERENTIAL‘; IF @copyOnly = 1 SET @CurrentCommand03 = @CurrentCommand03 + ‘, COPY_ONLY‘; IF @NoRecovery = 1 AND @CurrentBackupType = ‘LOG‘ SET @CurrentCommand03 = @CurrentCommand03 + ‘, NORECOVERY‘; IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ‘, DESCRIPTION = N‘‘‘ + REPLACE(@Description, ‘‘‘‘, ‘‘‘‘‘‘) + ‘‘‘‘; IF @CurrentCommand03 IS NULL SELECT @CurrentCommand03; EXECUTE @CurrentCommandOutput03 = [dbo].[CommandExecute] @Command = @CurrentCommand03, @CommandType = @CurrentCommandType03, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Exec = @Exec; SET @Error = @@ERROR; IF @Error <> 0 SET @CurrentCommandOutput03 = @Error; IF @CurrentCommandOutput03 <> 0 SET @ReturnCode = @CurrentCommandOutput03; END; -- Verify the backup IF @CurrentCommandOutput03 = 0 AND @Verify = 1 BEGIN WHILE EXISTS ( SELECT * FROM @CurrentBackupSet WHERE VerifyCompleted = 0 ) BEGIN SELECT TOP 1 @CurrentBackupSetID = ID FROM @CurrentBackupSet WHERE VerifyCompleted = 0 ORDER BY ID ASC; SET @CurrentCommandType04 = ‘RESTORE_VERIFYONLY‘; SET @CurrentCommand04 = ‘RESTORE VERIFYONLY FROM‘; SELECT @CurrentCommand04 = @CurrentCommand04 + ‘ ‘ + [Type] + ‘ = N‘‘‘ + REPLACE(FilePath, ‘‘‘‘, ‘‘‘‘‘‘) + ‘‘‘‘ + CASE WHEN ROW_NUMBER() OVER ( ORDER BY FilePath ASC ) <> @NumberOfFiles THEN ‘,‘ ELSE ‘‘ END FROM @CurrentFiles ORDER BY FilePath ASC; SET @CurrentCommand04 = @CurrentCommand04 + ‘ WITH ‘; IF @CheckSum = 1 SET @CurrentCommand04 = @CurrentCommand04 + ‘CHECKSUM‘; IF @CheckSum = 0 SET @CurrentCommand04 = @CurrentCommand04 + ‘NO_CHECKSUM‘; EXECUTE @CurrentCommandOutput04 = [dbo].[CommandExecute] @Command = @CurrentCommand04, @CommandType = @CurrentCommandType04, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Exec = @Exec; SET @Error = @@ERROR; IF @Error <> 0 SET @CurrentCommandOutput04 = @Error; IF @CurrentCommandOutput04 <> 0 SET @ReturnCode = @CurrentCommandOutput04; UPDATE @CurrentBackupSet SET VerifyCompleted = 1, VerifyOutput = @CurrentCommandOutput04 WHERE ID = @CurrentBackupSetID; SET @CurrentBackupSetID = NULL; SET @CurrentIsMirror = NULL; SET @CurrentCommand04 = NULL; SET @CurrentCommandOutput04 = NULL; SET @CurrentCommandType04 = NULL; END; END; END; -- Update that the database is completed UPDATE @tmpDatabases SET Completed = 1 WHERE Selected = 1 AND Completed = 0 AND ID = @CurrentDBID; -- Clear variables SET @CurrentDBID = NULL; SET @CurrentDatabaseID = NULL; SET @CurrentDatabaseName = NULL; SET @CurrentBackupType = NULL; SET @CurrentFileExtension = NULL; SET @CurrentFileNumber = NULL; SET @CurrentDifferentialBaseLSN = NULL; SET @CurrentDifferentialBaseIsSnapshot = NULL; SET @CurrentLogLSN = NULL; SET @CurrentLatestBackup = NULL; SET @CurrentDatabaseNameFS = NULL; SET @CurrentDate = NULL; SET @CurrentCleanupDate = NULL; SET @CurrentIsDatabaseAccessible = NULL; SET @CurrentAvailabilityGroup = NULL; SET @CurrentAvailabilityGroupRole = NULL; SET @CurrentAvailabilityGroupBackupPreference = NULL; SET @CurrentIsPreferredBackupReplica = NULL; SET @CurrentDatabaseMirroringRole = NULL; SET @CurrentLogShippingRole = NULL; SET @CurrentCommand03 = NULL; SET @CurrentCommandOutput03 = NULL; SET @CurrentCommandType03 = NULL; DELETE FROM @CurrentDirectories; DELETE FROM @CurrentFiles; DELETE FROM @CurrentBackupSet; END; ---------------------------------------------------------------------------------------------------- --// Log completing information //-- ---------------------------------------------------------------------------------------------------- Logging: IF @LogToTable = 0 BEGIN SET @EndMessage = ‘Date and time: ‘ + CONVERT(NVARCHAR, GETDATE(), 120); SET @EndMessage = REPLACE(@EndMessage, ‘%‘, ‘%%‘); RAISERROR(@EndMessage,10,1) WITH NOWAIT; END IF @ReturnCode <> 0 BEGIN RETURN @ReturnCode; END; END; GO /****** Object: StoredProcedure [dbo].[sp_MGR_trace_SetStatus] Script Date: 2017/2/15 11:16:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: hcc -- Create date: 2015-9-19 -- Description: 自动生成跟踪. 只跟踪超过1500ms的sql和过程, -- 会自动将上一个跟踪导入到TraceLog表,并启用新的跟踪.使用Job定时调用该过程 -- Parameters -- @rootPath: 跟踪文件存放目录 -- @status: 是否启用跟踪.1为启用,0为关闭 -- @path 手动写入某跟踪文件到表.要求为全路径 -- ============================================= CREATE PROC [dbo].[sp_MGR_trace_SetStatus] @rootPath NVARCHAR(200) = ‘D:\InOut\TraceLog\‘ ,-- @status BIT = 1 , @path NVARCHAR(200) = NULL AS BEGIN DECLARE @rc INT; DECLARE @TraceID INT , @curid INT; DECLARE @maxfilesize BIGINT; DECLARE @DateTime DATETIME; -- 先关闭已打开的自定义跟踪 IF @path IS NULL OR LEN(@path) = 0 SELECT @curid = id, @path = CASE WHEN CHARINDEX(‘_‘, [path]) > 0 THEN LEFT([path], CHARINDEX(‘_‘, [path]) - 1) + ‘.trc‘ ELSE [path] END FROM sys.traces WHERE id > 1 AND path IS NOT NULL AND path LIKE @rootPath + ‘%‘ AND status = 1; IF @path IS NULL OR LEN(@path) = 0 GOTO CreateNew; DECLARE @table TABLE ( filePath VARCHAR(500) ); EXEC sp_configure ‘show advanced options‘, 1; RECONFIGURE; EXEC sp_configure ‘xp_cmdshell‘, 1; RECONFIGURE; DECLARE @dir VARCHAR(500); SET @dir = ‘dir /b/s /o:d ‘ + REPLACE(@path, ‘.trc‘, ‘*.trc‘); INSERT INTO @table ( filePath ) EXEC master..xp_cmdshell @dir; EXEC sp_configure ‘xp_cmdshell‘, 0; RECONFIGURE; EXEC sp_configure ‘show advanced options‘, 0; RECONFIGURE; DELETE FROM @table WHERE filePath IS NULL OR filePath = ‘系统找不到指定的文件。‘ OR filePath = ‘找不到文件‘ OR filePath = ‘系统找不到指定的路径。‘; IF ( SELECT COUNT(1) FROM @table ) > 1 BEGIN DECLARE multiTraceFile CURSOR LOCAL FORWARD_ONLY FAST_FORWARD READ_ONLY FOR SELECT filePath FROM @table; OPEN multiTraceFile; FETCH NEXT FROM multiTraceFile INTO @path; WHILE ( @@fetch_status = 0 ) BEGIN INSERT INTO TraceDB.dbo.tracelog ( [EventClass], [Duration], [TextData], [SPID], [BinaryData], [CPU], [EndTime], [ObjectName], [StartTime],Reads,Writes ,databaseName,ApplicationName,HostName ) SELECT [EventClass], [Duration], [TextData], [SPID], [BinaryData], [CPU], [EndTime], [ObjectName], [StartTime],Reads,Writes,databaseName,ApplicationName,HostName FROM :: fn_trace_gettable(@path, DEFAULT) a WHERE a.EventClass IN ( 10, 12 ); -- PRINT @path; FETCH NEXT FROM multiTraceFile INTO @path; END; CLOSE multiTraceFile; DEALLOCATE multiTraceFile; END; ELSE INSERT INTO TraceDB.dbo.tracelog ( [EventClass], [Duration], [TextData], [SPID], [BinaryData], [CPU], [EndTime], [ObjectName], [StartTime],Reads,Writes,databaseName,ApplicationName,HostName ) SELECT [EventClass], [Duration], [TextData], [SPID], [BinaryData], [CPU], [EndTime], [ObjectName], [StartTime],Reads,Writes,databaseName,ApplicationName,HostName FROM :: fn_trace_gettable(@path, DEFAULT) a WHERE a.EventClass IN ( 10, 12 ); IF ( @curid IS NOT NULL ) BEGIN EXEC sp_trace_setstatus @curid, 0; EXEC sp_trace_setstatus @curid, 2; END; CreateNew: IF @status = 0 GOTO finish; SET @maxfilesize = 20; SET @path = @rootPath + CONVERT(VARCHAR(6), GETDATE(), 112) + ‘\‘; EXECUTE master.dbo.xp_create_subdir @path; SET @path = @rootPath + CONVERT(VARCHAR(6), GETDATE(), 112) + ‘\‘ + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), ‘-‘, ‘‘), ‘ ‘, ‘‘), ‘:‘, ‘‘); EXEC @rc = sp_trace_create @TraceID OUTPUT, 2, @path, @maxfilesize, NULL; IF ( @rc != 0 ) GOTO error; -- Set the events DECLARE @on BIT; SET @on = 1; EXEC sp_trace_setevent @TraceID, 10, 2, @on; EXEC sp_trace_setevent @TraceID, 10, 8, @on; EXEC sp_trace_setevent @TraceID, 10, 10, @on; EXEC sp_trace_setevent @TraceID, 10, 12, @on; EXEC sp_trace_setevent @TraceID, 10, 13, @on; EXEC sp_trace_setevent @TraceID, 10, 14, @on; EXEC sp_trace_setevent @TraceID, 10, 15, @on; exec sp_trace_setevent @TraceID, 10, 16, @on exec sp_trace_setevent @TraceID, 10, 17, @on EXEC sp_trace_setevent @TraceID, 10, 18, @on; EXEC sp_trace_setevent @TraceID, 10, 34, @on; exec sp_trace_setevent @TraceID, 10, 35, @on; EXEC sp_trace_setevent @TraceID, 12, 1, @on; EXEC sp_trace_setevent @TraceID, 12, 8, @on; EXEC sp_trace_setevent @TraceID, 12, 10, @on; EXEC sp_trace_setevent @TraceID, 12, 12, @on; EXEC sp_trace_setevent @TraceID, 12, 13, @on; EXEC sp_trace_setevent @TraceID, 12, 14, @on; EXEC sp_trace_setevent @TraceID, 12, 15, @on; exec sp_trace_setevent @TraceID, 12, 16, @on exec sp_trace_setevent @TraceID, 12, 17, @on EXEC sp_trace_setevent @TraceID, 12, 18, @on; exec sp_trace_setevent @TraceID, 12, 35, @on; -- Set the Filters DECLARE @intfilter INT; DECLARE @bigintfilter BIGINT; -- 1500毫秒即1500000微秒 SET @bigintfilter = 1500000; EXEC sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter; -- 排除空值 SET @bigintfilter = NULL; EXEC sp_trace_setfilter @TraceID, 13, 0, 1, @bigintfilter; -- Set the trace status to start EXEC sp_trace_setstatus @TraceID, 1; -- display trace id for future references -- SELECT TraceID = @TraceID; SELECT * FROM sys.traces WHERE id = @TraceID; GOTO finish; error: SELECT ErrorCode = @rc; END; finish:; GO USE [master] GO ALTER DATABASE [TraceDB] SET READ_WRITE GO
作业
USE [msdb] GO /****** Object: Job [Admin_Add_Trace] Script Date: 2017/2/15 11:34:28 ******/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 /****** Object: JobCategory [[Uncategorized (Local)]] Script Date: 2017/2/15 11:34:28 ******/ IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N‘[Uncategorized (Local)]‘ AND category_class=1) BEGIN EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N‘JOB‘, @type=N‘LOCAL‘, @name=N‘[Uncategorized (Local)]‘ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N‘Admin_Add_Trace‘, @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N‘无描述。‘, @category_name=N‘[Uncategorized (Local)]‘, @owner_login_name=N‘sa‘, @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /****** Object: Step [job1] Script Date: 2017/2/15 11:34:28 ******/ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N‘job1‘, @step_id=1, @cmdexec_success_code=0, @on_success_action=1, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N‘TSQL‘, @command=N‘exec [sp_MGR_trace_SetStatus]‘, @database_name=N‘TraceDB‘, @flags=0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N‘job2‘, @enabled=1, @freq_type=4, @freq_interval=1, @freq_subday_type=1, @freq_subday_interval=0, @freq_relative_interval=0, @freq_recurrence_factor=0, @active_start_date=20170215, @active_end_date=99991231, @active_start_time=500, @active_end_time=235959, @schedule_uid=N‘2f9ebad5-d3f4-42d6-98e8-19b3433d6eb3‘ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N‘(local)‘ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave: GO
标签:input 启用 模式 定义 save chain setevent imp mat
原文地址:http://www.cnblogs.com/davidhou/p/6400733.html