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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
日志服务 SLS,月写入数据量 50GB 1个月
简介:

前言

接下来我们将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基础系列中有关死锁的最后几篇。







本文转自Jeffcky博客园博客,原文链接:http://www.cnblogs.com/CreateMyself/p/6395670.html,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
10天前
|
SQL 存储 API
Flink实践:通过Flink SQL进行SFTP文件的读写操作
虽然 Apache Flink 与 SFTP 之间的直接交互存在一定的限制,但通过一些创造性的方法和技术,我们仍然可以有效地实现对 SFTP 文件的读写操作。这既展现了 Flink 在处理复杂数据场景中的强大能力,也体现了软件工程中常见的问题解决思路——即通过现有工具和一定的间接方法来克服技术障碍。通过这种方式,Flink SQL 成为了处理各种数据源,包括 SFTP 文件,在内的强大工具。
47 15
|
30天前
|
SQL 关系型数据库 MySQL
【MySQL】根据binlog日志获取回滚sql的一个开发思路
【MySQL】根据binlog日志获取回滚sql的一个开发思路
|
18天前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
23 1
|
29天前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
15天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
31 0
|
19天前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
35 0
|
19天前
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
21 0
|
2月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
60 13
|
2月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
25天前
|
SQL JavaScript 前端开发
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题