Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка при импорте данных из Exel. Нужна помощь  [new]
Dmitriy.Myasin
Member

Откуда:
Сообщений: 12
Добрый день всем. Нужна помощь.

В данный момент заняты импортом данных из Exel в MS SQL (задача более 50 миллионов файлов).

Вопрос заключается в следующем запускаем импорт данных. Все разбирается отлично, но на определенном этапе, не понятно по какой причине возникает следующая ошибка

----- текст ошибки
Location: tmpilb.cpp:3252
Expression: fNoReaderWriterConflict
SPID: 57
Process ID: 1332
Location: tmpilb.cpp:3302
Expression: fNoReaderWriterConflict
SPID: 57
Process ID: 1332
Msg 3624, Level 20, State 1, Line 110
A system assertion check has failed. Check the SQL Server error log for details. Typically, an assertion failure is caused by a software bug or data corruption. To check for database corruption, consider running DBCC CHECKDB. If you agreed to send dumps to Microsoft during setup, a mini dump will be sent to Microsoft. An update might be available from Microsoft in the latest Service Pack or in a Hotfix from Technical Support.
Msg 0, Level 20, State 0, Line 110
При выполнении текущей команды возникла серьезная ошибка.. При наличии результатов они должны быть аннулированы.
---- конец ошибки

Причина возникновения, как я полагаю, буферизация. Так вот, как обойти? или может подскажете еще что то?

Основная проблема, на мой взгляд, может заключаться в том, что при проходе 100 файлов, мы переносим их из временной таблицы в основную удаляя временную.
--- удаление сотки
if @Down=0 set @Down=1
WHILE @Up <= @Down
BEGIN
PRINT CONCAT('Up = ', @Up, ' - Down = ', @Down, ' - ID_Max = ', @ID_Max)
TRUNCATE TABLE Poligon.dbo.tmp_Path_Load_Parsing
INSERT INTO Poligon.dbo.tmp_Path_Load_Parsing
SELECT * FROM #Path_Load_Parsing WHERE ID_Counter between @Up * 100 + 1 and (@Up + 1) * 100 ORDER BY ID_Counter
--тело запроса
SET @Up = @Up + 1
IF @Up * 100 >= @ID_Max SET @Up = @Down + 1
-- конец удаления сотки
Сам запрос выполняется отлично, но постоянно приходится перезапускать.

Версия mssql server 2012.
30 янв 16, 16:43    [18749999]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Dmitriy.Myasin
Member

Откуда:
Сообщений: 12
Из лога

2016-01-30 14:41:16.55 spid57      Stack Signature for the dump is 0x000000002ED16201
2016-01-30 14:41:17.08 spid57 [INFO] Identity Begin End | State Result Error Speculate Prepared LazyCommit ReadOnly | Transaction Database ThreadId | ReadSet WriteSet ScanSet Savepoint LogSizeRq | CommitDep TotalComm Dependent 0 Dependent 1 Dependent 2 Dependent 3 Dependent 4 Dependent 5 Dependent 6 Dependent 7 | Area Location |
2016-01-30 14:41:17.75 spid57 External dump process return code 0x20000001.
External dump process returned no errors.

2016-01-30 14:41:17.75 spid57 Error: 17066, Severity: 16, State: 1.
2016-01-30 14:41:17.75 spid57 SQL Server Assertion: File: <tmpilb.cpp>, line=3302 Failed Assertion = 'fNoReaderWriterConflict'. This error may be timing-related. If the error persists after rerunning the statement, use DBCC CHECKDB to check the database for structural integrity, or restart the server to ensure in-memory data structures are not corrupted.
30 янв 16, 16:52    [18750046]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Dmitriy.Myasin,

Перечисленные здесь фиксы накатите
https://support.microsoft.com/en-us/kb/2778479
30 янв 16, 17:36    [18750175]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Dmitriy.Myasin
Member

Откуда:
Сообщений: 12
a_voronin,

