COPY

Копирование данных между файлами и таблицами.

Синтаксис

COPY table_name [(column_name [, ...])]
FROM {'filename' | PROGRAM 'command' | STDIN}
[ [ WITH ] ( option [, ...] ) ]
[ ON SEGMENT ]

COPY { table_name [(column_name [, ...])] | (query)}
     TO {'filename' | PROGRAM 'command' | STDOUT}
     [ [ WITH ] ( option [, ...] ) ]
     [ ON SEGMENT ]

где параметр option может быть одним из следующих:

FORMAT format_name
OIDS [ boolean ]
FREEZE [ boolean ]
DELIMITER 'delimiter_character'
NULL 'null string'
HEADER [ boolean ]
QUOTE 'quote_character'
ESCAPE 'escape_character'
FORCE_QUOTE { ( column_name [, ...] ) | * }
FORCE_NOT_NULL ( column_name [, ...] ) 
FORCE_NULL ( column_name [, ...] )
ENCODING 'encoding_name'       
FILL MISSING FIELDS
LOG ERRORS [ SEGMENT REJECT LIMIT count [ ROWS | PERCENT ] ]
IGNORE EXTERNAL PARTITIONS

Описание

COPY перемещает данные между таблицами базы данных YMatrix и файлами в стандартной файловой системе. COPY TO копирует содержимое таблицы в файл (если операция выполняется на ON SEGMENT, данные будут скопированы в несколько файлов в зависимости от идентификатора сегмента), а COPY FROM копирует данные из файла в таблицу (добавляя их к уже существующим данным в таблице). COPY TO также может копировать результаты запросов SELECT.

Если указан список столбцов, COPY копирует в файл или из файла только данные указанных столбцов. Для столбцов, не включённых в список, COPY FROM вставляет значения по умолчанию.

При указании имени файла COPY инструктирует хост Master базы данных YMatrix напрямую читать или записывать файлы. Файл должен быть доступен хосту Master, а его имя должно быть задано с точки зрения этого хоста.

Когда COPY используется вместе с предложением ON SEGMENT, ON SEGMENT заставляет сегмент создавать отдельные файлы, привязанные к конкретному сегменту, которые сохраняются на хосте сегмента. Параметр filename в ON SEGMENT принимает строковый литерал <SEGID> (обязательно) и использует абсолютный путь или строковый литерал <SEG_DATA_DIR>. При выполнении операции COPY пути к идентификатору сегмента и каталогу данных сегмента заменяются соответствующими строковыми литералами.

Использование COPY TO с таблицей-копией (DISTRIBUTED REPLICATED) в качестве источника создаёт файл со строками из одного сегмента, чтобы целевой файл не содержал дублирующихся строк. Использование COPY TO с предложением ON SEGMENT и таблицы-копии в качестве источника создаёт целевой файл на хосте сегмента, содержащий все строки таблицы.

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

Примечание: рекомендуется использовать предложение ON SEGMENT только опытным пользователям. Когда указано PROGRAM, сервер выполняет указанную команду и считывает или записывает данные через стандартный ввод/вывод программы. Эта команда должна быть указана с точки зрения сервера и может выполняться пользователем gpadmin.

Когда указано STDIN или STDOUT, данные передаются через соединение между клиентом и Master. STDIN и STDOUT нельзя использовать с предложением ON SEGMENT.

Если используется SEGMENT REJECT LIMIT, операция COPY FROM будет выполняться в режиме изоляции ошибок построчно. В этой версии режим одиночной ошибки применим только к неправильно сформированным строкам во входном файле — например, избыточным или отсутствующим атрибутам, атрибутам неверного типа данных или недопустимым последовательностям кодировки клиента. Ошибки ограничений (например, нарушение ограничений NOT NULL, CHECK или UNIQUE) по-прежнему обрабатываются в режиме «всё или ничего». Пользователь может указать допустимое количество строк с ошибками (на каждый сегмент), после достижения которого вся операция COPY FROM завершается, и ни одна строка не загружается. Подсчёт строк с ошибками ведётся по каждому сегменту отдельно, а не по всей операции загрузки. Если лимит ошибок по каждому сегменту не достигнут, все строки без ошибок загружаются, а строки с ошибками отбрасываются. Чтобы сохранить строки с ошибками для дальнейшего анализа, укажите предложение LOG ERRORS для записи информации об ошибках. Сообщение об ошибке и сама строка сохраняются во внутренней базе данных YMatrix.

Результат

После успешного завершения команда COPY возвращает следующую метку команды, где count — количество скопированных строк:

COPY count

Если команда COPY FROM выполняется в режиме изоляции ошибок построчно, и ни одна строка не была загружена из-за некорректного формата, возвращается следующее уведомление, где count — количество отклонённых строк:

