O que é o sinalizador de rastreamento 1605 no SQL Server 2008 R2? Não consegui encontrar nenhuma documentação sobre isso até agora.
Craig Efrein's questions
SQL Server 2016 Enterprise, CU15 + GDR.
O cliente recentemente começou a usar o OPCON em produção e notei que quando o OPCON cria jobs, ele não adiciona o Local Server como destino. Isso impede que o trabalho seja executado.
Existe alguma maneira de determinar se um trabalho específico não possui nenhum servidor de destino definido como é o caso acima?
Obrigado,
Craig
Usando a classe QueryTableXEventData no Powershell, sou capaz de analisar centenas de arquivos XEL muito rapidamente e exportar seu conteúdo para uma tabela no SQL Server usando SQLBulkCopy
Exemplo:
$events = new-object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData
("\\some_file_path\XELog_Files*.xel")
Eu não vejo uma propriedade File no array $fields.
$event | Select-Object -ExpandProperty Fields
is_cached System.Boolean True
is_recovered System.Boolean False
is_dac System.Boolean False
database_id System.UInt32 73
packet_size System.UInt32 8000
options System.Byte[] {32, 0, 0, 40...}
options_text System.String
database_name System.String
Ou em $eventos
Name : login
UUID : 13e22e12-3cb8-49bf-a3e1-131faa95601c
Package : Microsoft.SqlServer.XEvent.Linq.Internal.XEventInteropPackage
Metadata : Microsoft.SqlServer.XEvent.Linq.Internal.XEventInteropEventMetadata
Timestamp : 18/08/2020 03:41:37 +00:00
Fields : {is_cached, is_recovered, is_dac, database_id...}
Actions : {server_instance_name, database_name, database_id, client_hostname...}
Location : Microsoft.SqlServer.XEvent.Linq.EventLocator
Existe uma propriedade que eu possa usar em SQLBulkCopy ou QueryTableXEventData que tenha o nome do arquivo que está sendo lido ou exportado?
SQL Server 2016 SP1 + CU8 Instalado no Windows Server 2016 Standard Edition.
Tudo estava funcionando bem por um tempo e eu consegui criar bancos de dados até que, por algum motivo sem que eu soubesse, um problema de permissões apareceu nos meus volumes montados.
Msg 5123, Level 16, State 1, Line 1
CREATE FILE encountered operating system error 5(Access is denied.)
while attempting to open or create the physical file
'D:\MSSQL13.MSSQLSERVER\MSSQL\Data\UserDB\test.mdf'.
Msg 1802, Level 16, State 4, Line 1
CREATE DATABASE failed. Some file names listed could not be created.
Check related errors.
A pasta D:\MSSQL13.MSSQLSERVER\MSSQL\Data\UserDB é na verdade um volume montado como uma pasta dentro do diretório D:\MSSQL13.MSSQLSERVER\MSSQL\Data.
Eu pesquisei por horas e todos os links continuaram falando sobre propriedade e icacls e takecontrol, mas esse não é o problema aqui. Quero deixar claro que a conta de serviço que executa o SQL Server nesta instância tem CONTROLE TOTAL sobre este volume montado e o que está acima dele também.
Verifiquei o Acesso Efetivo para a conta de serviço e ela concedeu explicitamente o controle TOTAL.
Minha suspeita é que tenha algo a ver com a concessão de permissões para uma pasta montada como um volume em vez de um disco. Isso porque em meus testes, consigo criar um banco de dados com seus arquivos na raiz de D:\ sem problemas. D:\ também é um volume que usa o mesmo tipo de armazenamento.
Além disso, meu próprio usuário tem controle total, mas quando tento criar um arquivo, recebo esse aviso.
Curiosamente, posso adicionar uma pasta à pasta/volume do UserDB sem dificuldade.
Como faço para que este volume, montado como uma pasta na unidade D:\ seja gravável para a conta MSSQL?
Estou usando sp_help_revlogin há muito tempo para transferir entidades de servidor de uma instância SQL para outra.
Existe um equivalente sp_help_revlogin que pode gerar scripts de criação para usuários de banco de dados parcialmente independentes? Entendo que, se eu fizer backup/restaurar o usuário independente, mas preciso implantar usuários de um banco de dados independente para outro banco de dados independente diferente.
Alguém tem um script TSQL que possa gerar automaticamente o código necessário para anexar TODOS os bancos de dados de usuários existentes usando a sintaxe CREATE DATABASE FOR ATTACH ?
exemplo:
CREATE DATABASE [mydatabase] ON
(FILENAME=N'E:\MSSQL\Data\mydatabase.mdf'),
(FILENAME=N'D:\MSSQL.1\MSSQL\Data\mydatabase_log.ldf'),
(FILENAME=N'E:\MSSQL\Data\mydatabase_ndf.ndf')
FOR ATTACH
Encontrei muitos exemplos usando sp_attach_db, mas nenhum com a sintaxe CREATE DATABASE FOR ATTACH.
Obrigado,
Craig
Encontrei um problema ontem ao tentar criar a primeira tabela memory_optimized em um SQL Server 2016 SP1 Enterprise Edition.
Eu criei o banco de dados e o grupo de arquivos assim
CREATE DATABASE imoltp -- Transact-SQL
CONTAINMENT = NONE
ON PRIMARY
(
NAME = N'imoltp',
FILENAME = N'F:\UNREFRESHED_DB\imoltp.mdf' ,
SIZE = 5120KB ,
FILEGROWTH = 1024KB
)
LOG ON
(
NAME = N'imoltp_log',
FILENAME = N'F:\UNREFRESHED_DB\imoltp_log.ldf' ,
SIZE = 2048KB , FILEGROWTH = 10%
)
GO
ALTER DATABASE imoltp ADD FILEGROUP [imoltp_mod]
CONTAINS MEMORY_OPTIMIZED_DATA;
ALTER DATABASE imoltp ADD FILE
(name = [imoltp_dir], filename= 'F:\UNREFRESHED_DB\imoltp_dir')
TO FILEGROUP imoltp_mod;
go
Então eu criei a tabela
USE imoltp
GO
CREATE TABLE imoltp.[dbo].[T1] (
[TempID] INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),
[object_ids] NVARCHAR(255) NOT NULL,
[names] NVARCHAR(255) NOT NULL,
[comment] NVARCHAR(50)
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_ONLY);
GO
O que resulta neste erro:
Msg 41334, Level 16, State 0, Line 8 O diretório de geração de código não pode ser criado ou configurado corretamente.
Finalmente descobri que o SQL estava tentando criar um diretório (XTP) no local do banco de dados padrão definido nas propriedades do servidor que não existia mais nessa situação. Este diretório é onde ele deseja armazenar os arquivos dll necessários na memória.
https://blogs.msdn.microsoft.com/bobsql/2016/08/23/create-table-disk-vs-in-memory-optimized/
Então minhas perguntas são essas.
Existe uma maneira de definir onde o diretório XTP será criado na sintaxe CREATE TABLE ou em outro lugar?
Obrigado, Craig
No MySQL 5.5 rodando no Ubuntu 14 em uma configuração mestre-mestre-escravo
De um dos mestres, ao executar a consulta abaixo como usuário com (TODOS OS PRIVILÉGIOS) no banco de dados mas sem nenhum outro privilégio em outro lugar, esta consulta retorna 0
SELECT COUNT(1) SlaveThreadCount
FROM information_schema.processlist
WHERE user='system user'
Ao executar o mesmo usuário como root, IE (TODOS OS PRIVILÉGIOS) em tudo, recebo de volta a contagem real de escravos.
Algum motivo específico para o retorno de 0 e não o SlaveThreadCount real, que é 2 neste caso?
Isso é uma questão de privilégios?
Se eu executar a consulta sem haver WHERE no usuário não raiz, vejo apenas meus processos.
SELECT * FROM information_schema.processlist
Se eu executá-lo em um usuário root, vejo todos os processos.
Definitivamente, é um problema de permissão, então parece que preciso de PROCESS, acabei de responder minha própria pergunta.
Recentemente, atualizamos muitas de nossas instâncias para 2016. Como resultado, uma instrução SELECT de sqlpackage.exe está expirando em algumas instâncias.
Depois de alguns testes, descobri que ao atualizar as estatísticas nas tabelas do sistema do banco de dados que aparecem no plano de execução, o SELECT parou de atingir o tempo limite.
update statistics sys.[sysclsobjs] with fullscan
update statistics sys.[syscolpars] with fullscan
update statistics sys.[sysidxstats] with fullscan
update statistics sys.[sysiscols] with fullscan
update statistics sys.[sysobjvalues] with fullscan
Existe alguma maneira através dos pacotes de manutenção padrão, scripts de Ola Hallengren ou algum outro processo para atualizar apenas as estatísticas da tabela do sistema?
Atualização 08/01
Aqui estão as etapas que segui após a atualização
Sobre o traceflag 4199 KB974006
-- for the instance
/*
Turn on traceflag 4199 (my understanding of this traceflag is that it disables
optimizer hotfixes in 2016
*/
-- disable automatic numa
sp_configure 'automatic soft-NUMA disabled', 1
GO
-- For each database
-- Turn on Query optimizer hotfixes
-- Turn off Legacy cardinality estimation
exec sp_MSforeachDB 'ALTER DATABASE [?] SET COMPATIBILITY_LEVEL = 130;
USE [?];
ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = ON;
ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = OFF;
-- update statistics for all tables, system tables are ignored
EXEC sp_MSforeachtable ''UPDATE STATISTICS [?] WITH FULLSCAN''
'
Atualização 08/02
Aqui está o SELECT do sqlpackage.exe causando timeouts para o TFS
SELECT * FROM (
SELECT
SCHEMA_NAME([o].[schema_id]) AS [SchemaName],
[si].[object_id] AS [ColumnSourceId],
[o].[name] AS [ColumnSourceName],
[o].[type] AS [ColumnSourceType],
[ic].[column_id] AS [ColumnId],
[c].[name] AS [ColumnName],
[si].[index_id] AS [IndexId],
[si].[name] AS [IndexName],
[ds].[type] AS [DataspaceType],
[ds].[data_space_id] AS [DataspaceId],
[ds].[name] AS [DataspaceName],
[si].[fill_factor] AS [FillFactor],
[si].[is_padded] AS [IsPadded],
[si].[is_disabled] AS [IsDisabled],
[si].[allow_page_locks] AS [DoAllowPageLocks],
[si].[allow_row_locks] AS [DoAllowRowLocks],
[sit].[cells_per_object] AS [CellsPerObject],
[sit].[bounding_box_xmin] AS [XMin],
[sit].[bounding_box_xmax] AS [XMax],
[sit].[bounding_box_ymin] AS [YMin],
[sit].[bounding_box_ymax] AS [YMax],
[sit].[level_1_grid] AS [Level1Grid],
[sit].[level_2_grid] AS [Level2Grid],
[sit].[level_3_grid] AS [Level3Grid],
[sit].[level_4_grid] AS [Level4Grid],
[sit].[tessellation_scheme] AS [TessellationScheme],
[s].[no_recompute] AS [NoRecomputeStatistics],
[p].[data_compression] AS [DataCompressionId],
CONVERT(bit, CASE WHEN [ti].[data_space_id] = [ds].[data_space_id] THEN 1 ELSE 0 END)
AS [EqualsParentDataSpace]
FROM
[sys].[spatial_indexes] AS [si] WITH (NOLOCK)
INNER JOIN [sys].[objects] AS [o] WITH (NOLOCK) ON [si].[object_id] = [o].[object_id]
INNER JOIN [sys].[spatial_index_tessellations] [sit] WITH (NOLOCK) ON [si].[object_id] = [sit].[object_id] AND [si].[index_id] = [sit].[index_id]
INNER JOIN [sys].[data_spaces] AS [ds] WITH (NOLOCK) ON [ds].[data_space_id] = [si].[data_space_id]
INNER JOIN [sys].[index_columns] AS [ic] WITH (NOLOCK) ON [si].[object_id] = [ic].[object_id] AND [si].[index_id] = [ic].[index_id]
INNER JOIN [sys].[columns] AS [c] WITH (NOLOCK) ON [si].[object_id] = [c].[object_id] AND [ic].[column_id] = [c].[column_id]
INNER JOIN [sys].[objects] AS [o2] WITH (NOLOCK) ON [o2].[parent_object_id] = [si].[object_id]
INNER JOIN [sys].[stats] AS [s] WITH (NOLOCK) ON [o2].[object_id] = [s].[object_id] AND [s].[name] = [si].[name]
INNER JOIN [sys].[partitions] AS [p] WITH (NOLOCK) ON [p].[object_id] = [o2].[object_id] AND [p].[partition_number] = 1
LEFT JOIN [sys].[indexes] AS [ti] WITH (NOLOCK) ON [o].[object_id] = [ti].[object_id]
LEFT JOIN [sys].[tables] AS [t] WITH (NOLOCK) ON [t].[object_id] = [si].[object_id]
WHERE [si].[is_hypothetical] = 0
AND [ti].[index_id] < 2
AND OBJECTPROPERTY([o].[object_id], N'IsSystemTable') = 0
AND ([t].[is_filetable] = 0 OR [t].[is_filetable] IS NULL)
AND ([o].[is_ms_shipped] = 0 AND NOT EXISTS (SELECT *
FROM [sys].[extended_properties]
WHERE [major_id] = [o].[object_id]
AND [minor_id] = 0
AND [class] = 1
AND [name] = N'microsoft_database_tools_support'
))
) AS [_results]
Se eu não atualizar as estatísticas da tabela do sistema para o banco de dados, este SELECT pode e irá expirar ao implantar via sqlpackage.exe
Em um servidor Windows 2012 R2 em cluster com SQL Server 2014 Enterprise.
Acabei de atualizar uma instância de 2014 SP1 CU4 para 2016 RTM e agora recebo este erro ao tentar iniciar o SQL Server Agent.
LOG DO AGENTE DO SQL SERVER
2016-06-06 11:53:58 - ? [100] Microsoft SQLServerAgent version 13.0.1601.5 (X64 unicode retail build) : Process ID 10884
2016-06-06 11:53:58 - ? [495] The SQL Server Agent startup service account is DOMAIN\USERNAME.
2016-06-06 11:54:28 - ! [150] SQL Server does not accept the connection (error: 65535). Waiting for Sql Server to allow connections. Operation attempted was: Verify Connection On Start.
2016-06-06 11:54:28 - ! [000] Unable to connect to server 'SERVERNAME\INSTANCENAME'; SQLServerAgent cannot start
2016-06-06 11:54:33 - ! [298] SQLServer Error: 65535, SQL Server Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF]. [SQLSTATE 08001]
2016-06-06 11:54:33 - ! [165] ODBC Error: 0, Login timeout expired [SQLSTATE HYT00]
2016-06-06 11:54:33 - ! [298] SQLServer Error: 65535, A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online. [SQLSTATE 08001]
2016-06-06 11:54:33 - ! [382] Logon to server 'SERVERNAME\INSTANCENAME' failed (DisableAgentXPs)
2016-06-06 11:54:33 - ? [098] SQLServerAgent terminated (normally)
Log de aplicativos do Windows
SQLServerAgent could not be started (reason: Unable to connect to server 'A08SQL-EDI\EDI'; SQLServerAgent cannot start).
O agente é iniciado e executado por cerca de 30 segundos e, em seguida, morre com o erro acima. Alguém se deparou com esse problema? E você sabe como resolver isso?
Em uma instância do SQL Server 2014 com RAM suficiente e discos rápidos, existem mais de 160 usuários com acesso a um banco de dados. Por algum motivo desconhecido para mim, a execução do comando DROP USER [username]
neste banco de dados leva até 5 segundos por usuário.
Remapear usuários para logins e restaurar suas permissões é muito rápido.
No contexto de atualização dos bancos de dados DEV da produção, tenho que descartar e recriar todos os usuários do banco de dados. Portanto, é necessário descartar os usuários do banco de dados e recriá-los.
Como faço para acelerar o DROP USER
comando?
Lembre-se, tenho que executá-lo 160 vezes para a instância sobre a qual estou escrevendo.
Este é o SQL que estou usando:
DECLARE drop_user_cur CURSOR FOR
SELECT name FROM #drop_users
OPEN drop_user_cur
FETCH NEXT FROM drop_user_cur INTO @user
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'use [' + @db_name + '] DROP USER [' + @user + ']'
BEGIN TRY
print @sql
EXECUTE(@sql)
END TRY
BEGIN CATCH
print 'ERREUR : ' + @sql
END CATCH
FETCH NEXT FROM drop_user_cur INTO @user
END
CLOSE drop_user_cur
DEALLOCATE drop_user_cur
O problema não está vindo do cursor; é o real DROP USER
que está demorando até 5 segundos.
Usando sp_whoisactive
, o wait_type é NULL
.
Não preste atenção à duração, o DROP
e CREATE USER
estava sendo executado em um WHILE
loop, e é por isso que está dizendo mais de um minuto.
O Profiler mostra mais de 125.000 leituras para executar DROP USER
.
O Service Broker não está ativado.
Tentando restaurar um pequeno backup do Azure BLOB
RESTORE DATABASE MY_DATABASE FROM URL = 'https://somelocation.blob.core.windows.net/mydatabase.bak'
WITH FILE=1
,MOVE N'MY_DATABASE'TO N'D:\DATA\MY_DATABASE.mdf'
,MOVE N'MY_DATABASE_log'TO N'D:\LOG\MY_DATABASE_log.ldf'
,NOUNLOAD, REPLACE, STATS = 2, CREDENTIAL = 'somecredential'
E em algum lugar em cerca de 98%, a restauração simplesmente morre
86 percent processed.
88 percent processed.
90 percent processed.
92 percent processed.
94 percent processed.
96 percent processed.
98 percent processed.
Msg 3013, Level 16, State 1, Line 8
RESTORE DATABASE is terminating abnormally.
Aqui está a saída do log com os sinalizadores de rastreamento ativados
2016-01-08 08:59:52.780 spid63 RestoreDatabase: Database MY_DATABASE
2016-01-08 08:59:52.790 spid63 Opening backup set
2016-01-08 08:59:52.790 spid63 VDI: "C:\Program Files\Microsoft SQL Server\MSSQL12.DATA\MSSQL\Binn\BackupToUrl.exe" "r" "p" "680074007400700073003A002F002F006B0039003900730074006F003000300032002E0062006C006F0062002E0063006F00720065002E00770069006E0064006F00770073002E006E00650074002F006B0030003100730071006C002D0063006C0075002D0032002F004C005F0043004100540041004C004F0047005F00430044004900530043004F0055004E0054005F004D004900440044004C00450043004D0053005F0032003000310036005F00300031005F00300033005F003000310030003300350038002E00620061006B00" "6B0039003900730074006F00300030003200" "01000000D08C9DDF0115D1118C7A00C04FC297EB010000007D2AFDE19FCC3F4FBB113683EF29D7B5000000001200000061007A007500720065006B0065007900000003660000C000000010000000ED978F2ACEBB06BA73899E4D62DCEED10000000004800000A000000010000000FC5DAF946420975518E0336799E9FA2F48000000A5B7746C13945ABD05048D8CE67E8ACCF4A429616B12B1C1FBAA7B6C0AC4F8466F63644135D0C88F6DBA6D76BB18A550B81C15005FB538B4EA3C109B91549E3DE8872F460703247F14000000EE9427440D53CEEF53072D911D1CF92CA7BC1A2B" "NOFORMAT" "4C005F0043004100540041004C004F004700" "D:\DATA\SYSTEM\MSSQL12.DATA\MSSQL\Log" "DB" "54004500530054005F004D004900440044004C00450043004D005300" "NOTRACE"
2016-01-08 08:59:52.790 spid63 BackupToUrl process initiated with PID: 17796, for database name [MY_DATABASE]
2016-01-08 09:00:12.410 spid63 SetTargetRestoreAge: 0
2016-01-08 09:00:12.410 spid63 Restore: Configuration section loaded
2016-01-08 09:00:12.410 spid63 Restore: Backup set is open
2016-01-08 09:00:12.410 spid63 Restore: Planning begins
2016-01-08 09:00:12.440 spid63 Halting FullText crawls on database MY_DATABASE
2016-01-08 09:00:12.440 spid63 Dismounting FullText catalogs
2016-01-08 09:00:12.440 spid63 X-locking database: MY_DATABASE
2016-01-08 09:00:12.440 spid63 Restore: Planning complete
2016-01-08 09:00:12.450 spid63 Restore: BeginRestore (offline) on MY_DATABASE
2016-01-08 09:00:12.760 spid63 Restore: PreparingContainers
2016-01-08 09:00:14.210 spid63 Restore: Containers are ready
2016-01-08 09:00:14.210 spid63 Zeroing D:\DATA\MY_DATABASE_8.ldf from page 1 to 295800 (0x2000 to 0x906f0000)
2016-01-08 09:00:14.260 spid63 Restore: Restoring backup set
2016-01-08 09:00:14.260 spid63 Restore: Transferring data to MY_DATABASE
2016-01-08 09:01:14.370 spid63 Zeroing completed on D:\DATA\MY_DATABASE_8.ldf
2016-01-08 09:01:14.370 spid63 Zeroing D:\DATA\MY_DATABASE_log2.ldf from page 1 to 295800 (0x2000 to 0x906f0000)
2016-01-08 09:01:18.950 spid63 Restore: Waiting for log zero on MY_DATABASE
2016-01-08 09:02:16.370 spid63 Zeroing completed on D:\DATA\MY_DATABASE_log2.ldf
2016-01-08 09:02:16.370 spid63 Zeroing D:\DATA\MY_DATABASE_log3.ldf from page 1 to 295800 (0x2000 to 0x906f0000)
2016-01-08 09:03:15.440 spid63 Zeroing completed on D:\DATA\MY_DATABASE_log3.ldf
2016-01-08 09:03:15.440 spid63 Zeroing D:\DATA\MY_DATABASE_log4.ldf from page 1 to 295800 (0x2000 to 0x906f0000)
2016-01-08 09:04:13.620 spid63 Zeroing completed on D:\DATA\MY_DATABASE_log4.ldf
2016-01-08 09:04:13.620 spid63 Zeroing D:\DATA\MY_DATABASE_log5.ldf from page 1 to 244456 (0x2000 to 0x775d0000)
2016-01-08 09:05:06.270 spid63 Zeroing completed on D:\DATA\MY_DATABASE_log5.ldf
2016-01-08 09:05:06.270 spid63 FileHandleCache: 0 files opened. CacheSize: 14
2016-01-08 09:05:06.480 spid63 Resuming any halted fulltext crawls
Se o backup tivesse sido concluído com sucesso, eu teria visto esta linha logo após a mensagem de rastreamento de texto completo
2016-01-08 08:53:38.720 spid63 Restore: Writing history records
2016-01-08 08:53:38.720 Backup Database was restored: Database: MY_DATABASE_log5, creation date(time): 2014/12/10(22:04:35), first LSN: 71976:92071:1, last LSN: 71976:100304:1, number of dump devices: 1, device information: (FILE=1, TYPE=URL: {'https://somelocation.blob.core.windows.net/MY_DATABASE_2016_01_08_010437.bak'}). Informational message. No user action required.
Quanto à mensagem de erro, encontrei esta
O RESTORE VERIFYONLY é concluído com sucesso.
Outras restaurações de banco de dados do mesmo local foram concluídas com êxito. Uma restauração do mesmo backup localmente no servidor funciona bem. Leva uma eternidade para se recuperar por causa dos > 1000 VLFs.
A única informação nos logs é esta
Processo BackupToUrl iniciado com PID: 4632, para nome do banco de dados [MY_DATABASE]
Por que o banco de dados de restauração está falhando e não restaura a verificação?
Se esse fosse um problema causado por tempos de download muito lentos, haveria um erro de tempo limite em algum lugar?
Agora acredito que o problema está sendo causado pelo alto número de VLFs e que a sessão ainda pode depender de alguma forma da conexão com o armazenamento de blob do Azure.
De um SQL Server 2014 RTM em nosso ambiente DEV, estou executando esta consulta usando um login SQL.
select t.noshipid, y.nofolder
from distantserver.distantdatabase.dbo.sometable t (nolock)
inner join somedatabase.dbo.sometable y (nolock)
on cast(t.nobill as bigint) = y.nobill
where t.type_payment = 'CE'
group by t.noshipid, y.nofolder
servidor distante está em 2008 R2.
eu recebo de volta um erro
Msg 8522, Nível 16, Estado 3, Linha 1 O Microsoft Distributed Transaction Coordinator (MS DTC) interrompeu esta transação.
Se eu executar a mesma consulta no servidor de produção que é 2008 R2, sem erros.
1: O login do SQL em questão possui o acesso necessário.
2: O provedor que está sendo usado para conectar ao servidor 2008 R2 é SQLNCLI10
Perguntas:
1: É possível que a atualização do servidor DEV para 2014 esteja causando esses problemas?
2: Há algum problema conhecido usando um identificador de quatro partes de 2014 a 2008 R2?
from distantserver.distantdatabase.dbo.sometable
em vez de usar openquery
FROM OPENQUERY([distantserver],
pois usando OPENQUERY, a consulta não retorna erros.
3: Há alguma opção sp_configure ou opções de servidor vinculado que preciso configurar por causa de 2014?
Atualização 14:41
se eu adicionar
BEGIN DISTRIBUTED TRANSACTION
no topo, a parte distribuída funciona bem. Só quero enfatizar o fato de que antes da atualização, isso não era necessário.
Eu tenho um trabalho chamado @test_credentials que executa a seguinte consulta
select * from openquery(SERVER2,
'select USER_NAME(),* from openquery(SERVER1,''SELECT USER_NAME() '')')
e envia esses resultados para um arquivo.
Trabalho '@test_credentials': Etapa 1, 'test_credentials': começou a executar 31/08/2015 17:53:45
convidado LinkedServerUser
(1 linha(s) afetada(s))
- As definições de servidor vinculado para ambos
SERVER1
eSERVER2
estão usando o linkedserveruser para efetuar login um no outro (opção de contexto de segurança). - Ambas as definições de servidor vinculado são definidas com as mesmas opções
- A conta de usuário linkedserveruser existe em ambos os servidores e não está desativada de forma alguma.
- A conta de serviço que executa o AGENT é idêntica para
SERVER1
eSERVER2
.
Então minha pergunta é esta:
Por que o SQL Server Agent está fazendo login como convidado no SERVER2 ao executar este trabalho?
Ao executar a seguinte consulta
select value, cast(value as float) float_value
from OPENQUERY([ORACLESERVER],
'select 3/5 as value from table')
Eu estou recebendo o seguinte erro:
Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to float
.
Posso executar essa mesma consulta em outro servidor com o mesmo sistema operacional Windows 2012 R2, o mesmo SQL Server 2008 R2 Server e a mesma versão do cliente Oracle 12.1.0 e obter o resultado correto:
value float_value
.6 0,6
Os servidores vinculados em ambos os servidores são configurados de forma idêntica.
A versão do Oracle Server é
select * from OPENQUERY([ORACLESERVER],'SELECT * FROM V$VERSION')
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for HPUX: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 – Production
Há alguma outra opção de configuração que eu tenha esquecido no SQL Server e/ou no Oracle Client que pode estar causando esses problemas.
Por meio do Failover Cluster Manager, adicionei recentemente um novo disco a um cluster SQL Server 2008 R2 existente, em execução no Windows Server 2012 R2.
Ao tentar criar um banco de dados neste novo armazenamento, recebo o seguinte erro:
Msg 5123, Level 16, State 1, Line 1
CREATE FILE encountered operating system error 5(failed to retrieve text for this error. Reason: 15105) while attempting to open or create the physical file 'J:\DATA\mydatabase.mdf'.
Msg 1802, Level 16, State 4, Line 1
CREATE DATABASE failed. Some file names listed could not be created. Check related errors.
Posso adicionar manualmente um arquivo a J:\data
O novo armazenamento pode ser movido entre nós sem erros
A conta de serviço do SQL Server tem controle total sobre toda a unidade J:\
A conta de serviço do SQL Server tem controle total sobre J:\DATA Aqui está um layout da unidade, você notará que DATA é um volume separado montado dentro de J:\
Alguém pode me ajudar a descobrir por que estou recebendo esse erro?
Atualizar
De James, se eu adicionar um subdiretório aos dados, o comando create database funcionará
CREATE DATABASE [MCO_DB] ON PRIMARY
( NAME = N'MYDATABASE_DB', FILENAME = N'J:\DATA\MYDATABASE\MYDATABASE_DB.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N'MYDATABASE_DB_log', FILENAME = N'J:\TRN\MYDATABASE_DB_1.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO
Pediram-me para identificar um problema de permissões com um procedimento armazenado. Esse procedimento armazenado se comporta de duas maneiras possíveis, dependendo de quais valores são usados para seus parâmetros.
exec ps_my_stored_procedure @a=1, @b=2, @c=3
é tratado de forma muito diferente de
exec ps_my_stored_procedure @a=5, @b=7, @c=0
Você poderia dizer que ps_my_stored_procedure
é dividido logicamente em dois processos completamente separados.
Usando dm_exec_procedure_stats
e dm_exec_query_stats
, posso encontrar o plano de execução que mostra o SQL do procedimento armazenado usado. Não consegui, no entanto, recuperar como os parâmetros foram definidos e com quais valores.
É possível usar dm_exec_procedure_stats
e dm_exec_query_stats
quaisquer outras visualizações de gerenciamento para reconstruir a execução do procedimento armazenado que mostra os valores usados para seus parâmetros.
O que eu realmente gostaria é de encontrar no cache, é a execução real do procedimento armazenado para que eu possa executá-lo como está usando EXECUTE AS LOGIN = 'someone'
para resolver os problemas de permissão
Estou tentando remover o único nó ativo de um cluster de failover do SQL Server 2008 R2.
Tudo verifica e então eu recebo este erro
Final result: Failed: see details below
Exit code (Decimal): -568706566
Exit facility code: 1562
Exit error code: 14842
Exit message: Cannot create a file when that file already exists. (Exception from HRESULT: 0x800700B7)
Start time: 2015-05-30 16:09:38
End time: 2015-05-30 16:10:28
Requested action: RemoveNode
2015-05-30 18:47:12 Slp: Sco: Attempting to write hklm registry key SOFTWARE\Wow6432Node\Microsoft\MSSQLServer to file C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Log\20150530_184438\Registry_SOFTWARE_Wow6432Node_Microsoft_MSSQLServer.reg_
2015-05-30 18:47:13 Slp: Cannot create a file when that file already exists. (Exception from HRESULT: 0x800700B7)
2015-05-30 18:47:13 Slp: Watson bucket for exception based failure has been created
2015-05-30 16:10:24 Slp: Error: Action "Microsoft.SqlServer.Configuration.SetupExtension.ValidateFeatureSettingsAction" threw an exception during execution.
2015-05-30 16:10:24 Slp: Microsoft.SqlServer.Setup.Chainer.Workflow.ActionExecutionException: Cannot create a file when that file already exists. (Exception from HRESULT: 0x800700B7) ---> System.Runtime.InteropServices.COMException (0x800700B7): Cannot create a file when that file already exists. (Exception from HRESULT: 0x800700B7)
2
Alguma ideia sobre o que está causando esse erro?
Estou anexando um banco de dados de um instantâneo obtido dos volumes do banco de dados de produção. Esses bancos de dados serão anonimizados e depois restaurados para nossos servidores DEV.
Aqui está minha declaração em anexo:
CREATE DATABASE MY_DB ON
( FILENAME = N'H:\MY_DB.mdf' ),
( FILENAME = N'j:\MY_DB.ldf' ),
( FILENAME = N'i:\MY_DB.ndf' ),
( FILENAME = N'H:\MY_DB.mdf' ),
( FILENAME = N'i:\MY_DB.ndf' )
FOR ATTACH
GO
E estou recebendo este erro:
Ocorreu um erro ao recuperar o banco de dados 'MY_DB'. Não é possível conectar-se ao Microsoft Distributed Transaction Coordinator (MS DTC) para verificar o status de conclusão da transação (2:2141366340). Corrija o MS DTC e execute a recuperação novamente.
Eu tenho:
- Segurança verificada no MSDTC por meio de serviços de componentes
- MSDTC reiniciado
- MSSQL reiniciado
- Restaurado outro banco de dados do mesmo volume
Pesquisar no Google não ajudou muito e meu maior medo é ter que recriar o instantâneo do volume apenas para este banco de dados. Existem outros 4 no mesmo volume que terão que ser refeitos também, se eu não encontrar uma solução alternativa.
Pergunta: Alguém sabe como resolver o erro acima?
Estou trabalhando em um processo para remover 90% dos dados de uma tabela porque apenas 10% são necessários para testes.
A melhor maneira que encontrei inclui armazenar 10% das linhas da tabela em uma tabela temporária.
Método atual
SELECT TOP 10 PERCENT *
INTO #temp_some_table
FROM some_table (nolock)
ORDER BY some_column DESC
TRUNCATE TABLE some_table
INSERT INTO some_table
SELECT *
FROM #temp_some_table
DROP TABLE #temp_some_table
Este método está enchendo o tempdb e fazendo com que o disco também fique cheio.
Perguntas
Existe uma maneira mais eficiente de excluir 90% dos dados de uma tabela ex ( DELETE TOP 90 PERCENT FROM sometable
)
ou
Existe uma maneira de inserir 10% dos dados de some_table em uma tabela temporária usando lotes? Algo assim:
DECLARE @r INT;
WHILE @r > 0
BEGIN
BEGIN TRANSACTION;
INSERT INTO [dbo].[##temp_cds_Basket]
SELECT TOP 10 PERCENT *
FROM [dbo].[cds_basket] s
SET @r = @@ROWCOUNT;
print @r
COMMIT TRANSACTION
END
Solução possível
Que tal agora?
SET NOCOUNT ON;
DECLARE @r INT;
DECLARE @TenPercentDate datetime
with cte (some_column) as (
select top 10 percent some_column from some_table (nolock) order by some_column desc
)
select @TenPercentDate = min(some_column)
from cte
select @TenPercentDate
SET @r = 1;
WHILE @r > 0
BEGIN
BEGIN TRANSACTION;
DELETE TOP (10000) from
some_table
WHERE some_column < @TenPercentDate
SET @r = @@ROWCOUNT;
print @r
COMMIT TRANSACTION;
--CHECKPOINT; -- if simple
END
--rollback