이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : F.36. Postgres_FDW - 외부 PostgreSQL 범퍼카 토토 저장된 액세스 데이터버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

F.38. Postgres_FDW - 외부에 저장된 액세스 데이터PostgreSQL서버#

Postgres_FDW모듈은 외국 데이터 래퍼를 제공합니다postgres_fdw, 외부에 저장된 데이터에 액세스하는 데 사용할 수 있습니다PostgreSQL서버.

이 모듈에서 제공하는 기능은 이전의 기능과 실질적으로 겹칩니다토토 사이트 순위 : 문서 : 18 : F.11. DBLINK - 다른 토토 사이트 순위 데이터베이스에 연결모듈. 하지만postgres_fdw원격 테이블에 액세스하기위한보다 투명하고 표준 준수 구문을 제공하며 많은 경우 더 나은 성능을 제공 할 수 있습니다.

사용을 사용하여 원격 액세스를 준비하려면Postgres_FDW:

  1. 설치postgres_fdw확장 사용확장 생성.

  2. 사용을 사용하여 외국 서버 개체 생성서버 생성, 연결하려는 각 원격 데이터베이스를 나타냅니다. 을 제외하고 연결 정보 지정사용자비밀번호, 서버 객체의 옵션으로.

  3. 사용 사용자 매핑 만들기사용자 매핑 만들기, 각 데이터베이스 사용자에 대해 각 외국 서버에 액세스 할 수 있습니다. as as 원격 사용자 이름과 비밀번호를 지정하십시오.사용자and비밀번호사용자 매핑 옵션.

  4. 사용 외국 테이블 만들기외국 테이블 만들기또는외국 스키마 가져 오기, 액세스하려는 각 원격 테이블에 대해. 외국 테이블의 열은 참조 된 원격 테이블과 일치해야합니다. 그러나 원격 테이블 객체의 옵션으로 올바른 원격 이름을 지정하면 원격 테이블과 다른 테이블 및/또는 열 이름을 사용할 수 있습니다.

이제 필요select기본 원격 테이블에 저장된 데이터에 액세스하기 위해 외래 테이블에서. 를 사용하여 원격 테이블을 수정할 수도 있습니다.삽입, 업데이트, 삭제, COPY또는Truncate. (물론, 사용자 매핑에 지정된 원격 사용자는 이러한 작업을 수행 할 권한이 있어야합니다.)

전용옵션에 지정된select, 업데이트, 삭제또는Truncate원격 테이블에 액세스하거나 수정할 때 영향을 미치지 않습니다.

참고postgres_fdw현재 지원 부족삽입충돌시 업데이트절. 그러나갈등에 대한 일은 아무것도 없습니다조항이 지원되며 고유 한 지수 추론 사양이 생략된다면. 또한postgres_fdw지원 지원업데이트분할 된 테이블에서 실행 된 진술이지만 현재 이동식 행을 삽입하기 위해 선택한 원격 파티션이 인 경우를 처리하지 않습니다.업데이트같은 명령에서 다른 곳에서 업데이트 될 대상 파티션.

일반적으로 외국 테이블의 열은 원격 테이블의 참조 된 열과 정확히 동일한 데이터 유형으로 선언하고 해당되는 경우 콜라주를 표시하는 것이 좋습니다. 하지만postgres_fdw현재 필요에 따라 데이터 유형 변환을 수행하는 것에 대해 다소 용서하고 있습니다. 원격 서버가 로컬 서버와 다르게 쿼리 조건을 해석하기 때문에 유형이나 콜로레이션이 일치하지 않을 때 놀라운 의미 론적 이상이 발생할 수 있습니다..

기본 원격 테이블이 가지고있는 것보다 열이 적거나 열 순서가 다른 외부 테이블을 선언 할 수 있습니다. 원격 테이블에 열을 일치시키는 것은 이름이 아닌 위치입니다.

F.38.1. Postgres_FDW의 FDW 옵션#

F.38.1.1. 연결 옵션#

Postgres_FDW외국 데이터 래퍼는와 동일한 옵션을 가질 수 있습니다.libpq연결 문자열에서 수락합니다.섹션 32.1.2,이 옵션이 허용되지 않거나 특별한 취급이 없다는 점을 제외하고 :

  • 사용자, 비밀번호andsslpassword(대신 사용자 맵핑에 이들을 지정하거나 서비스 파일을 사용)

  • client_encoding(로컬 서버 인코딩에서 자동으로 설정 됨)

  • application_name- 이것은에 나타날 수 있습니다.둘 중 하나 또는 둘 다연결 및postgres_fdw.application_name. 둘 다 존재한다면postgres_fdw.application_name연결 설정을 무시합니다. 같지 않은libpq, Postgres_FDW허용application_name포함하려면탈출 시퀀스. 보다postgres_fdw.application_name자세한 내용.

  • fallback_application_name(항상 설정postgres_fdw)

  • sslkeyandSSLCERT- 이것은에 나타날 수 있습니다.둘 중 하나 또는 둘 다연결 및 사용자 매핑. 둘 다 존재하는 경우 사용자 매핑 설정이 연결 설정을 무시합니다.

슈퍼 사용자만이 사용자 매핑을 생성하거나 수정할 수 있습니다SSLCERT또는sslkey설정.

비 슈퍼 사용자는 비밀번호 인증 또는 GSSAPI 위임 자격 증명을 사용하여 외국 서버에 연결할 수 있으므로를 지정하십시오.비밀번호비밀번호 인증이 필요한 비 슈퍼 사용자에 속하는 사용자 매핑 옵션

