資料庫的運維策略腳本篇(內附腳本,無私分享)

来源:http://www.cnblogs.com/double-K/archive/2016/10/08/5915259.html
-Advertisement-
Play Games

資料庫運維中盛傳一個小段子,我誤刪除了資料庫,改怎麼辦?有備份還原備份,沒有備份就準備簡歷!聽起來有趣但發生在誰身上,誰都笑不起來。接觸了很多的客戶發現90%客戶的運維策略都不是很完善。本篇就分享一些常規的運維腳本,本篇沒有涉及到的或不足的也請大家留言無私貢獻深藏多年的腳本,謝謝! 郵件 郵件主要用 ...


  資料庫運維中盛傳一個小段子,我誤刪除了資料庫,改怎麼辦?有備份還原備份,沒有備份就準備簡歷!聽起來有趣但發生在誰身上,誰都笑不起來。接觸了很多的客戶發現90%客戶的運維策略都不是很完善。本篇就分享一些常規的運維腳本,本篇沒有涉及到的或不足的也請大家留言無私貢獻深藏多年的腳本,謝謝!

郵件

  郵件主要用來監控作業是否運行成功,如果您已經配置了類似zabbix等軟體請忽略。

配置郵件服務

  

--SQL Server 並沒有內置郵件伺服器(Mail Server),它跟我們發送郵件一樣,需要用戶名和密碼通過 SMTP(Simple Message Transfer Protocol)去連接郵件伺服器。我們想讓 SQL Server 來發送郵件,首先要告訴它用戶名稱,密碼,伺服器地址,網路傳送協議,郵件伺服器的埠。。。等信息。
--  以下腳本實現了資料庫郵件的配置:
----下麵是具體的配置郵件步驟 
----在 sa 系統帳戶下運行。 
--
--1. 啟用 SQL Server  郵件功能。 
use master
go
exec sp_configure 'show advanced options',1 
go 
reconfigure with override
go
exec sp_configure 'Database Mail XPs',1
go
reconfigure  with override
go
--2. 在 SQL Server  中添加郵件帳戶(account) 
exec msdb..sysmail_add_account_sp
        @account_name            = '163yx'      -- 郵件帳戶名稱(SQL Server 使用)
       ,@email_address           = '[email protected]'  -- 發件人郵件地址
       ,@display_name            = null                      -- 發件人姓名
       ,@replyto_address         = null
       ,@description             = null
       ,@mailserver_name         = 'smtp.163.com'           -- 郵件伺服器地址
       ,@mailserver_type         = 'SMTP'                    -- 郵件協議(SQL 2005 只支持 SMTP)
       ,@port                    = 25                        -- 郵件伺服器埠
       ,@username                = '[email protected]'      -- 用戶名
       ,@password                = 'XXXXX'      -- 密碼
       ,@use_default_credentials = 0
       ,@enable_ssl              = 0
       ,@account_id              = null

--3. 在 SQL Server  中添加 profile 
exec msdb..sysmail_add_profile_sp @profile_name = 'dba_profile3'      -- profile 名稱 
                                 ,@description  = 'dba mail profile' -- profile 描述 
                                 ,@profile_id   = null

-- 在 SQL Server  中映射 account 和 profile 
exec msdb..sysmail_add_profileaccount_sp  @profile_name    = 'dba_profile3' -- profile 名稱 
                                         ,@account_name    = '163yx'     -- account 名稱 
                                         ,@sequence_number = 1             -- account 在 profile 中順序 

--5. 利用 SQL Server  Database Mail 功能發送郵件。 
exec msdb..sp_send_dbmail @profile_name =  'dba_profile3'     -- profile 名稱 
                         ,@recipients   =  '[email protected];[email protected]' -- 收件人郵箱 
                         ,@subject      =  'SQL Server Mail 測試' -- 郵件標題 
                         ,@body         =  'Hello Mail!測試'   -- 郵件內容 
                         ,@body_format  =  'TEXT'      -- 郵件格式 
            ,@file_attachments = 'c:\a.txt' --郵件附件


--6. 查看郵件發送情況: 
use msdb
go
select * from sysmail_allitems
select * from sysmail_mailitems
select * from sysmail_event_log 


