Форум » [x]Harbour » Копирование открытых баз данных » Ответить

Копирование открытых баз данных

Dima: Имею непонятку. Cтал в последнее время замечать что скорость копирования базы а она на данный момент весит 10 гиг , стало занимать до ~15 минут , хотя пару недель назад это время было всего ~32 секунды. Провел эксперимент , в базах ни кого нет , время копирования базы заняло ~32 секунды , зашел в прогу и перешел в раздел где открывается много баз и снова запустил копирование , цирк ...время заняло ~ 33 секунды и ни какими минутами и не пахнет. Копирую базы так [pre2] FOR EACH aFile IN aDir hb_DynCall({ "CopyFileA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL },pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1],0) hb_releaseCPU() Next [/pre2] Винт SSD и ему почти 2 года. Не пойму куда копать ....есть какие мысли у кого ?

Ответов - 84, стр: 1 2 3 4 5 All

PSP: А при каком условии долго? Когда больше одного работает?

Dima: PSP пишет: А при каком условии долго? Когда больше одного работает? Да выяснил вчера , что при повторном копировании время занимает почему то в 2.5 - 3 раза больше чем при первоначальном копировании. А копирование происходит 1 раз в час , соответственно через часов 7-8 выйдем на результат в 15 минут. Почему не понял.

PSP: А если интервал увеличить или уменьшить? Эффект какой будет?


SergKis: Попробуй XCopy, у меня каждые 2-а часа планировщик запускает получение zip+xcopy на др. PC. Что будет ? Когда у тебя тормозит, что будет на xCopy ?

Dima: Убрал пока из цикла hb_releaseCPU() Вышел на 16 сек Через 1 час проверю

Haz: SergKis пишет: Попробуй XCopy, у меня каждые 2-а часа планировщик запускает получение zip+xcopy на др. PC. вместо xCopy лучше использовать RoboCopy, утилита более продвинутая и оптимизирована на работу в сети

SergKis: Haz пишет вместо xCopy лучше использовать RoboCopy, утилита более продвинутая и оптимизирована на работу в сети Возможно и лучше, но admin (это чужие PC) вряд ли будет ставить лишнюю утилиту, если работают штатные, тем более это работа сервер-сервер, на одном работает от планировщика gbak+7z, на другом полученные файлы 7z планировщик забирает xCopy по маске

Dima: SergKis так она штатная

Dima: короче при первом запуске копирования 16 сек спустя час , та же операция 43 сек спустя час , та же операция 54 сек Просто уже интересно , почему так...

SergKis: Haz пишет лучше использовать RoboCopy Dima пишет так она штатная Спасибо, не знал, что есть такая штука. Dima пишет 54 сек Просто уже интересно , почему так... Как штатные копирования ведут себя в это время (или за это время) ?

Dima: Штатные работают чуть медленнее а вот причину замедления я кажись нашел. Было [pre2] FOR EACH aFile IN aDir hb_DynCall({ "CopyFileA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL },pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1],0) Next [/pre2] Стало [pre2] hLib := hb_libLoad( "Kernel32.dll" ) IF ! Empty( hLib ) FOR EACH aFile IN aDir hb_DynCall({ "CopyFileA", hLib, HB_DYN_CALLCONV_STDCALL },pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1],0) Next hb_libFree( hLib ) ENDIF [/pre2] Потестил у себя на компе в цикле на большом файле , время практически одинаково а в первом варианте стабильно растет

PSP: Получается, что была утечка памяти. Память не освобождалась после вызова dll и в конце концов всё больше и больше использовался файл подкачки. Отсюда и тормоза. Имхо.

Pasha: Dima пишет: Стало hLib := hb_libLoad( "Kernel32.dll" ) IF ! Empty( hLib ) FOR EACH aFile IN aDir hb_DynCall({ "CopyFileA", hLib, HB_DYN_CALLCONV_STDCALL },pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1],0) Next hb_libFree( hLib ) ENDIF Можно еще проще: FOR EACH aFile IN aDir win_CopyFile(pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1], .f.) NEXT ... #pragma BEGINDUMP #include "hbapi.h" #include "windows.h" HB_FUNC( WIN_COPYFILE ) { hb_retnl( (LONG) CopyFile( (LPCSTR) hb_parc(1), (LPCSTR) hb_parc(2), HB_ISNIL(3) ? FALSE : (BOOL) hb_parl(3) ) ); } #pragma ENDDUMP вместо CopyFile будет вызвана либо неуникодная CopyFileA, либо уникодная CopyFileW

Andrey: Dima пишет: Cтал в последнее время замечать что скорость копирования базы Чисто теоретический вопрос - а не проще скидывать изменённые данные в базах на другой комп/сервер ? Или с другого компа/сервера подключаться к базам через определённое время и копировать только изменённые записи

Dima: Pasha Пробну , спасибо !

Dima: Pasha пишет: Можно еще проще Пожалуй это самый быстрый способ копирования. После первого прохода база в 10 гиг скопировалась за 15 сек (с базой работает 17 чел на сейчас) Подожду еще пары проходов и через 2-3 часа выложу результат

Dima: Вот и статистика приехала [pre2] Начало копирования : 2023-11-30 14:28:44.002 UserCount : 17 Конец копирования : 2023-11-30 14:29:00.877 Время копирования : 16.87 --------------------- Начало копирования : 2023-11-30 15:31:51.887 UserCount : 12 Конец копирования : 2023-11-30 15:32:29.873 Время копирования : 37.99 --------------------- Начало копирования : 2023-11-30 16:34:58.577 UserCount : 11 Конец копирования : 2023-11-30 16:35:52.881 Время копирования : 54.30 --------------------- Начало копирования : 2023-11-30 17:38:06.308 UserCount : 7 Конец копирования : 2023-11-30 17:39:22.358 Время копирования : 76.05 --------------------- [/pre2] Почему растет время не понятно ....база данных за 1 час не сильно наполняется. PS Копирование происходит в потоке.

SergKis: Dima пишет Почему растет время не понятно ... Тогда получается, что такой твой вариант лучше ?! Потестил у себя на компе в цикле на большом файле , время практически одинаково ... hLib := hb_libLoad( "Kernel32.dll" ) IF ! Empty( hLib ) FOR EACH aFile IN aDir hb_DynCall({ "CopyFileA", hLib, HB_DYN_CALLCONV_STDCALL },pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1],0) Next hb_libFree( hLib ) ENDIF

Dima: SergKis пишет: Тогда получается, что такой твой вариант лучше ?! Оказалось что нет , мало замеров на тот момент сделал. Сравнил по скорости win_CopyFile и HB_VFCOPYFILE. В цикле от 1 до 3 копирую файлик на 2 гига win_CopyFile время 36.62 53.17 48.71 HB_VFCOPYFILE 41.62 43.62 40.51

SergKis: Dima Получается большой разницы нет, набежит ~30 сек. даже пусть минута - это же поток и не мешает работе Если биться за скорость, то, правда, можно в больших базах брать только измененные записи, т.е., например, первого числа взял весь файл, а потом, из него, только записи новые и измененные, надо, конечно поле иметь TimeStamp модификации и так до след. первого числа

Dima: SergKis Тут не столько борьба за скорость , хотя она тоже важна , тут битва идёт уже что бы время не расло всё время. Если задачу не перезапускать то в какой то момент через ..надцать дней скажем , копирование может занять 1 час или типа того.

SergKis: Dima пишет Если задачу не перезапускать то в какой то момент через ..надцать дней скажем Вынь из задачи, помести в фоновый поток, например на планировщик запуск, твоего же exe с параметром только для выполнения копии, или твоя задача по timer запускает себя с параметром для вып. копии

Dima: Нет , планировщик не использую а вот сам процесс копирования действительно можно вынести в отдельный EXE и из потока его запускать. Должно помочь думается в плане времени копирования , так как первый раз всегда отрабатывает быстро

SergKis: Ты можешь не выносить из exe (там у тебя все определено и отлажено и есть вызов), сделай параметр входа для копирования и запускай тот же exe с этим параметром. Зачем лишние exe плодить ? Не всегда это оправдано

Pasha: Dima пишет: Оказалось что нет , мало замеров на тот момент сделал. Сравнил по скорости win_CopyFile и HB_VFCOPYFILE. В цикле от 1 до 3 копирую файлик на 2 гига win_CopyFile время 36.62 53.17 48.71 HB_VFCOPYFILE 41.62 43.62 40.51 win_CopyFile - это просто обертка для winapi-шной CopyFile. Как она работает, что там внутри делается - неизвестно. HB_VFCOPYFILE - там все прозрачно, исходный файл читается последовательно в буфер размером 64k, и этот буфер пишется в результирующий файл. Понятно, что windows еще сама как-то буферизирует эти операции чтения - записи. Для огромных файлов буфер 64k явно маловат. Можно сделать свой аналог, в котором задавать размер буфера

Pasha: Dima пишет: SergKis Тут не столько борьба за скорость , хотя она тоже важна , тут битва идёт уже что бы время не расло всё время. Если задачу не перезапускать то в какой то момент через ..надцать дней скажем , копирование может занять 1 час или типа того. Так нет чистого времени копирования, слишком много факторов влияют на время в каждом случае. Скажем, в это время качается обновление винды, диск занят и на другие операции, время скакнет. Или антивирус вздумает запустить проверку, и дергает тот же диск. А таких или может быть сколько угодно. Важно удостовериться, что у тебя все организовано без дырок, и более-менее оптимально

PSP: Разрешите вставить свои 5 копеек) Вот, если речь идет о бэкапе, то, имхо, тут лучше использовать сторонние средства. Я пользуюсь Cobian Backup. Отличная штука. Она использует механизм теневых копий, так что может копировать открытые в других программах файлы. Весьма удобна.

