`
jjxliu306
  • 浏览: 157164 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Postgres pg_multixact信息丢失极限拉起数据库

 
阅读更多

本测试模拟pg_multixact,pg_xlog全部信息丢失的情况下,数据库完全起不来的情况下拉起数据库。本人血淋淋的教训,建议还是做好备库和增量备份。

 

  一、初始化一个新的实例、创建数据库等。(因为当前系统用户并非postgres,因此我加了-U 来默认数据库超管用户postgres)

 

[lyf@centos250 pg9.6]$ initdb -D pg_db_test --encoding=UTF-8 --locale=C -U postgres 
The files belonging to this database system will be owned by user "lyf".
This user must also own the server process.

….信息忽略
Success. You can now start the database server using:

    pg_ctl -D pg_db_test -l logfile start

 修改配置端口即可,防止和其他已有实例冲突。如果本机只有一个pg实例,此步骤忽略。

listen_addresses = '*'          # (change requires restart)
port = 5678                             # (change requires restart)

 

 启动服务器

[lyf@centos250 pg9.6]$ pg_ctl start -D pg_db_test/ -l pg_db_test/db.log
server starting

 

Psql进入数据库,创建测试库和测试数据

[lyf@centos250 pg9.6]$ psql -U postgres -p 5678
psql (9.6.0)
Type "help" for help.

postgres=# create database dbtest;
CREATE DATABASE
postgres=# \c dbtest;
You are now connected to database "dbtest" as user "postgres".
dbtest=# create table t_test(id int , name text);
CREATE TABLE
dbtest=# insert into t_test select generate_series(1,10000) , md5(random()::text);
INSERT 0 10000
dbtest=# insert into t_test select generate_series(1,10000) , md5(random()::text);
INSERT 0 10000
dbtest=# insert into t_test select generate_series(1,10000) , md5(random()::text);
INSERT 0 10000
dbtest=# insert into t_test select generate_series(1,10000) , md5(random()::text);
INSERT 0 10000
-- 此处没有checkpoint的话,删除了xlog之后很可能数据已经丢了,感兴趣的可以试试
dbtest=# checkpoint ; 
CHECKPOINT
dbtest=# \q

 

 

二、停库,删除pg_multixact/members, pg_multixact/offsets 下的文件。

   先停库,做好clogxlogmultixact的备份

   

[lyf@centos250 pg9.6]$ pg_ctl stop -m fast -D pg_db_test/ 
waiting for server to shut down.... done
server stopped
[lyf@centos250 pg9.6]$ cd pg_db_test/
 [lyf@centos250 pg_db_test]$ zip -r xlog.zip pg_xlog
  adding: pg_xlog/ (stored 0%)
  adding: pg_xlog/000000010000000000000001 (deflated 83%)
  adding: pg_xlog/archive_status/ (stored 0%)
[lyf@centos250 pg_db_test]$ zip -r multixact.zip pg_multixact
  adding: pg_multixact/ (stored 0%)
  adding: pg_multixact/members/ (stored 0%)
  adding: pg_multixact/members/0000 (deflated 100%)
  adding: pg_multixact/offsets/ (stored 0%)
  adding: pg_multixact/offsets/0000 (deflated 100%)

 

删除文件

[lyf@centos250 pg_db_test]$ rm pg_xlog/* -r
[lyf@centos250 pg_db_test]$ rm pg_multixact/members/*
[lyf@centos250 pg_db_test]$ rm pg_multixact/offsets/*
[lyf@centos250 pg_db_test]$

 

三、 尝试启动数据库

[lyf@centos250 pg9.6]$ pg_ctl start -D pg_db_test/ -l pg_db_test/db.log
server starting
[lyf@centos250 pg9.6]$ tail -f pg_db_test/db.log 
LOG:  creating missing WAL directory "pg_xlog/archive_status"
LOG:  invalid primary checkpoint record
LOG:  invalid secondary checkpoint record
PANIC:  could not locate a valid checkpoint record
LOG:  startup process (PID 16658) was terminated by signal 6: Aborted
LOG:  aborting startup due to startup process failure
LOG:  database system is shut down

 此时,数据库已经起不来了

 

四、尝试通过resetxlog恢复,参考手册的配置:https://www.postgresql.org/docs/9.6/static/app-pgresetxlog.html 。这里我们重点需要-O-x-m三个参数

 

-O mxoff

 

此时pg_multixact/members 文件夹下文件为空,因此值为 to_hex((0 + 1) * 52352) = 0xcc80, 注意此参数9.2以前为65536 , 9.3以后改为52352

 

-x xid

[lyf@centos250 pg9.6]$ ls pg_db_test/pg_clog/
0000

 此时pg_clog下的文件夹文件最大0000,因此值为: 0x100000

 

 

-m mxid,mxid

 

此时pg_multixact/ offsets文件夹下文件为空, 因此给值: 0x10000,0x10000

 

[lyf@centos250 pg9.6]$ pg_resetxlog -m 0x10000,0x10000 -x 0x100000 -O 0xcc80 -f pg_db_test/
Transaction log reset

 观察此时的文件状态中xlog已经重置了wal

 

 五、再次重启数据库测试

[lyf@centos250 pg9.6]$ pg_ctl start -D pg_db_test/ -l pg_db_test/db.log
server starting
[lyf@centos250 pg9.6]$ tail -f pg_db_test/db.log 
LOG:  database system was shut down at 2017-09-13 15:00:49 CST
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

 此时数据库已经启动,psql进入查看数据。

[lyf@centos250 pg9.6]$ psql -U postgres -p 5678
psql (9.6.0)
Type "help" for help.

postgres=# \l+
                                                               List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   |  Size   | Tablespace |                Description                 
-----------+----------+----------+---------+-------+-----------------------+---------+------------+--------------------------------------------
 dbtest    | postgres | UTF8     | C       | C     |                       | 9767 kB | pg_default | 
 postgres  | postgres | UTF8     | C       | C     |                       | 7063 kB | pg_default | default administrative connection database
 template0 | postgres | UTF8     | C       | C     | =c/postgres          +| 6953 kB | pg_default | unmodifiable empty database
           |          |          |         |       | postgres=CTc/postgres |         |            | 
 template1 | postgres | UTF8     | C       | C     | =c/postgres          +| 6953 kB | pg_default | default template for new databases
           |          |          |         |       | postgres=CTc/postgres |         |            | 
(4 rows)

postgres=# \c dbtest
You are now connected to database "dbtest" as user "postgres".
dbtest=# \d
         List of relations
 Schema |  Name  | Type  |  Owner   
--------+--------+-------+----------
 public | t_test | table | postgres
(1 row)

dbtest=# select count(1) from t_test ;
 count 
-------
 40000
(1 row)

dbtest=# create table t_test2(id int , name text);
CREATE TABLE
dbtest=# insert into t_test2 values(1 , '1');
INSERT 0 1
dbtest=#

 

 

到此,数据库恢复正常。

 

1
0
分享到:
评论

相关推荐

    linux搭建postgresql、postgis、pg_pathman环境步骤以及需要的软件包

    在Linux系统上搭建PostgreSQL、PostGIS和pg_pathman环境是一项关键的任务,这些组件共同构成了一个强大的地理空间数据库解决方案。PostgreSQL是一种开源的关系型数据库管理系统,具有高度的可扩展性和可靠性;...

    postgresql数据库--psql、pg_dump命令带密码执行sql语句

    pg_dump -a -t tbl_test "host=127.0.0.1 hostaddr=127.0.0.1 port=5432 user=postgres password=123456 dbname=postgres" > /userdir/tbl_data a 参数是表示只导出数据,其他的额外信息不需要,该参数也可去掉 psql...

    postgres_exporter_v0.5.1_linux-amd64.tar.gz

    这包括理解Prometheus的 scrape_config、警报规则和表达式语法,以及Postgres_exporter的各种指标,如pg_stat_activity、pg_database_size等。这些指标可以帮助分析数据库的负载、查询性能、锁等待情况、索引使用...

    postgresql之pg_dump命令详解 - wling_89的专栏 - 博客频道 - CSDN_NET.mht

    PG导入导出命令详解

    GPU数据库PG_strom的安装及使用

    ### GPU数据库PG_strom的安装及使用 #### 一、环境说明及前置条件 ##### 1. 环境说明 - **操作系统**: CentOS 7.x - **PostgreSQL版本**: 9.5 - **PG_strom版本**: 1.x ##### 2. 前置条件 为了确保PG_strom能够...

    postgres_exporter-0.9.0.linux-amd64.tar.gz

    - `pg_stat_database`: 显示每个数据库的统计信息,如连接数、缓存命中率等。 - `pg_stat_activity`: 监控当前运行的查询,帮助识别阻塞和资源消耗高的查询。 - `pg_settings`: 获取PostgreSQL的配置参数,确保它们...

    pg_client_windows64

    PostgreSQL,通常简称为Postgres,是一种开源的对象关系数据库管理系统(ORDBMS),以其强大的功能、稳定性以及高度的灵活性而备受赞誉。这个压缩包包含了一系列用于在Windows平台上与PostgreSQL服务器进行交互的...

    pg_timetable:pg_timetable:PostgreSQL高级调度

    pg_timetable:PostgreSQL高级调度 pg_timetable是PostgreSQL高级作业调度程序,与cron等传统调度程序相比,具有许多优势。 它完全由数据库驱动,并提供了一些高级概念。 # ./pg_timetable Application Options: -...

    pg_probackup用户手册.rar

    pg_probackup官方英文文档+中文翻译,pg_probackup管理PostgreSQL数据库集群的备份和恢复.pg_probackup是一个实用程序,用于管理PostgreSQL数据库集群的备份和恢复。它旨在执行PostgreSQL实例的定期备份,使您能够在...

    pg_hba.conf

    可以直接粘贴,让服务器的数据库直接访问。

    pg_rewind11工作流程.docx

    pg_rewind --source-pgdata='/home/postgres/pg11.1/pgdata' --target-pgdata='/home/postgres/pg11.1/pgdata_2' ``` #### 实现细节 在实际的实现过程中,`pg_rewind` 需要处理许多细节,例如文件映射 (`filemap`) ...

    pg_hint_plan-REL10_1_3_6.tar.gz

    `pg_hint_plan` 是一个针对 PostgreSQL 数据库的开源插件,旨在帮助数据库管理员和开发人员更精细地控制查询执行计划,从而提升 SQL 查询的性能。本文将深入探讨 `pg_hint_plan` 的功能、工作原理以及如何在 ...

    pg_profile:Postgres历史工作量报告

    该存储库将保存您的postgres集群的统计信息“样本”。 通过调用take_sample()函数获取样本。 PostgreSQL没有任何类似于工作的引擎,因此您需要使用cron 。 定期抽样可以帮助您找到过去最耗费资源的活动。 假设您...

    postgres_vectorization_test, 矢量执行器,用于加速 PostgreSQL.zip

    postgres_vectorization_test, 矢量执行器,用于加速 PostgreSQL 向量执行器今年夏天我在Citus数据上暂存,并实现了sql的矢量执行器。 我们观察到了 3 -4x的性能改进,对于简单的选择查询,并决定打开我的项目。本文...

    pg_activity:pg_activity是用于PostgreSQL服务器活动监视的顶级应用程序

    在本地执行上下文中,要获得足够的权限来显示系统信息,运行pg_activity的系统用户必须是运行postgresql服务器的用户(默认情况下为postgres ),或者具有更多权限,例如root 。 否则, pg_activity可以回pg_...

    postgresql数据库备份和恢复

    在PostgreSQL数据库备份方面,通常的工具包括内置的客户端工具pgAdmin,它提供了用户图形界面来进行数据库的备份和恢复操作。然而,随着数据库规模的增长,直接使用pgAdmin进行操作可能变得不那么稳定和可靠,这就...

    pg_auto_failover:Postgres扩展和服务,用于自动故障转移和高可用性

    pg_auto_failover是PostgreSQL扩展和服务,用于监视和管理Postgres集群的自动故障转移。 它针对简单性和正确性进行了优化,并支持Postgres 10和更高版本。 pg_auto_failover支持几种Postgres架构,并为您的...

    postgres数据库日志参数详解与应用技巧_常春.docx

    pg_log 是 PostgreSQL 的数据库运行日志,它记录了数据库的运行状态、错误信息和性能指标等信息。用户可以通过配置日志参数来调整日志记录的内容和格式。 配置文件位置 pg_log 的配置文件默认位于 /Thdata/Abase/...

    pg_insights:方便SQL集合,用于监视Postgres数据库的运行状况

    **pg_insights:Postgres数据库监控利器** `pg_insights` 是一个专为PostgreSQL数据库设计的SQL集合,它的核心目标是提供一种便捷的方式来监视和分析数据库的运行状况。通过在Postgres环境中执行预定义的SQL查询,...

    Python库 | is_valid_postgres_column_name-0.0.1-py3-none-any.whl

    标题中的"Python库 | is_valid_postgres_column_name-0.0.1-py3-none-any.whl"指的是一款Python库,名为`is_valid_postgres_column_name`,版本号为0.0.1。该库专门用于验证是否符合PostgreSQL数据库的列名规则。...

Global site tag (gtag.js) - Google Analytics