SuperUser는 사용자 매핑 옵션을 설정하여 사용자 당 맵핑 기준 으로이 검사를 무시할 수 있습니다password_required 'false', 예 :

some_non_superuser 서버 루프 백 _nopw에 대한 사용자 매핑 변경
옵션 (password_required 'false');

비전지없는 사용자가 UNIX 사용자의 인증 권한을 악용하는 것을 방지하려면 Postgres 서버가 슈퍼 사용자 권한으로 에스컬레이션하여 실행 중이며 SuperUser만이 옵션을 사용자 매핑에서 설정할 수 있습니다..

관리가이를 통해 CVE-2007-3278 및 CVE-2007-6601 당 맵핑 된 데이터베이스에 슈퍼 사용자로 연결할 수있는 능력을 허용하지 않도록 관리해야합니다. 설정하지 마십시오password_required = falseonpublic역할. 매핑 된 사용자는 잠재적으로 클라이언트 인증서를 사용할 수 있습니다..pgpass, .pg_service.conf등. 시스템 사용자의 UNIX 홈 디렉토리에서 Postgres 서버는 다음과 같이 실행됩니다. (홈 디렉토리를 찾는 방법에 대한 자세한 내용은 참조메이저 토토 사이트 : 문서 : 18 : 32.16. 암호 파일.) 그들은 또한 인증 모드와 같은 신뢰 관계를 사용할 수 있습니다피어또는ID인증.

F.38.1.2. 객체 이름 옵션#

이 옵션은 원격으로 전송 된 SQL 문에 사용 된 이름을 제어하는 데 사용될 수 있습니다PostgreSQL서버. 이 옵션은 기본 원격 테이블의 이름과 다른 이름으로 외국 테이블을 만들 때 필요합니다.

Schema_Name(String)

외국 테이블에 지정할 수있는이 옵션은 원격 서버의 외부 테이블에 사용할 스키마 이름을 제공합니다. 이 옵션이 생략되면 외국 테이블 스키마의 이름이 사용됩니다.

table_name(String)

외국 테이블에 지정할 수있는이 옵션은 원격 서버의 외부 테이블에 사용할 테이블 이름을 제공합니다. 이 옵션이 생략되면 외국 테이블 이름이 사용됩니다.

column_name(String)

이 옵션은 외국 테이블 열에 지정할 수있는이 옵션은 원격 서버의 열에 사용할 열 이름을 제공합니다. 이 옵션이 생략되면 열 이름이 사용됩니다.

F.38.1.3. 비용 추정 옵션#

Postgres_FDW원격 서버에 대한 쿼리를 실행하여 원격 데이터를 검색하므로 외국 테이블을 스캔하는 데 드는 예상 비용은 원격 서버에서 수행하는 데 드는 비용과 통신을위한 오버 헤드 여야합니다. 이러한 추정치를 얻는 가장 신뢰할 수있는 방법은 원격 서버를 요청한 다음 오버 헤드를 추가하는 것입니다. 그러나 간단한 쿼리의 경우 비용 추정치를 얻기 위해 추가 원격 쿼리 비용의 가치가 없습니다. 그래서Postgres_FDW비용 추정 방법을 제어하기위한 다음 옵션을 제공합니다.

use_remote_estimate(부울)

이 옵션은 외국 테이블 또는 외국 서버에 지정할 수있는이 옵션이를 제어합니다.postgres_fdw원격 문제설명비용 추정치를 얻기위한 명령. 외국 테이블의 설정은 서버의 모든 설정을 대체하지만 해당 테이블에만 해당됩니다. 기본값은false.

FDW_STARTUP_COST(플로팅 포인트)

외국 서버에 지정할 수있는이 옵션은 해당 서버의 모든 외국 테이블 스캔의 예상 시작 비용에 추가되는 부동 소수점 값입니다. 이는 원격 측면의 연결, 구문 분석 및 계획 등의 추가 오버 헤드를 나타냅니다. 기본값은입니다.100.

fdw_tuple_cost(플로팅 포인트)

외국 서버에 지정할 수있는이 옵션은 해당 서버의 외국 테이블 스캔을위한 추가 비용 당 추가 비용으로 사용되는 부동 소수점 값입니다. 이는 서버 간의 데이터 전송의 추가 오버 헤드를 나타냅니다. 원격 서버에 대한 네트워크 지연이 높거나 낮아 지도록이 숫자를 늘리거나 줄일 수 있습니다. 기본값은입니다.0.2.

언제use_remote_estimate진실,postgres_fdw원격 서버에서 행 카운트 및 비용 추정치를 얻은 다음 추가FDW_STARTUP_COSTfdw_tuple_cost비용 추정치. 언제use_remote_estimatefalse,postgres_fdw로컬 행 카운트 및 비용 추정을 수행 한 다음 추가FDW_STARTUP_COSTandfdw_tuple_cost비용 추정치. 원격 테이블 통계의 로컬 사본을 사용할 수 없다면이 로컬 추정은 매우 정확하지 않을 것입니다. 달리기분석외국 표에서 로컬 통계를 업데이트하는 방법입니다. 이것은 원격 테이블의 스캔을 수행 한 다음 테이블이 로컬 인 것처럼 통계를 계산하고 저장합니다. 로컬 통계를 유지하는 것이 원격 테이블에 대한 쿼리 계획 간의 오버 헤드를 줄이는 유용한 방법이 될 수 있습니다. 그러나 원격 테이블이 자주 업데이트되면 로컬 통계는 곧 쓸모 없게됩니다.