Dima: PSP пишет: Cobian Backup Интересная тулза и главное бесплатно

PSP: Она работает чётко. Много лет ей пользуюсь)

Dima: Pasha пишет: Так нет чистого времени копирования, слишком много факторов влияют на время в каждом случае. Скажем, в это время качается обновление винды, диск занят и на другие операции, время скакнет. Или антивирус вздумает запустить проверку, и дергает тот же диск. А таких или может быть сколько угодно. Важно удостовериться, что у тебя все организовано без дырок, и более-менее оптимально Ну как бы согласен теоретически ...., не поленился и поставил эксперимент , запустил приложение которое в том числе выполняет и копирование базы данных (в сети была куча юзеров) , отработало копирование , вышел из задачи и так 10 раз подряд Время копирования 15-16 секунд а вот если не выгружать и дать ему работать и каждый час копировать то статистика в секундах следующая. [pre2] Время копирования : 16.46 //1 запуск Время копирования : 36.50 Время копирования : 58.74 Время копирования : 74.52 Время копирования : 96.05 Время копирования : 116.97 Время копирования : 133.02 Время копирования : 158.03 Время копирования : 176.51 Время копирования : 204.95 Время копирования : 218.67 Время копирования : 239.52 Время копирования : 259.55 Время копирования : 281.21 Время копирования : 296.34 [/pre2]

