F.38. postgres_fdw — 외부에 저장된 데이터에 액세스포스트그레SQL서버#

postgres_fdw모듈은 외부 데이터 래퍼를 제공합니다postgres_fdw, 외부에 저장된 데이터에 액세스하는 데 사용할 수 있음포스트그레SQL서버.

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

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

  1. 설치postgres_fdw확장을 사용하여확장 프로그램 만들기.

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

  3. 다음을 사용하여 사용자 매핑을 생성합니다.사용자 매핑 생성, 각 데이터베이스 사용자에 대해 각 외부 서버에 대한 액세스를 허용합니다. 사용할 원격 사용자 이름과 비밀번호를 지정하세요.사용자그리고비밀번호사용자 매핑 옵션.

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

이제 당신에게 필요한 것은 오직선택외부 테이블에서 기본 원격 테이블에 저장된 데이터에 액세스합니다. 다음을 사용하여 원격 테이블을 수정할 수도 있습니다.삽입, 업데이트, 삭제, 복사또는잘라내기. (물론, 사용자 매핑에 지정한 원격 사용자에게는 이러한 작업을 수행할 수 있는 권한이 있어야 합니다.)

참고하세요옵션이 지정됨선택, 업데이트, 삭제또는잘라내기원격 테이블에 액세스하거나 수정할 때 효과가 없습니다.

참고하세요postgres_fdw현재 다음 항목에 대한 지원이 부족합니다.삽입가 포함된 문충돌 시 업데이트를 하세요절. 그러나,충돌 시 아무것도 하지 않음14492_14591postgres_fdw다음에 의해 호출된 행 이동을 지원합니다.업데이트문이 분할된 테이블에서 실행되지만 현재는 이동된 행을 삽입하기 위해 선택한 원격 파티션도 파티션인 경우를 처리하지 않습니다.업데이트같은 명령의 다른 곳에서 업데이트될 대상 파티션.

일반적으로 외부 테이블의 열은 원격 테이블의 참조 열과 정확히 동일한 데이터 유형 및 해당되는 경우 데이터 정렬을 사용하여 선언되는 것이 좋습니다. 그래도postgres_fdw현재 필요에 따라 데이터 유형 변환을 수행하는 것에 대해 다소 관대합니다. 원격 서버가 쿼리 조건을 로컬 서버와 다르게 해석하기 때문에 유형이나 데이터 정렬이 일치하지 않는 경우 놀라운 의미적 이상이 발생할 수 있습니다.

외부 테이블은 기본 원격 테이블보다 더 적은 수의 열 또는 다른 열 순서로 선언될 수 있습니다. 열과 원격 테이블의 일치는 위치가 아닌 이름을 기준으로 이루어집니다.

F.38.1. postgres_fdw의 FDW 옵션#

F.38.1.1. 연결 옵션#

다음을 사용하는 외부 서버postgres_fdw외부 데이터 래퍼는 다음과 동일한 옵션을 가질 수 있습니다.libpq에 설명된 대로 연결 문자열을 허용합니다.섹션 34.1.2, 단, 이러한 옵션은 허용되지 않거나 특별 처리가 있습니다.

  • 사용자, 비밀번호그리고ssl비밀번호(대신 사용자 매핑에서 이를 지정하거나 서비스 파일을 사용하십시오)

  • 클라이언트_인코딩(로컬 서버 인코딩에서 자동으로 설정됨)

  • 응용프로그램_이름- 이것은 다음에 나타날 수 있습니다.둘 중 하나 또는 둘 다연결 및postgres_fdw.application_name. 둘 다 존재하는 경우,postgres_fdw.application_name연결 설정을 재정의합니다. 달리libpq, postgres_fdw허용응용프로그램_이름포함하다이스케이프 시퀀스. 참조postgres_fdw.application_name자세한 내용은.

  • fallback_application_name(항상 다음으로 설정됨postgres_fdw)

  • sslkey그리고sslcert- 다음 위치에 나타날 수 있습니다.둘 중 하나 또는 둘 다연결 및 사용자 매핑. 둘 다 존재하는 경우 사용자 매핑 설정이 연결 설정보다 우선 적용됩니다.

수퍼유저만이 다음을 사용하여 사용자 매핑을 생성하거나 수정할 수 있습니다.sslcert또는sslkey설정.