다음 옵션은 그러한 방법을 제어합니다분석작동 동작 :

Analyze_Sampling(String)

이 옵션은 외국 테이블 또는 외국 서버에 지정할 수있는이 옵션을 결정합니다.분석외국 테이블에서 원격 측면의 데이터를 샘플링하거나 모든 데이터를 읽고 전송하고 로컬로 샘플링을 수행합니다. 지원되는 값은입니다.OFF, random, 시스템, Bernoulliandauto. OFF원격 샘플링을 비활성화하므로 모든 데이터가 로컬로 전송되고 샘플링됩니다.random를 사용하여 원격 샘플링을 수행합니다random ()반환 된 행을 선택할 수있는 함수SystemandBernoulli내장에 의존테이블 샘플그 이름의 방법.random모든 원격 서버 버전에서 작동하는 동안테이블 샘플9.5 년 이후에만 지원됩니다.auto(기본값) 권장 샘플링 방법을 자동으로 선택합니다. 현재는 하나를 의미합니다Bernoulli또는random원격 서버 버전에 따라

F.38.1.4. 원격 실행 옵션#

기본적으로, 만여기서내장 연산자 및 기능을 사용하는 클로스는 원격 서버에서 실행을 위해 고려됩니다. 구축되지 않은 기능과 관련된 조항은 행을 가져온 후에 로컬로 점검됩니다. 원격 서버에서 이러한 기능을 사용할 수 있고 로컬에서 동일한 결과를 생성하기 위해 의존 할 수있는 경우, 그러한 것을 보내면 성능을 향상시킬 수 있습니다.여기서원격 실행을위한 조항. 이 동작은 다음 옵션을 사용하여 제어 할 수 있습니다.

확장(String)

이 옵션은 쉼표로 구분 된 이름 목록입니다.PostgreSQL로컬 서버 및 원격 서버 모두에 호환 가능한 버전으로 설치되는 확장. 불변성이고 나열된 확장자에 속하는 기능 및 연산자는 원격 서버에 전환 할 수있는 것으로 간주됩니다. 이 옵션은 테이블 당 이외의 외국 서버에만 지정할 수 있습니다.

사용시확장옵션,그것은 사용자의 책임입니다나열된 확장자가 존재하며 로컬 서버와 원격 서버 모두에서 동일하게 행동합니다. 그렇지 않으면 원격 쿼리가 실패하거나 예기치 않게 행동 할 수 있습니다.

fetch_size(정수)

이 옵션은 행 수를 지정합니다postgres_fdw각 페치 작업을 수행해야합니다. 외국 테이블 또는 외국 서버에 대해 지정할 수 있습니다. 테이블에 지정된 옵션은 서버에 지정된 옵션을 대체합니다. 기본값은100.

batch_size(정수)

이 옵션은 행 수를 지정합니다postgres_fdw각 삽입 작업에 삽입해야합니다. 외국 테이블 또는 외국 서버에 대해 지정할 수 있습니다. 테이블에 지정된 옵션은 서버에 지정된 옵션을 대체합니다. 기본값은1.

실제 행 수를 참고하십시오Postgres_FDW한 번에 인서트를 한 번에 삽입하는 열 수와 제공된batch_size값. 배치는 단일 쿼리로 실행되며 LIBPQ 프로토콜 (Postgres_FDW원격 서버에 연결하기 위해 사용) 단일 쿼리의 매개 변수 수를 65535로 제한합니다. 열 수 *.batch_size한도 초과batch_size오류를 피하기 위해 조정됩니다.

이 옵션은 외래 테이블에 복사 할 때도 적용됩니다. 이 경우 실제 행 수Postgres_FDW한 번에 사본은 삽입 케이스와 유사한 방식으로 결정되지만의 구현 제한으로 인해 최대 1000으로 제한됩니다.COPY명령.

F.38.1.5. 비동기 실행 옵션#

postgres_fdwAN의 여러 부분을 실행하는 비동기 실행을 지원합니다.부록노드 성능을 향상시키기보다는 동시에 노드. 이 실행은 다음 옵션을 사용하여 제어 할 수 있습니다.

async_capable(부울)

이 옵션은를 제어합니다.postgres_fdw비동기 실행을 위해 외래 테이블을 동시에 스캔 할 수 있습니다. 외국 테이블 또는 외국 서버에 대해 지정할 수 있습니다. 테이블 레벨 옵션은 서버 레벨 옵션을 대체합니다. 기본값은false.

외국 서버에서 반환되는 데이터가 일관되도록하기 위해postgres_fdw주어진 외국 서버에 대해 하나의 연결 만 열고 해당 테이블이 다른 사용자 매핑을받지 않는 한 여러 개의 외국 테이블이있는 경우에도 해당 서버에 대한 모든 쿼리를 순차적으로 실행합니다. 이 경우 쿼리 실행과 관련된 오버 헤드를 비동기로 제거하기 위해이 옵션을 비활성화하는 것이 더 성능이있을 수 있습니다..