Dima: Проблему решил костылём. Если время копирования базы превышает N секунд , убиваю поток и заново его запускаю. Работает однако. PS Почему росло время хз.

PSP: В плане бреда... А что, если дескрипторы файла "zip\..." остаются открытыми после копирования и со временем их становится много, как будто файл открыт из разных программ, а? Тут возникаю вопросы с блокировками, кэшированием и т.д.

PSP: Вот нечто https://www.cyberforum.ru/win-api/thread983172.html

Dima: PSP Фиг его знает , я тестил все возможные функции по копированию и всегда растет время , остановился на CopyFileA потому что самая быстрая.

Dima: PSP пишет: Вот нечто https://www.cyberforum.ru/win-api/thread983172.html писец у нас это сайт заблочен ....придется юзать тор браузер

PSP: А ты вот попробуй перед копированием файл назначения переименовать, а после успешного копирования старый удаляй.

Dima: PSP пишет: А ты вот попробуй перед копированием файл назначения переименовать чёт я не очень понял как переименовать то чего еще нет , так как операция копирования еще не происходила ?

PSP: Dima пишет: чёт я не очень понял как переименовать то чего еще нет , так как операция копирования еще не происходила ? А destination каждый раз новый создается? Или перезаписывается?

Dima: схема такая копирую файлы базы данных в пустую папку затем все скопированные файлы ZIPую , копирую архив на диск где живут бекапы папку куда копировал файлы базы полностью очищаю