수퍼유저가 아닌 사용자는 비밀번호 인증이나 GSSAPI 위임 자격 증명을 사용하여 외부 서버에 연결할 수 있으므로 다음을 지정하십시오.비밀번호비밀번호 인증이 필요한 비수퍼유저에 속하는 사용자 매핑을 위한 옵션.

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

some_non_superuser 서버 loopback_nopw에 대한 사용자 매핑 변경
옵션(추가 비밀번호_필수 'false');

권한 없는 사용자가 슈퍼유저 권한으로 승격하기 위해 postgres 서버가 실행 중인 unix 사용자의 인증 권한을 악용하는 것을 방지하기 위해 슈퍼유저만 사용자 매핑에서 이 옵션을 설정할 수 있습니다.

이로 인해 매핑된 사용자가 CVE-2007-3278 및 CVE-2007-6601에 따라 매핑된 데이터베이스에 수퍼유저로 연결하는 기능을 허용하지 않도록 주의가 필요합니다. 설정하지 않음password_required=false공개역할. 매핑된 사용자는 잠재적으로 모든 클라이언트 인증서를 사용할 수 있다는 점을 명심하세요..pgpass, .pg_service.conf등. postgres 서버가 실행되는 시스템 사용자의 unix 홈 디렉토리에서. 또한 다음과 같은 인증 모드에서 부여된 신뢰 관계를 사용할 수도 있습니다.동료또는ident인증.

F.38.1.2. 개체 이름 옵션#

이 옵션은 원격으로 전송되는 SQL 문에 사용되는 이름을 제어하는 데 사용할 수 있습니다.PostgreSQL서버. 이러한 옵션은 기본 원격 테이블 이름과 다른 이름으로 외부 테이블을 생성할 때 필요합니다.

schema_name (문자열)

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

테이블_이름 (문자열)

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

컬럼_이름 (문자열)

외부 테이블의 열에 대해 지정할 수 있는 이 옵션은 원격 서버의 열에 사용할 열 이름을 제공합니다. 이 옵션을 생략하면 해당 컬럼의 이름이 사용됩니다.

F.38.1.3. 비용 추정 옵션#

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

use_remote_estimate (부울)

외부 테이블이나 외부 서버에 대해 지정할 수 있는 이 옵션은 다음을 제어합니다.postgres_fdw원격 문제설명비용 견적을 얻기 위한 명령입니다. 외부 테이블에 대한 설정은 해당 서버에 대한 모든 설정을 재정의하지만 해당 테이블에 대해서만 적용됩니다. 기본값은거짓.

fdw_startup_cost (부동 소수점)

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

fdw_tuple_cost (부동 소수점)

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

언제use_remote_estimate사실입니다,postgres_fdw원격 서버에서 행 수와 비용 견적을 얻은 다음 추가합니다.fdw_startup_cost그리고fdw_tuple_cost비용 견적에. 언제use_remote_estimate거짓입니다,postgres_fdw로컬 행 개수 및 비용 추정을 수행한 다음 추가합니다fdw_startup_cost그리고fdw_tuple_cost비용 견적에. 원격 테이블 통계의 로컬 복사본을 사용할 수 없으면 이 로컬 추정은 매우 정확하지 않을 수 있습니다. 실행 중분석외부 테이블에서는 로컬 통계를 업데이트하는 방법입니다. 그러면 원격 테이블을 스캔한 다음 테이블이 로컬인 것처럼 통계를 계산하고 저장합니다. 로컬 통계를 유지하는 것은 원격 테이블에 대한 쿼리별 계획 오버헤드를 줄이는 데 유용한 방법이 될 수 있습니다. 그러나 원격 테이블이 자주 업데이트되면 로컬 통계는 곧 쓸모 없게 됩니다.

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

analyze_sampling (문자열)

외부 테이블이나 외부 서버에 대해 지정할 수 있는 이 옵션은 다음을 결정합니다.분석외부 테이블의 경우 원격 측의 데이터를 샘플링하거나 모든 데이터를 읽고 전송한 후 로컬에서 샘플링을 수행합니다. 지원되는 값은 다음과 같습니다.꺼짐, 무작위, 시스템, 베르누이그리고자동. 꺼짐원격 샘플링을 비활성화하므로 모든 데이터가 로컬로 전송되고 샘플링됩니다.무작위다음을 사용하여 원격 샘플링을 수행합니다.무작위()반환된 행을 선택하는 함수, 반면시스템그리고베르누이내장된 기능에 의존테이블 샘플그 이름의 방법.무작위모든 원격 서버 버전에서 작동하지만테이블 샘플9.5부터만 지원됩니다.자동(기본값)은 권장되는 샘플링 방법을 자동으로 선택합니다. 현재는 둘 중 하나를 의미합니다.베르누이또는무작위원격 서버 버전에 따라 다릅니다.

