sqlserver风险操作
查询慢sql的方法
1.whoisactive
安装方法
使用方法
停止方法
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中目前存在的作业,右键新建,可以新建作业。
新建作业方式
右键新建作业
输入作业名称,说明等
在步骤中新建一个步骤
选择计划
确定作业
作业启动,就正常执行了,如果要停止作业,需要右键该作业,选择禁用。单纯停止是停不下来的
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/点击确定完成事务日志备份
上篇暂时到这,下篇讲解db 的还原,还原中出现的问题,迁移,重命名,sql优化等操作