--如果不是以 sa 帳戶發送郵件,則可能會出現錯誤: 
--
--Msg 229, Level 14, State 5, Procedure sp_send_dbmail, Line 1
--EXECUTE permission denied on object 'sp_send_dbmail', database 'msdb', schema 'dbo'.
--
--這是因為,當前 SQL Server 登陸帳戶(login),在 msdb 資料庫中沒有發送資料庫郵件的許可權,需要加入 msdb 資料庫用戶,並通過加入 sp_addrolemember 角色賦予許可權。假設該SQL Server 登陸帳戶名字為 “dba” 
--
--use msdb
--go
--
--create user dba for login dba
--go
--
--exec dbo.sp_addrolemember @rolename   = 'DatabaseMailUserRole',
--                          @membername = 'dba'
--go
--
--此時,再次發送資料庫郵件,仍可能有錯誤: 
--
--Msg 14607, Level 16, State 1, Procedure sp_send_dbmail, Line 119
--profile name is not valid
--
--雖然,資料庫用戶 “dba” 已經在 msdb 中擁有發送郵件的許可權了,但這還不夠,他還需要有使用 profile:“dba_profile” 的許可權。 
--
--use msdb
--go
--
--exec sysmail_add_principalprofile_sp  @principal_name = 'dba'
--                                     ,@profile_name   = 'dba_profile'
--                                     ,@is_default     = 1
--
--從上面的參數 @is_default=1 可以看出,一個資料庫用戶可以在多個 mail profile 擁有發送許可權。




--EXEC msdb.dbo.sysmail_configure_sp 'MaxFileSize', 100000000 (位元組)設置郵件.note

 

 

配置操作員

  操作員主要是用於作業的通知對象:

  

  

  配置如下:

  

  

USE [msdb]
GO
EXEC msdb.dbo.sp_add_operator @name=N'mail_user2', 
        @enabled=1, 
        @pager_days=0, 
        @email_address=N'KK_XXXX.163.COM'
GO

 

 

  註 :操作員可根據是否在作業成功或失敗時通知,後續腳本均未配置操作員,如需配置可在作業屬性中自行添加 

  

 

AlwaysOn相關

節點切換監控

  

    declare @role VARCHAR(8000);    
    declare @email_conetent varchar(8000);--存放郵件正文 
    declare @name varchar(100);
    declare @lastsend int;
declare @subject_str varchar(100);
    set @name =(select @@servername)
set @subject_str = @name + 'always on 預警'
    set @role=(SELECT role FROM sys.dm_hadr_availability_replica_states WHERE is_local=1)
    set @lastsend = (select isnull(datediff(MINUTE,max(send_request_date), getdate()),6000) from [msdb].[dbo].[sysmail_mailitems] where subject = @subject_str)

     if @role >1 and @lastsend > 30  ----30分鐘發送一次
        begin 
            set  @email_conetent=(@name+'當前節點不是主節點,發生故障轉移')
            print(@email_conetent)
print(@lastsend)
--if @lastsend > 1
            --發送郵件  
                      --郵件正文內容
            EXEC msdb.dbo.sp_send_dbmail 
                @profile_name = 'DB-mail',         --配置文件名稱
                @recipients = '[email protected]',  --收件email地址
                @subject = @subject_str,                 --郵件主題
                @body = @email_conetent    
        end 

 

 

 

節點切換作業控制

  作業可以採用手動控制或如下腳本,也可以修改作業在作業執行前增加節點判斷

--------------------------判斷當前節點是否為主節點 如果不是則禁用作業 -------
------------節點 切換為主節點則啟用JOB ------------
DECLARE @ROLE tinyint 
DECLARE @ENABLE tinyint 
----判斷是否是主節點 --1 主節點
 SELECT @role=role FROM sys.dm_hadr_availability_replica_states WHERE is_local=1

--判斷JOB狀態  --0 禁用 1 啟用
--以syspolicy_purge_history 為 參照 --如果 禁用或刪除syspolicy_purge_history請修改 @ENABLE下段查詢
SELECT @ENABLE  = [ENABLED] 
FROM MSDB.[dbo].[sysjobs] 
WHERE NAME = 'syspolicy_purge_history'


-----第一次切換 輔助節點沒有創建CDC作業 job 則創建作業 [category_id] = 13 CDC LOG SCAN JOB
if not exists (select 1 from msdb.dbo.sysjobs where [category_id]= 13 or [category_id]= 16 ) and  @ROLE = 1
begin 
EXEC sys.sp_cdc_add_job @job_type = 'capture';
EXEC sys.sp_cdc_add_job @job_type = 'cleanup';
end

---primary and job disable set job enable
IF @ROLE = 1 and @ENABLE = 0
BEGIN

----如果存在原有作業為禁用,無法確定哪些JOB需要開啟....所以此處最好手動維護作業的啟用和禁用
EXEC msdb.dbo.sp_update_job
    @job_name = N'XXXXX',
    @enabled = 1 ;


-----執行 CDC 
EXEC msdb.dbo.sp_start_job @job_name = N'cdc.XX_capture'
EXEC msdb.dbo.sp_start_job @job_name = N'cdc.XX_cleanup'
end
---not primary and job enable set  disable
IF @ROLE <> 1 and @ENABLE  = 1
BEGIN
----如果存在原有作業為禁用,無法確定哪些JOB需要開啟....所以此處最好手動維護作業的啟用和禁用
EXEC msdb.dbo.sp_update_job
    @job_name = N'XXXXX',
    @enabled = 0 ;