F.38.1.4. 원격 실행 옵션#

기본적으로만어디27904_28260어디원격 실행을 위한 절. 이 동작은 다음 옵션을 사용하여 제어할 수 있습니다.

확장 프로그램 (문자열)

이 옵션은 쉼표로 구분된 이름 목록입니다.PostgreSQL호환되는 버전으로 로컬 및 원격 서버 모두에 설치된 확장 프로그램입니다. 변경할 수 없고 나열된 확장에 속하는 함수 및 연산자는 원격 서버에 제공 가능한 것으로 간주됩니다. 이 옵션은 테이블 단위가 아닌 외부 서버에만 지정할 수 있습니다.

사용 시확장 프로그램옵션,이것은 사용자의 책임입니다나열된 확장이 존재하고 로컬 및 원격 서버 모두에서 동일하게 작동하는지 확인하십시오. 그렇지 않으면 원격 쿼리가 실패하거나 예기치 않게 동작할 수 있습니다.

fetch_size (정수)

이 옵션은 행 수를 지정합니다.postgres_fdw각 가져오기 작업에 참여해야 합니다. 외부 테이블이나 외부 서버에 대해 지정할 수 있습니다. 테이블에 지정된 옵션은 서버에 지정된 옵션보다 우선합니다. 기본값은100.

배치_크기 (정수)

이 옵션은 행 수를 지정합니다.postgres_fdw각 삽입 작업에 삽입해야 합니다. 외부 테이블이나 외부 서버에 대해 지정할 수 있습니다. 테이블에 지정된 옵션은 서버에 지정된 옵션보다 우선합니다. 기본값은1.

실제 행 수 참고postgres_fdw한 번에 삽입하는 것은 열 수와 제공된 항목에 따라 다릅니다.배치_크기값. 배치는 단일 쿼리로 실행되며 libpq 프로토콜(이것은postgres_fdw원격 서버에 연결하는 데 사용)은 단일 쿼리의 매개변수 수를 65535로 제한합니다. 열 수가 *배치_크기한계를 초과했습니다.배치_크기오류를 방지하기 위해 조정됩니다.

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

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

postgres_fdw의 여러 부분을 실행하는 비동기 실행을 지원합니다.추가성능 향상을 위해 직렬이 아닌 동시에 노드를 실행합니다. 이 실행은 다음 옵션을 사용하여 제어할 수 있습니다.

async_capable (부울)

이 옵션은 다음을 제어합니다.postgres_fdw비동기 실행을 위해 외부 테이블을 동시에 스캔할 수 있습니다. 외부 테이블이나 외부 서버에 대해 지정할 수 있습니다. 테이블 수준 옵션은 서버 수준 옵션보다 우선합니다. 기본값은거짓.

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

비동기 실행은 다음과 같은 경우에도 적용됩니다.추가노드에는 동기식으로 실행되는 하위 계획과 비동기식으로 실행되는 하위 계획이 포함되어 있습니다. 이러한 경우 비동기 하위 계획이 다음을 사용하여 처리된 것이라면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다음을 사용하여 외부 테이블을 수정할 수 있습니다.삽입, 업데이트그리고삭제명령. 외부 테이블이나 외부 서버에 대해 지정할 수 있습니다. 테이블 수준 옵션은 서버 수준 옵션보다 우선합니다. 기본값은.

물론, 원격 테이블이 실제로 업데이트 가능하지 않다면 어쨌든 오류가 발생합니다. 이 옵션을 사용하면 주로 원격 서버에 쿼리하지 않고 로컬로 오류가 발생하도록 할 수 있습니다. 그러나 참고하세요.정보_스키마조회수가 보고됩니다.postgres_fdw이 옵션의 설정에 따라 원격 서버를 확인하지 않고도 외부 테이블을 업데이트할 수 있습니다.

F.38.1.8. 잘림 가능성 옵션#

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

