SQL Server-聚焦事务对本地变量、临时表、表变量影响以及日志文件存满时如何收缩(三十一)

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
日志服务 SLS,月写入数据量 50GB 1个月
简介: 前言 接下来我们将SQL Server基础系列还剩下最后几节内容结束,后续再来讲解SQL Server性能调优,我们开始进入主题。 SQL Server事务对本地变量影响 事务对变量影响具体是指什么意思呢,换句话说就是当我们回滚事务和提交事务之后对本地变量是否起作用呢,下面我们来看下具体例子。

前言

接下来我们将SQL Server基础系列还剩下最后几节内容结束,后续再来讲解SQL Server性能调优,我们开始进入主题。

SQL Server事务对本地变量影响

事务对变量影响具体是指什么意思呢,换句话说就是当我们回滚事务和提交事务之后对本地变量是否起作用呢,下面我们来看下具体例子。

PRINT '回滚事务之后测试'
DECLARE @FlagINT INT
SET @FlagInt = 1
PRINT @FlagInt ---- 此时变量值为1
BEGIN TRANSACTION
SET @FlagInt = 2 ---- 设置变量值为2
PRINT @FlagInt
ROLLBACK TRANSACTION
PRINT @FlagInt ---- 此时变量值为多少?
GO
PRINT '--------------------'
PRINT '提交事务之后测试'
DECLARE @FlagINT INT
SET @FlagInt = 1
PRINT @FlagInt ---- 此时变量值为1
BEGIN TRANSACTION
SET @FlagInt = 2 ---- 设置变量值为2
PRINT @FlagInt
COMMIT TRANSACTION
PRINT @FlagInt ---- 此时变量值为多少?
GO

 

通过上述图我们能够很清晰的知道:通过改变本地变量值,但是在回滚后和提交后对变量根本不起作用,所以我们得出结论:本地变量不受事务所影响,因为其作用范围受到限制。

SQL Server事务对临时变量影响

我们首先创建一个临时并插入一条数据,再来开启事务插入一条数据并回滚事务看其结果如何,具体示例如下:

USE AdventureWorks2012
GO
-- 创建临时表并插入一行数据
CREATE TABLE #TempTable (Col1 VARCHAR(100))
INSERT INTO #TempTable (Col1)
VALUES('Temp Table - Outside Tran');

--查询临时表插入的值
SELECT Col1 AS TempTable_BeforeTransaction
FROM #TempTable;

BEGIN TRAN
-- 插入一行数据
INSERT INTO #TempTable (Col1)
VALUES('Temp Table - Inside Tran');

ROLLBACK
-- 查询临时表中的值
SELECT Col1 AS TempTable_AfterTransaction
FROM #TempTable;

GO
-- 删除临时表
DROP TABLE #TempTable
GO

从上图观察到当默认插入一条为 Temp Table - Outside Tran 的数据时,接下来我们开启事务再插入一条为 Temp Table - Inside Tran 的数据,然后进行事务回滚,此时回滚之后的数据和默认插入的数据一致,基于此我们得出结论:临时表受事务影响

SQL Server事务对表变量影响

USE AdventureWorks2012
GO

-- 创建表变量并插入一行数据
DECLARE @TableVar TABLE(Col1 VARCHAR(100))
INSERT INTO @TableVar (Col1)
VALUES('Table Var - Outside Tran');

--查询未开启事务之前数据
SELECT Col1 AS TableVar_BeforeTransaction
FROM @TableVar;

BEGIN TRAN
-- 开启事务并插入一行数据
INSERT INTO @TableVar (Col1)
VALUES('Table Var - Inside Tran');

ROLLBACK

--查询开启事务之后数据
SELECT Col1 AS TableVar_AfterTransaction
FROM @TableVar;
GO

当默认插入一条为 Table Var - Outside Tran 的数据后,我们开启事务插入一条为 Table Var - Inside Tran 的数据,接下来再来进行回滚发现其结果仍为 Table Var - Inside Tran ,至此我们得出结论:表变量不受事务所影响。 

收缩日志文件

当日志文件占满时,我们可能需要收缩日志文件到最小,那么我们该如何做呢?我们可以通过如下三种方式收缩日志文件,请继续往下看。

收缩方式一(通过新建查询语句执行)

在SQL Server 2005之前我们可以通过如下做

USE AdventureWorks2012
GO
DBCC SHRINKFILE('TruncateLog', 1)
BACKUP LOG AdventureWorks2012 WITH TRUNCATE_ONLY
DBCC SHRINKFILE('TruncateLog', 1)
GO

如果在SQL Server 2005下运行上述命令则会出现如下错误:

此时我们应该运行如下查询。

USE [AdventureWorks2012] 
GO
ALTER DATABASE [AdventureWorks2012] SET RECOVERY SIMPLE WITH NO_WAIT
DBCC SHRINKFILE(AdventureWorks2012_Log, 1)
ALTER DATABASE [AdventureWorks2012] SET RECOVERY FULL WITH NO_WAIT
GO

此时运行成功将得到如下结果:

此时我们再右键数据库属性将得到我们收缩后最小的日志文件大小,如下:

收缩日志文件方式二(在正确时间收缩日志文件)

通过右键你要收缩的日志文件对应的数据库的任务->收缩->文件,如下:

收缩日志文件方式三(完全移除日志文件)

有时候我们完全不需要大日志文件,此时我们需要完全移除日志文件来释放硬盘空间,我们通过以下四步即可达到我们所需。

(1)分离数据库

(2)重命名日志文件

(3)重新附加不带日志文件的数据库

(4)删除日志文件

演示如下:

总结

本节我们详细讲解了事务对本地变量和表变量不起作用,而对临时表起作用以及当日志文件占满时我们采取几种方式来收缩日志,我们下节开始进入SQL Server基础系列中有关死锁的最后几篇。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
Java Apache 开发工具
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
|
2月前
|
运维 安全 Linux
【揭秘】如何轻松掌控Linux系统命脉?——一场探索日志文件奥秘的旅程,带你洞悉系统背后的故事!
【8月更文挑战第21天】日志文件对Linux系统至关重要,记录着包括应用行为、组件状态和安全事件在内的系统活动,如同系统的“黑匣子”。掌握日志查看技巧是系统管理的基础技能,有助于快速诊断问题。常用命令包括`cat`、`tail`和`grep`等,可用于查看如`/var/log/messages`和`/var/log/auth.log`等系统日志文件,以及特定应用的日志。`journalctl`则用于查看systemd服务日志。此外,`logrotate`工具可管理日志文件的滚动和归档,确保系统高效运行。
41 4
|
21天前
|
缓存 监控 算法
分析慢日志文件来优化 PHP 脚本的性能
分析慢日志文件来优化 PHP 脚本的性能
|
1月前
|
消息中间件 存储 监控
Kafka的logs目录下的文件都是什么日志?
Kafka的logs目录下的文件都是什么日志?
49 11
|
2月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
13天前
|
Python
Python如何将日志输入到文件里
Python如何将日志输入到文件里
|
2月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
2月前
|
存储 安全 Linux
在Linux中,日志文件通常存储在哪些目录?
在Linux中,日志文件通常存储在哪些目录?
|
2月前
|
Ubuntu Linux Apache
在Linux中,如何使用logrotate命令管理日志文件?
在Linux中,如何使用logrotate命令管理日志文件?
|
2月前
|
监控 安全 Linux
在Linux中,某个账号登陆linux后,系统会在哪些日志文件中记录相关信息?
在Linux中,某个账号登陆linux后,系统会在哪些日志文件中记录相关信息?