Skip to content

Index

https://hub.docker.com/r/arm64v8/postgres/tags

docker pull --platform=linux/arm64 arm64v8/postgres:13

version: '3.1'

services:
  db:
    image: postgres:13
    restart: always
    container_name: postgres_db
    ports:
      - "5432:5432"  # ✅ 映射宿主机端口
    environment:
      POSTGRES_PASSWORD: Pgsql@2024
      TZ: Asia/Shanghai
    volumes:
      - ./data:/var/lib/postgresql/data
    networks:
      - app_net

  adminer:
    image: adminer
    restart: always
    container_name: adminer_ui
    ports:
      - "8090:8080"
    networks:
      - app_net

networks:
  app_net:
    driver: bridge

备份数据

docker 容器

#!/bin/bash

# 数据库连接信息
DB_HOST="localhost"
DB_USER="postgres"
DB_NAME="postgres"

# 备份目录
BACKUP_DIR="/tmp"
TARGET_DIR="/data/backup/"

# 备份文件名格式:school_yyyymmdd.dump
BACKUP_FILE="$BACKUP_DIR/school_$(date +%Y%m%d).dump"

# 执行备份
docker exec -t pgsql_db_1 pg_dump -h $DB_HOST -U $DB_USER -F c -b -v -f $BACKUP_FILE $DB_NAME


docker cp pgsql_db_1:$BACKUP_FILE $TARGET_DIR



# 检查备份是否成功
if [ $? -eq 0 ]; then
  echo "备份成功: $BACKUP_FILE"
else
  echo "备份失败"
  exit 1
fi

# 删除7天前的备份文件
find $TARGET_DIR -name "school_*.dump" -type f -mtime +6 -exec rm -f {} \;

echo "旧备份文件清理完成"

直连

#!/bin/bash

# 数据库连接信息
DB_HOST="db"
DB_USER="postgres"
DB_NAME="postgres"
DB_PASS="你的真实密码在这里"  # <--- 【请在此处填入密码】

# 备份目录
BACKUP_DIR="/data/backup/pgsql/"


# 备份文件名格式:school_yyyymmdd.dump
BACKUP_FILE="$BACKUP_DIR/school_$(date +%Y%m%d).dump"


export PGPASSWORD=$DB_PASS

# 执行备份
pg_dump -h $DB_HOST -U $DB_USER -F c -b -v -f $BACKUP_FILE $DB_NAME



# 检查备份是否成功
if [ $? -eq 0 ]; then
  echo "备份成功: $BACKUP_FILE"
else
  echo "备份失败"
  exit 1
fi

# 删除7天前的备份文件
find $BACKUP_DIR -name "school_*.dump" -type f -mtime +6 -exec rm -f {} \;

echo "旧备份文件清理完成"

0 2 * * * /data/backup/backup.sh >> /var/log/backup_school.log 2>&1

psql

psql -h <远程主机IP或域名> -p <端口> -U <用户名> -d <数据库名>

主备配置

修改配置

patronictl -c /etc/patroni.yml edit-config

shared_buffers: 31GB

SHOW shared_buffers;

  • 使用patroni 初始化数据库

https://developer.aliyun.com/article/775029

sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y postgresql13-server
sudo systemctl enable postgresql-13
sudo systemctl start postgresql-13

root 用户安装

yum install -y python3 python3-pip python3-psycopg2 python3-devel pip3 install patroni pip3 install patroni[zookeeper]

vi /etc/patroni.yml * 数据目录需要归属于postgres

patroni /etc/patroni.yml

scope: pgsql
namespace: /service/
name: pg1

restapi:
  listen: 0.0.0.0:8008
  connect_address: 192.168.33.10:8008

zookeeper:
    hosts: 192.168.33.10:2181,192.168.33.11:2181  # Zookeeper 集群地址

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    master_start_timeout: 300
    synchronous_mode: true
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        listen_addresses: "0.0.0.0"
        port: 5432
        wal_level: logical
        hot_standby: "on"
        wal_keep_segments: 100
        max_wal_senders: 10
        max_replication_slots: 10
        wal_log_hints: "on"

  initdb:
  - encoding: UTF8
  - locale: C
  - lc-ctype: zh_CN.UTF-8
  - data-checksums

  pg_hba:
  - host replication repl 0.0.0.0/0 md5
  - host all all 0.0.0.0/0 md5

postgresql:
  listen: 0.0.0.0:5432
  connect_address: 192.168.33.10:5432
  data_dir: /var/lib/pgsql/13/data
  bin_dir: /usr/pgsql-13/bin

  authentication:
    replication:
      username: repl
      password: "123456"
    superuser:
      username: postgres
      password: "123456"

  basebackup:
    max-rate: 100M
    checkpoint: fast

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
scope: pgsql
namespace: /service/
name: pg2

