DBA常用操作----sqlserver篇(上)

引言

近期接手了公司的DBA职务,公司大大小小的几十个数据库,都需要管理,平时的表瘦身,数据迁移,存储过程优化,监控等等,一系列操作,为了方便操作,把我平时经常使用的一些操作保存下来,方便以后查阅使用。希望对大家有所帮助吧

sqlserver风险操作

  • 更新语句慢sql

  • 删除语句

  • 不带索引的查询语句

查询慢sql的方法

1.whoisactive

  • 安装方法

    • http://whoisactive.com/downloads/下载地址
    • 将下载好的zip包放到sqlserver服务器中
    • 文件-打开-文件-下载好的zip包-在查询窗口点击执行
    • 新建一个查询窗口,输入sp_whoisactive,获取当前运行的所有sql语句
  • 使用方法

    • 输入sp_whoisactive,获取当前运行的所有sql语句
    • 查看当前所有的sql中,观察运行时间,较长时间的,影响到其他业务的,或者影响这个服务器性能,导致其他的sql堆积的sql,就给停止掉
  • 停止方法

    • whoisactive查看的sql中,可以看到session_id,记录下慢sql的sessionId
    • 使用命令 kill session_id 的方式将慢sql的进行杀掉

2.自己编写的脚本

脚本命令 当数据库出现性能问题时,这个脚本能够直观的看到数据库中SQL 的运行状态,快速找到执行缓慢的语句。这是我使用最频繁的脚本之一.

SELECT
    es.session_id,
    database_name=DB_NAME(er.database_id),
    er.cpu_time,
    er.reads,
    er.writes,
    er.logical_reads,
    login_name,
    er.status,
    blocking_session_id,
    wait_type,
    wait_resource,
    wait_time,
    individual_query=SUBSTRING(qt.text,(er.statement_start_offset/2)+1,((CASE  WHEN  er.statement_end_offset=-1 THEN  LEN(CONVERT(NVARCHAR(MAX),qt.text))* 2 ELSE   er.statement_end_offset  END-er.statement_start_offset)/2)+1),
    parent_query=qt.text,
    program_name,
    host_name,
    nt_domain,
    start_time,
    DATEDIFF(MS,er.start_time,GETDATE())as duration,
    (SELECT  query_plan  FROM  sys.dm_exec_query_plan (er.plan_handle))AS  query_plan
FROM
    sys.dm_exec_requests er
    INNER  JOIN  sys.dm_exec_sessions  es  ON er.session_id=es.session_id
    CROSS  APPLY  sys.dm_exec_sql_text (er.sql_handle)AS  qt
WHERE
    es.session_id> 50         
    AND  es.session_Id  NOT  IN(@@SPID)
ORDER BY
    1, 2

重要信息

logical_reads:逻辑读,衡量语句的执行开销。如果大于10w,说明此语句开销很大。可以检查下索引是否合理

status:进程的状态。running 表示正在运行,sleeping 表示处于睡眠中,未运行任何语句,suspend 表示等待,runnable 等待cpu 调度

blocking_session_id: 如果不为0,例如 60 。表示52号进程正在被60阻塞。50 进程必须等待60执行完成,才能执行下面的语句

host_name :发出请求的服务器名

program_name:发出请求的应用程序名

duration: 请求的执行时间

3、sqlserver profile

  1. 打开sqlserver profiler

  2. 常规选项中,勾选保存到表,自己设置一个表

  3. 设置容量大小,最大行数。单位是:千行。大概设置10w条,就设置值为100

  4. 事件选择-勾选显示所有事件

  5. Security Audit选项中,反勾选Login,Logout

  6. session中,反勾选退出连接(existingConnection)

  7. stored procedures(存储过程) 勾选RPC completed 和 SP stmtCompleted

  8. TSQL 勾选 SQL:Batchcompleted和SQL:stmtcomple

  9. 选择列筛选器-》duration-》大于等于3000(此处单位为毫秒)意思是筛选执行3秒以上的sql记录

  10. 点击运行,就可以看到记录的慢sql了。