AN에도 비동기 실행이 적용됩니다.부록노드에는 비동기 적으로 실행 된 서브 플랜뿐만 아니라 동기식으로 실행 된 하위 플랜이 포함되어 있습니다. 그러한 경우, 비동기 서브 플랜트가 사용하여 처리 된 경우postgres_fdw, 비동기 서브 플랜의 튜플은 적어도 하나의 동기 하위 플랜이 모든 튜플을 반환 한 후에도 비동기 서브 플랜이 외국 서버로 전송 된 비동기 쿼리의 결과를 기다리는 동안 하위 플랜이 실행되므로 모든 튜플을 반환 할 때까지 반환되지 않습니다. 이 행동은 향후 릴리스에서 변할 수 있습니다.

F.38.1.6. 거래 관리 옵션#

트랜잭션 관리 섹션에 설명 된대로postgres_fdw트랜잭션은 해당 원격 트랜잭션을 작성하여 관리되며 해당 원격 서브 트랜잭션을 작성하여 하위 트랜잭션을 관리합니다. 여러 원격 트랜잭션이 현재 로컬 트랜잭션에 관여하는 경우 기본적으로postgres_fdw로컬 거래가 커밋되거나 중단 될 때 원격 트랜잭션을 연속적으로 저지르거나 중단시킵니다. 여러 원격 서브 트랜잭션이 현재 로컬 서브 트랜잭션에 관여하는 경우, 기본적으로postgres_fdw로컬 서브 트랜잭션이 커밋되거나 중단 될 때 원격 차축 작용을 연속적으로 커밋하거나 중단시킵니다. 다음 옵션으로 성능을 향상시킬 수 있습니다.

Parallel_Commit(부울)

이 옵션은를 제어합니다.postgres_fdw지역 거래가 커밋 될 때 로컬 거래에서 외국 서버에 원격 트랜잭션이 열렸습니다. 이 설정은 원격 및 로컬 서브 트랜잭션에도 적용됩니다. 이 옵션은 테이블 당 이외의 외국 서버에만 지정할 수 있습니다. 기본값은거짓.

parallel_abort(부울)

이 옵션은를 제어합니다.postgres_fdw지역 거래가 중단 될 때 지역 거래에서 외국 서버에서 원격 트랜잭션이 열렸습니다. 이 설정은 원격 및 로컬 서브 트랜잭션에도 적용됩니다. 이 옵션은 테이블 당 이외의 외국 서버에만 지정할 수 있습니다. 기본값은거짓.

이러한 옵션이있는 여러 외국 서버가 지역 거래에 관여하는 경우 해당 외국 서버의 여러 원격 트랜잭션이 해당 외국 서버에 걸쳐 지역 거래가 커밋되거나 중단 될 때 병렬로 훼손되거나 중단됩니다.

이러한 옵션이 활성화되면 많은 원격 트랜잭션이있는 외국 서버가 로컬 트랜잭션이 커밋되거나 중단 될 때 부정적인 성능 영향을 볼 수 있습니다..

F.38.1.7. 업데이트 가능성 옵션#

기본적으로 모든 외국 테이블을 사용하여Postgres_FDW는 업데이트 가능한 것으로 가정합니다. 다음 옵션을 사용하여 재정의 할 수 있습니다.

업데이트 가능(부울)

이 옵션은를 제어합니다.postgres_fdw이물질 테이블을 사용하여 수정할 수 있습니다삽입, 업데이트삭제명령. 외국 테이블 또는 외국 서버에 대해 지정할 수 있습니다. 테이블 레벨 옵션은 서버 레벨 옵션을 대체합니다. 기본값은true.

물론 원격 테이블이 실제로 업데이트되지 않은 경우 어쨌든 오류가 발생합니다. 이 옵션을 사용하면 주로 원격 서버를 쿼리하지 않고 오류를 로컬로 던질 수 있습니다. 그러나Information_Schema보기가 a보고합니다.postgres_fdw원격 서버를 점검하지 않고이 옵션의 설정에 따라 업데이트 할 수 있도록 외부 테이블 (또는 아님).

F.38.1.8. 자극 옵션#

기본적으로 모든 외국 테이블을 사용하여postgres_fdw는 잘린 것으로 가정합니다. 다음 옵션을 사용하여 재정의 할 수 있습니다.

Truncatable(부울)

이 옵션은를 제어합니다.Postgres_FDW|Truncate명령. 외국 테이블 또는 외국 서버에 대해 지정할 수 있습니다. 테이블 레벨 옵션은 서버 레벨 옵션을 대체합니다. 기본값은true.

물론, 원격 테이블이 실제로 잘라지지 않으면 어쨌든 오류가 발생합니다. 이 옵션을 사용하면 주로 원격 서버를 쿼리하지 않고 오류를 로컬로 던질 수 있습니다.

F.38.1.9. 옵션 가져 오기#

Postgres_FDW를 사용하여 외래 테이블 정의를 가져올 수 있습니다외국 스키마 가져 오기. 이 명령은 로컬 서버에서 원격 서버에있는 테이블 또는보기와 일치하는 외국 테이블 정의를 만듭니다. 가져올 원격 테이블에 사용자 정의 데이터 유형의 열이있는 경우 로컬 서버에는 동일한 이름의 호환 유형이 있어야합니다.

동작 가져 오기 동작은 다음 옵션으로 사용자 정의 할 수 있습니다 (외국 스키마 가져 오기명령) :

import_collate(부울)