잘림 가능 (부울)

이 옵션은 다음을 제어합니다.postgres_fdw다음을 사용하여 외부 테이블을 자를 수 있습니다.잘라내기명령. 외부 테이블이나 외부 서버에 대해 지정할 수 있습니다. 테이블 수준 옵션은 서버 수준 옵션보다 우선합니다. 기본값은.

물론 원격 테이블이 실제로 잘릴 수 없는 경우 어쨌든 오류가 발생합니다. 이 옵션을 사용하면 주로 원격 서버에 쿼리하지 않고 로컬에서 오류가 발생하도록 할 수 있습니다.

F.38.1.9. 가져오기 옵션#

postgres_fdw다음을 사용하여 외부 테이블 정의를 가져올 수 있습니다.외부 스키마 가져오기. 이 명령은 원격 서버에 있는 테이블이나 뷰와 일치하는 외부 테이블 정의를 로컬 서버에 생성합니다. 가져올 원격 테이블에 사용자 정의 데이터 유형의 열이 있는 경우 로컬 서버에는 동일한 이름의 호환 가능한 유형이 있어야 합니다.

가져오기 동작은 다음 옵션을 사용하여 사용자 정의할 수 있습니다(다음 옵션에 제공됨외국 스키마 가져오기명령):

import_collate (부울)

이 옵션은 열 여부를 제어합니다.콜레이트옵션은 외부 서버에서 가져온 외부 테이블의 정의에 포함됩니다. 기본값은사실. 원격 서버에 로컬 서버와 다른 데이터 정렬 이름 집합이 있는 경우(다른 운영 체제에서 실행 중인 경우일 가능성이 높음) 이 기능을 꺼야 할 수도 있습니다. 그러나 그렇게 하면 가져온 테이블 열의 데이터 정렬이 기본 데이터와 일치하지 않아 비정상적인 쿼리 동작이 발생할 매우 심각한 위험이 있습니다.

이 매개변수가 다음으로 설정된 경우에도, 데이터 정렬이 원격 서버의 기본값인 열을 가져오는 것은 위험할 수 있습니다. 다음으로 가져옵니다.콜레이트 "기본값", 이는 로컬 서버의 기본 데이터 정렬을 선택하며 다를 수 있습니다.

import_default (부울)

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

수입_생성 (부울)

이 옵션은 열 여부를 제어합니다.생성됨표현식은 외부 서버에서 가져온 외부 테이블의 정의에 포함되어 있습니다. 기본값은.가져오기가져온 생성 표현식이 로컬에 존재하지 않는 함수나 연산자를 사용하는 경우 완전히 실패합니다.

import_not_null (부울)

이 옵션은 열 여부를 제어합니다.NULL이 아님제약조건은 외부 서버에서 가져온 외부 테이블의 정의에 포함되어 있습니다. 기본값은.

다음 이외의 제약 조건에 유의하세요.NULL이 아님원격 테이블에서는 절대 가져오지 않습니다. 그래도PostgreSQL외부 테이블에 대한 검사 제약 조건을 지원하지만 제약 조건 표현식이 로컬 및 원격 서버에서 다르게 평가될 수 있는 위험 때문에 자동으로 가져올 수 있는 규정은 없습니다. 검사 제약 조건 동작에 이러한 불일치가 있으면 쿼리 최적화에서 감지하기 어려운 오류가 발생할 수 있습니다. 따라서 검사 제약 조건을 가져오려면 수동으로 수행해야 하며 각 항목의 의미를 주의 깊게 확인해야 합니다. 외부 테이블의 검사 제약 조건 처리에 대한 자세한 내용은 다음을 참조하세요.외부 테이블 생성.

다른 테이블의 파티션인 테이블 또는 외부 테이블은 명시적으로 지정된 경우에만 가져옵니다.한도절. 그렇지 않으면 자동으로 제외됩니다.외국 스키마 가져오기. 파티셔닝 계층의 루트인 파티셔닝된 테이블을 통해 모든 데이터에 접근할 수 있으므로, 파티셔닝된 테이블만 임포트하면 별도의 객체 생성 없이 모든 데이터에 접근이 가능해야 합니다.

F.38.1.10. 연결 관리 옵션#

기본적으로 모든 연결은postgres_fdw외부 서버에 대한 설정은 재사용을 위해 로컬 세션에서 열린 상태로 유지됩니다.