END

 

數據備份

  備份方案:每天全備份、6小時一次差異備份、一小時一次日誌備份。

備份存儲過程

  存儲過程創建後會保留在master庫中,存儲過程主要控製備份邏輯,備份路徑等。

  存儲過程中只有一個類型參數,用於控制全備/差異/日誌備份,可根據需要修改。

USE [master]
GO

/****** Object:  StoredProcedure [dbo].[sp_BackupDatabase]    Script Date: 01/22/2015 13:52:46 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- Author: KK

-- Create date: 2016-09-27

-- Description: 備份資料庫,備份路徑F:\KK_BackUp\ 可自行修改

-- http://www.cnblogs.com/double-K/

-- Parameter1: 備份類型 F=全部, D=差異, L=日誌

alter PROCEDURE [dbo].[sp_BackupDatabase]
@backupType CHAR(1)
AS
BEGIN
SET NOCOUNT ON;



declare @filepath_backup varchar(100)
declare @dateTime varchar(30),@del_time_stamp varchar(50)
DECLARE @sqlCommand NVARCHAR(1000)

---創建資料庫對應文件夾
EXECUTE master.dbo.xp_create_subdir N'F:\KK_BackUp\Full\'
EXECUTE master.dbo.xp_create_subdir N'F:\KK_BackUp\Difference\'
EXECUTE master.dbo.xp_create_subdir N'F:\KK_BackUp\Log_Bak\'

IF @backupType = 'F'
set @filepath_backup='F:\KK_BackUp\Full\'
IF @backupType = 'D'
set @filepath_backup='F:\KK_BackUp\Difference\'
IF @backupType = 'L'
set @filepath_backup='F:\KK_BackUp\Log_Bak\'

SET ANSI_WARNINGS OFF
SET @dateTime = replace(convert(varchar,current_timestamp, 112)+'_'+convert(varchar,current_timestamp, 108),':','')

----刪除超過3天的備份文件
DECLARE @delete_time datetime
set @delete_time = getdate() - 3

EXECUTE master.dbo.xp_delete_file 0,N'F:\kk_backup',N'trn',@delete_time,1
EXECUTE master.dbo.xp_delete_file 0,N'F:\kk_backup',N'bak',@delete_time,1

SELECT @dateTime = replace(convert(varchar,current_timestamp, 112)+'_'+convert(varchar,current_timestamp, 108),':','')





declare db_info cursor for    
SELECT NAME,recovery_model FROM MASTER.SYS.databases 
where state = 0 ---只處理online的資料庫 
and name not in ('tempdb','ReportServerTempDB','ReportServer')  ----填寫不需要備份的資料庫


declare @databaseName nvarchar(128) 
declare @recovery_model  int
OPEN db_info    
fetch next from db_info into @databaseName,@recovery_model 
while @@fetch_status=0    
Begin    

---recovery_model 1 : FULL 2 : BULK_LOGGED 3:SIMPLE
---系統資料庫只全備

IF @backupType = 'F' 

SET @sqlCommand = 'BACKUP DATABASE '+ @databaseName +' TO DISK = '''+ @filepath_backup + ''+ @databaseName +'_Full_'+@dateTime+'.BAK'' with STATS = 10, INIT, COMPRESSION, CHECKSUM '

IF @backupType = 'D' and @databaseName not in ('master','msdb','model')

SET @sqlCommand = 'BACKUP DATABASE '+ @databaseName +' TO DISK = '''+ @filepath_backup + ''+ @databaseName + '_Diff_' + @dateTime + '.BAK '' WITH DIFFERENTIAL, STATS = 10, INIT, COMPRESSION'

IF @backupType = 'L' and @recovery_model <> 3 and @databaseName not in ('master','msdb','model')
SET @sqlCommand = 'BACKUP LOG '+ @databaseName +' TO DISK = '''+ @filepath_backup + '' + @databaseName +'_Log_' + @dateTime + '.TRN'' with STATS = 10, INIT, COMPRESSION'
print @sqlCommand



EXECUTE sp_executesql @sqlCommand 


fetch next from db_info into @databaseName,@recovery_model 
End    

close db_info    
deallocate db_info    

PRINT '-- Backup completed successfully at '+convert(varchar, getdate(), 120)    

SET ANSI_WARNINGS ON
END
GO

 

備份作業

  備份作業很簡單,就是調用存儲過程用計劃控製備份頻率

  

-- Author: KK

-- Create date: 2016-09-27

-- Description: 備份資料庫,全備份每天一次 0點執行,差異備份6小時一次,日誌備份1小時一次

-- http://www.cnblogs.com/double-K/

--需要備份的資料庫未使用參數傳遞,而是選擇在存儲過程中指定,當添加新庫時不需要修改任何腳本

-- Parameter1: 備份類型 F=全部, D=差異, L=日誌


-------------------完整備份作業-----------------
USE [msdb]
GO

/****** Object:  Job [FULL_BACKUP]    Script Date: 2016/9/30 12:13:12 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object:  JobCategory [[Uncategorized (Local)]]]    Script Date: 2016/9/30 12:13:12 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'FULL_BACKUP', 
        @enabled=1, 
        @notify_level_eventlog=0, 
        @notify_level_email=0, 
        @notify_level_netsend=0, 
        @notify_level_page=0, 
        @delete_level=0, 
        @description=N'系統全備份', 
        @category_name=N'[Uncategorized (Local)]', 
        @owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [FULL_STEP1]    Script Date: 2016/9/30 12:13:12 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'FULL_STEP1', 
        @step_id=1, 
        @cmdexec_success_code=0, 
        @on_success_action=1, 
        @on_success_step_id=0, 
        @on_fail_action=2, 
        @on_fail_step_id=0, 
        @retry_attempts=0, 
        @retry_interval=0, 
        @os_run_priority=0, @subsystem=N'TSQL', 
        @command=N'[dbo].[sp_BackupDatabase] ''F''', 
        @database_name=N'master', 
        @flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EVERY_1d_zero', 
        @enabled=1, 
        @freq_type=4, 
        @freq_interval=1, 
        @freq_subday_type=1, 
        @freq_subday_interval=0, 
        @freq_relative_interval=0, 
        @freq_recurrence_factor=0, 
        @active_start_date=20160930, 
        @active_end_date=99991231, 
        @active_start_time=0, 
        @active_end_time=235959, 
        @schedule_uid=N'813653e1-4128-4f47-b378-5a26b49085d0'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = 	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL 基礎知識梳理(三) - 聚合和排序 【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/5926689.html 序 這是《SQL 基礎知識梳理(二) - 查詢基礎》的下篇。 目錄 對錶進行聚合查詢 對錶進行分組 為聚合結果指定條件 對查詢結果進行排 ...
  • 網上說使用localhost即可,確實沒錯,但是有的仍舊會報出無法找到錯誤,我在無法通過的時候又重新安裝了SQLServer,這次選中全部預設安裝,之前使用的是選擇安裝,然後發現多了幾個配置,其中有一項是建立實例,然後我再次選預設,安裝完成後,再啟動SQLServer2012,伺服器名稱中輸入loc ...
  • 回到目錄 對於StackExchange.Redis這個驅動來說,之前的版本在使用Proxy為Twemproxy代理時,它是不支持Password屬性的,即不支持原始的Auth指令,而我也修改過源代碼,為CommandMap添加了Auth但最後測試的結果還是失敗了,就在10月1過完後的第一天,我升級 ...
  • SQL語句中count(1)count(*)count(欄位)用法的區別 在SQL語句中count函數是最常用的函數之一,count函數是用來統計表中記錄數的一個函數, 一. count(1)和count(*)的區別 1. count(1)和count(*)的作用: 都是檢索表中所有記錄行的數目,不 ...
  • 表簇索引(cluster index) 對於表簇索引而言,必須使用表簇。 由於簇索引與索引表簇關聯緊密,無法單獨拿出來總結,因此一併進行總結。 1.1 表簇的定義 表簇是一組通過相同公共列(簇鍵),構成的表的集合。 如上圖,右側獨立的兩張表,employees員工表與departments部門表,通 ...
  • 在ORACLE資料庫中有物理讀(Physical Reads)、邏輯讀(Logical Reads)、一致性讀(Consistant Get)、當前模式讀(DB Block Gets)等諸多概念,如果不理解或混淆這些概念的話,對你深入理解一些知識無疑是一個障礙,但是這些概念確實挺讓讓人犯暈的。下麵我... ...
  • JDBC part1 JDBC概述 jdbc是一種用於執行SQL語句的Java API,通過這套API可以訪問各種關係資料庫,例如;Oracle,MySql,SQLServer等. JDBC驅動程式是各個資料庫廠家根據JDBC的W3C規範製作的JDBC實現類. oracle 驅動地址:F:\Orac ...
  • 【原文地址】https://docs.mongodb.com/manual/ 引言 MongoDB是一種開源文檔型資料庫,它具有高性能,高可用性,自動擴展性 1.文檔資料庫 MongoDB用一個文檔來表示一條記錄,文檔的數據結構由鍵值對組成。MongoDB文檔類似於JSON對象,欄位值可能是文檔,數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...