PSP: Ясно, но ясности это не добавило

Dima: PSP пишет: Вот нечто https://www.cyberforum.ru/win-api/thread983172.html Почитал....хммм

Dima: Потестю ка у клиента еще раз но уже с Hb_fcopy

Dima: Да с Hb_fcopy время тоже растет при каждом цикле копирования. Файлы под 2 гига , но не все. Погуглил , проблема таки есть по любому , когда поток + копирование в цикле + большие файлы. Полагаю что то нужно добавить в цикл , вот только что , хз. Поэтому пока буду юзать костыль с перезапуском потока , реально работает. Паше. Странно не замечать проблемы и косить на другие происходящие процессы , аргументы выше и статистику я приводил.

Dima: Паша а не сложно тебе сделать обертку для CopyFileExA что бы можно было его запускать с флагом COPY_FILE_NO_BUFFERING , хочу с ней поиграться и посмотреть на результат.

Dima: и вот такую SHFileOperationA

Dima: Pasha Поможешь с вопросом ?

gfilatov2002: Dima пишет: вот такую SHFileOperationA Дима! Попробуй эту функцию из библиотеки hbwin: win_SHFileOperation( [<hWnd>], [<nFunction>], [<cFrom>|<aFrom>], [<cTo>|<aTo>], [<nFlags>], [<@lAnyOperationAborted>], [<aNameMappings>], [<cProgressTitle>] ) -> <nResult> Контрольный пример из поставки Харбора: [pre2]/* * * Copyright 2010 Viktor Szakats (vszakats.net/harbour) * */ #require "hbwin" #include "simpleio.ch" PROCEDURE Main() LOCAL a LOCAL lAbort LOCAL tmp ? "0x" + hb_NumToHex( win_SHFileOperation( NIL, WIN_FO_COPY, { __FILE__, "olesrv1.prg" }, { "testcopy1" }, ; NIL, @lAbort, ; NIL, "Harbour SHFile 1" ) ) ? lAbort hb_MemoWrit( "rename.txt", "hello1" ) hb_MemoWrit( "rename1.txt", "hello2" ) a := {} ? "0x" + hb_NumToHex( win_SHFileOperation( NIL, WIN_FO_RENAME, { "rename.txt" }, { "rename1.txt" }, ; WIN_FOF_WANTMAPPINGHANDLE, @lAbort, ; a, "Harbour SHFile 2" ) ) ? lAbort FOR EACH tmp IN a ? tmp[ 1 ], tmp[ 2 ] FErase( tmp[ 1 ] ) FErase( tmp[ 2 ] ) NEXT FErase( "rename1.txt" ) ? "0x" + hb_NumToHex( win_SHFileOperation( NIL, WIN_FO_COPY, __FILE__ + Chr( 0 ) + "olesrv1.prg" + Chr( 0 ), "testcopy2", ; NIL, @lAbort, ; NIL, "Harbour SHFile 3" ) ) ? lAbort RETURN [/pre2]

Dima: gfilatov2002 пишет: Попробуй эту функцию из библиотеки hbwin: Спасибо , потестю , отпишу !