이 옵션은 열을 제어합니다Collate옵션은 외국 서버에서 가져온 외래 테이블의 정의에 포함됩니다. 기본값은true. 원격 서버가 로컬 서버와 다른 Collation 이름 세트가 있으면이를 끄는 것이 필요할 수 있습니다. 이는 다른 운영 체제에서 실행중인 경우에 해당 될 수 있습니다. 그러나 그렇게한다면, 가져온 테이블 열의 콜라이트가 기본 데이터와 일치하지 않아서 변칙적 인 쿼리 동작이 발생할 위험이 매우 심각합니다..

이 매개 변수가 설정된 경우에도true, Collation의 원격 서버의 기본값을 가져 오는 것은 위험 할 수 있습니다. 그들은로 수입됩니다."기본값", 로컬 서버의 기본 콜 레이션을 선택할 수 있습니다.

import_default(부울)

이 옵션은 열을 제어합니다기본값표현식은 외국 서버에서 가져온 외국 테이블의 정의에 포함됩니다. 기본값은거짓. 이 옵션을 활성화하는 경우 원격 서버에서 로컬 서버에서 다르게 계산 될 수있는 기본값에주의하십시오.nextVal ()는 일반적인 문제의 원인입니다. 그만큼가져 오기가져온 기본 표현식이 로컬로 존재하지 않는 함수 또는 연산자를 사용하는 경우 완전히 실패합니다.

import_generated(부울)

이 옵션은 열을 제어합니다생성표현식은 외국 서버에서 가져온 외국 테이블의 정의에 포함됩니다. 기본값은true. 그만큼가져 오기수입 된 생성 된 표현식이 로컬로 존재하지 않는 함수 또는 연산자를 사용하면 완전히 실패합니다.

import_not_null(부울)

이 옵션은 열 여부를 제어합니다NOT NULL제약 조건은 외국 서버에서 가져온 외래 테이블의 정의에 포함됩니다. 기본값은true.

이외의 제약 조건에 유의하십시오NOT NULL원격 테이블에서 절대 가져 오지 않습니다. 하지만PostgreSQL외래 테이블의 확인 조건 제약 조건을 지원합니다. 제약 조건 표현이 로컬 서버 및 원격 서버에서 다르게 평가할 수 있기 때문에 자동으로 가져 오는 조항이 없습니다. 체크 제약 조건의 동작에서 그러한 불일치는 쿼리 최적화에서 검출하기 어려운 오류로 이어질 수 있습니다. 따라서 점검 제약을 가져 오려면 수동으로 그렇게해야하며 각각의 의미를 신중하게 확인해야합니다. 외국 테이블에서의 수표 제약 치료에 대한 자세한 내용은 참조하십시오.외국 테이블 만들기.

다른 테이블의 파티션 인 테이블 또는 외국 테이블은 명시 적으로 지정된 경우에만 가져옵니다한계절. 그렇지 않으면 그들은 자동으로 |외국 스키마 가져 오기. 분할 계층 구조의 루트 인 파티션 된 테이블을 통해 모든 데이터에 액세스 할 수 있으므로 파티션 된 테이블 만 가져 오면 추가 객체를 생성하지 않고 모든 데이터에 액세스 할 수 있어야합니다..

F.38.1.10. 연결 관리 옵션#

기본적으로 모든 연결이postgres_fdw재사용을 위해 로컬 세션에서 외국 서버에 대한 설정을 유지합니다.

Keep_Connections(부울) #

이 옵션은를 제어합니다.postgres_fdw후속 쿼리가 재사용 할 수 있도록 외국 서버에 연결을 열어 두십시오. 외국 서버에 대해서만 지정할 수 있습니다. 기본값은on. 로 설정된 경우OFF,이 외국 서버에 대한 모든 연결은 각 트랜잭션의 끝에서 폐기됩니다.

use_scram_passthrough(부울) #

이 옵션은를 제어합니다.postgres_fdwSCRAM PASS-Strough 인증을 사용하여 외국 서버에 연결합니다. Scram Pass-Strough 인증,postgres_fdw원격 서버에 연결하기 위해 일반 텍스트 사용자 암호 대신 Scram-Hashed Secret을 사용합니다. 이것은 PostgreSQL 시스템 카탈로그에 일반 텍스트 사용자 비밀번호를 저장하지 않습니다.

Scram Pass-Strough 인증을 사용하려면 :

  • 원격 서버가 요청해야합니다Scram-Sha-256인증 방법; 그렇지 않으면 연결이 실패합니다.

  • 원격 서버는 SCRAM을 지원하는 PostgreSQL 버전 일 수 있습니다. 지원use_scram_passthrough클라이언트 측 (FDW 측)에서만 필요합니다.

  • 사용자 매핑 암호가 사용되지 않습니다.

  • 실행중인 서버postgres_fdw그리고 원격 서버에는 사용중인 사용자에 대해 동일한 스크램 비밀 (암호화 된 암호)이 있어야합니다.postgres_fdw외국 서버에서 인증하려면 (동일한 비밀번호가 아닌 동일한 소금 및 반복)

    예를 들어, 다수의 호스트와의 FDW 연결 (예 : 분할 된 외국 테이블/샤딩)과 같은 경우, 모든 호스트는 관련 사용자에 대해 동일한 SCRAM 비밀을 가져야합니다.

  • 나가는 FDW 연결을 만드는 PostgreSQL 인스턴스의 현재 세션도 들어오는 클라이언트 연결을 위해 SCRAM 인증을 사용해야합니다. (따라서Pass-Strough: SCRAM은 들어오고 나가야합니다.) 이것은 SCRAM 프로토콜의 기술적 요구 사항입니다.

