Bug 9449

Summary: БИНАР Перенос данных из 1c 7.7 dbf в postgres
Product: SELTA@Etersoft Reporter: Станислав Коробейников <stas>
Component: ОбщееAssignee: Anton Agapov <anton>
Status: CLOSED FIXED QA Contact: Vinichenko Sofia <vinny>
Severity: minor    
Priority: P4 CC: lav, stas
Version: 1.1.0   
Target Milestone: версия 1.0.4   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 9588    
Bug Blocks:    
Attachments: Скриншот ошибки в MS SQL
Промахнулся. Вот правильный скриншот.

Description Станислав Коробейников 2013-07-24 19:20:33 MSK
ООО НПФ БИНАР. Нужно перенести данные из 1c 7.7 dbf в postgres.
Comment 1 Станислав Коробейников 2013-07-24 19:24:18 MSK
Выгрузил в zip, загрузил в postgres. Прошло нормально, но на этапе (после загрузки) пересчет ссылок по графе ВРН падает в разных местах. 
Решил провести тестирование и исправление еще в dbf, но это на долго подвисло. Но что-то происходит.
Comment 2 Станислав Коробейников 2013-07-24 19:26:05 MSK
Внутри нашей сети часто обрывается соединение, что осложняет долгие процедуры. 
Думаю, что можно посмотреть, что будет при загрузке в MSSQL. Там должно быть не долго.
Comment 3 Vitaly Lipatov 2013-07-24 20:54:42 MSK
Аналог screen для Иксов называется xpra.
Отключение синка: /etc/wine/config: export WINEDISABLEFLUSH=yes
Базу данных стоит расположить на разделе, смонтированном с tmpfs (на builder* такого нет, но наверное /tmp тоже сойдёт).
Comment 4 Станислав Коробейников 2013-07-29 20:25:10 MSK
Сделал с горем пополам тестирование и исправление. На наших машинах делалось часов 6.
Выгрузил. Думаю, что сейчас зальется нормально.
Comment 5 Станислав Коробейников 2013-07-30 17:34:50 MSK
Нормально не залилось. В dbf были дублирующиеся записи, которые не обнаружились при тестировании и исправлении

Вот какие я получил ощибки.

ERROR:  could not create unique index "idd_sc26391"
DETAIL:  Table contains duplicated values.
CONTEXT:  SQL statement "CREATE UNIQUE INDEX "idd_sc26391" ON "sc26391" ("id");
        INSERT INTO pg_indexes_name VALUES('IDD','"sc26391"','"idd_sc26391"')"
        PL/pgSQL function "exec_query" line 8 at EXECUTE statement
