postgresql 12 버 전 구축 및 주 배치 작업

postgresql 12 버 전 주요 배치
환경 구축
centos 7+
postgresql 12.0

#     
ping -c2 baidu.com
#     ,selinux
systemctl stop firewalld && sudo systemctl disable firewalld
sed -ri s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
setenforce 0
###      yum 
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#echo "isntalling tools"
yum -y install vim net-tools wget ntpdate
yum -y groupinstall "Development Tools"
#     
echo "*/10 * * * * /usr/sbin/ntpdate ntp.aliyun.com > /dev/null 2>&1" >>/etc/crontab
#   ssh  
sed -ri s/"#UseDNS yes"/"UseDNS no"/g /etc/ssh/sshd_config
systemctl restart sshd
##     ,      ,      
yum install -y wget gcc gcc-c++ epel-release llvm5.0 llvm5.0-devel clang libicu-devel perl-ExtUtils-Embed readline readline-devel zlib zlib-devel openssl openssl-devel pam-devel libxml2-devel libxslt-devel openldap-devel systemd-devel tcl-devel python-devel
##   、  ,  
cd /usr/local/src
wget https://ftp.postgresql.org/pub/source/v12.0/postgresql-12.0.tar.gz
tar -xvzf postgresql-12.tar.gz
cd postgresql-12
./configure --prefix=/usr/local/pgsql/12 --enable-nls --with-python --with-tcl --with-gssapi --with-icu --with-openssl --with-pam --with-ldap --with-systemd --with-libxml --with-libxslt
make && make install
##        ,        
groupadd postgres
useradd -g postgres postgres
##                
echo "postgres" | passwd --stdin postgres
mkdir -p /data/pgdata/{data,archivedir}
chown -R postgres:postgres /usr/local/pgsql -R
chown postgres:postgres /data/pgdata -R
echo "export PATH=/usr/local/pgsql/12/bin:$PATH" >/etc/profile.d/pgsql.sh
source /etc/profile.d/pgsql.sh
환경 배치 가 완료 되 었 습 니 다.다음은 post gresql 의 주 비 를 구축 하 겠 습 니 다.
주비 건설
창고 건설 을 준비 하 다.
다음 작업 은 모두 postgres 사용자 아래 에서 진행 합 니 다.

su - postgres
##   
initdb -D /data/pgdata/data -U postgres --locale=en_US.UTF8 -E UTF8
cp /data/pgdata/data/{pg_hba.conf,pg_hba.conf.bak}
##   repl       
cat <<-eof >>/data/pgdata/data/pg_hba.conf
host all    all    0.0.0.0/0    md5
host replication  repl   192.168.0.0/22   trust
eof
cp /data/pgdata/data/{postgresql.conf,postgresql.conf.bak}
##  postgresql.conf
cat <<-eof >/data/pgdata/data/postgresql.conf
listen_addresses = '*'      
port = 5432
max_connections = 100
superuser_reserved_connections = 10
full_page_writes = on
wal_log_hints = off
max_wal_senders = 50
hot_standby = on
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S'
log_rotation_age = 1d
log_rotation_size = 10MB
log_statement = 'mod'
log_timezone = 'PRC'
timezone = 'PRC'
unix_socket_directories = '/tmp'
shared_buffers = 512MB
temp_buffers = 16MB
work_mem = 32MB
effective_cache_size = 2GB
maintenance_work_mem = 128MB
#max_stack_depth = 2MB
dynamic_shared_memory_type = posix
## PITR
full_page_writes = on
wal_buffers = 16MB
wal_writer_delay = 200ms
commit_delay = 0
commit_siblings = 5
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /data/pgdata/archivedir/%f && cp %p /data/pgdata/archivedir/%f'
archive_timeout = 60s
eof
##      
pg_ctl -D /data/pgdata/data -l /data/pgdata/data/serverlog start
##            
psql -U postgres -c "ALTER USER postgres WITH PASSWORD 'postgres';"
psql -U postgres -c "CREATE USER repl WITH PASSWORD 'postgres' REPLICATION;"
창고 건설 을 준비 하 다.

##     ,    ,
pg_basebackup -h 192.168.3.62 -p 5432 -U repl -w -Fp -Xs -Pv -R -D /data/pgdata/data
     postgresql.conf            :
1, listen_addresses = '* '
2, wal_level = hot_standby
3, max_connections = xxx, #         .
4,hot_standby = on
5, max_standby_streaming_delay = 30s
6. wal_receiver_status_interval = 10s
7, hot_standby_feedback = on #           ,         .
###  postgre.auto.conf    application_name =slave1,    
primary_conninfo = 'application_name=slave1 user=repl passfile=''/home/postgres/.pgpass'' host=192.168.3.62 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
##     
pg_ctl -D /data/pgdata/data start
마지막 에 쓰기(상태 검사)

##    
###         
$ psql -c "select client_addr,usename,backend_start,application_name,sync_state,sync_priority FROM pg_stat_replication;"
 client_addr | usename |   backend_start   | application_name | sync_state | sync_priority 
--------------+---------+-------------------------------+------------------+------------+---------------
 192.168.3.61 | repl | 2019-10-16 15:34:45.130732+08 | slave1   | async  |    0
(1 row)
$ psql -c "select client_addr, sync_state from pg_stat_replication;"
 client_addr | sync_state 
--------------+------------
 192.168.3.61 | async
(1 row)
##    ,       ,       :
postgres=# drop database pgtest;
ERROR: cannot execute DROP DATABASE in a read-only transaction
##        
# 
ps -ef |grep sender
postgres 92996 51692 0 15:34 ?  00:00:00 postgres: walsender repl 192.168.3.61(53958) streaming 0/8000060
postgres 101845 20470 0 15:45 pts/2 00:00:00 grep --color=auto sender
# 
ps -ef |grep recover
postgres 98311 98309 0 15:34 ?  00:00:00 postgres: startup recovering 000000010000000000000008
postgres 108029 21054 0 15:46 pts/2 00:00:00 grep --color=auto recover
#         
pg_controldata -D /data/pgdata/data/ |grep state
in archive recovery ##     
in production  ##     
추가:PostgreSQL 12:새로운 기능 과 기능 강화
소개 하 다.
PostgreSQL 12 는 세계 에서 가장 인기 가 많 고 기능 이 풍부 한 오픈 소스 데이터 뱅 크 의 다음 주요 발행 판 이다.PostgreSQL 12 의 안정 적 인 버 전 은 2019 년 말 발 표 될 예정 이다.버 전 12 의 베타 4 는 2019 년 9 월 12 일 발표 됐다.
본 고 는 당신 이 가장 중요 한 새로운 기능 의 요약 을 완성 하도록 인도 할 것 입 니 다.PostgreSQL 12 의 증강 기능 과 중대 한 변경 사항 입 니 다.
새로운 기능 과 증강 기능
CTE 강화
PostgreSQL 에서 CTE 는 최적화 장벽(외부 조회 제한 이 CTE 에 전달 되 지 않 음)이다.데이터 베 이 스 는 CTE 내부 에서 조 회 를 평가 하고 캐 시 결과(즉 구체 화 된 결과)와 외부 where 자 구 를 말한다.이 는 외부 조 회 를 처리 할 때 전체 표 스 캔 을 하거나 전체 색인 검색 을 수행 하 는 것 을 의미한다.큰 시계 로 서 는 나 쁜 성능 을 가 져 올 수 있다.

WITH AllUsers AS (SELECT * FROM Users)
SELECT * FROM AllUsers WHERE Id = 100;
이 문 제 를 극복 하기 위해 서 는 PostgreSQL 에서 이 조 회 를 다시 쓸 수 있 습 니 다.

WITH UserRecord AS (SELECT * FROM Users WHERE Id = 100)
SELECT * FROM UserRecord;
PostgreSQL 12 는 검색 최적화 기 알림 을 도입 하여 이 문 제 를 해결 함으로써 CTE:MATERIALIZED,NOT MATERIALIZED 를 실현 해 야 하 는 지 여 부 를 제어 할 수 있 습 니 다.따라서 조 회 를 다음 과 같이 다시 써 서 더 좋 은 성능 을 얻 을 수 있다.

WITH AllUsers AS NOT MATERIALIZED (SELECT * FROM Users)
SELECT * FROM AllUsers WHERE Id = 100;
이것 은 CTE 표현 식 을 효과적으로 내 연 했 고 성능 을 향상 시 켰 다.
생 성 열
SQL Server 와 Oracle 은 오랫동안 계산 열 이 있 었 고 PostgreSQL 에는 계산 열 이 없어 다른 데이터 베 이 스 를 이전 하 는 데 어려움 을 겪 었 다.PostgreSQL 12 는 생 성 열(Generated Columns)을 도입 하여 이 문 제 를 해결 했다.
열 대 열 을 만 드 는 것 은 보기 가 표 와 같 습 니 다.이 열의 값 은 시종 표 의 다른 열 에 따라 계산 된다.생 성 된 열 은 가상 또는 저장 할 수 있 습 니 다.가상 열의 값 은 조회 기간 에 동적 으로 계산 되 며 저장 공간 을 차지 하지 않 습 니 다.저 장 된 열의 값 은 표 데이터 의 일부분 으로 미리 계산 되 고 저장 되 었 습 니 다.PostgreSQL 은 현재 저 장 된 생 성 열 만 실현 합 니 다.
GENERATED ALWAYS AS 자 구 는 생 성 된 열 을 만 드 는 데 사 용 됩 니 다.

CREATE TABLE Employee (
 ...,
 dob timestamp,
 age integer GENERATED ALWAYS AS (date_part('year', CURRENT_TIME - dob)) STORED
);
PostgreSQL 11.x 와 더 빠 른 버 전에 서 유일한 방법 은 age 를 일반 열 로 설명 하고 트리거 를 작성 하여 삽입 과 업데이트 기간 에 이 열 을 채 우 는 것 입 니 다.

CREATE OR REPLACE FUNCTION calc_age() RETURNS TRIGGER AS $body$
BEGIN
 NEW.age := date_part('year', CURRENT_TIME - NEW.dob::timestamp);
 RETURN NEW;
END; 
$body$ LANGUAGE plpgsql;
계산 열의 SQL Server 문법
SQL Server 문법 과 비교 합 니 다.SQL Server 에는 계산 열 을 설명 하 는 특별한 키워드 가 없습니다.AS 자구 뒤에 저 희 를 계산 열 로 만 드 는 표현 식 을 지정 하 십시오.

-- SQL Server Syntax
CREATE TABLE Employee (
 ...,
 dob datetime,
 age AS DATEDIFF(year,dob,GETDATE()) PERSISTED
);
PERSISTED 자구 와 PostgreSQL 의 STORED 자구 가 같은 효 과 를 가 집 니 다.SQL Server 는 영구적 이지 않 은 계산 열 도 지원 합 니 다.PERSISTED 자 구 는 지정 되 지 않 습 니 다.
그렇다면 생 성 열 과 DEFAULT 자 구 를 가 진 일반 열 은 어떻게 다 릅 니까?
1.다른 값 을 제공 하지 않 으 면 줄 을 처음 삽입 할 때 열 기본 값 을 평가 합 니 다.줄 이 변경 되 고 덮어 쓸 수 없 을 때마다 생 성 된 열 이 업 데 이 트 됩 니 다.
2.INSERT 또는 UPDATE 구문 에서 DEFAULT 제약 이 있 는 열 에 값 을 제공 할 수 있 습 니 다.생 성 된 열 은 값 을 부여 할 수 없습니다.항상 계 산 됩 니 다.
3.열의 기본 값 은 표 의 다른 열 을 참조 할 수 없고 생 성 된 열 은 이 표를 참조 하 는 데 사 용 됩 니 다.
4.열 기본 값 은 random()또는 current 와 같은 변 하기 쉬 운 함 수 를 사용 할 수 있 습 니 다.time,생 성 된 열 은 사용 할 수 없습니다.
재 인덱스 개선
REINDEX CONCURRENTLY 는 표 에 대한 기록 을 막 지 않 고 색인 을 재 구축 할 수 있 습 니 다.CONCURRENTLY 자 구 는 이전에 CREATE INDEX 구문 에서 만 사용 할 수 있 었 다.

CREATE TABLE test (x INTEGER);
INSERT INTO test SELECT generate_series(1, 1000000);
CREATE INDEX i_test ON test (x);
REINDEX INDEXCONCURRENTLY i_test;
초기 버 전의 PostgreSQL 에서 REINDEX 는 큰 표 에서 기록 을 막 고 심각 한 성능 문 제 를 일 으 켰 다.
기본적으로 JIT 컴 파일 사용
서버 가 지원 하에 구축 되 었 다 면 기본적으로 실시 간(JIT)컴 파일 을 사용 합 니 다.기본적으로 이 지원 을 구축 하지 않 지만 구축 을 설정 할 때 명확 하 게 선택해 야 합 니 다.이것 은 데이터 창고 조회 에 특히 유용 하 다.
검색 병행 성 개선
SERIALIZABLE 격 리 모드 에서 병렬 조 회 를 허용 합 니 다.이전 에는 이 모드 에서 병행 성 을 사용 하지 않 았 습 니 다.
PL/pgSQL 강화
같은 PL/pgSQL 함수 에서 이 명령 들 과 같은 이름 의 SQL 명령 과 변 수 를 사용 할 수 있 도록 합 니 다.예 를 들 어 호출 변수 comment 를 COMMENT SQL 명령 을 호출 하 는 함수 에 존재 하도록 허용 합 니 다.이전에 이 조합 은 해석 오 류 를 초래 했다.
SQL/JSON 경로 조회
PostgreSQL 12 는 현재 SQL:2016 표준 중의 SQL/JSON 규범 에 따라 JSON 경 로 를 조회 할 수 있 습 니 다.JSON 경로 표현 식 은 각종 산술 표현 식 과 함 수 를 평가 하고 JSON 문서 의 값 을 XML 과 유사 한 XPath 표현 식 과 비교 할 수 있 습 니 다.GIN 색인 을 사용 하여 이 표현 식 들 을 가속 화하 여 JSON 데이터 간 검색 실행 을 개선 할 수 있 습 니 다.
파 티 션 개선
수천 개의 파 티 션 이 있 는 시 계 를 처리 하 는 명령 을 처리 할 때 파 티 션 을 사용 할 수 있 는 모든 부분 집합 만 사용 하면 PostgreSQL 12 의 성능 이 현저히 향상 된다.이전 버 전과 비교 해 INSERT 와 COPY 도 파 티 션 시트 까지 속도 가 빠르다.ATTACH PARTITION 은 현재 실행 할 수 있 으 며,구역 표 에 대한 동시 조 회 를 막 지 않 습 니 다.이제 파 티 션 표를 외 키 라 고 부 를 수 있 습 니 다.파 티 션 경 계 는 현재 표현 식 일 수 있 습 니 다.
맞 춤 법 개선
PostgreSQL 12 는 현재 ICU 에 제공 하 는 정렬 규칙('불확실 성 정렬 규칙'이 라 고도 함)을 지원 하 며 대소 문자 와 강세 구분 없 는 비 교 를 지원 합 니 다.이러한 정렬 규칙 을 사용 할 때 비교 와 정렬 에 편 의 를 제공 할 수 있 지만 정렬 규칙 은 문자열 에 대해 다른 검 사 를 해 야 할 수도 있 기 때문에 성능 이 떨 어 질 수도 있다.
MCV 통계 정 보 는 현재 다 열 을 지원 합 니 다.
CREATE STATISTICS 명령 은 여러 열 에 대해 가장 많이 사용 되 는 값 통 계 를 허용 합 니 다.이전에 다 열 은 하나의 관련 값 만 기록 했다.

CREATE STATISTICS stts3 (mcv) ON state, city FROM zipcodes;
ANALYZE zipcodes;
이전 버 전
1.PostgreSQL 12 의 일부 변경 사항 은 초기 버 전과 의 호환성 에 영향 을 줄 수 있 습 니 다.
recovery.conf 는 더 이상 사용 하지 않 으 며,이 파일 이 존재 하면 서버 가 시작 되 지 않 습 니 다.recovery.signal 과 standby.signal 파일 은 현재 비 주요 모드 로 전환 하 는 데 사 용 됩 니 다.trigger_file 이름 이 proove 로 바 뀌 었 습 니 다.trigger_file。standby_mode 설정 이 삭제 되 었 습 니 다.
2.새로운 btree 색인 에서 최대 색인 항목 의 길 이 는 8 바이트 감소 하여 중복 항목 의 처 리 를 개선 합 니 다.이것 은 REINDEX 가 이전 버 전에 대한 색인 pg 를 의미 합 니 다.upgrade 에서 진행 되 는 작업 이 실패 할 수 있 습 니 다.
3.매개 변수 목록 을 제공 하지 않 고 여러 개의 일치 하 는 대상 이 존재 한다 면 DROP IF EXISTS FUNCTION/PROCEDURE/AGGREGATE/ROUTINE 에서 오류 가 발생 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기