本测试模拟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 下的文件。
先停库,做好clog,xlog,multixact的备份
[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=#
到此,数据库恢复正常。
相关推荐
在Linux系统上搭建PostgreSQL、PostGIS和pg_pathman环境是一项关键的任务,这些组件共同构成了一个强大的地理空间数据库解决方案。PostgreSQL是一种开源的关系型数据库管理系统,具有高度的可扩展性和可靠性;...
### GPU数据库PG_strom的安装及使用 #### 一、环境说明及前置条件 ##### 1. 环境说明 - **操作系统**: CentOS 7.x - **PostgreSQL版本**: 9.5 - **PG_strom版本**: 1.x ##### 2. 前置条件 为了确保PG_strom能够...
这包括理解Prometheus的 scrape_config、警报规则和表达式语法,以及Postgres_exporter的各种指标,如pg_stat_activity、pg_database_size等。这些指标可以帮助分析数据库的负载、查询性能、锁等待情况、索引使用...
PG导入导出命令详解
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...
- `pg_stat_database`: 显示每个数据库的统计信息,如连接数、缓存命中率等。 - `pg_stat_activity`: 监控当前运行的查询,帮助识别阻塞和资源消耗高的查询。 - `pg_settings`: 获取PostgreSQL的配置参数,确保它们...
PostgreSQL,通常简称为Postgres,是一种开源的对象关系数据库管理系统(ORDBMS),以其强大的功能、稳定性以及高度的灵活性而备受赞誉。这个压缩包包含了一系列用于在Windows平台上与PostgreSQL服务器进行交互的...
pg_timetable:PostgreSQL高级调度 pg_timetable是PostgreSQL高级作业调度程序,与cron等传统调度程序相比,具有许多优势。 它完全由数据库驱动,并提供了一些高级概念。 # ./pg_timetable Application Options: -...
pg_probackup官方英文文档+中文翻译,pg_probackup管理PostgreSQL数据库集群的备份和恢复.pg_probackup是一个实用程序,用于管理PostgreSQL数据库集群的备份和恢复。它旨在执行PostgreSQL实例的定期备份,使您能够在...
可以直接粘贴,让服务器的数据库直接访问。
pg_rewind --source-pgdata='/home/postgres/pg11.1/pgdata' --target-pgdata='/home/postgres/pg11.1/pgdata_2' ``` #### 实现细节 在实际的实现过程中,`pg_rewind` 需要处理许多细节,例如文件映射 (`filemap`) ...
`pg_hint_plan` 是一个针对 PostgreSQL 数据库的开源插件,旨在帮助数据库管理员和开发人员更精细地控制查询执行计划,从而提升 SQL 查询的性能。本文将深入探讨 `pg_hint_plan` 的功能、工作原理以及如何在 ...
该存储库将保存您的postgres集群的统计信息“样本”。 通过调用take_sample()函数获取样本。 PostgreSQL没有任何类似于工作的引擎,因此您需要使用cron 。 定期抽样可以帮助您找到过去最耗费资源的活动。 假设您...
在PostgreSQL数据库备份方面,通常的工具包括内置的客户端工具pgAdmin,它提供了用户图形界面来进行数据库的备份和恢复操作。然而,随着数据库规模的增长,直接使用pgAdmin进行操作可能变得不那么稳定和可靠,这就...
postgres_vectorization_test, 矢量执行器,用于加速 PostgreSQL 向量执行器今年夏天我在Citus数据上暂存,并实现了sql的矢量执行器。 我们观察到了 3 -4x的性能改进,对于简单的选择查询,并决定打开我的项目。本文...
在本地执行上下文中,要获得足够的权限来显示系统信息,运行pg_activity的系统用户必须是运行postgresql服务器的用户(默认情况下为postgres ),或者具有更多权限,例如root 。 否则, pg_activity可以回pg_...
pg_auto_failover是PostgreSQL扩展和服务,用于监视和管理Postgres集群的自动故障转移。 它针对简单性和正确性进行了优化,并支持Postgres 10和更高版本。 pg_auto_failover支持几种Postgres架构,并为您的...
pg_log 是 PostgreSQL 的数据库运行日志,它记录了数据库的运行状态、错误信息和性能指标等信息。用户可以通过配置日志参数来调整日志记录的内容和格式。 配置文件位置 pg_log 的配置文件默认位于 /Thdata/Abase/...
**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。该库专门用于验证是否符合PostgreSQL数据库的列名规则。...