Pasha: #define COPY_FILE_NO_BUFFERING 0x00001000 proc main ? win_CopyFileEx('_cf.prg', '_cf1.prg', COPY_FILE_NO_BUFFERING) retu #pragma BEGINDUMP #include "hbapi.h" #include "windows.h" HB_FUNC( WIN_COPYFILEEX ) { hb_retl( (LONG) CopyFileEx( (LPCSTR) hb_parc(1), (LPCSTR) hb_parc(2), NULL, NULL, NULL, HB_ISNIL(3) ? 0 : (DWORD) hb_parnl(3) ) ); } #pragma ENDDUMP

Dima: Pasha gfilatov2002 Спасибо за помощь. Вопрос не решился. Поэтому перезапускаю поток если время копирования превысило N сек , работает.

Dima: Пора поюзать ROBOCOPY , интересно уже каков будет результат

PSP: Dima пишет: Пора поюзать ROBOCOPY А она умеет открытые файлы?

Dima: PSP пишет: А она умеет открытые файлы? Да , облом . не копирует открытые файлы и Xcopy тоже по ходу

Andrey: Dima пишет: Да , облом . не копирует открытые файлы и Xcopy тоже по ходу Делай тогда через Winrar или WinZip, они умеют делать архивы с открытыми файлами. Я сделал свою утилиту на МиниГуи, создаю нужный мне список файлов и делаю архив. Работает с 2013 года. Команда простая: [pre2] COMPRESS aFiles ; TO cBackupZip ; BLOCK { | cFile, nPos | ProgressUpdate( nPos, cFile, aSizeFiles, .T. ) } ; LEVEL LEVEL_ZIP ; PASSWORD cPass ; OVERWRITE ; STOREPATH ; FILEPROGRESS { | nPos, nTotal | ProgressFile( nPos, nTotal, .T. ) } ; RESULT lSuccess[/pre2]

Dima: Dima пишет: Да , облом . не копирует открытые файлы и Xcopy тоже по ходу Поправка Shared копирует , Exclusive нет

Dima: Прикольно на одном из серваков уже сделал 2 замера и время не растет , даже падает , при использовании Robocopy. Жду 2-го результата на втором серваке в другом городе. Update И на втором время не растет и тоже упало Приз получает Robocopy

Pasha: Dima пишет: Поправка Shared копирует , Exclusive нет Так работают все средства, хоть функции, хоть сторонние утилиты. На то оно и эксклюзив, что никому больше доступ к файлу не даст

PSP:

PSP: Pasha пишет: Так работают все средства, хоть функции, хоть сторонние утилиты. На то оно и эксклюзив, что никому больше доступ к файлу не даст Разрешите не согласиться. VSS с этим справляется. Она на другом уровне работает, не файловом.

Dima: Pasha пишет: Так работают все средства, хоть функции, хоть сторонние утилиты. На то оно и эксклюзив, что никому больше доступ к файлу не даст Да это я лоханулся в тестовом своем примере и написал что то типа Use nakl_r new и думал что оно в Shared по умолчанию открывается

Dima: Dima пишет: Прикольно на одном из серваков уже сделал 2 замера Уже 4 замера , время стабильно

Pasha: PSP пишет: Разрешите не согласиться. VSS с этим справляется. Она на другом уровне работает, не файловом. Ну да, прямому чтению кластеров до лампочки, как файл открыт и открыт ли он вообще А копирование открытого файла так себе затея. Во время копирования в разные участки файла другим процессом может производиться запись, и один участок успеет скопироваться до записи, другой нет, и целостность копии будет нарушена.

