稻草芭比解说的十大战役堪称war3界典范,现而今postgresql数据库里的十大经典案例,它来了…
一、被自宫的登录用户
华山门票的后台数据库由平之的徒弟负责搭建,由于第一次操作太自信,顺手把唯一的用户登录权限给自宫了。
alter user postgres nologin;
令狐大侠路过,使用单用户模式的绝学助其解困:
pg_ctl stop -mi -d $pgdata
postgres --single -d $pgdata dbname
backend> alter user postgres login;
二、复杂的数据依赖
燕都需要迁徙大量人口至安雄,愚公一家负责盘点迁移人口关系,进展及其缓慢,天上的老君被其坚持所打动,随口一声急急如律令,三道符顺势而出:
--section=pre-data
--section=data
--section=post-data
依靠符咒的加持,任务迅速完成。详细奥义请参考:<
三、刻意的破坏
新上任的招标办负责人孙小空闲来无聊,删除了牛阿魔家数据库系统运行最重要的wal,一旁的来主任不慌不忙,使用如下法宝快速恢复了他家的测试环境。
pg_resetwal $pgdata
技术详解:某些场景误删pg_wal目录下的wal文件后,此时会导致服务器无法正常重启,可以使用pg_resetwal工具重置wal来恢复环境。
四、精心的刁难
法和尚修改了金山寺经文管理系统的默认locale后,刁难许官人须快速检索出某本心经才能前往雷峰塔。番外修炼回来的青姨,利用索引修复技术,帮助他倆成功相会。
create index on 经文表 (name text_pattern_ops);
技术详解:数据库如果使用非c locale会导致无法在like查询子句中使用普通索引,索引创建时需要使用文本模式操作符text_pattern_ops。
五、可变的认知
刘皇叔过江迎娶新夫人孙二香,拦门的孙小妹摇着头,晃着脑出题:空是为空,null是为null,空即为空,而null非null。眨着大圆眼对迎亲队伍说:要进门,先过我这关。伴郎大羽哥接话:蜀国之文化,一切皆可为,null亦可null,null亦可非null。随即掏出蜀国兵册设计图,指出其中一处设计,折服的孙小妹暗生情愫。
create unique index on table ((column is null)) where column is null;
技术详解:sql标准允许在唯一约束列上插入多个null值,借助索引表达式约束也可达成这一设计。
六、朴实无华的安全
七十二洞主齐聚逍遥宫,想要办证进入练习武林绝学,发现新告示写着:系统已升级采用最简化的peer认证,只有门人在宫内方可习练。
技术详解:一些场景下使用peer认证是非常合适的,即简洁又安全。
七、上分的绊脚石
电玩小子在峡谷最近七连跪,不上分的根因最终定位到新装备的时区时间不准,鲁班大师编入如下代码后,小鲁班快速升上了王者。
create or replace function <>.sysdate()
returns timestamp without time zone
as
$body$
select clock_timestamp() at time zone '<>';
$body$
language sql;
八、斗转星移
阿紫参加信创去o夏令营活动时,遇到几个不常见的数据类型无法迁移过关,远程找他堂哥帮忙,利用domain这一特性斗转星移,顺利通关。
create domain binary_float as float;
技术详解:使用domain作为别名可以创建兼容性数据类型
九、触发器里的屏障
琼恩为了快速统计临冬城频繁的物资变更以便协调资源,使用trigger触发器进行串行工作,这确实有效。
create table item (
id bigint generated always as identity,
value bigint not null
);
create table sum (
total bigint not null
);
insert into sum values (0);
create function add_to_sum() returns trigger
language plpgsql as
$$begin
update sum set total = total new.value;
return new;
end;$$;
create constraint trigger add_to_sum
after insert on item
deferrable initially deferred
for each row
execute function add_to_sum();
可一旦有大量难民涌入,物资分配就会陷入混乱。红袍女使用古法对其重排化简帮助琼恩,临冬城瞬间变得尽然有序。
drop trigger add_to_sum on item;
create or replace function add_to_sum() returns trigger
language plpgsql as
$$begin
update sum set total = total
(select sum(value) from new_rows);
return null;
end;$$;
create trigger add_to_sum
after insert on item
referencing new table as new_rows
for each statement
execute function add_to_sum();
技术详解:在一个事务里频繁对单行数据进行更新操作会引起dead tuple回收不及时,此时基于触发器统计更新数据会变得越来越慢,使用触发器的过渡表特性在内存中批量处理效果极佳。
十、绝代双骄之完美合作
生产环境如果直接修改业务表名会影响业务,此时可以使用影子替身可更新视图来合作完成任务。
begin;
alter table x rename to y;
create view x as select * from y;
commit;
技术详解:直接修改业务表名会导致使用旧表的客户端中断,当我们使用可更新视图(视图可以正常进行insert、update、delete操作),创建一个与旧表同名的视图并在同一个事务里进行重命名表,因为是事务级的修改,重命名新表和创建影子视图是一个原子操作。最后当系统稳定运行一段时间,并且旧的程序被清理干净之后,我们再删除影子视图。
本文外貌内容纯属虚构,技术细节来自真实案例,欢迎大家鉴赏或留言。
保持联系
从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个pg乐知乐享交流群,欢迎关注我文章的小伙伴加我微信进群吹牛唠嗑,交流技术。