32.1. Функции управления подключением к базе данных#
32.1. Функции управления подключением к базе данных
Следующие функции отвечают за установление соединения с сервером базы данных Tantor SE. Приложение может иметь несколько открытых соединений с сервером одновременно. (Одна из причин для этого - доступ к нескольким базам данных). Каждое соединение представлено структурой PGconn
.
объект, который получается из функции PQconnectdb
, PQconnectdbParams
или PQsetdbLogin
. Обратите внимание, что эти функции всегда возвращают указатель на ненулевой объект, если, возможно, не хватает памяти даже для выделения объекта PGconn
. Функцию PQstatus
следует вызывать для проверки возвращаемого значения успешного подключения перед отправкой запросов через объект подключения.
Предупреждение
Если ненадежные пользователи имеют доступ к базе данных, которая не приняла
безопасный шаблон использования схем,
начните каждую сессию с удаления общедоступных схем из
search_path
. Можно установить параметр ключевого
слова options
со значением -csearch_path=
.
В качестве альтернативы можно выполнить PQexec(
после
подключения. Это соображение не является специфичным
для libpq; оно применимо к любому интерфейсу для
выполнения произвольных SQL-команд.
conn
, "SELECT
pg_catalog.set_config('search_path', '', false)")
Предупреждение
На Unix, создание процесса с открытыми соединениями libpq может привести к непредсказуемым результатам, поскольку родительский и дочерний процессы разделяют одни и те же сокеты и ресурсы операционной системы. По этой причине такое использование не рекомендуется, хотя выполнение функции exec
из дочернего процесса для загрузки нового исполняемого файла безопасно.
PQconnectdbParams
Устанавливает новое соединение с сервером базы данных.
PGconn *PQconnectdbParams(const char * const *keywords, const char * const *values, int expand_dbname);
Эта функция открывает новое подключение к базе данных, используя параметры, взятые из двух
NULL
-терминированных массивов. Первый,keywords
, определен как массив строк, каждая из которых является ключевым словом. Второй,values
, задает значение для каждого ключевого слова. В отличие отPQsetdbLogin
ниже, набор параметров может быть расширен без изменения сигнатуры функции, поэтому использование этой функции (или ее неблокирующих аналоговPQconnectStartParams
иPQconnectPoll
) предпочтительно для нового программирования приложений.Все ключевые слова параметров, которые в настоящее время распознаются, перечислены в Раздел 32.1.2.
Все переданные массивы могут быть пустыми, чтобы использовать все параметры по умолчанию, или могут содержать одну или несколько настроек параметров. Они должны быть одинаковой длины. Обработка остановится при первом вхождении
NULL
в массивеkeywords
. Кроме того, если значениеvalues
, связанное с ненулевым значениемkeywords
, являетсяNULL
или пустой строкой, это значение будет проигнорировано, и обработка продолжится с следующей парой элементов массива.Когда
expand_dbname
не равно нулю, значение для первого ключевого словаdbname
проверяется, чтобы увидеть, является ли оно строкой подключения. Если это так, оно “расширяется” в отдельные параметры подключения, извлеченные из строки. Значение считается строкой подключения, а не просто именем базы данных, если оно содержит знак равенства (=
) или начинается с указателя схемы URI. (Подробнее о форматах строки подключения см. в разделе Раздел 32.1.1). Только первое вхождениеdbname
обрабатывается таким образом; любой последующий параметрdbname
обрабатывается как обычное имя базы данных.В общем случае массивы параметров обрабатываются от начала до конца. Если ключевое слово повторяется, используется последнее значение (которое не является
NULL
или пустым). Это правило особенно применяется, когда ключевое слово, найденное в строке подключения, конфликтует с ключевым словом, появляющимся в массивеkeywords
. Таким образом, программист может определить, могут ли элементы массива переопределять или быть переопределены значениями, взятыми из строки подключения. Элементы массива, появляющиеся перед расширенным параметромdbname
, могут быть переопределены полями строки подключения, и в свою очередь эти поля переопределяются элементами массива, появляющимися после параметраdbname
(но только если эти элементы предоставляют непустые значения).После обработки всех элементов массива и любых расширенных строк подключения, все параметры подключения, которые остаются неустановленными, заполняются значениями по умолчанию. Если соответствующая переменная среды (см. Раздел 32.15) для неустановленного параметра установлена, то используется ее значение. Если переменная среды также не установлена, то используется встроенное значение параметра по умолчанию.
PQconnectdb
Устанавливает новое соединение с сервером базы данных.
PGconn *PQconnectdb(const char *conninfo);
Эта функция открывает новое соединение с базой данных, используя параметры, взятые из строки
conninfo
.Переданная строка может быть пустой, чтобы использовать все параметры по умолчанию, или она может содержать одну или несколько настроек параметров, разделенных пробелами, или она может содержать URI. См. Раздел 32.1.1 для получения подробной информации.
PQsetdbLogin
Устанавливает новое соединение с сервером базы данных.
PGconn *PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd);
Это предшественник
PQconnectdb
с фиксированным набором параметров. Он имеет ту же функциональность, за исключением того, что отсутствующие параметры всегда принимают значения по умолчанию. ЗапишитеNULL
или пустую строку для любого из фиксированных параметров, которые должны быть установлены по умолчанию.Если тег
dbName
содержит знак=
или имеет допустимый префикс подключения URI, он рассматривается как строкаconninfo
точно так же, как если бы он был передан вPQconnectdb
, а оставшиеся параметры затем применяются так, как указано дляPQconnectdbParams
.pgtty
больше не используется и любое переданное значение будет проигнорировано.PQsetdb
Устанавливает новое соединение с сервером базы данных.
PGconn *PQsetdb(char *pghost, char *pgport, char *pgoptions, char *pgtty, char *dbName);
Это макрос, который вызывает
PQsetdbLogin
с нулевыми указателями для параметровlogin
иpwd
. Он предоставляется для обратной совместимости с очень старыми программами.PQconnectStartParams
PQconnectStart
PQconnectPoll
Установите соединение с сервером базы данных в неблокирующем режиме.
PGconn *PQconnectStartParams(const char * const *keywords, const char * const *values, int expand_dbname); PGconn *PQconnectStart(const char *conninfo); PostgresPollingStatusType PQconnectPoll(PGconn *conn);
Эти три функции используются для открытия соединения с сервером базы данных таким образом, чтобы поток выполнения вашего приложения не блокировался при удаленном вводе-выводе. Суть этого подхода заключается в том, что ожидание завершения ввода-вывода может происходить в основном цикле приложения, а не внутри
PQconnectdbParams
илиPQconnectdb
, и поэтому приложение может управлять этой операцией параллельно с другими действиями.С помощью тега
PQconnectStartParams
устанавливается соединение с базой данных, используя параметры, взятые из массивовkeywords
иvalues
, и управляемое параметромexpand_dbname
, как описано выше дляPQconnectdbParams
.С помощью функции
PQconnectStart
создается соединение с базой данных, используя параметры, взятые из строкиconninfo
, как описано выше дляPQconnectdb
.Ни
PQconnectStartParams
ниPQconnectStart
ниPQconnectPoll
не будут блокировать, при условии соблюдения ряда ограничений:Параметр
hostaddr
должен быть использован правильно, чтобы избежать выполнения DNS-запросов. См. документацию по этому параметру в Раздел 32.1.2 для получения подробной информации.Если вы вызываете
PQtrace
, убедитесь, что объект потока, в который вы осуществляете трассировку, не будет блокироваться.Убедитесь, что сокет находится в соответствующем состоянии перед вызовом функции
PQconnectPoll
, как описано ниже.
Для начала неблокирующего запроса на подключение вызовите функцию
PQconnectStart
илиPQconnectStartParams
. Если результат равен null, то libpq не смог выделить новую структуруPGconn
. В противном случае будет возвращен действительный указатель наPGconn
(хотя пока еще не представляющий действительное подключение к базе данных). Затем вызовитеPQstatus(conn)
. Если результат равенCONNECTION_BAD
, то попытка подключения уже не удалась, обычно из-за недопустимых параметров подключения.Если функция
PQconnectStart
илиPQconnectStartParams
успешно выполняется, следующим этапом является опрос libpq, чтобы он мог продолжить последовательность подключения. Используйте функциюPQsocket(conn)
, чтобы получить дескриптор сокета, лежащего в основе соединения с базой данных. (Осторожно: не предполагайте, что сокет остается тем же самым при вызовахPQconnectPoll
). Повторяйте следующий цикл: ЕслиPQconnectPoll
в последний раз вернулаPGRES_POLLING_READING
, подождите, пока сокет будет готов к чтению (как указано функциейselect()
,poll()
или аналогичной системной функцией). Затем снова вызовитеPQconnectPoll(conn)
. Соответственно, еслиPQconnectPoll(conn)
в последний раз вернулаPGRES_POLLING_WRITING
, подождите, пока сокет будет готов к записи, затем снова вызовите PQconnectPoll(conn). На первой итерации, то есть, если вы еще не вызывалиPQconnectPoll(conn)
, ведите себя так, как если бы она в последний раз вернулаPGRES_POLLING_WRITING
. Продолжайте этот цикл, покаPQconnectPoll(conn)
не вернетPGRES_POLLING_FAILED
, указывающий на неудачу процедуры подключения, илиPGRES_POLLING_OK
, указывающий на успешное установление соединения.В любой момент соединения можно проверить его состояние, вызвав функцию
PQstatus
. Если эта функция возвращает значениеCONNECTION_BAD
, то процедура соединения завершилась неудачно; если функция возвращает значениеCONNECTION_OK
, то соединение готово. Оба этих состояния можно определить по возвращаемому значению функцииPQconnectPoll
, описанной выше. Во время (и только во время) асинхронной процедуры соединения могут возникать и другие состояния. Они указывают на текущий этап процедуры соединения и могут быть полезны, например, для обратной связи с пользователем. Эти состояния:CONNECTION_STARTED
Ожидание установления соединения.
CONNECTION_MADE
Соединение установлено; ожидание отправки.
CONNECTION_AWAITING_RESPONSE
Ожидание ответа от сервера.
CONNECTION_AUTH_OK
Получена аутентификация; ожидание завершения запуска бэкенда.
CONNECTION_SSL_STARTUP
Установка SSL шифрования.
CONNECTION_SETENV
Согласование параметров, зависящих от окружения.
CONNECTION_CHECK_WRITABLE
Проверка возможности подключения для обработки записи транзакций.
CONNECTION_CONSUME
Сохранение всех сообщений ответа на подключении.
Обратите внимание, что, хотя эти константы останутся (для поддержания совместимости), приложение никогда не должно полагаться на их порядок или наличие, или на то, что статус всегда будет одним из этих документированных значений. Приложение может сделать что-то вроде этого:
switch(PQstatus(conn)) { case CONNECTION_STARTED: feedback = "Connecting..."; break; case CONNECTION_MADE: feedback = "Connected to server..."; break; . . . default: feedback = "Connecting..."; }
Время ожидания подключения
connect_timeout
игнорируется при использованииPQconnectPoll
; это ответственность приложения решить, прошло ли слишком много времени. В противном случае, последовательное выполнениеPQconnectStart
и циклаPQconnectPoll
эквивалентноPQconnectdb
.Обратите внимание, что когда
PQconnectStart
илиPQconnectStartParams
возвращает ненулевой указатель, вы должны вызватьPQfinish
, когда закончите работу с ним, чтобы освободить структуру и все связанные блоки памяти. Это необходимо сделать даже в случае неудачной попытки подключения или ее отмены.PQconndefaults
Возвращает параметры подключения по умолчанию.
PQconninfoOption *PQconndefaults(void); typedef struct { char *keyword; /* The keyword of the option */ char *envvar; /* Fallback environment variable name */ char *compiled; /* Fallback compiled in default value */ char *val; /* Option's current value, or NULL */ char *label; /* Label for field in connect dialog */ char *dispchar; /* Indicates how to display this field in a connect dialog. Values are: "" Display entered value as is "*" Password field - hide value "D" Debug option - don't show by default */ int dispsize; /* Field size in characters for dialog */ } PQconninfoOption;
Возвращает массив параметров подключения. Это может быть использовано для определения всех возможных параметров
PQconnectdb
и их текущих значений по умолчанию. Возвращаемое значение указывает на массив структурPQconninfoOption
, который заканчивается записью с указателемkeyword
равным null. Если память не может быть выделена, возвращается null указатель. Обратите внимание, что текущие значения по умолчанию (val
) зависят от переменных среды и другого контекста. Отсутствующий или недопустимый файл службы будет молча проигнорирован. Вызывающие функции должны рассматривать данные параметров подключения как доступные только для чтения.После обработки массива опций освободите его, передав его в
PQconninfoFree
. Если этого не сделать, для каждого вызоваPQconndefaults
будет утекать небольшое количество памяти.PQconninfo
Возвращает параметры подключения, используемые активным соединением.
PQconninfoOption *PQconninfo(PGconn *conn);
Возвращает массив параметров подключения. Это может быть использовано для определения всех возможных параметров
PQconnectdb
и значений, которые были использованы для подключения к серверу. Возвращаемое значение указывает на массив структурPQconninfoOption
, который заканчивается записью с нулевым указателемkeyword
. Все замечания, указанные выше дляPQconndefaults
, также применимы к результатуPQconninfo
.PQconninfoParse
Возвращает разобранные параметры подключения из предоставленной строки подключения.
PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);
Разбирает строку подключения и возвращает полученные параметры в виде массива; или возвращает
NULL
, если возникла проблема со строкой подключения. Эта функция может использоваться для извлечения параметровPQconnectdb
в предоставленной строке подключения. Возвращаемое значение указывает на массив структурPQconninfoOption
, который заканчивается записью с нулевым указателем наkeyword
.Все допустимые параметры будут присутствовать в результирующем массиве, но для параметра
PQconninfoOption
, отсутствующего в строке подключения, значениеval
будет установлено вNULL
; значения по умолчанию не вставляются.Если
errmsg
не равноNULL
, то*errmsg
устанавливается вNULL
в случае успеха, иначе вmalloc
'd строку ошибки, объясняющую проблему. (Также возможно, что*errmsg
устанавливается вNULL
, а функция возвращаетNULL
; это указывает на состояние нехватки памяти).После обработки массива опций, освободите его, передав его в
PQconninfoFree
. Если этого не сделать, для каждого вызоваPQconninfoParse
будет утекать некоторая память. Соответственно, если происходит ошибка иerrmsg
не равноNULL
, обязательно освободите строку ошибки с помощьюPQfreemem
.PQfinish
Закрывает соединение с сервером. Также освобождает память, используемую объектом
PGconn
.void PQfinish(PGconn *conn);
Обратите внимание, что даже если попытка подключения к серверу не удалась (как указано в
PQstatus
), приложение должно вызватьPQfinish
для освобождения памяти, используемой объектомPGconn
. УказательPGconn
не должен использоваться снова после вызоваPQfinish
.PQreset
Сбрасывает канал связи с сервером.
void PQreset(PGconn *conn);
Эта функция закрывает соединение с сервером и пытается установить новое соединение, используя все те же параметры, которые были использованы ранее. Это может быть полезно для восстановления после ошибки, если рабочее соединение было потеряно.
PQresetStart
PQresetPoll
Сбросьте канал связи с сервером в неблокирующем режиме.
int PQresetStart(PGconn *conn); PostgresPollingStatusType PQresetPoll(PGconn *conn);
Эти функции закрывают соединение с сервером и пытаются установить новое соединение, используя все те же ранее использованные параметры. Это может быть полезно для восстановления после ошибки, если рабочее соединение было потеряно. Они отличаются от
PQreset
(выше) тем, что действуют в неблокирующем режиме. Эти функции страдают от тех же ограничений, что иPQconnectStartParams
,PQconnectStart
иPQconnectPoll
.Для инициирования сброса соединения вызовите
PQresetStart
. Если он возвращает 0, сброс не удался. Если он возвращает 1, проверьте сброс, используя функциюPQresetPoll
точно так же, как вы бы создали соединение, используя функциюPQconnectPoll
.PQpingParams
PQpingParams
сообщает о состоянии сервера. Он принимает параметры подключения, идентичные тем, что описаны выше дляPQconnectdbParams
. Для получения состояния сервера не обязательно указывать правильное имя пользователя, пароль или имя базы данных; однако, если будут предоставлены неправильные значения, сервер зарегистрирует неудачную попытку подключения.PGPing PQpingParams(const char * const *keywords, const char * const *values, int expand_dbname);
Функция возвращает одно из следующих значений:
PQPING_OK
Сервер работает и, по-видимому, принимает соединения.
PQPING_REJECT
Сервер работает, но находится в состоянии, которое не позволяет устанавливать соединения (запуск, остановка или восстановление после сбоя).
PQPING_NO_RESPONSE
Сервер не может быть связан. Это может указывать на то, что сервер не запущен, или что есть проблема с заданными параметрами подключения (например, неправильный номер порта), или что есть проблема с сетевым подключением (например, брандмауэр блокирует запрос на подключение).
PQPING_NO_ATTEMPT
Не была предпринята попытка связаться с сервером, поскольку предоставленные параметры явно неверны или возникла проблема на стороне клиента (например, нехватка памяти).
PQping
PQping
сообщает о состоянии сервера. Он принимает параметры подключения, идентичные тем, что описаны выше дляPQconnectdb
. Для получения состояния сервера не обязательно указывать правильное имя пользователя, пароль или имя базы данных; однако, если будут предоставлены неправильные значения, сервер зарегистрирует неудачную попытку подключения.PGPing PQping(const char *conninfo);
Возвращаемые значения такие же, как и для
PQpingParams
.PQsetSSLKeyPassHook_OpenSSL
PQsetSSLKeyPassHook_OpenSSL
позволяет приложению переопределить libpq's стандартную обработку зашифрованных файлов ключей клиентского сертификата с использованием sslpassword или интерактивного запроса.void PQsetSSLKeyPassHook_OpenSSL(PQsslKeyPassHook_OpenSSL_type hook);
Приложение передает указатель на функцию обратного вызова с сигнатурой:
int callback_fn(char *buf, int size, PGconn *conn);
который libpq затем вызовет вместо своего стандартного обработчика
PQdefaultSSLKeyPassHook_OpenSSL
. Обратный вызов должен определить пароль для ключа и скопировать его в буфер результатаbuf
размеромsize
. Строка вbuf
должна быть завершена нулевым символом. Обратный вызов должен вернуть длину пароля, сохраненного вbuf
, исключая нулевой символ. В случае ошибки обратный вызов должен установитьbuf[0] = '\0'
и вернуть 0. См.PQdefaultSSLKeyPassHook_OpenSSL
в исходном коде libpq для примера.Если пользователь указал явное расположение ключа, его путь будет находиться в
conn->sslkey
при вызове обратного вызова. Он будет пустым, если используется путь к ключу по умолчанию. Для ключей, которые являются указателями на движок, реализации движка могут использовать обратный вызов пароля OpenSSL или определить свою собственную обработку.Приложение обратного вызова может выбрать делегировать необработанные случаи
PQdefaultSSLKeyPassHook_OpenSSL
, или вызвать его первым и попробовать что-то другое, если он возвращает 0, или полностью переопределить его.Обратный вызов не должен использовать исключения,
longjmp(...)
и т. д. для управления нормальным потоком выполнения. Он должен завершиться нормально.PQgetSSLKeyPassHook_OpenSSL
PQgetSSLKeyPassHook_OpenSSL
возвращает текущую функцию обратного вызова для пароля ключа клиентского сертификата илиNULL
, если она не была установлена.PQsslKeyPassHook_OpenSSL_type PQgetSSLKeyPassHook_OpenSSL(void);
32.1.1. Строки подключения
Несколько функций libpq разбирают строку, указанную пользователем, чтобы получить параметры подключения. Существуют два принятых формата для этих строк: простые строки ключ/значение и URI. URI обычно следуют RFC 3986, за исключением того, что допускаются строки подключения с несколькими хостами, как дополнительно описано ниже.
32.1.1.1. Ключевое слово/Значение строки подключения
В формате ключевое слово/значение каждая настройка параметра имеет вид
keyword
=
value
, с пробелом(и) между настройками.
Пробелы вокруг знака равенства настройки являются
необязательными. Чтобы записать пустое значение или значение, содержащее пробелы, заключите его
в одинарные кавычки, например keyword = 'a value'
.
Одинарные кавычки и обратные слеши внутри
значения должны быть экранированы обратным слешем, т.е. \'
и
\\
.
Пример:
host=localhost port=5432 dbname=mydb connect_timeout=10
Распознаваемые ключевые слова параметров перечислены в Раздел 32.1.2.
32.1.1.2. URI подключения
Общий формат для подключения URI выглядит так:
postgresql://[userspec
@][hostspec
][/dbname
][?paramspec
] whereuserspec
is:user
[:password
] andhostspec
is: [host
][:port
][,...] andparamspec
is:name
=value
[&...]
Схема обозначения URI может быть либо postgresql://
, либо postgres://
. Каждая из оставшихся частей URI является необязательной. Ниже приведены примеры правильного синтаксиса URI:
postgresql:// postgresql://localhost postgresql://localhost:5433 postgresql://localhost/mydb postgresql://user@localhost postgresql://user:secret@localhost postgresql://other@localhost/otherdb?connect_timeout=10&application_name=myapp postgresql://host1:123,host2:456/somedb?target_session_attrs=any&application_name=myapp
Значения, которые обычно появляются в иерархической части URI, могут быть заданы в виде именованных параметров. Например:
postgresql:///mydb?host=localhost&port=5433
Все именованные параметры должны соответствовать ключевым словам, перечисленным в Раздел 32.1.2, за исключением того, что для совместимости с соединениями JDBC URI экземпляры ssl=true
переводятся в sslmode=require
.
Соединение URI должно быть закодировано с использованием процентного кодирования,
если оно содержит символы с особым значением в любой из его частей. Вот
пример, где знак равенства (=
) заменен на
%3D
, а пробел - на
%20
:
postgresql://user@localhost:5433/mydb?options=-c%20synchronous_commit%3Doff
Часть с хостом может быть либо именем хоста, либо IP-адресом. Чтобы указать IPv6-адрес, заключите его в квадратные скобки:
postgresql://[2001:db8::1234]/database
Часть с хостом интерпретируется так, как описано для параметра host. В частности, выбирается соединение через Unix-доменный сокет, если часть с хостом либо пуста, либо выглядит как абсолютный путь, в противном случае инициируется соединение TCP/IP. Однако следует отметить, что слэш является зарезервированным символом в иерархической части URI. Поэтому, чтобы указать нестандартный каталог Unix-доменного сокета, либо опустите часть с хостом URI и укажите хост как именованный параметр, либо примените процентную кодировку пути в части с хостом URI:
postgresql:///dbname?host=/var/lib/postgresql postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
Возможно указать несколько компонентов хоста, каждый из которых может иметь необязательный компонент порта, в одном URI. URI вида postgresql://host1:port1,host2:port2,host3:port3/
эквивалентен строке подключения вида host=host1,host2,host3 port=port1,port2,port3
. Как далее описано, каждый хост будет пробоваться по очереди, пока не будет успешно установлено соединение.
32.1.1.3. Указание нескольких хостов
Возможно указать несколько хостов для подключения, чтобы они были
попробованы в указанном порядке. В формате Ключ/Значение, параметры host
,
hostaddr
и port
принимают значения, разделенные запятыми.
В каждом указанном параметре должно быть указано одинаковое количество элементов,
так что, например, первый hostaddr
соответствует первому имени хоста,
второй hostaddr
соответствует второму имени хоста и так далее.
Исключение составляет случай, когда указан только один port
,
он применяется ко всем хостам.
В формате URI подключения вы можете перечислить несколько пар host:port
, разделенных запятыми в компоненте host
URI.
В любом формате одно имя хоста может соответствовать нескольким сетевым адресам. Обычным примером является хост, у которого есть и IPv4-адрес, и IPv6-адрес.
Когда указано несколько хостов или когда одно имя хоста переводится в несколько адресов, все хосты и адреса будут пробоваться по порядку, пока один не будет успешным. Если ни один из хостов не может быть достигнут, соединение не устанавливается. Если соединение установлено успешно, но аутентификация не проходит, остальные хосты в списке не пробуются.
Если используется файл паролей, вы можете иметь разные пароли для разных хостов. Все остальные параметры подключения одинаковы для каждого хоста в списке; невозможно, например, указать разные имена пользователей для разных хостов.
32.1.2. Ключевые слова параметров
В настоящее время распознаваемыми ключевыми словами параметров являются:
host
Имя хоста, к которому нужно подключиться. Если имя хоста выглядит как абсолютный путь, то это указывает на использование межпроцессного взаимодействия Unix-домена вместо TCP/IP-соединения; значение представляет собой имя каталога, в котором хранится файл сокета. (В Unix абсолютный путь начинается с косой черты. В Windows также распознаются пути, начинающиеся с буквы диска). Если имя хоста начинается с
@
, оно считается сокетом Unix-домена в абстрактном пространстве имен (в настоящее время поддерживается в Linux и Windows). Поведение по умолчанию, когдаhost
не указан или пуст, заключается в подключении к сокету Unix-домена. в/tmp
(или в любой другой каталог сокетов, указанный при сборке Tantor SE). На Windows и на машинах без сокетов Unix-домена, соединение по умолчанию устанавливается сlocalhost
.Также принимается список имен хостов, разделенных запятыми, в котором каждое имя хоста в списке пробуется по порядку; пустой элемент в списке выбирает поведение по умолчанию, как объяснено выше. См. Раздел 32.1.1.3 для получения подробной информации.
hostaddr
Числовой IP-адрес хоста, к которому нужно подключиться. Он должен быть в стандартном формате IPv4, например,
172.28.40.9
. Если ваша машина поддерживает IPv6, вы также можете использовать эти адреса. Всегда используется TCP/IP-соединение, когда для этого параметра указана непустая строка. Если этот параметр не указан, значениеhost
будет искаться для определения соответствующего IP-адреса, или, еслиhost
указывает IP-адрес, то этот адрес будет использоваться напрямую.Использование тега
hostaddr
позволяет приложению избежать поиска имени хоста, что может быть важным в приложениях с ограниченным временем. Однако, для методов аутентификации GSSAPI или SSPI, а также для проверки SSL-сертификата с использованиемverify-full
, требуется указание имени хоста. Применяются следующие правила:Если указан тег
host
без тегаhostaddr
, выполняется поиск имени хоста. (При использовании функцииPQconnectPoll
поиск выполняется, когда функцияPQconnectPoll
впервые рассматривает это имя хоста, и это может привести к блокировке функцииPQconnectPoll
на значительное время).Если
hostaddr
указан безhost
, значение дляhostaddr
представляет собой сетевой адрес сервера. Попытка подключения завершится неудачей, если метод аутентификации требует имя хоста.Если указаны оба тега
host
иhostaddr
, значение для тегаhostaddr
задает сетевой адрес сервера. Значение для тегаhost
игнорируется, если метод аутентификации не требует его, в этом случае оно будет использоваться в качестве имени хоста.
Обратите внимание, что аутентификация, скорее всего, не выполнится, если
host
не является именем сервера по сетевому адресуhostaddr
. Кроме того, когда указаны оба параметраhost
иhostaddr
,host
используется для идентификации соединения в файле паролей (см. Раздел 32.16).Также принимается список значений
hostaddr
, разделенных запятыми, в котором каждый хост из списка пробуется по порядку. Пустой элемент в списке приводит к использованию соответствующего имени хоста или имени хоста по умолчанию, если оно также пусто. Подробности см. в разделе Раздел 32.1.1.3.Без указания имени хоста или адреса хоста, libpq будет подключаться с использованием локального сокета домена Unix; или на Windows и на машинах без сокетов домена Unix, он будет пытаться подключиться к
localhost
.port
Номер порта для подключения к хосту сервера или расширение имени файла сокета для подключений в Unix-домене. Если в параметрах
host
илиhostaddr
указано несколько хостов, этот параметр может указывать список портов, разделенных запятыми, такой же длины, как список хостов, или может указывать один номер порта, который будет использоваться для всех хостов. Пустая строка или пустой элемент в списке, разделенном запятыми, указывает на номер порта по умолчанию, установленный при построении Tantor SE.dbname
Имя базы данных. По умолчанию совпадает с именем пользователя. В некоторых контекстах значение проверяется на наличие расширенных форматов; см. Раздел 32.1.1 для получения дополнительной информации о них.
user
Tantor SE имя пользователя для подключения. По умолчанию будет таким же, как имя операционной системы пользователя, запускающего приложение.
password
Пароль, который будет использоваться, если сервер требует аутентификации по паролю.
passfile
Указывает имя файла, используемого для хранения паролей (см. Раздел 32.16). По умолчанию используется
~/.pgpass
, или%APPDATA%\postgresql\pgpass.conf
в Microsoft Windows. (Если этот файл не существует, ошибка не сообщается).channel_binding
Эта опция управляет использованием клиентом привязки канала. Значение
require
означает, что соединение должно использовать привязку канала,prefer
означает, что клиент выберет привязку канала, если она доступна, аdisable
предотвращает использование привязки канала. По умолчанию, если Tantor SE скомпилирован с поддержкой SSL, значение по умолчанию -prefer
, в противном случае значение по умолчанию -disable
.Привязка канала - это метод, с помощью которого сервер аутентифицирует себя перед клиентом. Он поддерживается только в SSL-соединениях с серверами Tantor SE версии 11 или выше, использующими метод аутентификации
SCRAM
.connect_timeout
Максимальное время ожидания подключения, в секундах (записывается в виде десятичного целого числа, например,
10
). Нулевое, отрицательное или не указанное значение означает бесконечное ожидание. Минимально допустимое значение тайм-аута составляет 2 секунды, поэтому значение1
интерпретируется как2
. Этот тайм-аут применяется отдельно к каждому имени хоста или IP-адресу. Например, если вы указываете два хоста и значениеconnect_timeout
равно 5, каждый хост будет отключаться, если подключение не будет установлено в течение 5 секунд, поэтому общее время ожидания подключения может составить до 10 секунд.compression
Запрос на сжатие трафика libpq. Клиент отправляет запрос с перечислением алгоритмов сжатия. Клиент может запросить сжатие, включив опцию
"compression"
в строке подключения. Это может быть логическое значение для включения или отключения сжатия ("true"
/"false"
,"on"
/"off"
,"yes"
/"no"
,"1"
/"0"
),"any"
или явное перечисление алгоритмов сжатия, разделенных запятыми, которые могут включать уровень сжатия ("zlib,lz4:2"
). Если сжатие включено, но алгоритм явно не указан, клиентская библиотека отправляет свой полный список поддерживаемых алгоритмов. Сервер пересекает полученные алгоритмы сжатия с разрешенными (управляется через настройку сервераlibpq_compression
). Если пересечение не пусто, сервер отвечает с сообщением CompressionAck, содержащим окончательный список алгоритмов сжатия, которые могут использоваться для сжатия сообщений libpq между клиентом и сервером. Если пересечение пусто (сервер не принимает ни один из запрошенных алгоритмов), то он отвечает с сообщением CompressionAck, содержащим пустой список, и клиент решает, продолжать ли без сжатия или сообщить об ошибке.После отправки сообщения CompressionAck сервер может отправить сообщение SetCompressionMethod для установки текущего алгоритма сжатия для сжатия трафика от сервера к клиенту. После получения сообщения CompressionAck клиент может отправить сообщение SetCompressionMethod для установки текущего алгоритма сжатия для сжатия трафика от клиента к серверу. Сжатые данные передаются с помощью сообщений CompressedData.
Поддержка алгоритмов сжатия должна быть включена при компиляции сервера. В настоящее время поддерживаются две библиотеки: zlib (по умолчанию) и lz4 (если Postgres был настроен с опцией --with-lz4). В обоих случаях используется режим потоковой передачи. По умолчанию клиент не запрашивает сжатие. Обратите внимание, что использование сжатия вместе с SSL может создавать дополнительные уязвимости: CRIME
client_encoding
Это устанавливает параметр конфигурации
client_encoding
для данного соединения. В дополнение к значениям, принимаемым соответствующей опцией сервера, вы можете использоватьauto
, чтобы определить правильную кодировку из текущей локали в клиенте (переменная окруженияLC_CTYPE
в системах Unix).options
Указывает параметры командной строки, которые будут отправлены на сервер при установлении соединения. Например, установка значения
-c geqo=off
устанавливает значение параметраgeqo
в сессии наoff
. Пробелы внутри этой строки считаются разделителями аргументов командной строки, если они не экранированы обратной косой чертой (\
); для представления буквальной обратной косой черты используйте\\
. Для подробного обсуждения доступных параметров см. Глава 19.application_name
Указывает значение для параметра конфигурации application_name.
fallback_application_name
Указывает значение по умолчанию для параметра конфигурации application_name. Это значение будет использоваться, если не было указано значение для
application_name
через параметр подключения или переменную окруженияPGAPPNAME
. Указание значения по умолчанию полезно в утилитах общего назначения, которые хотят установить имя приложения по умолчанию, но позволить пользователю переопределить его.keepalives
Определяет, используются ли клиентские TCP keepalive. Значение по умолчанию - 1, что означает включено, но вы можете изменить его на 0, что означает выключено, если keepalive не требуется. Этот параметр игнорируется для соединений, установленных через Unix-доменный сокет.
keepalives_idle
Управляет количеством секунд бездействия, после которого TCP должен отправить сообщение keepalive на сервер. Значение нуль использует системное значение по умолчанию. Этот параметр игнорируется для соединений, установленных через Unix-доменный сокет или если keepalives отключены. Он поддерживается только на системах, где доступна опция сокета
TCP_KEEPIDLE
или эквивалентная ей, а также на Windows; на других системах он не имеет эффекта.keepalives_interval
Управляет количеством секунд, через которое должно быть повторно отправлено сообщение TCP keepalive, которое не было подтверждено сервером. Значение ноль использует системное значение по умолчанию. Этот параметр игнорируется для соединений, установленных через Unix-доменный сокет, или если keepalive отключены. Он поддерживается только на системах, где доступна опция
TCP_KEEPINTVL
или эквивалентная опция сокета, а также на Windows; на других системах он не имеет эффекта.keepalives_count
Определяет количество TCP keepalive-пакетов, которые могут быть потеряны, прежде чем соединение клиента с сервером будет считаться неработающим. Значение ноль использует системное значение по умолчанию. Этот параметр игнорируется для соединений, установленных через Unix-доменный сокет, или если keepalive отключены. Он поддерживается только на системах, где доступна опция сокета
TCP_KEEPCNT
или эквивалентная ей; на других системах он не имеет эффекта.tcp_user_timeout
Определяет количество миллисекунд, в течение которых переданные данные могут оставаться без подтверждения, прежде чем соединение будет принудительно закрыто. Значение нуль использует системное значение по умолчанию. Этот параметр игнорируется для соединений, установленных через Unix-доменный сокет. Он поддерживается только на системах, где доступна опция
TCP_USER_TIMEOUT
; на других системах он не имеет эффекта.replication
Этот параметр определяет, должно ли соединение использовать протокол репликации вместо обычного протокола. Именно этот протокол используют соединения репликации PostgreSQL, а также инструменты, такие как pg_basebackup, внутренне, но им может также пользоваться стороннее приложение. Для описания протокола репликации см. Раздел 53.4.
Поддерживаются следующие значения, которые нечувствительны к регистру:
-
true
,on
,yes
,1
Соединение переходит в режим физической репликации.
database
Соединение переходит в режим логической репликации, подключаясь к базе данных, указанной в параметре
dbname
.-
false
,off
,no
,0
Соединение является обычным, что является поведением по умолчанию.
В физическом или логическом режиме репликации может использоваться только простой протокол запросов.
-
gssencmode
Эта опция определяет, будет ли и с каким приоритетом установлено безопасное TCP/IP-соединение с сервером с использованием протокола GSS. Существуют три режима:
disable
только попробуйте незашифрованное подключение без GSSAPI
prefer
(default)если присутствуют учетные данные GSSAPI (т.е. в кеше учетных данных), сначала попробуйте установить зашифрованное соединение с использованием GSSAPI; если это не удается или учетных данных нет, попробуйте установить не зашифрованное соединение. Это является настройкой по умолчанию, когда Tantor SE был скомпилирован с поддержкой GSSAPI.
require
только попробуйте GSSAPI-зашифрованное соединение
gssencmode
игнорируется при обмене данными через Unix-сокеты. Если Tantor SE скомпилирован без поддержки GSSAPI, использование опцииrequire
вызовет ошибку, в то время как опцияprefer
будет принята, но libpq фактически не будет пытаться установить зашифрованное соединение с использованием GSSAPI.sslmode
Этот параметр определяет, будет ли и с каким приоритетом установлено безопасное TCP/IP-соединение с сервером с использованием SSL. Существует шесть режимов:
disable
только попробуйте не-SSL соединение
allow
попробуйте сначала незащищенное SSL подключение; если это не удастся, попробуйте защищенное SSL подключение
prefer
(default)Попробуйте сначала установить соединение с использованием SSL; если это не удастся, попробуйте установить не-SSL соединение.
require
только попробуйте установить соединение SSL. Если присутствует файл корневого CA, проверьте сертификат так же, как если бы был указан параметр
verify-ca
verify-ca
только попробуйте установить соединение SSL и проверьте, что сертификат сервера выдан доверенным удостоверяющим центром (CA)
verify-full
только попробуйте установить соединение SSL, проверьте, что сертификат сервера выдан доверенным CA и что запрашиваемое имя сервера соответствует имени в сертификате
См. Раздел 32.19 для подробного описания того, как работают эти параметры.
sslmode
игнорируется для обмена данными через Unix-сокет. Если Tantor SE скомпилирован без поддержки SSL, использование опцийrequire
,verify-ca
илиverify-full
вызовет ошибку, в то время как опцииallow
иprefer
будут приняты, но libpq фактически не будет пытаться установить SSL соединение.Обратите внимание, что если возможно использование шифрования GSSAPI, то оно будет предпочтительнее использования шифрования SSL, независимо от значения параметра
sslmode
. Чтобы принудительно использовать шифрование SSL в среде, где работает инфраструктура GSSAPI (например, сервер Kerberos), также установите параметрgssencmode
в значениеdisable
.requiressl
Этот параметр устарел в пользу настройки
sslmode
.Если установлено значение 1, требуется SSL соединение с сервером (это эквивалентно
sslmode
require
). libpq затем откажется подключаться, если сервер не принимает SSL соединение. Если установлено значение 0 (по умолчанию), libpq будет согласовывать тип соединения с сервером (эквивалентноsslmode
prefer
). Этот параметр доступен только если Tantor SE скомпилирован с поддержкой SSL.sslcompression
Если установлено значение 1, данные, отправляемые по SSL-соединениям, будут сжиматься. Если установлено значение 0, сжатие будет отключено. По умолчанию установлено значение 0. Этот параметр игнорируется, если установлено соединение без SSL.
Сжатие SSL в настоящее время считается небезопасным, и его использование больше не рекомендуется. OpenSSL 1.1.0 по умолчанию отключает сжатие, и многие дистрибутивы операционных систем также отключают его в предыдущих версиях, поэтому установка этого параметра в значение on не будет иметь никакого эффекта, если сервер не принимает сжатие. Tantor SE 14 полностью отключает сжатие внутри сервера.
Если безопасность не является основной проблемой, сжатие может улучшить пропускную способность, если узким местом является сеть. Отключение сжатия может улучшить время отклика и пропускную способность, если ограничивающим фактором является производительность ЦП.
sslcert
Этот параметр указывает имя файла клиентского SSL-сертификата, заменяя значение по умолчанию
~/.postgresql/postgresql.crt
. Этот параметр игнорируется, если не устанавливается SSL-соединение.sslkey
Этот параметр указывает расположение секретного ключа, используемого для клиентского сертификата. Он может указывать имя файла, которое будет использоваться вместо значения по умолчанию
~/.postgresql/postgresql.key
, или он может указывать ключ, полученный из внешнего “движка” (движки - это загружаемые модули OpenSSL). Спецификация внешнего движка должна состоять из имени движка, разделенного двоеточием, и идентификатора ключа, специфичного для движка. Этот параметр игнорируется, если не устанавливается SSL-соединение.sslpassword
Этот параметр указывает пароль для секретного ключа, указанного в
sslkey
, позволяя хранить закрытые ключи клиентских сертификатов в зашифрованной форме на диске, даже когда интерактивный ввод пароля не является практичным.Спецификация этого параметра с любым непустым значением подавляет приглашение
Enter PEM pass phrase:
, которое OpenSSL будет выводить по умолчанию, когда предоставляется зашифрованный ключ клиентского сертификатаlibpq
.Если ключ не зашифрован, этот параметр игнорируется. Параметр не влияет на ключи, указанные с помощью механизма OpenSSL движков, если движок использует механизм обратного вызова пароля OpenSSL для запросов.
Не существует эквивалентной переменной среды для этой опции, и нет возможности найти ее в файле
.pgpass
. Она может быть использована в определении подключения в файле службы. Пользователи с более сложными потребностями должны рассмотреть использование механизмов OpenSSL и инструментов, таких как PKCS#11 или устройства для выгрузки криптографии через USB.sslrootcert
Этот параметр указывает имя файла, содержащего сертификаты удостоверяющих центров (CA). Если файл существует, сертификат сервера будет проверен на подпись одним из этих удостоверяющих центров. По умолчанию используется файл
~/.postgresql/root.crt
.sslcrl
Этот параметр указывает имя файла списка отзыва сертификатов (CRL) SSL-сервера. Сертификаты, перечисленные в этом файле, если он существует, будут отклонены при попытке аутентификации сертификата сервера. Если ни sslcrl, ни sslcrldir не установлены, это значение принимается как
~/.postgresql/root.crl
.sslcrldir
Этот параметр определяет имя каталога списка отзыва сертификатов (CRL) SSL-сервера. Сертификаты, перечисленные в файлах в этом каталоге, если он существует, будут отклонены при попытке аутентификации сертификата сервера.
Для подготовки каталога необходимо выполнить команду OpenSSL
openssl rehash
илиc_rehash
. Подробности см. в его документации.Оба тега
sslcrl
иsslcrldir
могут быть указаны вместе.sslsni
Если установлено значение 1 (по умолчанию), libpq устанавливает расширение TLS “Server Name Indication” (SNI) на подключениях, включенных SSL. Установка этого параметра в 0 отключает данную функцию.
Серверное имя индикации может использоваться SSL-совместимыми прокси-серверами для маршрутизации соединений без необходимости расшифровки SSL-потока. (Обратите внимание, что для этого требуется прокси-сервер, который знает о протоколе рукопожатия PostgreSQL, а не просто любой SSL-прокси). Однако, SNI делает имя целевого хоста видимым в открытом виде в сетевом трафике, поэтому в некоторых случаях это может быть нежелательно.
requirepeer
Этот параметр указывает имя пользователя операционной системы сервера, например
requirepeer=postgres
. При установлении соединения через Unix-доменный сокет, если этот параметр установлен, клиент проверяет в начале соединения, что процесс сервера работает от имени указанного пользователя; если это не так, соединение прерывается с ошибкой. Этот параметр может использоваться для обеспечения аутентификации сервера, аналогичной доступной с использованием SSL-сертификатов в TCP/IP-соединениях. (Обратите внимание, что если Unix-доменный сокет находится в/tmp
или другом общедоступном месте для записи, любой пользователь может запустить сервер, слушающий его. Используйте этот параметр для обеспечения соединения с сервером, запущенным от имени доверенного пользователя). Эта опция поддерживается только на платформах, для которых реализован метод аутентификацииpeer
; см. Раздел 20.9.ssl_min_protocol_version
Этот параметр определяет минимальную версию протокола SSL/TLS, разрешенную для соединения. Допустимые значения:
TLSv1
,TLSv1.1
,TLSv1.2
иTLSv1.3
. Поддерживаемые протоколы зависят от версии OpenSSL, используемой, более старые версии не поддерживают самые современные версии протоколов. Если не указано, используется значение по умолчаниюTLSv1.2
, которое соответствует лучшим практикам отрасли на данный момент.ssl_max_protocol_version
Этот параметр определяет максимальную версию протокола SSL/TLS, разрешенную для соединения. Допустимые значения:
TLSv1
,TLSv1.1
,TLSv1.2
иTLSv1.3
. Поддерживаемые протоколы зависят от версии OpenSSL, используемой, старые версии не поддерживают самые современные версии протоколов. Если не установлено, этот параметр игнорируется, и соединение будет использовать максимальную границу, определенную бэкендом, если она установлена. Установка максимальной версии протокола полезна в основном для тестирования или если у некоторого компонента возникают проблемы с работой с более новым протоколом.krbsrvname
Имя службы Kerberos, используемое при аутентификации с помощью GSSAPI. Оно должно совпадать с именем службы, указанным в конфигурации сервера, чтобы аутентификация Kerberos прошла успешно. (См. также Раздел 20.6). Значение по умолчанию обычно
postgres
, но его можно изменить при сборке Tantor SE с помощью опции--with-krb-srvnam
команды configure. В большинстве сред выполнения этот параметр не требует изменений. Некоторые реализации Kerberos могут требовать другого имени службы, например, Microsoft Active Directory, которая требует, чтобы имя службы было в верхнем регистре (POSTGRES
).gsslib
Используемая библиотека GSS для аутентификации GSSAPI. В настоящее время это не учитывается, за исключением сборок для Windows, которые включают поддержку как GSSAPI, так и SSPI. В этом случае установите значение
gssapi
, чтобы заставить libpq использовать библиотеку GSSAPI для аутентификации вместо используемого по умолчанию SSPI.service
Имя службы для использования дополнительных параметров. Оно указывает имя службы в
pg_service.conf
, которая содержит дополнительные параметры подключения. Это позволяет приложениям указывать только имя службы, чтобы параметры подключения можно было централизованно поддерживать. См. Раздел 32.17.target_session_attrs
Этот параметр определяет, должны ли сессии иметь определенные свойства, чтобы быть приемлемыми. Обычно он используется в сочетании с несколькими именами хостов для выбора первой приемлемой альтернативы среди нескольких хостов. Существует шесть режимов:
any
(default)любое успешное соединение допустимо
read-write
session должна по умолчанию принимать транзакции на чтение и запись (то есть сервер не должен находиться в режиме горячего резервирования и параметр
default_transaction_read_only
должен бытьoff
)read-only
сессия по умолчанию не должен принимать чтение-запись транзакции (наоборот)
primary
сервер не должен находиться в режиме горячего резервирования
standby
сервер должен находиться в режиме горячего резервирования
prefer-standby
сначала попробуйте найти резервный сервер, но если ни один из перечисленных хостов не является резервным сервером, попробуйте снова в режиме
any