F.38.2. 기능#

postgres_fdw_get_connection (check_conn boolean default false, out server_name 텍스트, out user_name 텍스트, 유효한 부울, out_in_xact boolean, 폐쇄 부울, out atmere_backend_pid int 4) 반환 reture

이 기능은 모든 열린 연결에 대한 정보를 반환합니다. Postgres_FDW는 로컬 세션에서 외국 서버로 설정했습니다. 열린 연결이 없으면 레코드가 반환되지 않습니다.

ifcheck_conn로 설정되었습니다true, 함수는 각 연결의 상태를 확인하고 결과를에 표시합니다.폐쇄열. 이 기능은 현재 비표준을 지원하는 시스템에서만 사용할 수 있습니다pollrdhup연장Linux를 포함한 시스템 호출. 이는 트랜잭션 내에서 사용되는 모든 연결이 여전히 열려 있는지 확인하는 데 유용합니다. 연결이 닫히면 트랜잭션을 성공적으로 커밋 할 수 없으므로 끝까지 계속되는 대신 닫힌 연결이 감지 되 자마자 롤백하는 것이 좋습니다. 기능이 두 곳에서 연결을보고하면 사용자는 즉시 트랜잭션을 롤백 할 수 있습니다used_in_xactand폐쇄aretrue.

함수의 사용법 예 :

postgres =# select * from postgres_fdw_get_connections (true);
 Server_name | user_name | 유효한 | used_in_xact | 폐쇄 | Remote_backend_pid
------------+----------+-------+------------------------------------------------------------
 루프백 1 | Postgres | t | t | f |            1353340
 루프백 2 | 공개 | t | t | f |            1353120
 루프백 3 |           | f | t | f |            1353156

출력 열은에 설명되어 있습니다.표 F.28.

표 F.28. postgres_fdw_get_connections출력 열

타입 설명
server_name 텍스트 이 연결의 외래 서버 이름. 서버가 삭제되었지만 연결이 열린 상태로 유지되면 (즉, 유효하지 않은 것으로 표시)NULL.
user_name 텍스트 이 연결의 외국 서버에 매핑 된 로컬 사용자의 이름 또는public공개 매핑이 사용되는 경우. 사용자 매핑이 삭제되었지만 연결이 열려있는 상태로 유지되면 (즉, 유효하지 않은 것으로 표시)NULL.
유효 부울 거짓이 연결이 유효하지 않은 경우 현재 트랜잭션에 사용되지만 해당 외국 서버 또는 사용자 매핑이 변경되거나 삭제되었습니다. 거래가 끝날 때 잘못된 연결이 닫힙니다. 참으로 반환됩니다.
used_in_xact 부울 이 연결이 현재 트랜잭션에서 사용되는 경우 True
폐쇄 부울 True이 연결이 닫히면, 그렇지 않으면 false.NULLif 반환됩니다.check_conn로 설정되었습니다false또는이 플랫폼에서 연결 상태 확인을 사용할 수없는 경우.
Remote_backend_pid int4 외국 서버에서 원격 백엔드의 프로세스 ID, 연결 처리. 원격 백엔드가 종료되고 연결이 닫힌 경우 (폐쇄설정true), 이것은 여전히 종료 된 백엔드의 프로세스 ID를 보여줍니다.

postgres_fdw_disconnect (server_name text) 반환 부울

이 함수는에 의해 설정된 열린 연결을 버립니다postgres_fdw로컬 세션에서 주어진 이름을 가진 외국 서버에 이르기까지. 다른 사용자 매핑을 사용하여 주어진 서버에 여러 개의 연결이있을 수 있습니다. 연결이 현재 로컬 트랜잭션에서 사용되는 경우 연결이 끊어지지 않으며 경고 메시지 가보고됩니다. 이 함수는 반환True적어도 하나의 연결을 연결하면 그렇지 않으면false. 주어진 이름이있는 외국 서버가없는 경우 오류 가보고됩니다. 기능의 예제 :

postgres =# postgres_fdw_disconnect ( 'loopback1');
 postgres_fdw_disconnect
-----------------------------
 티
postgres_fdw_disconnect_all () boolean 반환

이 함수는에 의해 설정된 모든 열린 연결을 폐기합니다postgres_fdw로컬 세션에서 외국 서버까지. 연결이 현재 로컬 트랜잭션에서 사용되는 경우 연결이 끊어지지 않으며 경고 메시지 가보고됩니다. 이 함수는 반환true적어도 하나의 연결을 연결하면false. 기능의 예제 :

postgres =# postgres_fdw_disconnect_all ();
 postgres_fdw_disconnect_all
---------------------------------
 티

F.38.3. 연결 관리#

postgres_fdw외국 서버와 관련된 외국 테이블을 사용하는 첫 번째 쿼리 중에 외국 서버에 대한 연결을 설정합니다. 기본적 으로이 연결은 동일한 세션에서 후속 쿼리에 대해 유지 및 재사용됩니다. 이 동작은를 사용하여 제어 할 수 있습니다.Keep_Connections외국 서버의 옵션. 여러 사용자 ID (사용자 매핑)가 외국 서버에 액세스하는 데 사용되는 경우 각 사용자 매핑마다 연결됩니다.

외국 서버 또는 사용자 매핑의 정의 또는 제거를 변경하면 관련 연결이 닫힙니다. 그러나 현재 지역 거래에서 연결이 사용되는 경우 거래가 끝날 때까지 유지됩니다. 외국 테이블을 사용하는 향후 쿼리에 의해 필요할 때 폐쇄 된 연결이 재건 될 것입니다.