NOTICE: Rejected count badly formatted rows.

Параметры

table_name

  • Имя существующей таблицы (может быть указано с указанием схемы).

column_name

  • Необязательный список столбцов для копирования. Если список столбцов не указан, будут скопированы все столбцы таблицы.
    При копировании в текстовом формате строка данных в столбце типа bytea по умолчанию может составлять до 256 МБ.

query

  • Команда SELECT или VALUES, результаты которой будут скопированы. Обратите внимание, что запрос должен быть заключён в круглые скобки.

filename

  • Путь к входному или выходному файлу. Входные имена файлов могут быть абсолютными или относительными путями, но выходные имена файлов должны быть абсолютными путями. Пользователям Windows может потребоваться использовать строки E'' и удваивать обратные слэши в пути.

PROGRAM 'command'

  • Указывает команду для выполнения. В режиме COPY FROM входные данные считываются из стандартного вывода команды, а в режиме COPY TO выходные данные записываются в стандартный ввод команды. Команда должна быть указана с точки зрения хост-системы мастера базы данных YMatrix и должна быть исполняемой пользователем-администратором базы данных YMatrix (gpadmin).
    Команда вызывается через программу оболочки. При передаче параметров в оболочку необходимо удалить или экранировать любые специальные символы, имеющие особое значение для оболочки. По соображениям безопасности лучше всего использовать фиксированные строки команд или, по крайней мере, избегать передачи каких-либо пользовательских данных в строке.
    Когда указано ON SEGMENT, команда должна быть исполняемой пользователем-администратором базы данных YMatrix (gpadmin) на всех первичных хостах сегментов базы данных YMatrix. Команда выполняется каждым экземпляром сегмента YMatrix. В команде обязательно должен присутствовать <SEGID>.
    Для требований к синтаксису команды и информации о данных, подлежащих копированию при использовании этого параметра, см. предложение ON SEGMENT.

STDIN

  • Указывает, что входные данные поступают от клиентского приложения. STDIN не поддерживает предложение ON SEGMENT.

STDOUT

  • Указывает, что выходные данные направляются в клиентское приложение. STDOUT не поддерживает предложение ON SEGMENT.

boolean

  • Определяет, включена или выключена выбранная опция. Для включения опции можно указать TRUE, ON или 1, а для отключения — FALSE, OFF или 0. Логическое значение можно опустить, в этом случае предполагается TRUE.

FORMAT

  • Выбирает формат данных для чтения или записи: text, csv (значения, разделённые запятыми), или binary. По умолчанию используется text.

OIDS

  • Указывает, что для каждой строки следует копировать OID. (Если OIDS указан для таблицы без OID или при копировании результата запроса, будет возбуждена ошибка.)

FREEZE

  • Запрашивает, чтобы скопированные данные состояли из «замороженных» строк, как если бы была выполнена команда VACUUM FREEZE. Это предназначено для использования в качестве оптимизации производительности при начальной загрузке данных. Строки будут заморожены только в том случае, если таблица была создана или очищена в текущей подтранзакции, нет открытых курсоров и транзакция не имеет более старых снимков.
    Обратите внимание, что сразу после загрузки данных все другие сессии смогут их видеть. Это нарушает обычные правила видимости MVCC, и пользователи, использующие эту опцию, должны осознавать потенциальные проблемы, которые это может вызвать.

DELIMITER

  • Указывает символ, используемый для разделения столбцов в каждой строке файла. По умолчанию — символ табуляции для текстового формата и запятая для CSV-формата. Должен быть однобайтовым символом. Этот параметр недопустим при использовании двоичного формата.

NULL

  • Указывает строку, представляющую значение NULL. По умолчанию — \N для текстового формата (обратная косая черта -N) и пустая строка без кавычек для CSV-формата. В случаях, когда вы не хотите различать значения NULL и пустые строки, можно даже использовать пустую строку в текстовом формате. Этот параметр недопустим при использовании двоичного формата.
    Примечание: При использовании COPY FROM любой элемент данных, совпадающий с этой строкой, будет сохранён как значение NULL, поэтому убедитесь, что используется та же самая строка, что и в COPY TO.

HEADER

  • Указывает, что файл содержит заголовочную строку с именами столбцов. При выводе первая строка содержит имена столбцов таблицы. При вводе первая строка игнорируется. Этот параметр разрешён только при использовании CSV-формата.

QUOTE

  • Указывает символ кавычки, используемый при заключении значений данных в кавычки. По умолчанию — двойная кавычка. Должен быть однобайтовым символом. Этот параметр разрешён только при использовании CSV-формата.

ESCAPE

  • Указывает символ, который должен стоять перед символом данных, совпадающим со значением QUOTE. По умолчанию совпадает со значением QUOTE (таким образом, если символ кавычки встречается в данных, он удваивается). Должен быть однобайтовым символом. Этот параметр разрешён только при использовании CSV-формата.

FORCE_QUOTE

  • Принудительно заключает в кавычки все ненулевые значения в указанных столбцах. Значения NULL никогда не заключаются в кавычки. Если указано *, ненулевые значения во всех столбцах заключаются в кавычки. Этот параметр разрешён только в COPY TO и при использовании CSV-формата.

FORCE_NOT_NULL

  • Не сопоставляет значения указанных столбцов с пустыми строками. По умолчанию пустые строки считаются пустыми, то есть пустые значения читаются как строки нулевой длины, а не как значения NULL, даже если они не заключены в кавычки. Этот параметр разрешён только в COPY FROM и при использовании CSV-формата.

FORCE_NULL

  • Сопоставляет значения указанных столбцов с пустыми строками, даже если они заключены в кавычки. Если совпадение найдено, значение устанавливается в NULL. Этот параметр разрешён только в COPY FROM и при использовании CSV-формата.

ENCODING

  • Указывает, что файл закодирован в encoding_name. Если параметр опущен, используется текущая кодировка клиента.

ON SEGMENT

  • Указывает отдельные файлы данных сегментов на хосте сегмента. Каждый файл содержит данные таблицы, управляемые первичным экземпляром сегмента. Например, при использовании команды COPY TO...ON SEGMENT для копирования данных из таблицы в файл команда создаёт отдельный файл для каждого экземпляра сегмента на хосте сегмента. Каждый файл содержит данные таблицы, управляемые этим экземпляром сегмента.
    Команда COPY не копирует данные между зеркальными экземплярами и файлами данных сегментов.
    ON SEGMENT не поддерживает ключевые слова STDIN и STDOUT.
    Для указания абсолютных путей и имён файлов используются строковые литералы <SEG_DATA_DIR> и <SEGID> со следующим синтаксисом:
    COPY table [TO|FROM] '<SEG_DATA_DIR>/gpdumpname<SEGID>_suffix' ON SEGMENT;
    • <SEG_DATA_DIR>
      Строковый литерал, представляющий абсолютный путь к каталогу данных экземпляра сегмента, используемый для репликации ON SEGMENT. Угловые скобки (< и >) являются частью строкового литерала, используемого для указания пути. Когда выполняется команда COPY, строковый литерал заменяется путём к сегменту. Вместо строкового литерала <SEG_DATA_DIR> можно использовать абсолютный путь.
    • <SEGID>
      Строковый литерал, представляющий номер идентификатора контента (content ID) экземпляра сегмента, подлежащего репликации при ON SEGMENT. При указании ON SEGMENT строковой литерал <SEGID> является обязательной частью имени файла. Угловые скобки являются частью строкового литерала, используемого для указания имени файла.
      При использовании COPY TO строковый литерал заменяется идентификатором контента экземпляра сегмента при выполнении команды COPY.
      При использовании COPY FROM укажите идентификатор контента экземпляра сегмента в имени файла и поместите файл на хост экземпляра сегмента. На хосте должен быть файл для каждого первичного экземпляра сегмента. При выполнении команды COPY FROM данные копируются из файла в экземпляр сегмента.

NEWLINE

  • Указывает символ новой строки, используемый в файле данных: LF (перевод строки, 0x0A), CR (возврат каретки, 0x0D) или CRLF (возврат каретки и перевод строки, 0x0D 0x0A). Если не указано, сегмент YMatrix определит тип новой строки, анализируя первую строку полученных данных, и использует первый встретившийся тип новой строки.

CSV

  • Выбирает режим значений, разделённых запятыми (CSV).

FILL MISSING FIELDS

  • В режимах TEXT и CSV при указании COPY FROM и FILL MISSING FIELDS отсутствующие в конце строки поля данных будут установлены в NULL (вместо генерации ошибки). Пустые строки, поля с ограничениями NOT NULL и разделители в конце строки всё равно вызовут ошибку.

LOG ERRORS

  • Необязательное предложение, которое может предваряться предложением SEGMENT REJECT LIMIT для сбора информации об ошибках в журнале для строк с неправильным форматом.
    Информация об ошибках хранится внутренне и может быть получена с помощью встроенной SQL-функции gp_read_error_log() базы данных YMatrix.