Накатывал, не помогло.
30 янв 16, 17:39    [18750187]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
Dmitriy.Myasin
Причина возникновения, как я полагаю, буферизация. Так вот, как обойти? или может подскажете еще что то?
- Сама база/базы консистентная, checkdb что сказал?
- На каком стейтменте ошибка?
- Ошибка всегда на одном стейтменте или на разных?
- select @@version?

Dmitriy.Myasin
Основная проблема, на мой взгляд, может заключаться в том, что при проходе 100 файлов, мы переносим их из временной таблицы в основную удаляя временную.
Работа с временными таблицами - совсем не проблема.
Десятилетия так делаю, всё работает, таких серьёзных ошибок с дампами из за этого не было. Были из за битых баз и глюкавого железа.
30 янв 16, 20:43    [18750792]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Dmitriy.Myasin
Member

Откуда:
Сообщений: 12
alexeyvg,

1. checkdb - не выявил ошибок, все отлично.
2.
автор
- На каком стейтменте ошибка?
- Ошибка всегда на одном стейтменте или на разных?
- все время на разных
3.
автор
select @@version
Microsoft SQL Server 2014 - 12.0.4213.0 (X64) Jun 9 2015 12:06:16 Copyright (c) Microsoft Corporation Enterprise Evaluation Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: )


Единственная закономерность, это выпадение на ровном числе, когда дропаем временную таблицу
30 янв 16, 21:05    [18750884]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Dmitriy.Myasin
Member

Откуда:
Сообщений: 12
alexeyvg,

Так же по поводу железа. У меня 4 разных сервака с разными версиями sql и везде, одна и та же ерунда с данным запросом.

Может затык в sp_refreshview

В части @viewname nvarchar(776), но пока, обладаю слабым опытом на данный момент, как сделать @viewname nvarchar(max)
30 янв 16, 21:08    [18750904]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51213
Ну значит тебе повезло нарваться на бага. Стучись в техсаппорт с дампом, как и написано в первом сообщении.
31 янв 16, 14:32    [18752353]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dmitriy.Myasin
Причина возникновения, как я полагаю, буферизация. Так вот, как обойти? или может подскажете еще что то?

Какая конкртено команда падает то ?
И причем тут Excel, если в вашем коде нет ни буквы для работы с Excel ?
31 янв 16, 14:46    [18752383]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
Dmitriy.Myasin
1. checkdb - не выявил ошибок, все отлично.
Надеюсь, не только свою базу проверили, но и системные?
Dmitriy.Myasin
автор
- На каком стейтменте ошибка?
- Ошибка всегда на одном стейтменте или на разных?
- все время на разных
...
Единственная закономерность, это выпадение на ровном числе, когда дропаем временную таблицу
Так "на разных стейтментах", или "когда дропаем"?
Или ровное число - имеется в виду всегда одно и то же количество проходов цикла?
Всё таки непонятно, почему вы связываете падения с временными таблицами?

Да, ещё - tempdb на обычных дисках, как всё остальное? Нет какого нибудь RAM-диска?
Dmitriy.Myasin
У меня 4 разных сервака с разными версиями sql и везде, одна и та же ерунда с данным запросом.

Всё это очень странно. И это именно 4 разных железных сервака, не виртуальные? Они не подключены к общей СХД?

Совершенно обычный код с рутинным DDL/DML падает с дампом на разных версиях MSSQL, Windows, и на разном железе? Фантастика.

У меня только такое предположение, что у вас используются где то CLR/OLE/Ectended proc, либо какие то интегрируемые в сиквел системы внешнего бакапа, которые портят память сиквела.
Ну или общая СХД/хост для виртуалок.
Glory
И причем тут Excel, если в вашем коде нет ни буквы для работы с Excel ?
Ага, такой заголовок вводит в заблуждение.
31 янв 16, 15:40    [18752501]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Dmitriy.Myasin
Member

Откуда:
Сообщений: 12
alexeyvg,

