使用Ola 的备份策略,有一项工作
数据库备份 - 系统数据库已满,如下图所示。
此项工作计划每周日早上运行一次。
一切都很好,已经运行了一段时间了。
现在我需要将其改为每天运行。
使用 ssms 、编写更改脚本并应用它,效果很好。
然而,因为我需要在几十台服务器上完成这项工作,所以我需要一个脚本来找出时间表,然后修改它并重新应用到工作中
我还没有实现它,但我想知道是否有人已经做到了。
使用Ola 的备份策略,有一项工作
数据库备份 - 系统数据库已满,如下图所示。
此项工作计划每周日早上运行一次。
一切都很好,已经运行了一段时间了。
现在我需要将其改为每天运行。
使用 ssms 、编写更改脚本并应用它,效果很好。
然而,因为我需要在几十台服务器上完成这项工作,所以我需要一个脚本来找出时间表,然后修改它并重新应用到工作中
我还没有实现它,但我想知道是否有人已经做到了。
我一直在研究SQL 服务器内部的映射驱动器。
我绘制了类似这样的图:
EXEC XP_CMDSHELL 'net use y: "\\my_server\Initialed Folders\MM" @@__password__@@ /User:mycompany\m_miorelli /persistent:NO'
那已是三个多月前的事了。
现在我已经更改了密码。
然后当我进入同一个服务器时,我们将其称为 my_server,然后运行此
EXEC XP_CMDSHELL 'net use'
我得到这个结果:
你看那里还有 az:驱动器仍然挂在那里,我不知道具体是怎么回事,也许我映射了它......persisted
当我尝试涉及备份所在服务器的任何操作时,我收到此错误消息:
restore filelistonly from disk=N'\\backup_server\ Initialed Folders\MM\backup_of_a_database.bak'
Msg 3201, Level 16, State 2, Line 20
Cannot open backup device '\\backup_server\ Initialed Folders\MM\backup_of_a_database.bak'. Operating system error 1326(The user name or password is incorrect.).
Msg 3013, Level 16, State 1, Line 20
RESTORE FILELIST is terminating abnormally.
我曾尝试这样做:
exec xp_cmdshell 'net use \\ip\xxx pass /user:xxx /persistent:no'
问题):
我怎样才能摆脱该映射驱动器?或者非常具体的目标:我怎样才能摆脱这个错误密码的事情?
其他任何服务器都不会发生这种情况。
按照Craig在评论中的建议,感谢Craig,我删除了映射驱动器
EXEC XP_CMDSHELL 'NET USE Z: /d'
这让我很高兴也很感激,但是,这并没有解决问题。
此触发器在数据库创建时执行操作- 显示了当有人创建新数据库时触发的服务器端触发器的示例。
另一个问题 -创建时触发更改数据库排序规则- 也显示了当有人创建新数据库时触发的服务器端触发器的示例。
这里有一个服务器端触发器的示例,它可以防止用户放弃登录:
USE [master]
GO
--======================================================================
-- example of a server trigger - does not allow a login to be dropped
--======================================================================
create trigger [no_dropped_logins] on all server
for drop_login
as
insert into ##LOGIN_WATCH
select r.*, s.login_name, s.host_name,
EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') AS 'CmdText'
from sys.dm_exec_requests r
inner join sys.dm_exec_sessions s
on r.session_id = s.session_id
where r.session_id = @@SPID
我的问题是:
如何使用服务器端触发器来防止在 SQL Server 中创建链接服务器?
在尝试防止自动增长发生时,我在这里得到了这个很好的脚本。
然而,如果确实发生了,我需要知道如何找出它。我可以使用Max Vernon 编写的这个非常好的脚本来做到这一点。
print @@servername + ' - ' + SUBSTRING(@@version,1,COALESCE(CHARINDEX('Copyright',@@version,0)-1,108))
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT OFF
/*
Description: display growth events for all databases on the instance
by: Max Vernon
date: 2014-10-01
*/
DECLARE @Version NVARCHAR(255);
DECLARE @VersionINT INT;
SET @Version = CONVERT(NVARCHAR(255),SERVERPROPERTY('ProductVersion'));
SET @VersionINT = CONVERT(INT, SUBSTRING(@Version,1 ,CHARINDEX('.',@Version)-1));
DECLARE @cmd NVARCHAR(2000);
SET @cmd = '';
IF @VersionINT >= 9
BEGIN
SET @cmd =
'
DECLARE @trcfilename VARCHAR(1000);
SELECT @trcfilename = path
FROM sys.traces WITH(NOLOCK)
WHERE is_default = 1;
IF COALESCE(@trcfilename,'''') <> ''''
BEGIN
SELECT [Radhe]=
'''''''' + @@SERVERNAME + '''''','''''' +
DB_NAME(mf.database_id) + '''''','''''' +
mf.name + '''''','' +
CONVERT(VARCHAR(255), a.NumberOfGrowths) + '','' +
CONVERT(VARCHAR(255), CAST(a.DurationOfGrowthsInSeconds AS decimal(38, 20)))
FROM
(
SELECT
tt.DatabaseID AS database_id,
tt.FileName AS LogicalFileName,
COUNT(*) AS NumberOfGrowths,
SUM(tt.Duration / (1000 * 1000.0)) AS DurationOfGrowthsInSeconds
FROM sys.fn_trace_gettable(@trcfilename, default) tt
WHERE (EventClass IN (92, 93))
GROUP BY
tt.DatabaseID,
tt.FileName
) a
INNER JOIN sys.master_files mf ON
(mf.database_id = a.database_id) AND
(mf.name = a.LogicalFileName);
END
ELSE
BEGIN
SELECT @@SERVERNAME, ''NO TRACE FILE'';
END
';
EXEC sp_executesql @cmd;
END
ELSE
BEGIN
SELECT [SERVER NAME]=@@SERVERNAME, [Product Version]=SERVERPROPERTY('ProductVersion');
END
缺少的是并且我想补充的是——自动增长是什么时候发生的?
我怎样才能找到它?
当我运行以下脚本时:
-- ——— SCRIPT GRANTS for Object Privileges—————
IF OBJECT_ID('[sys].[sysrowsets]') IS NOT NULL GRANT CONTROL on [sys].[sysrowsets] to [db_myrole_BA]
我收到此错误信息:
Msg 15151, Level 16, State 1, Line 271
Cannot find the object 'sysrowsets', because it does not exist or you do not have permission.
然而:
当我运行这个时:
select radhe=OBJECT_ID('[sys].[sysrowsets]')
我的原始脚本来自这里:
-- SCRIPT GRANTS for Objects Level Privilegs
PRINT '-- ——— SCRIPT GRANTS for Object Privileges—————'
SELECT
[GRANTS for Object Privileges]='IF OBJECT_ID(''['+ sys.schemas.name + '].[' + sys.objects.name + ']''' + ') IS NOT NULL ' + CHAR(13) + SPACE(1) +
state_desc + ' ' + permission_name + ' on ['+ sys.schemas.name + '].[' + sys.objects.name + '] to [' + sys.database_principals.name + ']' COLLATE SQL_Latin1_General_CP1_CI_AS
from sys.database_permissions
join sys.objects on sys.database_permissions.major_id =
sys.objects.object_id
join sys.schemas on sys.objects.schema_id = sys.schemas.schema_id
join sys.database_principals on sys.database_permissions.grantee_principal_id =
sys.database_principals.principal_id
where sys.database_principals.name not in ( 'public', 'guest')
--order by 1, 2, 3, 5
我怎么可能会收到这个错误?
我想保存所有这些权限,以便当我恢复数据库时,我可以重新应用这些权限。
今天我必须检查传输中加密是否在特定服务器(sql服务器)中启动并运行,如果没有,则进行设置。
完成的方式是:
在 SQL Server 配置管理器中,展开 SQL Server 网络配置,右键单击协议,然后选择属性。在标志选项卡上的 ForceEncryption 框中,选择是,然后选择确定以关闭对话框。重新启动 SQL Server 服务。
下面的图片是我重新启动sql server服务之后的。
现在,我是一个喜欢 DBA 天堂的 DBA,喜欢所有自动化和通过脚本完成的事情。
我如何通过脚本完成此操作?部分解决方案也有效。它可以是 powershell、T-SQL 或任何其他脚本语言。
我有一个查询,它显示了服务器中的所有 SQL 服务器实例:
DECLARE @GetInstances TABLE
( Value nvarchar(100),
InstanceNames nvarchar(100),
Data nvarchar(100))
Insert into @GetInstances
EXECUTE xp_regread
@rootkey = 'HKEY_LOCAL_MACHINE',
@key = 'SOFTWARE\Microsoft\Microsoft SQL Server',
@value_name = 'InstalledInstances'
Select [ServerName] = @@servername,InstanceNames from @GetInstances
我还有一个查询,显示特定实例的内存设置和使用情况:
SELECT [instance] = @@servername, p.*
FROM (SELECT name, [value_in_use]
FROM sys.configurations) t
PIVOT (MAX([value_in_use]) FOR name IN ([min server memory (MB)],
[min memory per query (KB)],
[max server memory (MB)],
[optimize for ad hoc workloads])) p
有没有一种方法可以让我同时拥有这两方面的优势 - 通过一个查询获得所有 SQL 服务器实例的所有信息?
我想避免创建链接服务器。
我不介意使用 powershell 或任何其他工具,只要我不需要以管理员身份运行它。
我正在尝试将msdb 作业消息转换为 xml。
我正在使用Ola Hallengren 备份程序。
当我运行以下例程时,它运行惊人并转换所有内容。
现在,如果我将数字 3333 更改为 3702,则会失败。
我无法识别消息中字符 3701 后面的内容,但这阻碍了我将完整消息转换为 xml
如果您使用Ola,您可以在自己的系统上进行测试。如果您知道如何更改我的函数以便我可以成功地将 nvarchar(max) 或varchar(max)转换 为 xml ,请告诉我。
create or alter FUNCTION dbo.fnCleanString (@InputString VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @CleanedString VARCHAR(MAX) = '';
DECLARE @Char VARCHAR(1);
DECLARE @Index INT = 1;
DECLARE @Len INT = 3333-- LEN(@InputString);
WHILE @Index <= @Len
BEGIN
SET @Char = SUBSTRING(@InputString, @Index, 1);
IF (ASCII(@Char) NOT BETWEEN 0 AND 31 OR ASCII(@Char) IN (9, 10, 13))
BEGIN
SET @CleanedString += @Char;
END
SET @Index += 1;
END
RETURN @CleanedString;
END
go
SELECT TOP 50
SysJobs.name,
SysJobs.enabled,
Job.message AS Message_Text,
TRY_CAST(
(SELECT dbo.fnCleanString(Job.message) AS [text()]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') AS XML
) AS Message_XML
FROM msdb.dbo.sysjobhistory Job WITH (NOLOCK)
INNER JOIN msdb.dbo.sysjobs SysJobs WITH (NOLOCK)
ON Job.job_id = SysJobs.job_id
WHERE SysJobs.name = 'DatabaseBackup - USER_DATABASES - FULL'
ORDER BY Job.instance_id DESC;
我正在将数据库恢复到事务和合并复制的每一端。基本上,发布者和订阅者最初是同一个数据库。
我仍然需要运行快照代理才能开始工作。
我的意思是,如何在不运行 bcp 命令的情况下运行快照,而不复制数据?
不过,我同意复制数据结构。
如何找到我实际可以连接的数据库列表?
我正在使用sys.master_files检查数据库文件的状态,但是,在辅助数据库上,数据库正在同步并且显示为在线
我不能做到这一点:
use my_database
我不能这样做:
select * from my_database.sys.master_files
消息 976,级别 14,状态 1,第 364 行 目标数据库“my_database”正在参与可用性组,当前无法访问查询。数据移动已暂停,或者可用性副本未启用读取访问。要允许对此数据库和可用性组中的其他数据库进行只读访问,请启用对该组中的一个或多个辅助可用性副本的读取访问权限。有关详细信息,请参阅 SQL Server 联机丛书中的 ALTER AVAILABILITY GROUP 语句。
我正在使用sqlwatch来监视我的一些服务器,它有一个从名为 的表中批量删除的作业dbo.sqlwatch_logger_snapshot_header
我遇到了很多锁定和阻塞问题,因为该表由不同的进程使用,然后我禁用了所有其他作业,但处理该表的作业除外。
我使用以下脚本禁用所有其他 sqlwatch 作业:
use distribution
set nocount on
set transaction isolation level read uncommitted
declare @Job_id uniqueidentifier
declare @job_name varchar(300)
declare @category_name varchar(300)
declare @body varchar(max)
declare @flag tinyint
declare @enabled bit = 0; --0 - disable 1-enable
declare @subject varchar(300) = case when @enabled = 0 then 'Disabling sqlwatch jobs on' + @@servername else 'Enabling sqlwatch jobs on' + @@servername end;
declare @job_enabled bit;
set @flag = 0
set @body = 'The following jobs are going to be ' +
case when @enabled = 0 then 'Disabled' else 'Enabled' end
+ ' : '+char(10)+Char(13)
IF OBJECT_ID('tempdb.[dbo].[#LogReaderAgents]') IS NOT NULL
DROP TABLE [dbo].[#LogReaderAgents]
CREATE TABLE [dbo].[#LogReaderAgents] (
[job_id] UNIQUEIDENTIFIER NOT NULL,
[job_name] SYSNAME NOT NULL,
[category_name] SYSNAME NOT NULL,
[enabled] TINYINT NOT NULL)
INSERT INTO [dbo].[#LogReaderAgents] ([job_id],[job_name],[category_name],[enabled])
select job_id, job_name = sj.name, category_name=sc.name, sj.enabled
from msdb.dbo.sysjobs sj
inner join msdb.dbo.syscategories sc
on sj.category_id = sc.category_id
where 1=1
and sj.name like 'SQLWATCH%'
-- and sc.category_id in (10,13)
and sj.name not in ('SQLWATCH-INTERNAL-RETENTION')
-- exec sp_gettabledef 'dbo.#LogReaderAgents'
-- exec sp_GetInsertList 'TEMPDB','DBO.#LogReaderAgents'
DECLARE c1 CURSOR FOR
SELECT Job_id,job_name, category_name, [enabled]
FROM #LogReaderAgents
OPEN c1
FETCH NEXT FROM c1
INTO @Job_id,@job_name,@category_name,@job_enabled
WHILE @@FETCH_STATUS = 0
begin
if (select top (1) stop_execution_date from msdb.dbo.sysjobactivity ja
where Job_ID = @Job_id
and
ja.start_execution_date IS NOT NULL
order by Start_execution_date desc) is not NULL
begin
set @flag = 1
Print @job_name +' is ' + case when @job_enabled=1 then 'Enabled' else 'disabled' end
exec msdb..sp_update_job @job_id = @job_id, @enabled = @enabled
set @Body = @Body + char(10)+char(13) + @job_name + ' -- ' + @category_name +' is ' + case when @job_enabled=1 then 'Enabled' else 'disabled' end
end
FETCH NEXT FROM c1
INTO @Job_id,@job_name,@category_name,@job_enabled
end
CLOSE c1
DEALLOCATE c1
但是,此后作业仍在运行,但我没有看到该表中的记录数量有任何变化。
这是执行过程并批量删除的作业:
现在有3690万
所以基本上它正在工作,所以一切都很好。
现在我的问题是:
假设我因任何原因不得不停止这份工作
这是批量删除,如果我现在必须停止这项工作,有多少行受到影响,回滚尚未提交的内容的成本有多大?
通常,当数据库在线时,我使用以下查询并获取每个文件内有多少可用空间:
SELECT CONVERT (decimal(12,2) ,
(CONVERT(decimal(12,2), size)/128)/1024.00)
- CONVERT(decimal(12,2),
ROUND(fileproperty(a.name,'SpaceUsed')/128.000,2)/1024.00) as [FREESPACE GB],
*
FROM sys.database_files a WITH(NOLOCK)
您需要位于要查看的数据库中。
但是,当数据库离线时如何做到这一点呢?
我还没有找到办法。
我正在尝试这个,但没有成功:
select object_name,counter_name,instance_name,cntr_value,
case cntr_type
when 65792 then 'Absolute Meaning'
when 65536 then 'Absolute Meaning'
when 272696576 then 'Per Second counter and is Cumulative in Nature'
when 1073874176 then 'Bulk Counter. To get correct value, this value needs to be divided by Base Counter value'
when 537003264 then 'Bulk Counter. To get correct value, this value needs to be divided by Base Counter value'
else 'I don"t know'
end as counter_comments
from sys.dm_os_performance_counters with(nolock)
where cntr_type not in (1073939712)
and counter_name in ('Data File(s) Size (KB) ',
'Database pages ')
有没有办法找出脱机数据库文件内的可用空间?
我有一个查询,显示 sql server 使用了多少内存,最大内存和最小内存、cpu 等设置。
这是查询:
--============================================================
--checking current memory settings and usage
--marcelo miorelli
--16-feb-2014
--============================================================
SELECT R.[instance],
R.[Logical CPU Count],
R. [Hyperthread Ratio],
R.[Physical CPU Count],
R.[Physical Memory (GB)],
k.[Max server memory (GB)],
FOO.Memory_usedby_Sqlserver_MB,
FOO.Locked_pages_used_Sqlserver_MB,
k.[Min server memory (GB)],
k.[optimize for ad hoc workloads],
R.affinity_type_desc,
FOO.process_physical_memory_low,
FOO.process_virtual_memory_low,
R.virtual_machine_type_desc,
R.sqlserver_start_time
FROM (
SELECT [instance]=@@servername,
cpu_count AS [Logical CPU Count],
hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count],
CONVERT(decimal(12,2),physical_memory_kb/1024.00/1024.00) AS [Physical Memory (GB)],
affinity_type_desc,
virtual_machine_type_desc,
sqlserver_start_time
FROM sys.dm_os_sys_info WITH (NOLOCK)
) R
INNER JOIN (
SELECT [instance] = @@servername,
[Max server memory (GB)] = CONVERT(decimal(12,2),CAST(p.[max server memory (MB)] AS DECIMAL(12,2))/1024.00),
[Min server memory (GB)] = CONVERT(decimal(12,2),CAST(P.[min server memory (MB)] AS DECIMAL(12,2))/1024.00),
[min memory per query (MB)]= CONVERT(decimal(12,2),CAST(P.[min memory per query (KB)] AS DECIMAL(12,2))/1024.00),
p.[optimize for ad hoc workloads]
FROM ( SELECT name, [value_in_use]
FROM sys.configurations) t
PIVOT (MAX([value_in_use])
FOR name IN (
[min server memory (MB)],
[min memory per query (KB)],
[max server memory (MB)],
[optimize for ad hoc workloads]
)) p
) K
ON R.instance = K.instance
INNER JOIN (
SELECT [instance] = @@servername,
CONVERT(decimal(12,2),CAST(physical_memory_in_use_kb AS DECIMAL(12,2))/1024.00) AS Memory_usedby_Sqlserver_MB,
CONVERT(decimal(12,2),CAST(locked_page_allocations_kb AS DECIMAL(12,2))/1024.00) AS Locked_pages_used_Sqlserver_MB,
CONVERT(decimal(18,2),CAST(total_virtual_address_space_kb AS DECIMAL(18,2))/1024.00/1024.00) AS Total_VAS_in_GB,
process_physical_memory_low,
process_virtual_memory_low
FROM sys.dm_os_process_memory t
) FOO
ON R.instance = foo.instance
OPTION (RECOMPILE);
这个查询给了我这个 - 目前在一个不繁忙的开发服务器上:
physical_memory_in_use_kb
我的问题与locked_page_allocations_kb
dmv相关sys.dm_os_process_memory
。
我如何找到该内存中保存的对象或任何 sql server?
我可以看到,在我的例子中,最小内存设置为 2 Gb,但使用的内存超过 5 Gb。
可能我实际上不需要知道,因为目前可能没有内存压力,但仍然有办法找出 sql server 在内存中保存了什么?
在将 1.8 TB 大型数据库恢复到另一台服务器时,当恢复完成大约 90% 时,我遇到了此错误消息:
90%已处理完毕。
消息 3013,级别 16,状态 1,第 52 行
RESTORE DATABASE 异常终止。
消息 1204,级别 19,状态 4,第 52 行
SQL Server 数据库引擎实例此时无法获取 LOCK 资源。当活跃用户较少时重新运行您的语句。要求数据库管理员检查该实例的锁和内存配置,或者检查长时间运行的事务。
SELECT [instance]=@@servername,[setting name]=name, value, value_in_use, [description]
FROM sys.configurations
where name in ('min server memory (MB)',
'min memory per query (KB)',
'max server memory (MB)',
'optimize for ad hoc workloads')
SELECT [instance]=@@servername,
cpu_count AS [Logical CPU Count],
hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count],
CONVERT(decimal(12,2),physical_memory_kb/1024.00/1024.00) AS [Physical Memory (GB)],
affinity_type_desc,
virtual_machine_type_desc,
sqlserver_start_time
FROM sys.dm_os_sys_info WITH (NOLOCK)
用它来检查sql错误日志,我找不到任何明确的迹象表明上述原因。
EXEC xp_readerrorlog 1
这是我发现的:
Using dynamic lock allocation. Initial allocation of 2500 Lock blocks and 5000 Lock Owner blocks per node. This is an informational message only. No user action is required.
Node configuration: node 0: CPU mask: 0x000000000000000f:0 Active CPU mask: 0x000000000000000f:0. This message provides a description of the NUMA configuration for this computer. This is an informational message only. No user action is required.
怎样做才能让我的恢复彻底进行而不是中途停止?
我刚刚要求基础设施向 sql server 盒子添加内存,现在总内存为 16Gb
我已将sql server中的最大内存设置为12GB。
当我运行下面的内存查询时:
SELECT [ServerName]=@@servername,
[Setting Name]=name,
value,
value_in_use,
[Value (GB)]=CONVERT(decimal(12,2),CONVERT(decimal(12,2), value_in_use)/1024.00),
[description]
FROM master.sys.configurations with(nolock)
WHERE name like '%server memory%'
ORDER BY name OPTION (RECOMPILE);
--Msg 260, Level 16, State 3, Line 12
--Disallowed implicit conversion from data type sql_variant to data type numeric,
--table 'master.sys.configurations', column 'value_in_use'.
--Use the CONVERT function to run this query.
SELECT
CONVERT(decimal(12,2),physical_memory_in_use_kb/1024.00/1024.00 ) AS sql_physical_memory_in_use_GB,
CONVERT(decimal(12,2),large_page_allocations_kb/1024.00/1024.00) AS sql_large_page_allocations_GB,
CONVERT(decimal(12,2),locked_page_allocations_kb/1024.00/1024.00) AS sql_locked_page_allocations_GB,
CONVERT(decimal(12,2),virtual_address_space_reserved_kb/1024.00/1024.00) AS sql_VAS_reserved_GB,
CONVERT(decimal(12,2),virtual_address_space_committed_kb/1024.00/1024.00) AS sql_VAS_committed_GB,
CONVERT(decimal(12,2),virtual_address_space_available_kb/1024.00/1024.00) AS sql_VAS_available_GB,
REPLACE(CONVERT(VARCHAR(50),CAST(page_fault_count AS MONEY),1), '.00','') AS page_fault_count,
memory_utilization_percentage AS sql_memory_utilization_percentage,
CASE WHEN process_physical_memory_low = 1 THEN 'Yes' ELSE 'No' END AS sql_process_physical_memory_low,
CASE WHEN process_virtual_memory_low = 1 THEN 'Yes' ELSE 'No' END AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;
SELECT CONVERT(decimal(12,2),committed_kb/1024.00/1024.00 ) AS [SQL Server Committed Memory in GB],
CONVERT(decimal(12,2),committed_target_kb/1024.00/1024.00 ) AS [SQL Server Target Committed Memory in GB],
CONVERT(decimal(12,2),physical_memory_kb/1024.00/1024.00 ) AS [Server Physical Memory in GB],
sql_memory_model_desc
FROM sys.dm_os_sys_info;
我明白了:
问题:
为什么sql server内存不是12GB?
我刚刚恢复了一个数据库,但后来我注意到 create_date 仍然是恢复前的日期。
有没有办法可以将 create_date 更改为新数据库(恢复后)?
这是脚本:
USE [master]
RESTORE DATABASE [SUPT_S01_Radhe]
FROM DISK = N'\\krishna3.radhe.co.uk\support\MM_Backups\S01__JagannathaeCA_12122023.bak'
WITH FILE = 1,
MOVE N'radhe_Data' TO N'Y:\DATA\SUPT_S01_radhe_shyam_Data.mdf',
MOVE N'radhe_ChangeLog' TO N'W\:\DATA\SUPT_S01_radhe_shyam_ChangeLog.ndf',
MOVE N'radhe_Docs' TO N'Z:\DATA\SUPT_S01_radhe_shyame_Docs.ndf',
MOVE N'radhe_Log' TO N'P:\LOGS\SUPT_S01_radhe_shyam_Log.ldf',
NOUNLOAD, REPLACE, STATS = 1
select name, database_id, create_date from sys.databases d
where d.database_id in (1,2,3,4,8)
我有一个无法杀死的顽固 spid,它阻止了我的 tempdb的事务日志被截断
这就是我发现这个流氓 spid 的方法:
if object_id('tempdb..#OpenTranStatus','U') is not null
drop table #OpenTranStatus
CREATE TABLE #OpenTranStatus (
ActiveTransaction varchar(25),
Details sql_variant
);
-- Execute the command, putting the results in the table.
INSERT INTO #OpenTranStatus
EXEC ('DBCC OPENTRAN (sqlwatch) with tableresults')
SELECT * FROM #OpenTranStatus
这是它正在运行(或保留)的查询:
select d.database_id , sd.sqlwatch_database_id, sd.sql_instance
into #d
from dbo.vw_sqlwatch_sys_databases d
inner join [dbo].[sqlwatch_meta_database] sd
on sd.[database_name] = d.[name] collate database_default
and sd.[database_create_date] = case when d.name = 'tempdb' then '1970-01-01 00:00:00.000' else d.[create_date] end
and sd.sql_instance = @sql_instance
left join [dbo].[sqlwatch_config_exclude_database] ed
on d.[name] like ed.database_name_pattern collate database_default
and ed.snapshot_type_id = @snapshot_type_id
where ed.snapshot_type_id is null
option (keep plan)
它已经运行了60 多个小时:
它已经被杀死了。
所以我尝试做的事情:
alter database sqlwatch set single_user with rollback immediate
但没用
kill 54 with statusonly
SPID 54:正在进行事务回滚。预计回滚完成:0%。预计剩余时间:0 秒。
问题:
我怎样才能停止spid54?
我正在恢复一个数据库,这个数据库非常大,它有 6 个备份文件(意味着备份被分成 6 个较小的文件)我可以使用恢复标签看到指示
MediaFamilyId uniqueidentifier 媒体系列的唯一标识号。
MediaSequenceNumber int 该媒体在媒体系列中的序列号。
这是恢复命令:
restore filelistonly
FROM DISK = '\\MY_BACKUP_SERVER\SQLBackups\MY_SERVER\MY_DATABASE\FULL\MY_SERVER_MY_DATABASE_FULL_20231215_180002_6.bak'
restore labelonly
FROM DISK = '\\MY_BACKUP_SERVER\SQLBackups\MY_SERVER\MY_DATABASE\FULL\MY_SERVER_MY_DATABASE_FULL_20231215_180002_6.bak'
restore headeronly
FROM DISK = '\\MY_BACKUP_SERVER\SQLBackups\MY_SERVER\MY_DATABASE\FULL\MY_SERVER_MY_DATABASE_FULL_20231215_180002_6.bak'
我的问题是,如何在 msdb 中找到(在本例中为 6 个)文件?
基本上是一个查询来获取这 6 个文件 - 最后的完整备份 - 恢复这 (6) 个文件。
我使用复制监视器进行了查看,它向我显示了正在等待复制的命令:
我的问题是 - 我如何找出这些命令是什么?
我已经尝试过本·安德森的这个查询
select @@Servername,a.publication + ':' + s.srvname as [Agent],
v.undelivcmdsindistdb,
v.delivcmdsindistdb,
a.id
from distribution.dbo.msdistribution_status v
join distribution.dbo.msdistribution_agents a on v.agent_id = a.id
join master.dbo.sysservers s on a.subscriber_id = s.srvid
where v.undelivcmdsindistdb > 0
但数字并不完全匹配,尽管这绝对是一个好的开始,有没有办法我可以找到有关这些记录的更多信息?