외국 서버에 대한 연결이 설정되면 로컬 또는 해당 원격 세션이 종료 될 때까지 기본적으로 유지됩니다. 연결을 분리하려면 명시 적으로Keep_Connections외국 서버의 옵션이 비활성화 될 수 있습니다.postgres_fdw_disconnectpostgres_fdw_disconnect_all함수를 사용할 수 있습니다. 예를 들어, 이들은 더 이상 필요하지 않은 연결을 닫는 데 유용하여 외국 서버에서 연결을 공개합니다.

F.38.4. 거래 관리#

외국 서버에서 원격 테이블을 참조하는 쿼리 중에Postgres_FDW현재 로컬 트랜잭션에 해당하는 아직 열지 않은 경우 원격 서버에서 트랜잭션을 엽니 다. 로컬 거래가 저지르거나 중단 할 때 원격 거래는 커밋되거나 중단됩니다. SavePoints는 해당 원격 저장 포인트를 작성하여 유사하게 관리됩니다.

원격 트랜잭션이 사용SERIALIZABLE지역 거래가있는 경우 격리 수준SERIALIZALE분리 레벨; 그렇지 않으면 사용반복 가능한 읽기분리 레벨. 이 선택을 통해 쿼리가 원격 서버에서 여러 테이블 스캔을 수행하면 모든 스캔에 대한 스냅 샷과 일치하는 결과가 나타납니다. 결과적으로 단일 트랜잭션 내에서 연속적인 쿼리는 다른 활동으로 인해 원격 서버에서 동시 업데이트가 발생하더라도 원격 서버에서 동일한 데이터를 볼 수 있습니다. 지역 거래가 사용하면 어쨌든 그 행동이 예상 될 것입니다SERIALIZABLE또는반복 가능한 읽기격리 레벨이지만 A에 놀라운 일이 될 수 있습니다.Commited 읽기로컬 거래. 미래PostgreSQL릴리스 가이 규칙을 수정할 수 있습니다.

현재는 지원되지 않습니다Postgres_FDW2 상 커밋을 위해 원격 트랜잭션을 준비하려면

F.38.5. 원격 쿼리 최적화#

Postgres_FDW외국 서버에서 전송 된 데이터 양을 줄이기 위해 원격 쿼리를 최적화하려고 시도합니다. 이것은 query를 보내어 수행됩니다여기서실행을 위해 원격 서버로의 조항과 현재 쿼리에 필요하지 않은 테이블 열을 검색하지 않습니다. 쿼리의 미성 침체의 위험을 줄이기 위해여기서클로스는 데이터 유형, 연산자 및 기능 만 사용하지 않는 한 원격 서버로 전송되지 않습니다.확장옵션. 그러한 조항의 운영자와 기능은불변for업데이트또는삭제쿼리,postgres_fdw쿼리가없는 경우 전체 쿼리를 원격 서버로 전송하여 쿼리 실행을 최적화하려고 시도합니다여기서원격 서버로 보낼 수없는 클로스, 쿼리에 대한 로컬 조인, 로컬 로컬 없음또는이후대상 테이블에 생성 된 열 트리거 또는 저장된 열을옵션 확인부모보기의 제약. 안에업데이트, 대상 열에 할당하는 표현식은 내장 데이터 유형 만 사용해야합니다.불변운영자 또는불변함수, 쿼리의 미성 침체 위험을 줄이기위한 기능.

언제postgres_fdw동일한 외국 서버의 외국 테이블 사이의 결합을 만나면, 어떤 이유로 든 각 테이블의 행을 개별적으로 가져 오는 것이 더 효율적이라고 생각하지 않거나 관련된 테이블 참조가 다른 사용자 맵핑에 따라 다릅니다. 보내는 동안Join조항, 위에서 언급 한 것과 동일한 예방 조치를 취합니다.여기서클로즈.

실행을 위해 실제로 원격 서버로 전송 된 쿼리를 사용하여 검사 할 수 있습니다Verbose 설명.

F.38.6. 원격 쿼리 실행 환경#

원격 세션에서postgres_fdw,search_path매개 변수가 정당하게 설정되었습니다PG_CATALOG, 스키마 자격없이 내장 객체 만 볼 수 있도록합니다. 이것은에 의해 생성 된 쿼리에 대한 문제가 아닙니다.postgres_fdw자체는 항상 그러한 자격을 제공하기 때문입니다. 그러나 이는 원격 테이블의 트리거 또는 규칙을 통해 원격 서버에서 실행되는 기능에 위험을 초래할 수 있습니다. 예를 들어, 원격 테이블이 실제로보기 인 경우 해당보기에 사용 된 기능은 제한된 검색 경로로 실행됩니다. 그러한 함수의 모든 이름을 스키마 자격으로 평가하거나 첨부하는 것이 좋습니다set search_path옵션 (참조함수 만들기) 그러한 함수에 대한 예상 검색 경로 환경을 설정하기 위해.

postgres_fdw마찬가지로 다양한 매개 변수에 대한 원격 세션 설정을 설정합니다.

이들은 문제가 적을 가능성이 적습니다search_path이지만 기능으로 처리 할 수 있습니다SET필요가 발생하는 경우 옵션.