Чек сделал для всех баз, и системный в том числе. Голову уже всю сломал.

Ошибка выпадает когда дропаем.

Серваки физические, различное железо, различные процы и харды. Разнесены в разных ДЦ (даже в разных страннах)


автор
У меня только такое предположение, что у вас используются где то CLR/OLE/Ectended proc, либо какие то интегрируемые в сиквел системы внешнего бакапа, которые портят память сиквела.

А вот тут как раз скорей всего и кроется загадка.

Сейчас еще помучаюсь, и если не получится уйду в php кодеры.
31 янв 16, 16:11    [18752570]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Dmitriy.Myasin
Member

Откуда:
Сообщений: 12
alexeyvg,

Попробуем поставить ему один тред и прогнать
31 янв 16, 16:31    [18752613]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
Dmitriy.Myasin
Ошибка выпадает когда дропаем.
А, то есть не на разных стейтментах, а на одном?

А "когда дропаем" - это как? У вас нет команды DROP в коде.

Или вы про команду TRUNCATE TABLE?
Dmitriy.Myasin
Сейчас еще помучаюсь, и если не получится уйду в php кодеры.
:-)

Мда, загадка...
31 янв 16, 21:37    [18753372]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Dmitriy.Myasin
Member

Откуда:
Сообщений: 12
alexeyvg,

Вот весь запрос
SET NOCOUNT ON;

-- Загрузка данных в цикле во временную таблицу

IF (OBJECT_ID('tempdb..#t') IS NOT NULL) DROP TABLE #t
IF (OBJECT_ID('tempdb..#Path_Load_Parsing') IS NOT NULL) DROP TABLE #Path_Load_Parsing

--1.1. Подготовка списка загружаемых файлов
CREATE TABLE #t ([subdirectory] varchar(max), depth int, [file] int)
CREATE TABLE #Path_Load_Parsing
(
[subdirectory] varchar(max),
[table_name] varchar(max),
ID_Notification int,
id bigint,
[file_name] nvarchar(max),
ID_Counter int identity
)

INSERT #t EXEC xp_dirtree 'C:\bd_from_moskov\Госзакупки\Временные_данные\DWH\Гарантии\data\', 1,1

INSERT INTO #Path_Load_Parsing ([subdirectory], [file_name])
SELECT
[subdirectory] = 'C:\bd_from_moskov\Госзакупки\Временные_данные\DWH\Гарантии\data\' + [subdirectory],
[file_name] = [subdirectory]
FROM #t
WHERE [file] = 1
AND [subdirectory] LIKE '%.xls%'
--AND [subdirectory] LIKE '%NOTIF%'

-- SELECT * FROM #Path_Load_Parsing WHERE ID_Counter < 6