SEGMENT REJECT LIMIT count [ROWS | PERCENT]

  • Запускает операцию COPY FROM в режиме изоляции ошибок по одной строке. Если входные строки имеют неправильный формат, они будут отброшены, пока количество отклонённых строк не достигнет заданного предела на любом экземпляре сегмента YMatrix во время операции загрузки. Предельное количество можно указать как число строк (по умолчанию) или процент от общего числа строк (1–100). При использовании PERCENT каждый сегмент начинает рассчитывать процент неверных строк только после обработки количества строк, указанного параметром gp_reject_percent_threshold. Значение по умолчанию для gp_reject_percent_threshold составляет 300 строк. Ошибки ограничений (например, нарушение ограничений NOT NULL, CHECK или UNIQUE) по-прежнему обрабатываются в режиме «всё или ничего». Если предел не достигнут, все корректные строки загружаются, а все некорректные — отбрасываются.
    Примечание: Если SEGMENT REJECT LIMIT не активировано или не указано, база данных YMatrix ограничивает количество начальных строк, которые могут содержать неправильно сформированные данные. Если первые 1000 строк будут отклонены, операция COPY прекратится и будет откатываться.
    Ограничение на начальное количество отклонённых строк можно изменить с помощью параметра конфигурации сервера YMatrix gp_initial_bad_row_limit.

IGNORE EXTERNAL PARTITIONS

  • При копировании данных из секционированной таблицы данные не копируются из листовых секций внешней таблицы. Когда данные не копируются, сообщение добавляется в файл журнала.
    Если этот параметр не указан, и база данных YMatrix пытается скопировать данные из листовой секции, являющейся внешней таблицей, возвращается ошибка.
    Информацию об указании SQL-запросов для копирования данных из листовой секции, являющейся внешней таблицей, см. в следующем разделе «Замечания».

Замечания

COPY можно использовать только с таблицами, но не с внешними таблицами или представлениями. Однако вы можете выполнить COPY (SELECT * FROM viewname) TO ...

При указании предложения ON SEGMENT команда COPY не поддерживает указание оператора SELECT в команде COPY TO. Например, следующая команда не поддерживается:

COPY (SELECT * FROM testtbl) TO '/tmp/mytst<SEGID>' ON SEGMENT

COPY работает только с конкретными именованными таблицами; она не копирует данные между дочерними таблицами. Таким образом, например, COPY table TO показывает те же данные, что и SELECT * FROM ONLY table. Однако COPY (SELECT * FROM table) TO ... можно использовать для дампа всех данных в иерархии наследования.

Аналогично, чтобы скопировать данные из секционированной таблицы, имеющей листовые секции в виде внешних таблиц, используйте SQL-запрос для копирования данных. Например, если таблица my_sales содержит листовые секции в виде внешних таблиц, то команда COPY my_sales TO stdout вернёт ошибку. Эта команда отправляет данные в stdout:

Ключевое слово BINARY заставляет все данные храниться/считываться в двоичном формате вместо текстового. Он немного быстрее обычного текстового режима, но двоичные файлы менее переносимы между различными архитектурами компьютеров и версиями базы данных YMatrix. Кроме того, COPY FROM не может работать в режиме изоляции ошибок по одной строке, если данные находятся в двоичном формате.

Вы должны иметь привилегию SELECT на таблицу, из которой читаете через COPY TO, и привилегию INSERT на таблицу, в которую вставляете через COPY FROM. Достаточно наличия привилегий на столбцы, указанные в команде.

Файлы, указанные в команде COPY, читаются или записываются непосредственно сервером базы данных, а не клиентским приложением. Поэтому они должны находиться на хосте мастера базы данных YMatrix или быть доступны ему (а не клиенту). Доступ к ним и права на чтение или запись должны иметь пользователь системы YMatrix (учётная запись, от имени которой работает сервер), а не клиент. Команда COPY разрешена только суперпользователям базы данных, поскольку позволяет читать или записывать любой файл, к которому имеет доступ сервер.

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

Ввод и вывод COPY зависят от DateStyle. Чтобы обеспечить переносимость на другие установки YMatrix, которые могут использовать нестандартные настройки DateStyle, установите DateStyle в ISO перед использованием COPY TO. Также рекомендуется избегать дампа данных с установленным IntervalStyle в sql_standard, так как серверы с другими настройками IntervalStyle могут неправильно интерпретировать отрицательные значения интервалов.

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

При копировании XML-данных из файла в текстовом режиме параметр конфигурации сервера xmloption влияет на проверку копируемых XML-данных. Если значение content (по умолчанию), XML-данные проверяются как фрагмент содержимого XML. Если значение параметра document, XML-данные проверяются как документ XML. Если XML-данные недействительны, COPY возвращает ошибку.

По умолчанию COPY останавливает операцию при первой ошибке. Если это происходит в COPY TO, проблем не должно быть, но целевая таблица в COPY FROM уже получила предыдущие строки. Эти строки будут невидимыми или недоступными, но они по-прежнему занимают место на диске. Если сбой произойдёт при большой операции COPY FROM, может быть потрачено значительное количество дискового пространства. Возможно, вам потребуется вызвать VACUUM, чтобы восстановить потерянное пространство. Другой вариант — использовать режим изоляции ошибок по одной строке, чтобы отфильтровать ошибочные строки, продолжая загружать правильные.

При выполнении команды COPY FROM...ON SEGMENT параметр конфигурации сервера gp_enable_segment_copy_checking определяет, проверяется ли политика распределения таблицы (из предложения DISTRIBUTED таблицы) при копировании данных в таблицу. По умолчанию политика распределения проверяется. Если строка данных нарушает политику распределения экземпляра сегмента, возвращается ошибка.

Команды COPY TO...ON SEGMENT создают данные таблицы, которые можно использовать для восстановления данных таблицы с помощью COPY FROM...ON SEGMENT. Однако при создании файлов командой COPY TO данные, восстанавливаемые в сегмент, распределяются в соответствии с политикой распределения таблицы. Если вы попытаетесь восстановить данные таблицы, а политика распределения таблицы была изменена после выполнения COPY FROM...ON SEGMENT, команда COPY может вернуть ошибку политики распределения таблицы.

Примечание: Если вы выполнили COPY FROM...ON SEGMENT, а параметр конфигурации сервера gp_enable_segment_copy_checking равен false, вам может потребоваться вручную перераспределить данные таблицы. См. предложение ALTER TABLE WITH REORGANIZE.

При указании предложения LOG ERRORS база данных YMatrix фиксирует ошибки, возникающие при чтении данных внешней таблицы. Вы можете просматривать и управлять зафиксированными данными журнала ошибок.

  • Используйте встроенную SQL-функцию gp_read_error_log('table_name'). Требуется привилегия SELECT на table_name. В этом примере используется команда COPY для отображения информации журнала ошибок при загрузке данных в таблицу ext_expenses:
    SELECT * from gp_read_error_log('ext_expenses');
  • Если у указанной таблицы есть данные журнала ошибок, новые данные журнала ошибок будут добавлены к существующим. Информация журнала ошибок не копируется на зеркало.
  • Используйте встроенную SQL-функцию gp_truncate_error_log('table_name') для удаления данных журнала ошибок для table_name. Требуются привилегии владельца таблицы. В этом примере удаляется информация журнала ошибок, зафиксированная при перемещении данных в таблицу ext_expenses:
    SELECT gp_truncate_error_log('ext_expenses');
    Если table_name не существует, функция возвращает FALSE.
    Укажите подстановочный знак *, чтобы удалить данные журнала ошибок для всех таблиц в текущей базе данных. Укажите строку *.*, чтобы удалить все данные журнала ошибок базы данных, включая данные, которые не были удалены из-за предыдущих проблем с базой данных. Если вы указываете *, вам нужны привилегии владельца базы данных. Если вы указываете *.*, вам нужны привилегии суперпользователя операционной системы.

Когда пользователь базы данных YMatrix, не являющийся суперпользователем, выполняет команду COPY, выполнение команды может контролироваться очередью ресурсов. Очередь ресурсов должна быть настроена с параметром ACTIVE_STATEMENTS, который указывает максимальное количество запросов, которые роли, назначенные очереди, могут выполнять. База данных YMatrix не применяет стоимостные или объёмные значения к командам COPY, поэтому очереди ресурсов, имеющие только стоимостные или объёмные ограничения, не влияют на работу команд COPY.

Несуперпользователи могут выполнять только следующие типы команд COPY:

  • Команды COPY FROM с источником STDIN
  • Команды COPY TO с целью STDOUT

Форматы файлов

Форматы файлов, поддерживаемые COPY.

Текстовый формат

При использовании текстового формата данные, считываемые или записываемые, представляют собой текстовый файл, в котором одна строка соответствует одной строке таблицы. Столбцы в строке разделяются символом delimiter_character (по умолчанию — табуляция). Значения столбцов представляют собой строки, генерируемые функцией вывода типа данных каждого атрибута, либо строки, допустимые для функции ввода. Пустая строка используется для обозначения значения NULL в столбце. Если в любом ряду входного файла будет больше или меньше столбцов, чем ожидается, COPY FROM выдаст ошибку. Если указан параметр OIDS, OID считывается или записывается как первый столбец перед столбцами пользовательских данных.

Файлы данных содержат два зарезервированных символа, имеющих особое значение для COPY:

  • Указанный разделитель (по умолчанию — табуляция), используемый для разделения полей в файле данных.
  • Новая строка в стиле UNIX (\n или 0x0a), используемая для обозначения конца строки в файле данных. Приложениям, генерирующим данные COPY, настоятельно рекомендуется преобразовывать символы новой строки в формат UNIX, а не использовать символы возврата каретки в стиле Microsoft Windows (\r\n или 0x0a 0x0d).