그것은not이 매개 변수의 세션 수준 설정을 변경 하여이 동작을 무시할 것을 권장합니다. 그것은 원인 일 가능성이 높습니다postgres_fdw오작동에.

F.38.7. 교차 버전 호환성#

postgres_fdw로 거슬러 올라가는 원격 서버와 함께 사용할 수 있습니다PostgreSQL8.3. 읽기 전용 기능은 8.1로 다시 사용할 수 있습니다.

한계는입니다.postgres_fdw일반적으로 불변의 내장 기능과 운영자가 실행을 위해 원격 서버로 보내기에 안전하다고 가정합니다.여기서외국 표에 대한 조항. 따라서 원격 서버의 릴리스 이후에 추가 된 내장 기능이 실행을 위해 전송 될 수있어함수가 존재하지 않습니다또는 유사한 오류. 이 유형의 실패는 쿼리를 다시 작성하여 해결할 수 있습니다.selectwith오프셋 0최적화 울타리로서, 문제가있는 기능 또는 연산자를 하위 외부에 배치합니다select.

또 다른 한계는 실행할 때입니다.삽입갈등에 대한 일은 아무것도 없습니다외국 테이블의 절에서 원격 서버가 실행 중이 됨PostgreSQL9.5 이상, 이전 버전 이이 기능을 지원하지 않으므로

F.38.8. 대기 이벤트#

Postgres_FDW대기 이벤트 유형에서 다음 대기 이벤트를보고 할 수 있습니다확장:

postgresfdwcleanupresult

원격 서버에서 트랜잭션 중단 대기 중.

postgresfdwconnect

원격 서버에 연결하기를 기다리고 있습니다.

postgresfdwgetresult

원격 서버에서 쿼리 결과를 받기를 기다리고 있습니다.

F.38.9. 구성 매개 변수#

postgres_fdw.application_name(String) #

값을 지정application_nameconfiguration 매개 변수를 사용했을 때postgres_fdw외국 서버와 연결을 설정합니다. 이것은 무시합니다Application_Name서버 객체의 옵션. 이 매개 변수의 변경 사항은 다시 설립 될 때까지 기존 연결에 영향을 미치지 않습니다.

postgres_fdw.application_name길이의 모든 스트링 일 수 있으며 ASCII가 아닌 문자조차 포함합니다. 그러나 전달되고에 사용될 때application_name외국 서버에서는 이하로 잘릴 것입니다.지명 된 ATALEN문자. 인쇄 가능한 ASCII 문자 이외의 다른 것은로 대체됩니다.C 스타일의 16 진수 탈출. 보다Application_Name자세한 내용.

%문자 시작탈출 시퀀스는 아래에 요약 된 상태 정보로 대체됩니다. 인식되지 않은 탈출은 무시됩니다. 다른 문자는 응용 프로그램 이름으로 바로 복사됩니다. 이후에 플러스/마이너스 부호 또는 숫자 리터럴을 지정할 수 없습니다.%옵션 전에 정렬 및 패딩을위한 옵션.

탈출 효과
%a 로컬 서버의 응용 프로그램 이름
%C 로컬 서버의 세션 ID (참조log_line_prefix자세한 내용)
%C 로컬 서버의 클러스터 이름 (참조cluster_name자세한 내용)
%U 로컬 서버의 사용자 이름
%d 로컬 서버의 데이터베이스 이름
%p 로컬 서버에서 백엔드의 프로세스 ID
%% 리터럴 %

예를 들어, 사용자를 가정 해local_user데이터베이스에서 연결을 설정local_dbto외국_DB사용자로외국 _user, 설정'db =%d, user =%u''db = local_db, user = local_user'.

F.38.10. 예#

다음은로 외국 테이블을 만드는 예입니다.postgres_fdw. 먼저 확장자 설치 :

확장 생성 Postgres_fdw;

그런 다음를 사용하여 외국 서버를 만듭니다서버 생성. 이 예에서 우리는 A에 연결하고 싶습니다PostgreSQL호스트의 서버192.83.123.89포트 듣기5432. 연결이 이루어진 데이터베이스 이름외국_DB원격 서버에서 :

Server forever_server 생성
        외국 데이터 포장 Postgres_FDW
        옵션 (호스트 '192.83.123.89', 포트 '5432', dbname 'forex_db');

사용자 맵핑, 정의사용자 매핑 만들기, 원격 서버에서 사용될 역할을 식별하기 위해 필요합니다 :

local_user에 대한 사용자 매핑 생성
        서버 외국_server
        옵션 (사용자 '외국_user', 비밀번호 '비밀번호');

이제로 외국 테이블을 만들 수 있습니다외국 테이블 만들기. 이 예에서는이라는 테이블에 액세스하고자합니다.some_schema.some_table원격 서버에서. 그것의 로컬 이름은입니다.외국 _table:

외국 테이블 생성 외국_table (
        ID 정수가 NULL,
        데이터 텍스트
))
        서버 외국_server
        옵션 (schema_name 'some_schema', table_name 'some_table');

선언 된 열의 데이터 유형 및 기타 속성이외국 테이블 만들기실제 원격 테이블과 일치합니다. 첨부하지 않는 한 열 이름도 일치해야합니다column_name원격 테이블에서 이름이 어떻게 지명되었는지를 보여주기 위해 개별 열의 옵션. 많은 경우 사용외국 스키마 가져 오기수동으로 외국 테이블 정의를 구성하는 것이 바람직합니다.

F.38.11. 작가#

Shigeru Hanada