Sql-Server

DBA 新工作的第一天 - 檢查備份和安全性 - 如何?還應該檢查什麼?

  • February 1, 2022

通常,當我在新環境中開始時,我傾向於檢查備份在哪裡,最後一次完整的時間,最後一次恢復的時間,我也會檢查安全性。

我這樣做的方式是通過 T-SQL。

檢查備份

       ;with Radhe as (
           SELECT  @@Servername as [Server_Name],
           B.name as Database_Name, 
           ISNULL(STR(ABS(DATEDIFF(day, GetDate(), MAX(Backup_finish_date)))), 'NEVER') as DaysSinceLastBackup,
           ISNULL(Convert(char(11), MAX(backup_finish_date), 113)+ ' ' + CONVERT(VARCHAR(8),MAX(backup_finish_date),108), 'NEVER') as LastBackupDate
           ,BackupSize_GB=CAST(COALESCE(MAX(A.BACKUP_SIZE),0)/1024.00/1024.00/1024.00 AS NUMERIC(18,2))
           ,BackupSize_MB=CAST(COALESCE(MAX(A.BACKUP_SIZE),0)/1024.00/1024.00 AS NUMERIC(18,2))
           ,media_set_id = MAX(A.media_set_id)
           ,[AVG Backup Duration]= AVG(CAST(DATEDIFF(s, A.backup_start_date, A.backup_finish_date) AS int))
           ,[Longest Backup Duration]= MAX(CAST(DATEDIFF(s, A.backup_start_date, A.backup_finish_date) AS int))
           ,A.type
           FROM sys.databases B 

           LEFT OUTER JOIN msdb.dbo.backupset A 
                        ON A.database_name = B.name 
                       AND A.is_copy_only = 0
                       AND (A.type = 'D')  --'D' full, 'L' log 

           GROUP BY B.Name, A.type

       )

        SELECT r.[Server_Name]
              ,r.Database_Name
              ,[Backup Type] = r.type 
              ,r.DaysSinceLastBackup
              ,r.LastBackupDate
              ,r.BackupSize_GB
              ,r.BackupSize_MB
              ,F.physical_device_name
              ,r.[AVG Backup Duration]
              ,r.[Longest Backup Duration]

          FROM Radhe r

           LEFT OUTER JOIN msdb.dbo.backupmediafamily F
                        ON R.media_set_id = F.media_set_id

           ORDER BY r.Server_Name, r.Database_Name

檢查安全性:

Kenneth Fisher 的伺服器級別和數據庫權限

檢查恢復:

DECLARE @dbname sysname, @days int
SET @dbname = NULL --substitute for whatever database name you want
SET @days = -30 --previous number of days, script will default to 30
SELECT
rsh.destination_database_name AS [Database],
rsh.user_name AS [Restored By],
CASE WHEN rsh.restore_type = 'D' THEN 'Database'
 WHEN rsh.restore_type = 'F' THEN 'File'
 WHEN rsh.restore_type = 'G' THEN 'Filegroup'
 WHEN rsh.restore_type = 'I' THEN 'Differential'
 WHEN rsh.restore_type = 'L' THEN 'Log'
 WHEN rsh.restore_type = 'V' THEN 'Verifyonly'
 WHEN rsh.restore_type = 'R' THEN 'Revert'
 ELSE rsh.restore_type 
END AS [Restore Type],
rsh.restore_date AS [Restore Started],
bmf.physical_device_name AS [Restored From], 
rf.destination_phys_name AS [Restored To]
FROM msdb.dbo.restorehistory rsh
INNER JOIN msdb.dbo.backupset bs ON rsh.backup_set_id = bs.backup_set_id
INNER JOIN msdb.dbo.restorefile rf ON rsh.restore_history_id = rf.restore_history_id
INNER JOIN msdb.dbo.backupmediafamily bmf ON bmf.media_set_id = bs.media_set_id
WHERE rsh.restore_date >= DATEADD(dd, ISNULL(@days, -30), GETDATE()) --want to search for previous days
--AND destination_database_name = ISNULL(@dbname, destination_database_name) --if no dbname, then return all
ORDER BY rsh.restore_history_id DESC
GO

複製:

--first thing - go to the publisher DB and find out the distributor server and DB
sp_helpdistributor

-- go to the distributor server and DB found above and run the following:
sp_replmonitorhelppublication null

鏡像:

--==============================================================================
-- query that shows the current state of each database in the mirroring
--==============================================================================
 SELECT   db_name(sd.[database_id])              AS [Database Name]
         ,sd.mirroring_state                  AS [Mirror State]
         ,sd.mirroring_state_desc             AS [Mirror State] 
         ,sd.mirroring_partner_name           AS [Partner Name]
         ,sd.mirroring_role_desc              AS [Mirror Role]  
         ,sd.mirroring_safety_level_desc      AS [Safety Level]
         ,sd.mirroring_witness_name           AS [Witness]
         ,sd.mirroring_connection_timeout AS [Timeout(sec)]
   FROM sys.database_mirroring AS sd
   WHERE mirroring_guid IS NOT null
   ORDER BY [Database Name];