restapi:
  listen: 0.0.0.0:8008
  connect_address: 192.168.33.11:8008

zookeeper:
    hosts: 192.168.33.10:2181,192.168.33.11:2181  # Zookeeper 集群地址

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    master_start_timeout: 300
    synchronous_mode: true
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        listen_addresses: "0.0.0.0"
        port: 5432
        wal_level: logical
        hot_standby: "on"
        wal_keep_segments: 100
        max_wal_senders: 10
        max_replication_slots: 10
        wal_log_hints: "on"

  initdb:
  - encoding: UTF8
  - locale: C
  - lc-ctype: zh_CN.UTF-8
  - data-checksums

  pg_hba:
  - host replication repl 0.0.0.0/0 md5
  - host all all 0.0.0.0/0 md5

postgresql:
  listen: 0.0.0.0:5432
  connect_address: 192.168.33.11:5432
  data_dir: /var/lib/pgsql/13/data
  bin_dir: /usr/pgsql-13/bin

  authentication:
    replication:
      username: repl
      password: "123456"
    superuser:
      username: postgres
      password: "123456"

  basebackup:
    max-rate: 100M
    checkpoint: fast

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false

/etc/systemd/system/patroni.service

[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target

[Service]
Type=simple
User=postgres
Group=postgres
#StandardOutput=syslog
ExecStart=/usr/local/bin/patroni /etc/patroni.yml
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
TimeoutSec=30
Restart=no

[Install]
WantedBy=multi-user.target

yum install keepalived

keepalived.conf

vrrp_script chk_patroni {
    script "curl -s http://localhost:8008/health | grep '\"state\": \"running\"'"
    interval 2
    weight -2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1  # 替换为你的网络接口名
    virtual_router_id 51
    priority 100  # 主节点优先级较高
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1234
    }

    virtual_ipaddress {
        192.168.33.100  # 虚拟 IP 地址
    }

    track_script {
        chk_patroni  # 关联 Patroni 健康检查脚本
    }
}

systemctl start keepalived.service

开启日志

vi postgresql.conf

配置

# 更改wal日志方式为logical(方式有:minimal、replica 、logical  )
wal_level = logical  

# 更改solts最大数量(默认值为10),flink-cdc默认一张表占用一个slots
max_replication_slots = 20

# 更改wal发送最大进程数(默认值为10),这个值和上面的solts设置一样
max_wal_senders = 20     

# 中断那些停止活动超过指定毫秒数的复制连接,可以适当设置大一点(默认60s,0表示禁用)
wal_sender_timeout = 180s
SHOW wal_level;

更改密码

ALTER ROLE username WITH PASSWORD 'new_password';

创建用户

::: warning 用户名不要用大写 :::

-- pg新建用户
CREATE USER test1 WITH PASSWORD 'test123';

-- 给用户复制流权限
ALTER ROLE test1 replication;

-- 给用户数据库权限
GRANT CONNECT ON DATABASE test_db to test1;

发布表

  • 设置发布开关

update pg_publication set puballtables=true where pubname is not null;
- 发布表

:::tabs

@tab 所有表

CREATE PUBLICATION dbz_publication FOR ALL TABLES;

@tab 单表

CREATE PUBLICATION publication_name FOR table table_name;

:::

  • 查询哪些表已经发布
select * from pg_publication_tables;
-- 给表查询权限
grant select on TABLE aa to ODPS_ETL;

-- 给用户读写权限
grant select,insert,update,delete ON  ALL TABLES IN SCHEMA public to bd_test;

-- 把当前库所有表查询权限赋给用户
GRANT SELECT ON ALL TABLES IN SCHEMA public TO ODPS_ETL;

-- 把当前库以后新建的表查询权限赋给用户
alter default privileges in schema public grant select on tables to ODPS_ETL;

-- 更改复制标识包含更新和删除之前值
ALTER TABLE test0425 REPLICA IDENTITY FULL;

-- 查看复制标识
select relreplident from pg_class where relname='test0425';

-- 查看solt使用情况
SELECT * FROM pg_replication_slots;

-- 删除solt
SELECT pg_drop_replication_slot('zd_org_goods_solt');

-- 查询用户当前连接数
select usename, count(*) from pg_stat_activity group by usename order by count(*) desc;

-- 设置用户最大连接数
alter role odps_etl connection limit 200;
☁️ 部署建议
如果你打算长期运行项目(博客 / API / 自动化脚本),建议直接用云服务器,会比本地稳定很多。
👉 查看云服务器(新用户优惠)