PSP: Pasha пишет: А копирование открытого файла так себе затея. Во время копирования в разные участки файла другим процессом может производиться запись, и один участок успеет скопироваться до записи, другой нет, и целостность копии будет нарушена. Ну, в случае с VSS это исключено. Создается моментальная теневая копия диска. Сначала блокируются изменения ВСЕХ кластеров, содержащих данные. Потом нужные данные копируются. Все изменения данных записываются в свободные кластеры, т.е., для приложения всё происходит прозрачно и незаметно. После завершения копирования теневая копия удаляется и все изменения, произошедшие за время копирования, синхронизируются. Так что ни о каком нарушении целостности не может быть и речи.

Andrey: PSP пишет: Разрешите не согласиться. VSS с этим справляется. Она на другом уровне работает, не файловом. Пропустил, что за зверь такой ?

PSP: Andrey пишет: Пропустил, что за зверь такой ? https://ru.wikipedia.org/wiki/Теневая_копия

Dima: PSP пишет: В плане бреда... А что, если дескрипторы файла "zip\..." остаются открытыми после копирования и со временем их становится много, как будто файл открыт из разных программ, а? Тут возникаю вопросы с блокировками, кэшированием и т.д. Проверил тулзой Handle от Sysinternals , не остаются открытыми , в этом плане норм. Тогда не понятна ситуация с ростом времени. Если юзать для копирования в той же проге Robocopy , то роста времени нет совсем ....прыгает от 7 до 15 секунд , это замеры за сутки

PSP: Может правда косяк в CopyFileA с кэшем?

Dima: Насчет VSS , смотрю есть тулза HoboCopy , но чёт не могу найти актуальную ссылку на нее

PSP: Dima пишет: Насчет VSS , смотрю есть тулза HoboCopy , но чёт не могу найти актуальную ссылку на нее Cobian (я тебе о ней писал) использует VSS.

PSP: Есть Cobian Backup 11 (больше не развивается). А есть Cobian Reflector (следующая). Я использую Cobian Backup. Важно: требует .Net 3.5

Dima: PSP пишет: Cobian (я тебе о ней писал) использует VSS. Это я помню , но HoboCopy работает из командной строки как и Robocopy , вот почему и отписал :)

PSP: Dima пишет: из командной строки А это обязательно? Это - служба (точнее две). Один раз настроил и всё. Дальше оно само)

Dima: PSP пишет: А это обязательно? Ну мне так удобнее , так как бекап делает моя прога , кроме остального функционала а его там много

PSP: Есть Diskshadow. Но она для серверов, вроде.

PSP: Есть еще VShadow. Тут чувак немного ее описывает: https://m151163.blogspot.com/2013/11/volume-shadow-copy-service.html

PSP: Всё, я отстал))

Dima: PSP пишет: Всё, я отстал)) Не нуно )) Значит так , нарыл Hobocopy 32 бита на Windows 7 работает на ура. На сервере Windows 2008 работать отказалась падлюка и упало с ошибкой There was a COM failure 0x80042302 - .\HoboCopy.cpp (172) Стал мучать поисковик , нарыл 64 битную версию и заработало на серваке Короче если кому надо налью оба варианта.

SergKis: Dima пишет Короче если кому надо налью оба варианта. Кинь тудой, на ftp. Спасибо

Dima: готово

Dima: SergKis Для работы из архива нужен только EXE файл

PSP: Где оно?)

Dima: PSP пишет: Где оно?) На FTP у Сергея )

Dima: PSP Лови https://www.softpedia.com/get/System/Back-Up-and-Recovery/HoboCopy.shtml#download https://web.archive.org/web/20201006123925if_/https://github.s3.amazonaws.com/downloads/candera/hobocopy/hobocopy-unstable-64bit-20110505-01.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAISTNZFOVBIJMK3TQ%2F20201006%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201006T123907Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=cb80df64052c3cbffc5e3666f96a76cda6fc13434eaa5ca44856a3470ee75916

Dima: Прошло более 2-х месяцев с момента использования Hobocopy , ни одного косяка с открытием баз не было. Бонусом так же вышло так что если база под ADS залочена вот таким образом AdsLocking( .T. ) то Hobocopy легко копирует такие базы.



полная версия страницы