Если один из этих символов встречается в данных, он должен быть экранирован, чтобы COPY интерпретировал его как данные, а не как разделитель поля или конец строки.

По умолчанию символ экранирования для текстовых файлов — \ (обратная косая черта), а для CSV-файлов — " (двойные кавычки). Если вы хотите использовать другой символ экранирования, вы можете указать его с помощью предложения ESCAPE AS. Убедитесь, что выбранный вами символ экранирования нигде не встречается в файле данных как обычное значение. Вы также можете отключить экранирование в текстовых файлах, используя ESCAPE 'OFF'.

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

  • Знак процента = %
  • Вертикальная черта = |
  • Обратная косая черта = \

Вы указываете delimiter_character как | (символ вертикальной черты), а символ экранирования — как * (звездочка). Отформатированная строка в файле данных будет выглядеть так:

percentage sign = % | vertical bar = *| | backslash = \

Обратите внимание, как символ вертикальной черты в данных экранирован звездочкой. Также обратите внимание, что поскольку мы используем альтернативный символ экранирования, нам не нужно экранировать обратную косую черту.

Если любой из следующих символов встречается в значении столбца, за ним должен следовать символ экранирования: сам символ экранирования, символ новой строки, возврат каретки и текущий разделитель. Вы можете указать другой символ экранирования с помощью предложения ESCAPE AS.

Формат CSV

Этот параметр формата используется для импорта и экспорта файлов с разделителями-запятыми (CSV), формата, применяемого во многих других программах (например, электронных таблицах). Он генерирует и распознаёт распространённые механизмы экранирования CSV, а не правила экранирования, используемые стандартным текстовым форматом базы данных YMatrix.

Значения в каждой записи разделяются символом DELIMITER. Если значение содержит разделитель, символ QUOTE, символ ESCAPE (по умолчанию — двойные кавычки), строку NULL, возврат каретки или символ новой строки, всё значение заключается в кавычки с помощью символа QUOTE. При выводе непустых значений в определённом столбце можно также использовать FORCE_QUOTE для принудительного заключения в кавычки.

В формате CSV нет стандартного способа различать значения NULL и пустые строки. База данных YMatrix COPY решает эту проблему с помощью кавычек. Значения NULL выводятся как строка параметра NULL без кавычек, тогда как непустые значения, совпадающие со строкой NULL, заключаются в кавычки. Например, при использовании настроек по умолчанию NULL записывается как пустая строка без кавычек, а пустые строковые значения записываются как двойные кавычки (""). Чтение значений следует аналогичным правилам. Вы можете использовать FORCE_NOT_NULL, чтобы избежать сравнения входных данных с NULL для конкретных столбцов.

Так как обратная косая черта не является специальным символом в формате CSV, маркер окончания данных \. также может встречаться как значение данных. Чтобы избежать неоднозначности, значения данных, совпадающие с \. в строке, автоматически заключаются в кавычки при выводе и не интерпретируются как маркер окончания данных при вводе, если они заключены в кавычки. Если вам нужно загрузить файл, созданный другим приложением, содержащий одностолбцовые строки без кавычек и потенциально имеющий значения \., возможно, вам придётся использовать это значение во входном файле.

Примечание: В формате CSV все символы являются допустимыми. Пробелы и любые другие символы внутри кавычек, кроме DELIMITER, включаются. Если вы импортируете данные из системы, которая заполняет строки CSV до фиксированной ширины пробелами в конце, это может привести к ошибкам. В этом случае может потребоваться предварительная обработка CSV-файла для удаления завершающих пробелов перед импортом данных в базу данных YMatrix.

Формат CSV распознаёт и генерирует CSV-файлы со значениями в кавычках, содержащими встроенные возвраты каретки и символы новой строки. Таким образом, в отличие от текстовых файлов, файлы не ограничиваются строго одной строкой на строку таблицы.

Примечание: Многие программы генерируют нестандартные (иногда некорректные) CSV-файлы, поэтому формат скорее является де-факто стандартом. Поэтому вы можете столкнуться с файлами, которые невозможно импортировать с помощью этого механизма, а COPY может создавать файлы, которые другие программы не смогут обработать.

Двоичный формат

Опция двоичного формата заставляет все данные храниться/считываться в двоичном формате вместо текстового. Он немного быстрее текстового и CSV-форматов, но двоичные файлы менее переносимы между различными архитектурами компьютеров и версиями базы данных YMatrix. Аналогично, двоичный формат очень специфичен для типов данных. Например, хотя это работает в текстовом формате, вывод двоичных данных из столбца smallint и их чтение в столбец integer работать не будет.

