PostgreSQL: ОБНОВЛЕНИЕ большой таблицы

По некоторым соображениям безопасности Git отказывается хранить любые файлы в любом каталоге с именем .git. (Если Git сделал разрешить файлы .git, файл с именем .git/hooks/commit в репозитории Git станет вашим крюком фиксации, а следующая команда, которую вы выполняете, будет запускать любые произвольные команды, которые атакующий помещает в этот файл . Есть проверка, чтобы избежать этого, но оказалось, что он был слегка сломан.) Для конкретных по конкретным конкретным причинам эта особая проблема безопасности проявляется как плохой «древовидный объект», который содержит «.git», который настраивается с помощью hasDotGit .1

Однако не каждая версия Git имеет все испытания, и, поскольку на протяжении многих лет были обнаружены новые проблемы, новые версии Git приобрели новые защиты от этих старых проблем. Если у вас установлена ​​более старая версия Git, ваш Git может разрешить сохранение небезопасных и / или неправильных элементов, таких как этот плохой объект tree. Обновление до более новой версии Git или доступ к более новой версии Git на каком-то сервере иногда будет диагностировать или даже начать отказываться от работы с плохим репозиторием.

Начиная с версии Git 2.6 , вы можете настроить Git для приема определенных элементов плохого репозитория , даже если вы включили проверку вообще. (До 2.6 вы должны просто полностью отключить проверку.) Вы можете игнорировать некоторые проблемы, понижать некоторые проблемы до уровня предупреждения, обновлять предупреждения до ошибок и / или игнорировать некоторые конкретные объекты по своим идентификаторам хеширования. Эта конфигурация должна быть выполнена на сервере ; независимо от того, как, и как, это можно сделать на серверах, которые вы используете, я не знаю. См. Также этот форум GitLab, размещающий , который предполагает, что что-то или кто-то отключил это и продолжал с течением времени.

Для справки, Git версии 2.2.1, 2.1.4, 2.0.5, 1.9.5 и 1.8.5 были точками, в которых Git начал проверять .git, записанные в NTFS и MacOS (HFS), конкретными способами и с нечувствительностью к регистру (до этого .Git или .gIt или .GIT, например, были приняты как ОК, которые обычно находятся в системах Linux / Unix). Эти проверки находятся в fsck.c и могут быть вызваны во всех операциях загрузки, загрузки и индексирования пакетов. См. Документацию git config, ища каждый экземпляр fsck, так как для включения или отключения проверки полностью существует множество настроек или изменение серьезности проблем.

Чтобы уменьшить степень серьезности hasDotGit ] до warning, вы бы сделали:

$ git config fsck.hasDotGit warning

в этом конкретном репозитории.

Помимо реконфигурирования серверов вы также можете переписать историю плохого репозитория (используя git filter-branch), чтобы превратить его в хороший репозиторий. Если вы это сделаете, вы по существу заставите всех своих пользователей повторно клонировать.


1 Точная форма текстового сообщения претерпевает интернационализацию, но по умолчанию это contains '.git', а строка конфигурации hasDotGit.

Строки конфигурации не очевидны и, похоже, не документированы должным образом. Они формируются путем взятия перечисляемых имен в источнике fsck.c и удаления всех подчеркиваний и перевода в нижний регистр, а затем в верхний верхний регистр, где бы вы ни хотели создавать имена camelCase. (Сравнение строк git config выполняется с учетом нечувствительности к регистру, поэтому вы можете настроить fsck.hasdotgit или fsck.HASDOTGIT, если хотите. CamelCase - это просто соглашение.)

0
задан Theo F 29 March 2019 в 13:37
поделиться

2 ответа

Вы не указали никаких серверных характеристик, запись 9ГБ может быть довольно быстрой на последнем оборудовании.

Вы должны быть в порядке с одним длинным обновлением - , если у вас нет одновременных записей в эту таблицу.

Распространенная уловка для решения этой проблемы (очень длинная транзакция, блокировка записи в таблицу) заключается в разделении UPDATE на диапазоны, основанные на первичном ключе, выполняемом в отдельных транзакциях.

/* Use PK or any attribute with a known distribution pattern */
UPDATE schema.table SET ... WHERE id BETWEEN 0 AND 1000000;
UPDATE schema.table SET ... WHERE id BETWEEN 1000001 AND 2000000;

Для высокого уровня одновременной записи люди используют более тонкие приемы (такие как: SELECT FOR UPDATE / NOWAIT, облегченные блокировки, логика повторных попыток и т. Д.).

0
ответ дан filiprem 29 March 2019 в 13:37
поделиться

Из моего первоначального вопроса:

Однако, выполнение этого запроса сразу для всей таблицы приводит к ошибкам «недостаточно места на диске» и «соединение с сервером потеряно» ... реже.

Оказалось, что нашей базе данных экземпляра Amazon AWS не хватает места, и мой исходный запрос ST_GeomFromText не был выполнен. Освобождение места исправило это.

На важном замечании, предложенном @mlinth, ST_Point выполнял мой запрос намного быстрее, чем ST_GeomFromText (24 минуты против 2 часов).

Мой последний запрос:

UPDATE schema.tablename
SET geom = ST_SetSRID(ST_Point(eastingcolumn,northingcolumn),27700);
0
ответ дан filiprem 29 March 2019 в 13:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: