前言:
E-Maj 是 PostgreSQL 数据库的一个扩展插件,它的全称为 "Elementary Majordomo"。这个扩展的主要功能是为数据库中的表集提供细粒度的写入日志记录和时间旅行能力。这意味着使用 E-Maj 的用户可以在数据库的特定子集上实现事务的回滚,从而达到时间点恢复的效果,这对于审计、数据恢复、数据分析等场景非常有用。
E-Maj 通过跟踪对数据库表的更改来工作,允许用户创建和管理一组表的稳定视图,这些视图可以被快照并在需要时恢复到之前的状态。它通过一种称为“快照集”的机制来实现这一点,快照集定义了哪些表应该被跟踪以及如何处理它们的变更。
一些 E-Maj 的关键特性包括:
- 细粒度的日志记录:只记录你指定的表的更改,而不是整个数据库。
- 时间旅行:能够将表状态恢复到过去的任何已保存的快照点。
- 并发安全:在执行时间旅行操作时不影响其他正在进行的事务。
- 管理工具:提供了命令行工具和 Emaj_web,一个基于 PHP 的 web 客户端,以便更方便地管理和监控 E-Maj 的操作。
E-Maj 的最新版本(截至2024年4月23日的4.4.0版本)带来了对表组和扩展版本历史记录的可视化改进,错误修复,以及对 Emaj_web 客户端的功能增强,以更好地利用这些新特性。此外,从4.2.0版本开始,E-Maj 已不再支持 PostgreSQL 11之前的版本,表明其持续跟进并适应 PostgreSQL 数据库的新发展。
🆗,本文是基于postgresql12做的部署,e-maj-web说实话不好用,基本不推荐使用,前面也说了这是一个插件,因此,安装方式采用rpm包安装,操作系统是centos7 ,x86_64架构
一、
e-maj在postgresql的社区仓库内,也就是pgdg仓库内,仓库地址是:Index of /pub/repos/yum/reporpms/EL-7-x86_64/
仓库文件rpm包下载后上传到服务器rpm安装即可,非常简单,这里就不废话了
postgresql的安装也采用的是rpm方式,仓库配置好后,执行以下命令先安装postgresql
yum install postgresql12-server postgresql12-libs postgresql12-devel postgresql12-contrib postgresql12-tcl postgresql12-odbc pgadmin4-server pgadmin4-web -y
开始安装e-maj
yum install e-maj_12-4.3.1 emaj_web-4.3.1 -y
输出如下:
Installed:
e-maj_12.noarch 0:4.3.1-1PGDG.rhel7 emaj_web.noarch 0:4.3.1-1PGDG.rhel7
Dependency Installed:
libsodium.x86_64 0:1.0.18-1.el7 php.x86_64 0:7.4.33-14.el7.remi php-cli.x86_64 0:7.4.33-14.el7.remi php-common.x86_64 0:7.4.33-14.el7.remi php-json.x86_64 0:7.4.33-14.el7.remi php-pdo.x86_64 0:7.4.33-14.el7.remi php-pgsql.x86_64 0:7.4.33-14.el7.remi php-sodium.x86_64 0:7.4.33-14.el7.remi
Complete!
可以看到,主要依赖的是php7.4,如果不安装emajweb将会非常简单
ema插件安装在表所在的数据库内,例如,我有三张表,在名为test的数据库,那么,需要先切换到test数据库,然后在安装emaj插件
二、
emaj插件激活
需要创建一个新的数据库和新的schema ,这里名字都叫test,登陆命令行,执行以下SQL语句:
create database test;
\c test
create schema test;
安装emaj这个插件:
此插件依赖dblink,btree_gist和adminpack,并且需要开启两阶段提交,也就是数据库主配置文件内的max_prepared_transactions需要设定一个非零值
- 如果你打算使用两阶段提交,并且预计会有大量的并发两阶段事务,你可以从一个较高的值(如 50 或 100)开始,并根据需要进行调整。
- 如果你的系统资源有限,或者你不打算频繁使用两阶段提交,可以考虑设置一个较低的值,如 10 或 20。
- 我这里因为是实验性质,因此,使用的是20,修改此参数完毕后,重启数据库
进入数据库命令行模式,执行以下SQL命令:
CREATE EXTENSION adminpack;
CREATE EXTENSION IF NOT EXISTS emaj CASCADE;
输出如下:
test=# CREATE EXTENSION IF NOT EXISTS emaj CASCADE;
NOTICE: extension "emaj" already exists, skipping
CREATE EXTENSION
此时查看emaj相关表和函数,可以看到在postgres这个数据库下的emaj这个schema内:
🆗,emaj插件激活完毕,这个插件不需要写在postgresql数据库的主配置文件内
删除插件
删除emaj插件不能使用drop extension,因为本次使用的是4.3版本,因此,需要使用删除脚本,4.4最新版本是使用函数删除插件
脚本路径如下
postgres=# \i /usr/pgsql-12/share/extension/emaj_uninstall.sql
>>> Starting the E-Maj uninstallation procedure...
psql:/usr/pgsql-12/share/extension/emaj_uninstall.sql:238: WARNING: emaj_uninstall: emaj_adm and emaj_viewer roles have been dropped.
>>> E-maj successfully uninstalled from this database
二、
emaj插件的使用
首先,需要明确几个概念,这些概念是emaj独有的,第一个是表组,也就是有哪些表你需要纳入emaj的管理,可以以schema为范围,也就是一个schema下的所有表都纳入emaj管理,第二个是mark,也可以理解为标记点,第三个是快照点
emaj的官方文档地址是:Welcome to the E-Maj’s documentation! — E-Maj 4.4.0 documentation
emaj大体的流程是 创建表组--->表组内加入表--->启动表组--->---->创建标记mark---->回滚到指定标记--->停止表组
1、
创建表组
SELECT emaj.emaj_create_group('my_group', true);
2、
表组内添加表
The tables group can now be populated with tables and sequences, using statements like:
SELECT emaj.emaj_assign_table('my_schema', 'my_table', 'my_group');
to add a table into the group, or, to add all tables and sequences of a given schema:
SELECT emaj.emaj_assign_tables('my_schema', '.*', '', 'my_group'); SELECT emaj.emaj_assign_sequences('my_schema', '.*', '', 'my_group')
//以上是官网的,仿照官网,现在有三个表在test数据库下的test schema内,该schema只有这三个表,因此,第一个参数是schema名称,第二个参数表示所有表,第三个参数空缺,第四个参数是表组名称
SELECT emaj.emaj_assign_tables('test', '.*', '', 'my_group');
3、
查看表组状态,
可以看到现在还没有开始记录表更改
4、
查看表组详细信息
5、
启动表组,
开始记录三个表的更改,第一个参数是表组名称,第二个参数是初始化的记录点名称,可以自己随意定义,这个表组只能启动一次,第二次就报错了
SELECT emaj.emaj_start_group('my_group', '20240526');
6、
看看group表,
是否开始记录
7、
表组内标记 mark
SELECT emaj.emaj_set_mark_group('my_group', 'Mid_Point');
8、
修改emp表后查看日志记录表,日志记录表存放在emaj+表所在schema这样的形式新创建的schema里面了,可以看到修改了两个列的值,新旧都写在这个日志表里了
9、
根据mark点 恢复表组内管理的表,
回滚之后,上面的日志表的内容就清空了,也就是时间回溯,只能回放,不能朝前放
SELECT emaj.emaj_rollback_group('my_group', 'Mid_Point');
10、
停止emaj日志记录
SELECT emaj.emaj_stop_group('my_group', '20240527');
停止后,数据库的任何对以上三表的操作都不记录了,也就没有回溯功能了
多表组管理还没搞清楚,以后在说吧!!!!emaj-web功能比较弱,暂时也不说了!!!!