Двоичный формат файла состоит из заголовка файла, нуля или более кортежей, содержащих данные строк, и конца файла. Заголовок и данные находятся в сетевом порядке байтов.

  • Заголовок файла — Заголовок состоит из 15-байтового фиксированного поля, за которым следует область расширения заголовка переменной длины. Фиксированные поля:
    • Подпись — 11-байтовая последовательность PGCOPY\n\377\r\n\0 — Обратите внимание, что нулевой байт является обязательной частью подписи. (Подпись предназначена для облегчения обнаружения файлов, повреждённых при передаче через не-8-бит-чистые каналы. Эта подпись проходит через фильтры преобразования окончаний строк, не теряет нулевые байты, не теряет старшие биты и не изменяет чётность.)
    • Поле идентификатора — 32-битное целое число-маска, указывающее важные аспекты формата файла. Биты нумеруются от 0 (младший бит) до 31 (старший бит). Обратите внимание, что это поле хранится в сетевом порядке байтов (старший байт первым), как и все целочисленные поля, используемые в формате файла. Зарезервированные биты 16–31 указывают на критические вопросы формата файла; если читающая сторона обнаруживает какие-либо неожиданные установленные биты в этом диапазоне, она должна прекратить чтение. Зарезервированные биты 0–15 указывают на обратно совместимые вопросы формата; читающая сторона должна просто игнорировать любые неожиданные установленные биты в этом диапазоне. В настоящее время определён только один флаг; остальные должны быть нулевыми (если в данных есть OID, бит 16 равен 1, иначе 0).
    • Длина области расширения заголовка файла — 32-битное целое число, указывающее длину в байтах оставшейся части заголовка файла, не включая само это поле. В настоящее время оно равно нулю, и сразу после него следует первый кортеж. В будущем изменения формата могут позволить размещать другие данные в заголовке файла. Читающие программы должны молча пропускать любые данные расширения заголовка, которые они не умеют обрабатывать. Предполагается, что область расширения заголовка будет содержать серию блоков с собственной идентификацией. Поле флагов не предназначено для информирования читающей стороны о содержимом области расширения. Конкретный дизайн содержимого расширения заголовка остаётся на усмотрение будущих версий.
  • Кортеж — Каждый кортеж начинается с 16-битного целого числа — количества полей в кортеже. (В настоящее время все кортежи в таблице будут иметь одинаковое количество, но это может измениться.) Затем для каждого поля в кортеже следует 32-битное длинное слово, за которым следует столько байт данных поля. (Слово длины не включает себя и может быть нулём.) В особом случае -1 оно указывает на значение NULL. В случае NULL байты значения отсутствуют.
    Между полями нет дополнительных пробелов выравнивания или других дополнительных данных.
    В настоящее время все значения данных в двоичных файлах предполагаются в двоичном формате (код формата 1). Можно ожидать, что будущие расширения добавят поле заголовка файла для указания кодов формата по столбцам.
    Если OID присутствуют в файле, поле OID следует сразу после счётчика полей. Это обычное поле, за исключением того, что оно не учитывается в счётчике полей. В частности, оно имеет слово длины — это позволяет легко обрабатывать 4-байтовые и 8-байтовые OID, и при необходимости OID может быть представлен как NULL.
  • Конец файла — Конец файла состоит из 16-битного целого числа, содержащего -1. Это легко отличает его от счётчика полей кортежа. Если счётчик полей не равен -1 и не соответствует ожидаемому количеству столбцов, программа чтения должна сообщить об ошибке. Это обеспечивает дополнительную проверку на случай потери синхронизации с данными.

Примеры

Копирование таблицы на клиент с использованием вертикальной черты (|) в качестве разделителя полей:

COPY country TO STDOUT (DELIMITER '|');

Копирование данных из файла в таблицу country:

COPY country FROM '/home/usr1/sql/country_data';

Копирование только тех стран, название которых начинается с 'A', в файл:

COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO
  '/home/usr1/sql/a_list_countries.copy';

Копирование данных из файла в таблицу sales с логированием ошибок в режиме одиночной строки изоляции ошибок:

COPY sales FROM '/home/usr1/sql/sales_data' LOG ERRORS
   SEGMENT REJECT LIMIT 10 ROWS;

Чтобы скопировать данные сегментов для последующего использования, используйте предложение ON SEGMENT. Команда COPY TO ON SEGMENT используется следующим образом:

COPY table TO '<SEG_DATA_DIR>/gpdumpname<SEGID>_suffix' ON SEGMENT;