STATEMENT:  SELECT CASE WHEN NOT EXISTS (SELECT * FROM "sysindexes" WHERE "name" = 'IDD' AND "id" = "object_id"('SC26391')) TH
        exec_query('CREATE UNIQUE INDEX "idd_sc26391" ON "sc26391" ("id");
        INSERT INTO pg_indexes_name VALUES(''IDD'',''"sc26391"'',''"idd_sc26391"'')')
        END
        
        
        
ERROR:  could not create unique index "idd_sc29109"
DETAIL:  Table contains duplicated values.
CONTEXT:  SQL statement "CREATE UNIQUE INDEX "idd_sc29109" ON "sc29109" ("id");
        INSERT INTO pg_indexes_name VALUES('IDD','"sc29109"','"idd_sc29109"')"
        PL/pgSQL function "exec_query" line 8 at EXECUTE statement
STATEMENT:  SELECT CASE WHEN NOT EXISTS (SELECT * FROM "sysindexes" WHERE "name" = 'IDD' AND "id" = "object_id"('SC29109')) TH
        exec_query('CREATE UNIQUE INDEX "idd_sc29109" ON "sc29109" ("id");
        INSERT INTO pg_indexes_name VALUES(''IDD'',''"sc29109"'',''"idd_sc29109"'')')
        END

Постарался, как мог исправить (удалил дубли):


SELECT count(id), id FROM sc26391 GROUP BY id HAVING count(id) > 1 ;
 count |    id     
-------+-----------
     2 |    ACK   
(1 row)

SELECT row_id, id FROM sc26391 WHERE id LIKe '%ACK%';
 row_id |    id     
--------+-----------
  32515 |    ACK   
  32516 |    ACK   
(2 rows)

DELETE FROM sc26391 WHERE row_id = 32516;

SELECT count(id), id FROM sc29109 GROUP BY id HAVING count(id) > 1 ;
 count |    id     
-------+-----------
     2 |      2   
     2 |      1   
(2 rows)
Comment 6 Станислав Коробейников 2013-07-31 20:07:05 MSK
Долго мучился в итоге удалил дублирующиеся записи из dbf.
Интересно, что не заливается в MS SQL, похоже из-за неправильно написанной конфигурации. 
В postgres этой ошибки нету, зато есть другая "the query is NULL". Это ошибка выдается odbc драйвером и ей можно игнорировать, по скольку она не критическая. Хотя можно и разобраться, почему так происходит.
Comment 7 Станислав Коробейников 2013-07-31 20:08:55 MSK
Created attachment 2961 [details]
Скриншот ошибки в MS SQL

При заливки в MS SQL происходит ошибка на этапе 
"Пересчет ссылок по графе отбора 'ДокВид'"
Думаю, что это из-за неправильно написанной конфигурации.
Comment 8 Станислав Коробейников 2013-07-31 20:10:42 MSK
Created attachment 2962 [details]
Промахнулся. Вот правильный скриншот.
Comment 9 Станислав Коробейников 2013-08-01 20:17:32 MSK
Дело не в ошибке NULL query. Падает всё равно bad_alloc, всё время в разных местах. Надо попробывать из win.
Comment 10 Станислав Коробейников 2013-09-02 18:56:20 MSK
Падает, как я ни пробовал. Но вот, что я заметил падает на этапе "тестирование и исправление", на сколько я понимаю, именно это происходит после загрузки, но надо проконсультироваться. 
И надо протестировать потыкать по кнопкам, одинаковые ли документы.
Comment 11 Станислав Коробейников 2013-09-03 20:57:37 MSK
К сожалению, предположение оказалось не верным. Пересчет ссылок и итогов всё равно нужно запустить. Запустил, падает на том же месте. 
Мне подсказали, что можно удалить старые документы (там есть за 18 век), тогда не будет там много пересчитываться. Надо попробывать, может это улучшит ситуацию
Comment 12 Vitaly Lipatov 2013-09-03 21:57:33 MSK
(В ответ на comment #9)
> Дело не в ошибке NULL query. Падает всё равно bad_alloc, всё время в разных
> местах. Надо попробывать из win.
Хорошо бы иметь какую-то отладочную версию, и если это опять ошибка с работой с памятью в трансляторе, то что-то продвинуть в этом направлении, по сравнению с прошлыми попытками отладки.
У нас вот появилось чудо средство для отладки проблем с памятью для Linux с помощью LLVM. Что-то типа http://clang.llvm.org/docs/AddressSanitizer.html
Comment 13 Станислав Коробейников 2013-09-04 18:08:26 MSK
После того, как убрали старые (до 20 века) документы, стало загружаться и после того момента. Но там то память кончитась, то место, сейчас поставил загружаться, надеюсь к завтрашнему дню будет готово. 
Тут брат у меня залил в ms sql исправив какие-то ошибки в базе 1с, может придется воспользоваться его вариантом. Но он каких-то денег хочет. Посмотрим.
Comment 14 Станислав Коробейников 2013-09-05 20:30:55 MSK
Подготовил к отправке. По пути выяснилось, что в нашем postgre сломалась база при падении из-за отклучноого sync'а
Залил в новую в pg 9.1.9

Что им нужно знать. 
Postgre@Etersoft мы рекомендуем 9.1.9. 
файлы лежат в 
ftp://ftp.etersoft.ru/pub/people/stas/binar/W0QVLQD3FO.
Состав файлов
a1c277.tar.gz  -- дамп базы pg
from1c277sql.zip  -- файлы 1с (просто нужно разорхивировать и в режиме конструктора изменить параметры подключения к postgre)
report1canalyze.zip -- отчет об ошибках в базе 1с. Мы их можем исправить, если они хотят.

Первый раз, возможно нужно запустить 1с в монопольном режиме

Для того, что бы загрузить пришлось удалить несколько документов до 20 века, и пару начала 20 века
База в теперешнем состоянии всё равно не загружается в mssql. Загружается только с исправленными ошибками о которых говорится в отчете.
Comment 15 Станислав Коробейников 2013-09-05 20:35:25 MSK
Добавление
Из двух таблиц были удалены записи с дублирующимеся записями. Это
sc26391
id = ACK 
2 записи
sc29109
id = 1
id = 2
по 2 записи

Желательно, что бы они это бы сделали без нас.
Comment 16 Vitaly Lipatov 2013-09-05 22:38:12 MSK
(В ответ на comment #14)
> Подготовил к отправке. По пути выяснилось, что в нашем postgre сломалась база
> при падении из-за отклучноого sync'а
Мне было бы интересно узнать, как отключение sync может приводить к порче базы при падении программы. Пока выглядит абсурдно.

Но если это каким-то образом так, предлагаю запускать postgres командой
# eatmydata serv postgresql start
Это точно отключит все синки и никак при этом на логику программы не повлияет.
Comment 17 Станислав Коробейников 2013-09-06 13:17:22 MSK
(В ответ на comment #16)
> Мне было бы интересно узнать, как отключение sync может приводить к порче базы
> при падении программы. Пока выглядит абсурдно.
http://www.postgresql.org/docs/current/static/runtime-config-wal.html
While turning off fsync is often a performance benefit, this can result in unrecoverable data corruption in the event of a power failure or system crash. 
Тут достаточно чётко написало. "data corruption"
Может и обсурдно, но это случилось.

> Но если это каким-то образом так, предлагаю запускать postgres командой
> # eatmydata serv postgresql start
> Это точно отключит все синки и никак при этом на логику программы не повлияет.
Хорошо, буду запускать так.
Comment 21 Vinichenko Sofia 2013-09-06 15:08:30 MSK
Стас, что тебе необходимо из железа, для поднятия стенда с базой?
Comment 22 Станислав Коробейников 2013-09-06 21:07:44 MSK
Сложный вопрос. Мне кажется, что если они собираются покупать, то вменяемым будет машина с 4-8 Гб памяти, средним современный процессором, и не плохо бы ssd под базу. Это под postgres.
Но неизвестно сколько у них там собирается быть пользователей. И как они всё это используют -- от этого много зависит.

Я думаю, что сначала им бы посмотреть на работоспособность, а там уже и быстродействие тестировать
(В ответ на comment #21)
> Стас, что тебе необходимо из железа, для поднятия стенда с базой?
Comment 23 Станислав Коробейников 2013-09-30 20:16:07 MSK
Подготовил всё для быстрого перехода на тестовый сервер.
Comment 24 Станислав Коробейников 2013-10-01 18:32:31 MSK
Сделал дампы базы, всё заархивировал.
Лежит в /var/ftp/tmp/stas/2binar/