始終開啟

我使用Rudy Panigas 的腳本

--  Always On Status Report
--
-- This script will show the status of the Alway On replication status

SELECT DISTINCT
primary_replica as 'Primary Server',
[endpoint_url] as 'End Point URL',
primary_recovery_health_desc as 'Primary Server Health Status',
secondary_recovery_health_desc as 'Secondary Server Health Status',
operational_state_desc as 'Operational State',
connected_state_desc as 'Connection State',
recovery_health_desc as 'Recovery Health',
synchronization_state_desc as 'Synchronization State',
database_state_desc as 'Database State',
JOIN_state_desc as 'Join State',
suspend_reason_desc as 'Suspended Reason',
availability_mode_desc as 'Availability Mode',
failover_mode_desc as 'Failover Mode',
primary_role_allow_connections_desc as 'Primary Connections Allowed',
secondary_role_allow_connections_desc as 'Secondary Connections Allowed',
create_date as 'Date Created',
modify_date as 'Date Modified',
[backup_priority] as 'Backup Priority',
role_desc as 'Role Type',
last_connect_error_description as 'Last Connection Error',
last_connect_error_timestamp as 'Last Connection Error Time',
last_sent_time as 'Last Data Send Time',
last_received_time as 'Last Data Recieved TIme',
last_hardened_time  as 'Last Hardened Time',
last_redone_time as 'Last Redone Time',
log_send_queue_size as 'Log Send Queue Size',
log_send_rate as 'Log Send Rate',
redo_queue_size as 'Redo Queue Size',
redo_rate as 'Rate of Redo',
filestream_send_rate as 'Filestream Send Rate',
last_commit_time as ' Last Commit Time',
low_water_mark_for_ghosts as 'Low Water Mark for Ghosts'
FROM sys.dm_hadr_availability_group_states

JOIN sys.availability_replicas
ON sys.dm_hadr_availability_group_states.group_id =  sys.availability_replicas.group_id

JOIN sys.dm_hadr_availability_replica_cluster_states
ON sys.dm_hadr_availability_group_states.group_id =  sys.dm_hadr_availability_replica_cluster_states.group_id

JOIN sys.dm_hadr_availability_replica_states
ON sys.dm_hadr_availability_group_states.group_id =  sys.dm_hadr_availability_replica_states.group_id

JOIN sys.dm_hadr_database_replica_states
ON sys.dm_hadr_availability_group_states.group_id =  sys.dm_hadr_database_replica_states.group_id

WHERE operational_state_desc IS NOT NULL
AND database_state_desc IS NOT NULL
ORDER BY [endpoint_url] DESC

-- Testing section
/*
-- Suspend replication from primary
ALTER DATABASE [AdventureWorksLT2008] SET HADR SUSPEND

-- Resume replication from secondary
ALTER DATABASE [AdventureWorksLT2008] SET HADR RESUME

-- Force a manual failover of replication with data loss. MUST EXECUTE ON SECONDARY SQL SERVER
ALTER AVAILABILITY GROUP [AG-AdventureWorksLT2008] FORCE_FAILOVER_ALLOW_DATA_LOSS;

-- Force a manual failover of replication with NO data loss MUST EXECUTE ON SECONDARY SQL SERVER
--- YOU MUST EXECUTE THE FOLLOWING SCRIPT IN SQLCMD MODE.
--Connect VDV1OPS03

ALTER AVAILABILITY GROUP [AG-AdventureWorksLT2008] FAILOVER;
GO

--- YOU MUST EXECUTE THE FOLLOWING SCRIPT IN SQLCMD MODE.
--:Connect OPSDBSRV

ALTER AVAILABILITY GROUP [AG-AdventureWorksLT2008] FAILOVER;
GO

*/

日誌運輸:

監視 SQL Server 數據庫的日誌傳送的不同方法

題:

除了上述之外,在開始新環境時我還應該優先檢查其他事項嗎?

正是出於這個原因,我編寫了免費(和開源)的sp_Blitz

人們不停地遞給我 SQL Server,然後說:“你是 DBA,你來管理這件事。” 我需要一些可以快速分析以下內容的東西:

  • 尚未備份或檢查損壞的數據庫
  • 不受支持的 SQL Server 版本
  • 危險的跟踪標誌和數據庫設置
  • 錯誤的 sp_configure 選項

只需執行它,無需任何參數,您將獲得優先的健康檢查。優先級 1-50 是您想要立即開始的事情,優先級 51+ 是需要注意的事情,以備後用。

如需支持或貢獻程式碼,請前往FirstResponderKit.org的 Github 儲存庫。

引用自:https://dba.stackexchange.com/questions/164406