浏览代码

adding more changes to t-log9002 file

[email protected] 4 年之前
父节点
当前提交
103e35a70e
共有 1 个文件被更改,包括 62 次插入12 次删除
  1. 62 12
      Troubleshooting-Notebooks/DOCs-to-Notebooks/T-Shooting_LogFull_9002.ipynb

+ 62 - 12
Troubleshooting-Notebooks/DOCs-to-Notebooks/T-Shooting_LogFull_9002.ipynb

@@ -79,11 +79,61 @@
                 "SET NOCOUNT ON\r\n",
                 "DECLARE @SQL VARCHAR (8000), @log_reuse_wait tinyint, @log_reuse_wait_desc nvarchar(120), @dbname sysname, @database_id int, @recovery_model_desc varchar (24)\r\n",
                 "\r\n",
-                "if ( OBJECT_id (N'tempdb..#CannotTruncateLog_Db') is not null)\r\n",
+                "\r\n",
+                "IF ( OBJECT_id (N'tempdb..#CannotTruncateLog_Db') is not null)\r\n",
                 "BEGIN\r\n",
                 "    DROP TABLE #CannotTruncateLog_Db\r\n",
                 "END\r\n",
                 "\r\n",
+                "\r\n",
+                "--get info about transaction logs in each db. Using older DMV to support versions prior to 2016\r\n",
+                "\r\n",
+                "IF ( OBJECT_id (N'tempdb..#dm_db_log_space_usage') is not null)\r\n",
+                "BEGIN\r\n",
+                "    DROP TABLE #dm_db_log_space_usage \r\n",
+                "END\r\n",
+                "SELECT * INTO #dm_db_log_space_usage FROM sys.dm_db_log_space_usage where 1=0\r\n",
+                "\r\n",
+                "DECLARE log_space CURSOR FOR SELECT NAME FROM sys.databases\r\n",
+                "OPEN log_space \r\n",
+                "\r\n",
+                "FETCH NEXT FROM log_space into @dbname\r\n",
+                "\r\n",
+                "WHILE @@FETCH_STATUS = 0\r\n",
+                "BEGIN\r\n",
+                "\r\n",
+                "\tset @SQL = '\r\n",
+                "\tinsert into #dm_db_log_space_usage (\r\n",
+                "\tdatabase_id, \r\n",
+                "\ttotal_log_size_in_bytes, \r\n",
+                "\tused_log_space_in_bytes, \r\n",
+                "\tused_log_space_in_percent, \r\n",
+                "\tlog_space_in_bytes_since_last_backup\r\n",
+                "\t)\r\n",
+                "\tselect\r\n",
+                "\tdatabase_id, \r\n",
+                "\ttotal_log_size_in_bytes, \r\n",
+                "\tused_log_space_in_bytes, \r\n",
+                "\tused_log_space_in_percent, \r\n",
+                "\tlog_space_in_bytes_since_last_backup\r\n",
+                "\tfrom ' + @dbname +'.sys.dm_db_log_space_usage'\r\n",
+                "\r\n",
+                "\t\r\n",
+                "\tBEGIN TRY  \r\n",
+                "\t\texec (@SQL)\r\n",
+                "\tEND TRY  \r\n",
+                "\r\n",
+                "\tBEGIN CATCH  \r\n",
+                "        SELECT ERROR_MESSAGE() AS ErrorMessage;  \r\n",
+                "\tEND CATCH;\r\n",
+                "\r\n",
+                "\tFETCH NEXT FROM log_space into @dbname\r\n",
+                "END\r\n",
+                "\r\n",
+                "CLOSE log_space \r\n",
+                "DEALLOCATE log_space \r\n",
+                "\r\n",
+                "--select the affected databases \r\n",
                 "SELECT \r\n",
                 "    sdb.name as DbName, \r\n",
                 "    sdb.log_reuse_wait, sdb.log_reuse_wait_desc, \r\n",
@@ -105,16 +155,14 @@
                 "\r\n",
                 "    sdb.database_id,\r\n",
                 "    sdb.recovery_model_desc,\r\n",
-                "    ls.total_log_size_mb,\r\n",
-                "    ls.active_log_size_mb,\r\n",
-                "    ls.total_log_size_mb - ls.active_log_size_mb as Free_Space_mb\r\n",
+                "    lsu.used_log_space_in_bytes/1024 as Used_log_size_MB,\r\n",
+                "\tlsu.total_log_size_in_bytes /1024 as Total_log_size_MB,\r\n",
+                "    100 - lsu.used_log_space_in_percent as Percent_Free_Space\r\n",
                 "INTO #CannotTruncateLog_Db\r\n",
-                "FROM sys.databases AS sdb CROSS APPLY sys.dm_db_log_stats(database_id) AS ls\r\n",
-                "\r\n",
-                "WHERE sdb.log_reuse_wait != 0;\r\n",
+                "FROM sys.databases AS sdb INNER JOIN #dm_db_log_space_usage lsu ON sdb.database_id = lsu.database_id\r\n",
+                "WHERE log_reuse_wait > 0\r\n",
                 "\r\n",
-                "\r\n",
-                "SELECT * FROM #CannotTruncateLog_Db;\r\n",
+                "SELECT * FROM #CannotTruncateLog_Db \r\n",
                 "\r\n",
                 "\r\n",
                 "DECLARE no_truncate_db CURSOR FOR\r\n",
@@ -127,8 +175,9 @@
                 "\r\n",
                 "WHILE @@FETCH_STATUS = 0\r\n",
                 "BEGIN\r\n",