<SEGID> обязателен. Однако вы можете заменить строковый литерал <SEG_DATA_DIR> в пути абсолютным путём.

При передаче строковых литералов <SEG_DATA_DIR> и <SEGID> в COPY значение COPY будет автоматически заполнено при выполнении операции.

Например, если ваш mytable содержит следующие сегменты и зеркала:

contentid | dbid | file segment location
    0 | 1 | /home/usr1/data1/gpsegdir0
    0 | 3 | /home/usr1/data_mirror1/gpsegdir0
    1 | 4 | /home/usr1/data2/gpsegdir1
    1 | 2 | /home/usr1/data_mirror2/gpsegdir1

Выполните команду:

COPY mytable TO '<SEG_DATA_DIR>/gpbackup<SEGID>.txt' ON SEGMENT;

Будет сгенерирована следующая строка:

/home/usr1/data1/gpsegdir0/gpbackup0.txt
/home/usr1/data2/gpsegdir1/gpbackup1.txt

Идентификатор контента в первом столбце — это идентификатор, вставляемый в путь к файлу (например, gpsegdir0/gpbackup0.txt выше). Файлы создаются на сегменте, а не на мастере, точно так же, как и при стандартных операциях COPY. При копировании с ON SEGMENT файлы данных для зеркал не создаются.

Если указан абсолютный путь вместо <SEG_DATA_DIR>, например в выражении

COPY mytable TO '/tmp/gpdir/gpbackup_<SEGID>.txt' ON SEGMENT;

Файл будет помещён в директорию /tmp/gpdir каждого сегмента. Если требуется перераспределение, инструмент gpfdist также может использоваться для восстановления файлов данных, созданных COPY TO, с помощью опции ON SEGMENT. Примечание: Вы можете использовать такие инструменты, как gpfdist, для восстановления данных. Инструмент резервного копирования/восстановления не подходит для файлов, созданных вручную с помощью COPY TO ON SEGMENT. В этом примере данные копируются из таблицы lineitem с использованием предложения PROGRAM для добавления данных в файл /tmp/lineitem_program.csv с помощью утилиты cat. Этот файл размещается на мастер-узле базы данных YMatrix.

COPY LINEITEM TO PROGRAM 'cat > /tmp/lineitem.csv' CSV;

В этом примере используются предложения PROGRAM и ON SEGMENT для копирования данных в файл на хосте сегмента. На хосте сегмента команда COPY заменяет <SEGID> на идентификатор контента сегмента, создавая файл для каждого экземпляра сегмента на хосте сегмента.

COPY LINEITEM TO PROGRAM 'cat > /tmp/lineitem_program<SEGID>.csv' ON SEGMENT CSV;

В этом примере используются предложения PROGRAM и ON SEGMENT для копирования данных из файлов на хосте сегмента. При копировании данных из файла команда COPY заменяет <SEGID> на идентификатор контента сегмента. На хосте сегмента каждый экземпляр сегмента должен иметь файл с именем, содержащим идентификатор контента сегмента.

COPY LINEITEM_4 FROM PROGRAM 'cat /tmp/lineitem_program<SEGID>.csv' ON SEGMENT CSV;

Совместимость

В стандарте SQL нет оператора COPY.

Следующий синтаксис использовался в более ранних версиях баз данных YMatrix и по-прежнему поддерживается:

COPY table_name [(column_name [, ...])] FROM
                    {'filename' | PROGRAM 'command' | STDIN}
    [ [WITH]
      [ON SEGMENT]
      [BINARY]
      [OIDS]
      [HEADER]
      [DELIMITER [ AS ] 'delimiter_character']
      [NULL [ AS ] 'null string']
      [ESCAPE [ AS ] 'escape' | 'OFF']
      [NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
      [CSV [QUOTE [ AS ] 'quote']
           [FORCE NOT NULL column_name [, ...]]
      [FILL MISSING FIELDS]
      [[LOG ERRORS]
      SEGMENT REJECT LIMIT count [ROWS | PERCENT] ]

COPY { table_name [(column_name [, ...])] | (query)} TO {'filename' | PROGRAM 'command' | STDOUT}
      [ [WITH]
        [ON SEGMENT]
        [BINARY]
        [OIDS]
        [HEADER]
        [DELIMITER [ AS ] 'delimiter_character']
        [NULL [ AS ] 'null string']
        [ESCAPE [ AS ] 'escape' | 'OFF']
        [CSV [QUOTE [ AS ] 'quote']
             [FORCE QUOTE column_name [, ...]] | * ]
      [IGNORE EXTERNAL PARTITIONS ]

Обратите внимание, что в этом синтаксисе BINARY и CSV считаются независимыми ключевыми словами, а не параметрами опции FORMAT.