keep_connections (부울)

이 옵션은 다음을 제어합니다.postgres_fdw다음 쿼리가 이를 재사용할 수 있도록 외부 서버에 대한 연결을 열어둡니다. 외부 서버에만 지정할 수 있습니다. 기본값은켜짐. 으로 설정된 경우꺼짐, 이 외부 서버에 대한 모든 연결은 각 트랜잭션이 끝나면 삭제됩니다.

F.38.2. 기능#

postgres_fdw_get_connections(OUT server_name 텍스트, OUT 유효한 부울)이 레코드 세트를 반환합니다.

이 함수는 열려 있는 모든 연결의 외부 서버 이름을 반환합니다.postgres_fdw로컬 세션에서 외부 서버로 설정되었습니다. 또한 각 연결이 유효한지 여부도 반환합니다.거짓현재 로컬 트랜잭션에서 외부 서버 연결이 사용되지만 해당 외부 서버 또는 사용자 매핑이 변경되거나 삭제된 경우 반환됩니다. (잘못된 연결의 서버 이름은 다음과 같습니다.NULL서버가 삭제된 경우) 그런 잘못된 연결은 해당 트랜잭션이 끝나면 닫힐 것입니다.47000_47113

postgres=# SELECT * FROM postgres_fdw_get_connections() ORDER BY 1;
 서버_이름 | 유효한
-----------+-------
 루프백1 | 티
 루프백2 | 에프
postgres_fdw_disconnect(server_name 텍스트)는 부울을 반환합니다.

이 함수는 다음에 의해 설정된 열린 연결을 삭제합니다.postgres_fdw로컬 세션에서 주어진 이름을 가진 외부 서버로. 서로 다른 사용자 매핑을 사용하여 특정 서버에 여러 연결이 있을 수 있습니다. 현재 로컬 트랜잭션에서 연결이 사용되는 경우 연결이 끊어지지 않고 경고 메시지가 보고됩니다. 이 함수는 다음을 반환합니다.사실적어도 하나의 연결이 끊어진 경우, 그렇지 않은 경우거짓. 해당 이름을 가진 외부 서버가 없으면 오류가 보고됩니다. 함수 사용 예:

postgres=# SELECT postgres_fdw_disconnect('loopback1');
 postgres_fdw_disconnect
------------
 티
postgres_fdw_disconnect_all()은 부울을 반환합니다.

이 함수는 다음에 의해 설정된 모든 열린 연결을 삭제합니다.postgres_fdw로컬 세션에서 외부 서버로. 현재 로컬 트랜잭션에서 연결이 사용되는 경우 연결이 끊어지지 않고 경고 메시지가 보고됩니다. 이 함수는 다음을 반환합니다.사실적어도 하나의 연결이 끊어진 경우, 그렇지 않은 경우거짓. 함수 사용 예:

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

F.38.3. 연결 관리#

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

외부 서버 또는 사용자 매핑의 정의를 변경하거나 제거하면 관련 연결이 닫힙니다. 그러나 현재 로컬 트랜잭션에서 연결이 사용 중인 경우 해당 연결은 트랜잭션이 끝날 때까지 유지됩니다. 외래 테이블을 사용하는 향후 쿼리에 필요할 때 닫힌 연결이 다시 설정됩니다.

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

F.38.4. 거래 관리#

외부 서버의 원격 테이블을 참조하는 쿼리 중postgres_fdw현재 로컬 트랜잭션에 해당하는 트랜잭션이 아직 열려 있지 않은 경우 원격 서버에서 트랜잭션을 엽니다. 로컬 트랜잭션이 커밋되거나 중단되면 원격 트랜잭션이 커밋되거나 중단됩니다. 저장점은 해당 원격 저장점을 생성하여 유사하게 관리됩니다.

원격 트랜잭션은 다음을 사용합니다.직렬화 가능로컬 트랜잭션의 격리 수준직렬화 가능격리 수준; 그렇지 않으면 다음을 사용합니다반복 가능한 읽기격리 수준. 이렇게 선택하면 쿼리가 원격 서버에서 여러 테이블 스캔을 수행하는 경우 모든 스캔에 대해 스냅샷과 일치하는 결과를 얻을 수 있습니다. 결과적으로 단일 트랜잭션 내의 연속적인 쿼리는 다른 활동으로 인해 원격 서버에서 동시 업데이트가 발생하더라도 원격 서버에서 동일한 데이터를 보게 됩니다. 로컬 트랜잭션이 다음을 사용하는 경우 해당 동작이 예상됩니다.직렬화 가능또는반복 가능한 읽기격리 수준이지만 a에게는 놀랄 수도 있습니다.읽어 커밋됨로컬 트랜잭션. 미래PostgreSQL릴리스에서는 이 규칙을 수정할 수 있습니다.

현재는 지원되지 않습니다.postgres_fdw2단계 커밋을 위한 원격 트랜잭션을 준비합니다.

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

postgres_fdw외부 서버에서 전송되는 데이터의 양을 줄이기 위해 원격 쿼리를 최적화하려고 시도합니다. 이는 쿼리를 전송하여 수행됩니다.어디절을 원격 서버에 전달하여 실행하고 현재 쿼리에 필요하지 않은 테이블 열을 검색하지 않습니다. 쿼리가 잘못 실행될 위험을 줄이기 위해,어디에서절은 내장되거나 외부 서버에 나열된 확장에 속하는 데이터 유형, 연산자 및 함수만 사용하지 않는 한 원격 서버로 전송되지 않습니다.확장옵션. 해당 절의 연산자와 함수는 다음과 같아야 합니다.불변또한요. 에 대한업데이트또는삭제질의,postgres_fdw쿼리가 없는 경우 전체 쿼리를 원격 서버로 전송하여 쿼리 실행을 최적화하려고 시도합니다.어디에서원격 서버로 보낼 수 없는 절, 쿼리에 대한 로컬 조인 없음, 행 수준 로컬 없음이전또는이후대상 테이블에서 생성된 열을 트리거하거나 저장하며, 아니오옵션 확인상위 뷰의 제약. 에서업데이트, 대상 열에 할당할 표현식은 내장 데이터 유형만 사용해야 합니다.불변연산자 또는불변함수, 쿼리의 잘못된 실행 위험을 줄이기 위한 것입니다.

언제postgres_fdw동일한 외부 서버에 있는 외부 테이블 사이의 조인이 발생하면 어떤 이유로 각 테이블에서 개별적으로 행을 가져오는 것이 더 효율적이라고 생각하거나 관련된 테이블 참조가 다른 사용자 매핑에 적용되지 않는 한 전체 조인을 외부 서버로 보냅니다. 보내는 동안가입절, 위에서 언급한 것과 동일한 예방 조치를 취합니다.어디절.

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

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

다음에 의해 열린 원격 세션에서postgres_fdw, 그검색_경로매개변수가 다음으로 설정됨pg_catalog, 스키마 한정 없이 내장 객체만 표시됩니다. 이는 다음으로 생성된 쿼리에는 문제가 되지 않습니다.postgres_fdw자체입니다. 항상 그러한 자격을 제공하기 때문입니다. 그러나 이는 원격 테이블의 트리거나 규칙을 통해 원격 서버에서 실행되는 기능에 위험을 초래할 수 있습니다. 예를 들어, 원격 테이블이 실제로 뷰인 경우 해당 뷰에 사용된 모든 기능은 제한된 검색 경로로 실행됩니다. 해당 함수의 모든 이름을 스키마로 한정하거나 첨부하는 것이 좋습니다.검색_경로 설정옵션(참조함수 생성)을 이러한 기능에 추가하여 예상 검색 경로 환경을 설정합니다.

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

다음보다 문제가 발생할 가능성이 적습니다.검색_경로, 그러나 함수로 처리할 수 있음세트필요한 경우 옵션을 선택하세요.

그렇습니다아님이러한 매개변수의 세션 수준 설정을 변경하여 이 동작을 재정의하는 것이 좋습니다. 그로 인해 발생할 가능성이 높습니다.postgres_fdw오작동합니다.

F.38.7. 버전 간 호환성#

postgres_fdw이전의 원격 서버와 함께 사용할 수 있습니다.PostgreSQL8.3. 읽기 전용 기능은 8.1부터 사용할 수 있습니다. 그러나 제한 사항은 다음과 같습니다.postgres_fdw일반적으로 불변 내장 함수와 연산자가 a에 나타나는 경우 실행을 위해 원격 서버로 보내도 안전하다고 가정합니다.어디외부 테이블에 대한 절. 따라서 원격 서버 릴리스 이후 추가된 내장 함수가 실행을 위해 원격 서버로 전송되어 다음과 같은 결과가 발생할 수 있습니다.함수가 존재하지 않습니다또는 유사한 오류. 이러한 유형의 실패는 쿼리를 다시 작성하여 해결할 수 있습니다. 예를 들어 하위 테이블 참조에 외부 테이블 참조를 삽입하면 됩니다.선택함께오프셋 0최적화 펜스로 사용하고 문제가 있는 함수나 연산자를 하위 외부에 배치선택.

F.38.8. 구성 매개변수#

postgres_fdw.application_name (문자열) #

다음 값을 지정합니다.응용프로그램_이름다음 경우에 사용되는 구성 매개변수postgres_fdw외부 서버에 연결을 설정합니다. 이는 재정의됩니다.응용프로그램_이름서버 개체의 옵션입니다. 이 매개변수를 변경해도 기존 연결이 다시 설정될 때까지 기존 연결에는 영향을 미치지 않습니다.

postgres_fdw.application_name길이에 관계없이 문자열이 될 수 있으며 ASCII가 아닌 문자도 포함할 수 있습니다. 그러나 다음과 같이 전달되어 사용되는 경우에는응용프로그램_이름외부 서버에서는 다음 미만으로 잘립니다.NAMEDATALEN문자. 인쇄 가능한 ASCII 문자 이외의 모든 문자는 다음으로 대체됩니다.C 스타일 16진수 이스케이프. 참조응용프로그램_이름자세한 내용은.

%문자 시작이스케이프 시퀀스아래 설명된 상태 정보로 대체됩니다. 인식할 수 없는 이스케이프는 무시됩니다. 다른 문자는 응용 프로그램 이름에 바로 복사됩니다. 뒤에는 더하기/빼기 기호나 숫자 리터럴을 지정할 수 없습니다.%그리고 정렬 및 패딩을 위한 옵션 앞.

탈출 효과
%a 로컬 서버의 애플리케이션 이름
%c 로컬 서버의 세션 ID(참조log_line_prefix자세한 내용은)
%C 로컬 서버의 클러스터 이름(참조클러스터_이름자세한 내용은)
%u 로컬 서버의 사용자 이름
%d 로컬 서버의 데이터베이스 이름
%p 로컬 서버의 백엔드 프로세스 ID
%% 문자 그대로 %

예를 들어 사용자를 가정해 보겠습니다.local_user데이터토토 베이스에서 연결을 설정합니다.local_db외국인_db사용자로서외국인_사용자, 설정'db=%d, 사용자=%u'다음으로 대체됨'db=local_db, 사용자=local_user'.

F.38.9. 예#

다음은 다음을 사용하여 외부 테이블을 생성하는 예입니다.postgres_fdw. 먼저 확장 프로그램을 설치하세요.

확장 프로그램 생성 postgres_fdw;

그런 다음 다음을 사용하여 외부 서버를 생성하십시오.서버 생성. 이 예에서는 a에 연결하려고 합니다.포스트그레SQL호스트의 서버192.83.123.89항구에서 수신 중5432. 연결이 이루어진 데이터베이스의 이름은 다음과 같습니다.외국인_db원격 서버에서:

서버 생성 foreign_server
        외부 데이터 래퍼 postgres_fdw
        OPTIONS(호스트 '192.83.123.89', 포트 '5432', dbname 'foreign_db');

다음으로 정의된 사용자 매핑사용자 매핑 생성, 원격 서버에서 사용될 역할을 식별하는 데에도 필요합니다.

local_user에 대한 사용자 매핑 생성
        서버 foreign_server
        OPTIONS(사용자 'foreign_user', 비밀번호 'password');

이제 다음을 사용하여 외부 테이블을 생성할 수 있습니다.외부 테이블 생성. 이 예에서는라는 테이블에 액세스하려고 합니다.some_schema.some_table원격 서버에서. 해당 지역 이름은 다음과 같습니다.외국_테이블:

외부 테이블 생성 foreign_table (
        ID 정수는 NULL이 아닙니다.
        데이터 텍스트
)
        서버 foreign_server
        OPTIONS(스키마_이름 'some_schema', 테이블_이름 'some_table');

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

F.38.10. 작성자#

하나다 시게루

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.