-                "    if (@log_reuse_wait is not null)\r\n",
-                "        select '-- ''' + @dbname +  ''' database --' as \"Individual Database Report\"\r\n",
+                "    if (@log_reuse_wait > 0)\r\n",
+                "        select '-- ''' + @dbname +  ''' database has log_reuse_wait = ' + @log_reuse_wait_desc + ' --'  as 'Individual Database Report'\r\n",
+                "\r\n",
                 "\r\n",
                 "    if (@log_reuse_wait = 1)\r\n",
                 "    BEGIN\r\n",
@@ -138,7 +187,7 @@
                 "    END\r\n",
                 "    else if (@log_reuse_wait = 2)\r\n",
                 "    BEGIN\r\n",
-                "        select 'Is '+ @recovery_model_desc +' recovery model the intended choice for your database? Review recovery models and determine if you need to change it. https://docs.microsoft.com/sql/relational-databases/backup-restore/recovery-models-sql-server'\r\n",
+                "        select 'Is '+ @recovery_model_desc +' recovery model the intended choice for ''' + @dbname+ ''' database? Review recovery models and determine if you need to change it. https://docs.microsoft.com/sql/relational-databases/backup-restore/recovery-models-sql-server' as RecoveryModelChoice\r\n",
                 "        select 'To truncate the log consider performing a transaction log backup on database ''' + @dbname+ ''' which is in ' + @recovery_model_desc +' recovery model. Be mindful of any existing log backup chains that could be broken' as Recommendation\r\n",
                 "        select 'BACKUP LOG [' + @dbname + '] TO DISK = ''some_volume:\\some_folder\\' + @dbname + '_LOG.trn ''' as BackupLogCommand\r\n",
                 "    END\r\n",
@@ -176,6 +225,7 @@
                 "        select 'select availability_group=cast(ag.name as varchar(30)), primary_replica=cast(ags.primary_replica as varchar(30)),primary_recovery_health_desc=cast(ags.primary_recovery_health_desc as varchar(30)), synchronization_health_desc=cast(ags.synchronization_health_desc as varchar(30)),ag.failure_condition_level, ag.health_check_timeout, automated_backup_preference_desc=cast(ag.automated_backup_preference_desc as varchar(10))  from sys.availability_groups ag join sys.dm_hadr_availability_group_states ags on ag.group_id=ags.group_id' as CheckAGHealth\r\n",
                 "        select 'SELECT  group_name=cast(arc.group_name as varchar(30)), replica_server_name=cast(arc.replica_server_name as varchar(30)), node_name=cast(arc.node_name as varchar(30)),role_desc=cast(ars.role_desc as varchar(30)), ar.availability_mode_Desc, operational_state_desc=cast(ars.operational_state_desc as varchar(30)), connected_state_desc=cast(ars.connected_state_desc as varchar(30)), recovery_health_desc=cast(ars.recovery_health_desc as varchar(30)), synhcronization_health_desc=cast(ars.synchronization_health_desc as varchar(30)), ars.last_connect_error_number, last_connect_error_description=cast(ars.last_connect_error_description as varchar(30)), ars.last_connect_error_timestamp, primary_role_allow_connections_desc=cast(ar.primary_role_allow_connections_desc as varchar(30)) from sys.dm_hadr_availability_replica_cluster_nodes arc join sys.dm_hadr_availability_replica_cluster_states arcs on arc.replica_server_name=arcs.replica_server_name join sys.dm_hadr_availability_replica_states ars on arcs.replica_id=ars.replica_id join sys.availability_replicas ar on ars.replica_id=ar.replica_id join sys.availability_groups ag on ag.group_id = arcs.group_id and ag.name = arc.group_name ORDER BY cast(arc.group_name as varchar(30)), cast(ars.role_desc as varchar(30))' as CheckReplicaHealth\r\n",
                 "        select 'select database_name=cast(drcs.database_name as varchar(30)), drs.database_id, drs.group_id, drs.replica_id, drs.is_local,drcs.is_failover_ready,drcs.is_pending_secondary_suspend, drcs.is_database_joined, drs.is_suspended, drs.is_commit_participant, suspend_reason_desc=cast(drs.suspend_reason_desc as varchar(30)), synchronization_state_desc=cast(drs.synchronization_state_desc as varchar(30)), synchronization_health_desc=cast(drs.synchronization_health_desc as varchar(30)), database_state_desc=cast(drs.database_state_desc as varchar(30)), drs.last_sent_lsn, drs.last_sent_time, drs.last_received_lsn, drs.last_received_time, drs.last_hardened_lsn, drs.last_hardened_time,drs.last_redone_lsn, drs.last_redone_time, drs.log_send_queue_size, drs.log_send_rate, drs.redo_queue_size, drs.redo_rate, drs.filestream_send_rate, drs.end_of_log_lsn, drs.last_commit_lsn, drs.last_commit_time, drs.low_water_mark_for_ghosts, drs.recovery_lsn, drs.truncation_lsn, pr.file_id, pr.error_type, pr.page_id, pr.page_status, pr.modification_time from sys.dm_hadr_database_replica_cluster_states drcs join sys.dm_hadr_database_replica_states drs on drcs.replica_id=drs.replica_id and drcs.group_database_id=drs.group_database_id left outer join sys.dm_hadr_auto_page_repair pr on drs.database_id=pr.database_id  order by drs.database_id' as LogMovementHealth\r\n",
+                "        select 'For more information see https://docs.microsoft.com/en-us/troubleshoot/sql/availability-groups/error-9002-transaction-log-large' as OnlineDOCResource\r\n",
                 "    END    \r\n",
                 "    else if (@log_reuse_wait in (10, 11, 12, 14))\r\n",
                 "    BEGIN\r\n",