Today I ran into a very strange problem. I was doing an audit because a client lost 32 billion records in a table and he wanted to know "Who did it!". They did not use auditing because it had a too large impact on performance. The server and instance was not restarted so the DMV's were still available with data.
I presumed there were two options how the data could have been lost and so quickly:
SELECT
t.TEXT QueryName,
s.execution_count AS ExecutionCount,
s.max_elapsed_time AS MaxElapsedTime,
ISNULL(s.total_elapsed_time / s.execution_count, 0) AS AvgElapsedTime,
s.creation_time AS LogCreatedOn
FROM sys.dm_exec_query_stats s
CROSS APPLY sys.dm_exec_sql_text( s.sql_handle ) t
WHERE t.TEXT LIKE '%TRUNCATE%'
ORDER BY
s.creation_time DESC
GO
No truncate. Mmm. With partition? No partition. Mmm, very strange.
So I created a temp table on my server and ran a truncate table command like this:
TRUNCATE TABLE [dbo].[tblToBeTruncated]
and the query above. No truncate. Than I changed the query in the following:
TRUNCATE TABLE [dbo].[tblToBeTruncated]
GO
and again no truncate.Then I changed the query in a format with a ; like this:
TRUNCATE TABLE [dbo].[tblToBeTruncated];
and there was the truncate statement when I ran the query above.
Due to this bug we weren't able to find the bad guy and he got away with it. I hope the Microsoft SQL Server team will correct this ASAP because every query, even it takes a second, should be in the DMV's.
For the bad guys: you still can get away with a truncate of a table but be aware the SQL Server team is working on it.
PS: the test was executed on Azure SQL Database. When I tried it SQL Server 2016 the TRUNCATE command never appeared in the list with ; or without ;. Nothing. Same for SQL Server 2012.
I presumed there were two options how the data could have been lost and so quickly:
- run a TRUNCATE TABLE. Very fast and and in less than a second your table is unrecoverable empty
- Switch a partition out into a temporary table and just truncate the original table. Yes it happens and the effect is the same: nothing!
SELECT
t.TEXT QueryName,
s.execution_count AS ExecutionCount,
s.max_elapsed_time AS MaxElapsedTime,
ISNULL(s.total_elapsed_time / s.execution_count, 0) AS AvgElapsedTime,
s.creation_time AS LogCreatedOn
FROM sys.dm_exec_query_stats s
CROSS APPLY sys.dm_exec_sql_text( s.sql_handle ) t
WHERE t.TEXT LIKE '%TRUNCATE%'
ORDER BY
s.creation_time DESC
GO
No truncate. Mmm. With partition? No partition. Mmm, very strange.
So I created a temp table on my server and ran a truncate table command like this:
TRUNCATE TABLE [dbo].[tblToBeTruncated]
and the query above. No truncate. Than I changed the query in the following:
TRUNCATE TABLE [dbo].[tblToBeTruncated]
GO
and again no truncate.Then I changed the query in a format with a ; like this:
TRUNCATE TABLE [dbo].[tblToBeTruncated];
and there was the truncate statement when I ran the query above.
Due to this bug we weren't able to find the bad guy and he got away with it. I hope the Microsoft SQL Server team will correct this ASAP because every query, even it takes a second, should be in the DMV's.
For the bad guys: you still can get away with a truncate of a table but be aware the SQL Server team is working on it.
PS: the test was executed on Azure SQL Database. When I tried it SQL Server 2016 the TRUNCATE command never appeared in the list with ; or without ;. Nothing. Same for SQL Server 2012.
Comments
Post a Comment