sqlserver作业的使用方式

打开sqlserver manager,登陆上db 使用作业之前,需要将SQL Server 代理打开 代理的子目录中,有一个作业选项,打开该选项,可以看到db中目前存在的作业,右键新建,可以新建作业。

新建作业方式

  • 右键新建作业

    1. 输入作业名称,说明等
    1. 在步骤中新建一个步骤
    1. 输入步骤名称
    1. 如果要执行sql命令,就选择类型为T-SQL
    1. 运行身份(可选)
    1. 数据库选择执行sql所作用的数据库
    1. 命令,可以在窗口处输入要执行的sql命令,也可以在外部新建一个存储过程,然后执行存储过程
    1. 高级选项中,选择成功和失败后要执行的内容,下一步还是退出
  • 选择计划

    1. 新建计划,选择执行时间
  • 确定作业

作业启动,就正常执行了,如果要停止作业,需要右键该作业,选择禁用。单纯停止是停不下来的

sqlserver备份

操作步骤 全备-》插入记录-》停止插入-》差异备份-》插入记录-》停止插入-》日志备份-》还原全备-》还原日志-》还原差异备-》还原日志备

全备

全备代码: 记得修改相关路径

USE [master]
GO

/****** Object:  StoredProcedure [dbo].[sp_full_BackupDB]    Script Date: 2020/2/12 18:55:20 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE procedure [dbo].[sp_full_BackupDB](@DBName varchar(50))
as
begin
  declare @sCommandText varchar(255)
  declare @startTime    varchar(255)
  declare @endTime      varchar(255)
  declare @tmp_file_name  varchar(255)
  declare @tmp_file_name_2  varchar(255)
  declare @base_dir       varchar(255)
  declare @base_dir_2       varchar(255)
  declare @now_day        varchar(255)
  declare @rarcmd        varchar(255)  
  declare @rarfile       varchar(255)  
  declare @tmp_prefix       varchar(255)  
  
  set @tmp_prefix = 'test_back'
  
  set @startTime = convert(varchar,GETDATE( ) , 120)
  set  @sCommandText = 'echo 开始备份  完全备份: ' +  @DBName + '  ' +   @startTime + ' >>  D:\bak_db\backup_detail.txt'
  exec xp_cmdshell  @sCommandText
   
  ---- 正式备份
   -- 类似 2018-01-02-1407  是 年-月-日-时分  用于日志备份
   -- set @now_day = substring( replace(replace(replace(CONVERT(varchar,   getdate()   , 120 ),'-','-'),' ','-'),':','') , 1, 15)
   
   -- 类似 2018-01-02   是 年月日时分   用于完整、差异备份
   set @now_day =  replace(CONVERT(varchar,  getdate()   , 111 ),'/','-') 
   
   set  @base_dir = 'D:\bak_db\quanbei_db\'
   
   
   -- 全备 master,压缩备份, 生成类似  TongCheng_B2B_DB_TC_master_full_2018-05-28.bak
   set  @tmp_file_name = @base_dir + @tmp_prefix + @DBName + '_master_full_' + @now_day + '.bak'
   BACKUP DATABASE [master] TO  DISK = @tmp_file_name  with STATS = 1,compression
   
   -- 全备 model,压缩备份,  生成类似  TongCheng_B2B_DB_TC_model_full_2018-05-28.bak
   set  @tmp_file_name = @base_dir + @tmp_prefix + @DBName +  '_model_full_' + @now_day + '.bak'
   BACKUP DATABASE [model] TO  DISK = @tmp_file_name  with STATS = 1,compression
   
   -- 全备 msdb,压缩备份,   生成类似  TongCheng_B2B_DB_TC_msdb_full_2018-05-28.bak
   set  @tmp_file_name = @base_dir + @tmp_prefix + @DBName +  '_msdb_full_' + @now_day + '.bak'
   BACKUP DATABASE [msdb] TO  DISK = @tmp_file_name  with STATS = 1,compression
   
   
   -- 全备 该用户数据库     生成类似  TongCheng_B2B_DB_TC_full_2018-05-28.bak
   set  @tmp_file_name = @base_dir + @tmp_prefix + @DBName +  '_full_' + @now_day + '.bak'
   
   BACKUP DATABASE @DBName  TO  DISK = @tmp_file_name  with STATS = 1,compression  

   
   
   -- 停止1分钟
   waitfor delay '00:01:00'
  
  ----- 结束备份
  
  set  @endTime = convert(varchar,GETDATE( ) , 120)
  set  @sCommandText = 'echo 结束备份  完全备份:  ' +  @DBName + '  ' +   @endTime + ' >>  D:\bak_db\backup_detail.txt'
  exec xp_cmdshell  @sCommandText
  
  set  @sCommandText = 'echo  -------------------    >>  D:\bak_db\backup_detail.txt'
  exec xp_cmdshell  @sCommandText
   
end
GO


创建过存储过程之后,执行全备命令
exec [sp_full_BackupDB]  库名

等待执行完毕即可

差异备

差异备代码:记得修改相关路径和名字

USE [master]
GO

/****** Object:  StoredProcedure [dbo].[sp_differential_BackupDB]    Script Date: 2020/2/12 18:57:43 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE procedure [dbo].[sp_differential_BackupDB](@DBName varchar(50))
as
begin
  declare @sCommandText varchar(255)
  declare @startTime    varchar(255)
  declare @endTime      varchar(255)
  declare @tmp_file_name  varchar(255)
  declare @tmp_file_name_2  varchar(255)
  declare @tmp_file_name_3  varchar(255)
  declare @base_dir       varchar(255)
  declare @base_dir_2       varchar(255)
  declare @base_dir_3       varchar(255)
  declare @now_day        varchar(255)
  declare @rarcmd        varchar(255)  
  declare @rarfile       varchar(255) 
  declare @tmp_prefix       varchar(255)  
  
  set @tmp_prefix = 'test_differential_back'
  set @startTime = convert(varchar,GETDATE( ) , 120)
  set  @sCommandText = 'echo 开始备份: 差异备份  ' +  @DBName + '  ' +   @startTime + ' >>  D:\bak_db\backup_detail.txt'
  exec xp_cmdshell  @sCommandText
   
  ---- 正式备份
   -- 类似 2018-01-02   是 年月日时分   用于完整、差异备份
   set @now_day =  replace(CONVERT(varchar,  getdate()   , 111 ),'/','-') 

   
   set  @base_dir = 'D:\bak_db\differential_db\'
  
   
   -- 差异备份 该用户数据库     生成类似  TongCheng_B2B_DB_TC_differential_2018-05-28.bak
   set  @tmp_file_name = @base_dir + @tmp_prefix + @DBName +  '_differential_' + @now_day + '.bak'
   
   BACKUP DATABASE @DBName  TO  DISK = @tmp_file_name  
     with differential , STATS = 1,compression   
  
  
  -- 停止1分钟
   waitfor delay '00:01:00'
   
   
  ----- 结束备份
  
  set  @endTime = convert(varchar,GETDATE( ) , 120)
  set  @sCommandText = 'echo 结束备份: 差异备份  ' +  @DBName + '  ' +   @endTime + ' >>  D:\bak_db\backup_detail.txt'
  exec xp_cmdshell  @sCommandText
   
  set  @sCommandText = 'echo  -------------------    >>  D:\bak_db\backup_detail.txt'
  exec xp_cmdshell  @sCommandText
  
end
GO


差异备执行方式:
exec [sp_differential_BackupDB]  库名

等待执行完毕即可

日志备

日志备代码:记得修改相关路径


USE [master]
GO

/****** Object:  StoredProcedure [dbo].[sp_tlog_BackupDB]    Script Date: 2020/2/12 18:58:56 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE procedure [dbo].[sp_tlog_BackupDB](@DBName varchar(50))
as
begin
  declare @sCommandText varchar(255)
  declare @startTime    varchar(255)
  declare @endTime      varchar(255)
  declare @tmp_file_name  varchar(255)
  declare @base_dir       varchar(255)
  declare @tlog_time        varchar(255)
  declare @tmp_prefix       varchar(255)  
  
  set @tmp_prefix = 'test_log_back'
  set @startTime = convert(varchar,GETDATE( ) , 120)
  set  @sCommandText = 'echo 开始备份: 日志备份  '  + @DBName + '  ' +   @startTime + ' >>  D:\bak_db\backup_detail.txt'
  exec xp_cmdshell  @sCommandText
   
  ---- 正式备份
   -- 类似 2017-12-21-1000  
    set @tlog_time = substring( replace(replace(replace(CONVERT(varchar,   getdate()   , 120 ),'-','-'),' ','-'),':','') , 1, 15)
   
   set  @base_dir = 'D:\bak_db\tlog_db\'
   
   
   -- 日志备份 该用户数据库     生成类似  account_tlog_2017-12-20-1000.bak
   set  @tmp_file_name = @base_dir + @tmp_prefix + @DBName +  '_tlog_' + @tlog_time + '.bak'
   BACKUP  log  @DBName  TO  DISK = @tmp_file_name   with   STATS = 1,compression
  
  ----- 结束备份
  
  set  @endTime = convert(varchar,GETDATE( ) , 120)
  set  @sCommandText = 'echo 结束备份: 日志备份  ' +  @DBName + '  ' +   @endTime + ' >>  D:\bak_db\backup_detail.txt'
  exec xp_cmdshell  @sCommandText
   
  set  @sCommandText = 'echo  -------------------    >>  D:\bak_db\backup_detail.txt'
  exec xp_cmdshell  @sCommandText
  
end
GO

执行代码:
exec [sp_tlog_BackupDB]  库名

等待执行完毕即可

ldf备份

进行尾日志还原的时候,mdf不可用,ldf可用的情况下,需要将ldf备份,然后进行还原。(前提是做过全备等备份,然后进行还原)

尾日志备份代码: 修改相关路径和库名即可

BACKUP LOG 库名 TO DISK=N'D:\bak_db\tlog_db2\tail_log.bak' WITH INIT,NO_TRUNCATE;

等待执行完毕即可

事务备份

如果误操作进行节点还原,需要有事务备份,然后进行节点还原。此操作需要一些前置条件支持

前置条件:
1、数据库右键属性,在选项中查看数据恢复模式为“完整”
2、在数据误操作之前进行过完整数据备份

备份方法:
1、命令行操作方式:
BACKUP LOG [test] TO  DISK = N'D:\bak_db\testback.trn' WITH NOFORMAT, NOINIT,  NAME = N'test-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

2、图形化操作:
a/选择要恢复的数据库,右键-“任务”-“备份”
b/在弹出的备份对话框中备份类型选择“事务日志”,并添加备份文件“log.trn”------->备份类型:事务日志,目标:磁盘,删除原有的路径,添加到自定义的路径。
c/点击确定完成事务日志备份

注意事项

1、sqlserver profile的记录慢sql时间单位问题: 在数据表中记录的微妙。但是设置的那个地方填写的是毫秒

2、数据库属性中,恢复模式问题 一定要选择完整,才能进行全备,和事务备份等。

3、做全备、差异备的时候,一定要停掉所有的连接,关闭job。否则恢复的时候,就会显示恢复中,这是sqlserver的事务未提交问题

4、重启sqlserver服务器的时候,一定要关闭数据库服务,关闭job等。防止数据库事务未提交完毕就重启,会导致数据库在恢复中。

下一篇

下一篇文章,DBA常用操作 sqlserver篇 (下) 主要讲解了db的还原,迁移,优化,问题处理等,有兴趣的可以阅读一下。 文章链接: DBA常用操作----sqlserver篇(下)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写代码的喵o

请作者吃包辣条可好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值