-- Прометка поля "table_name"
update #Path_Load_Parsing
set table_name = LEFT(REPLACE([subdirectory], LEFT([subdirectory], CHARINDEX('data\', [subdirectory]) + 4), ''),
CHARINDEX('_',REPLACE([subdirectory], LEFT([subdirectory], CHARINDEX('data\', [subdirectory]) + 4), '')))

-- Правка тех записей, у кот. есть разделители (встречаются 2 и более раз)
update #Path_Load_Parsing
set table_name =
LEFT(
REPLACE(
REPLACE([subdirectory], 'fcs_notification', 'fcsnotification'),
LEFT(
REPLACE([subdirectory], 'fcs_notification', 'fcsnotification'),
CHARINDEX('data\', REPLACE([subdirectory],'fcs_notification','fcsnotification')) + 4
),''
),
CHARINDEX(
'_',
REPLACE(
REPLACE([subdirectory],'fcs_notification','fcsnotification'),
LEFT(
REPLACE([subdirectory],'fcs_notification','fcsnotification'),
CHARINDEX('data\', REPLACE([subdirectory], 'fcs_notification', 'fcsnotification')) + 4
),
''
)
)
)
where [subdirectory] like '%fcs_notification%'

--Прометка поля "ID_Notification"

update #Path_Load_Parsing
set ID_Notification=1
where table_name like '%Notification%'
and not (table_name like '%NotificationCancel%' or table_name like '%NotificationLotCancel%')


--паразитные символы (ОТкуда берутся!!?)
UPDATE #Path_Load_Parsing
SET table_name=replace(table_name, '~$',''), [subdirectory]=replace([subdirectory], '~$','')
WHERE table_name='~$bankGuaranteeTermination_'
or table_name='~$fcsNotificationISM44_'



--1.2. Загрузка данных в таблицу "Parsing_ALL.dbo.DIC_File_Load" (там происходит идентификация файлов для последующего опознания - ID единый для всех загружаемых данных!)
--Идентификация проходит по названию файла, а не по полному пути!!!
insert into Parsing_ALL.dbo.DIC_File_Load (table_name,[Path] ) -- здесь в DIC_File_Load вставляются записи
select distinct t.table_name, [file_name] as [Path] -- из #Path_Load_Parsing, которых ещё нет
FROM Parsing_ALL.dbo.DIC_File_Load AS d RIGHT OUTER JOIN -- в DIC_File_Load ????
#Path_Load_Parsing AS t ON d.Path = t.[file_name] -- Не лучше использовать EXCEPT ???
where d.Path is null

--1.3. Расстановка идентификатора для загрузки в таблице "#tmp_Path_Load_Parsing"
update t
set id= d.id from #Path_Load_Parsing as T inner join Parsing_ALL.dbo.DIC_File_Load AS d ON
[Path]=[file_name]


--1.4. Создание временной таблицы, в кот. будут подаваться данные.
--IF (SELECT count(*) FROM Poligon.sys.tables WHERE name = 'tmp_Path_Load_Parsing')<>0 drop table Poligon.dbo.tmp_Path_Load_Parsing
--create table Poligon.dbo.tmp_Path_Load_Parsing ([subdirectory] varchar(max),table_name varchar(max), ID_Notification int, id bigint, [file_name] nvarchar(max),
--ID_Counter int)
-- В чем смысл её постоянного пересоздания ?

--119116

--sp_Load_File_intoSQL - 119062
--2. Цикл "подачи" групп файлов в таблицу "tmp_Path_Load_Parsing"

--select distinct table_name from #Path_Load_Parsing

--bankGuaranteeInvalid_ --bankGuaranteeReturn_ --bankGuaranteeTermination_ --fcsGaranteeInfo_

---delete FROM #Path_Load_Parsing WHERE ID_Counter < 121170

--Определяем диапазон таблиц для переноса
declare @Up int, @Down int, @ID_Max int
--Нижний диапазон
set @Up=(select FLOOR(min(ID_Counter)*0.01) from #Path_Load_Parsing)
--Верхний диапазон
set @Down=(select FLOOR(max(ID_Counter)*0.01) from #Path_Load_Parsing)
--Максимальный ID в перечне загружаемых файлов.
set @ID_Max=(select max(ID_Counter) from #Path_Load_Parsing)


--select @ID_Max, @Up, @Down

if @Down=0 set @Down=1

WHILE @Up <= @Down
BEGIN
PRINT CONCAT('Up = ', @Up, ' - Down = ', @Down, ' - ID_Max = ', @ID_Max)

TRUNCATE TABLE Poligon.dbo.tmp_Path_Load_Parsing
INSERT INTO Poligon.dbo.tmp_Path_Load_Parsing
SELECT * FROM #Path_Load_Parsing WHERE ID_Counter between @Up * 100 + 1 and (@Up + 1) * 100 ORDER BY ID_Counter

-- МЕХАНИЗМ ЗАГРУЗКИ И ОБРАБОТКИ ТАБЛИЦ ТИПА "NOTIFICATION"

-- ПОРЯДОК ЗАПУСКА ФАЙЛОВ (Далее переделать в хранимые процедуры)

-- 1. "Загрузка DWH-таблиц с анализом_тест новых Аукционов Процедура".
EXEC [Parsing_TMP].[dbo].[sp_Load_File_intoSQL]

-- Запускается ТОЛЬКО в случае наличия хотябы одной таблицы с подходящим названием в БД "Parsing_ALL".
--IF (select count(*) from (
-- select top 1 * FROM Parsing_TMP.sys.tables
-- where name like '%Notification%'
-- and not (left(name,9)='Shablon_V'or left(name,4)='DIC_')) as a)<>0
/* Заменяем условие */
------------------------------------------------------------------------------
IF EXISTS
(
SELECT TOP 1 1 FROM Parsing_TMP.sys.tables
WHERE ([name] LIKE '%Guarant%' or [name] LIKE '%Garant%')
AND NOT (LEFT([name], 9) = 'Shablon_V' OR LEFT([name], 4) = 'DIC_')
)
------------------------------------------------------------------------------
BEGIN
--2. "Создание общей таблицы и представления Garante".
exec [Parsing_TMP].[dbo].[sp_V_tmp_Garante_All_Create]

--Здесь же создание представления - фантома с пустыми полями вместо отсутствующих
exec [Parsing_TMP].[dbo].[sp_V_tmp_Garante_All_Shablon_Create]

--Строится на базе шаблонов (таблицы "Shablon_V" в БД "Parsing_TMP")

--3. Удаление старых таблиц.
exec [Parsing_TMP].[dbo].[sp_Garantee_OLdTable_Delete]
--4. ПРОВЕРКА СУЩЕСТВОВАНИЯ ДАННЫХ ДЛЯ ЗАГРУЗКИ.
exec [Parsing_TMP].[dbo].[sp_Garantee_Table_Create]
--5. DWH_Notification предварительная подготовка
exec [Parsing_TMP].[dbo].[sp_Garantee_Prepare_Load]

--6. Добавление полей.
exec [Parsing_TMP].[dbo].[sp_Garantee_Field_Add]



--7.Обновление справочников.
exec [Parsing_TMP].[dbo].[sp_GaranteeDIC_Load]

--8. Прометка полей
exec [Parsing_TMP].[dbo].[sp_Garantee_Field_Mark]

--9. Удаление старых данных из DWH-таблиц.
exec [Parsing_TMP].[dbo].[sp_Garante_OldDate_Delete]
--9. Загрузка данных в DWH-таблицы.
exec [Parsing_TMP].[dbo].[sp_Garantee_DWH_Load]
END
SET @Up = @Up + 1
IF @Up * 100 >= @ID_Max SET @Up = @Down + 1
END
1 фев 16, 07:22    [18754293]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Dmitriy.Myasin
Member

Откуда:
Сообщений: 12
alexeyvg,

И вот уже новая ошибка, которую получилось отловить
---------------------------
Msg 596, Level 21, State 1, Line 110
Cannot continue the execution because the session is in the kill state.
---------------------------
1 фев 16, 07:23    [18754295]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dmitriy.Myasin
Вот весь запрос

Откуда вы все это запускаете ?

Dmitriy.Myasin
Msg 596, Level 21, State 1, Line 110

И какая команда у вас в Line 110 ?
1 фев 16, 09:20    [18754486]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из Exel. Нужна помощь  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
Dmitriy.Myasin
И вот уже новая ошибка, которую получилось отловить
---------------------------
Msg 596, Level 21, State 1, Line 110
Cannot continue the execution because the session is in the kill state.
То есть, вот у вас этот текст в окне Query в SSMS, вы его выполняете, и вам возвращает только вот этот текст:
Msg 596, Level 21, State 1, Line 110
Cannot continue the execution because the session is in the kill state.
Правильно?

Вообще говоря, эта ошибка просто говорит, что коннект в состоянии завершения, с откатом транзакции. А вот почему он в таком состоянии, непонятно...
1 фев 16, 10:51    [18754881]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить