PostgreSQL은 이미지나 PDF 문서와 같은 대용량 데이터 유형을 저장하기 위해 pg_largeobject 테이블을 통해 액세스할 수 있는 대용량 객체 구조를 제공합니다. 이 접근 방식은 COPY TO 함수보다 우수한 성능을 제공하며, 데이터를 파일 시스템으로 내보낼 수 있어 원본 파일의 정확한 복제본을 유지할 수 있습니다.
이 테이블에 완전한 파일을 저장하기 위해서는 pg_largeobject 테이블에 개체(LOID로 식별)를 생성한 다음, 이 개체에 2KB 크기의 데이터 청크를 삽입해야 합니다. 이러한 청크는 정확히 2KB 크기여야 하며(마지막 청크는 예외일 수 있음), 내보내기 함수가 올바르게 작동하도록 해야 합니다.
바이너리 데이터를 2KB 청크로 분할하려면 다음 명령을 실행할 수 있습니다:
split-b2048your_file# Creates 2KB sized files
각 파일을 Base64 또는 Hex로 인코딩하기 위해 아래 명령어를 사용할 수 있습니다:
base64-w0<Chunk_file># Encodes in Base64 in one linexxd-ps-c99999999999<Chunk_file># Encodes in Hex in one line
중요: 이 프로세스를 자동화할 때, 2KB의 평문 바이트 청크를 보내도록 해야 합니다. 16진수로 인코딩된 파일은 크기가 두 배로 증가하기 때문에 청크 당 4KB의 데이터가 필요하며, Base64로 인코딩된 파일은 ceil(n / 3) * 4의 공식을 따릅니다.
디버깅 목적으로 대형 객체의 내용을 볼 수 있습니다.
select loid, pageno, encode(data, 'escape') from pg_largeobject;
lo_creat 및 Base64 사용
바이너리 데이터를 저장하기 위해 먼저 LOID를 생성합니다:
SELECT lo_creat(-1); -- Creates a new, empty large objectSELECT lo_create(173454); -- Attempts to create a large object with a specific OID
정확한 제어가 필요한 상황에서는 Blind SQL Injection을 이용하는 경우, 고정된 LOID를 지정하기 위해 lo_create를 사용하는 것이 좋습니다.