Postgres 12 在容器中文件损坏问题

如何把阿里云RDS的自动备份恢复到本地呢?

从阿里云上下载的自动备份文件默认情况下是tar包

hins15183099_data_20220927032925.tar

先解压一次,产生一个新文件:

hins15183099_data_20220927032925

追加扩展名为 .zip

hins15183099_data_20220927032925.zip

再解压一次,产生数据目录,会非常大,需要耐心。

如果是linux下,则直接tar命令即可:

tar -zxvf hins15183099_data_20220927032925.tar -C /YourPGdataDir

先利用docker初始化一个默认配置文件

docker run -d --name pgsql_temp postgres:9.4
docker cp pgsql_temp:/var/lib/postgresql/data/pgdata/postgresql.conf /YourPGdataDir/postgresql.conf

使用 docker 快速实践恢复

docker run -d \
    -e POSTGRES_PASSWORD=YourPass \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -v /YourPGdataDir:/var/lib/postgresql/data/pgdata \
    -p 5432:5432 \
    --privileged \
    --sysctl kernel.sem="50100 128256000 50100 2560" \
    postgres:9.4 bash

这时在容器的bash环境

su - postgres
/usr/lib/postgresql/9.4/bin/pg_ctl start -D "/var/lib/postgresql/data/pgdata"

可能出现的问题:

docker 启动参数 –sysctl kernel.sem=”50100 128256000 50100 2560”

It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI)

尝试使用默认配置文件

Either set wal_level to “hot_standby” on the master, or turn off hot_standby here

删除 recovery.conf 文件

could not connect to the primary server socket PGSQL.XXXX

当服务器由于损坏而无法启动时,这只应该被用作最后的手段。

rm /var/lib/postgresql/data/pgdata/postmaster.pid
su - postgres
/usr/lib/postgresql/9.4/bin/pg_resetxlog -f /var/lib/postgresql/data/pgdata

Postgres 12 在测试环境的容器上容易因为POD的无故重启导致文件损坏;
日志一直出现:

the database system is starting up

解决办法:

快速进入容器,执行以下命令:

rm /var/lib/postgresql/data/postmaster.pid

su - postgres -c "/usr/lib/postgresql/12/bin/pg_resetwal -D /var/lib/postgresql/data -f"

可能会丢一些测试数据,生产数据不要虚拟化。