美文网首页
PostgreSQL数据库实例只读锁问题

PostgreSQL数据库实例只读锁问题

作者: Hmcf | 来源:发表于2020-07-10 10:31 被阅读0次

锁定的实现方法有若干种。

  • 硬锁定,直接将数据库切换到恢复模式,绝对不会有写操作出现。
  • 软锁定,设置default_transaction_read_only为on,默认开启的事务为只读事务。用户如果使用begion transaction read write可破解。
  • 内核层面改进的锁定,对于云上产品,锁定后实际上是期望用户升级容量,或者用户可以上去删数据使得使用空间降下来的。那么以上两种锁定都不适用,需要禁止除truncate, drop操作以外的所有操作的这种锁定方式。而且最好是不需要重启数据库就可以实现。

锁定实例

硬锁定

1、配置 recovery.conf

recovery_target_timeline = 'latest'  
standby_mode = on  

2、重启数据库

pg_ctl restart -m fast  

3、硬锁定,不可破解

postgres=# select pg_is_in_recovery();  
 pg_is_in_recovery   
-------------------  
 t  
(1 row)  

postgres=# insert into t1 values (1);  
ERROR:  cannot execute INSERT in a read-only transaction  

postgres=# begin transaction read write;  
ERROR:  cannot set transaction read-write mode during recovery  

软锁定

1、设置default_transaction_read_only

postgres=# alter system set default_transaction_read_only=on;  
ALTER SYSTEM  

2、重载配置

postgres=# select pg_reload_conf();  
 pg_reload_conf   
----------------  
 t  
(1 row)  

3、所有会话自动进入read only的默认事务模式。

reload前

postgres=# show default_transaction_read_only ;  
 default_transaction_read_only   
-------------------------------  
 off  
(1 row)  

reload后

postgres=# show default_transaction_read_only ;  
 default_transaction_read_only   
-------------------------------  
 on  
(1 row)  

postgres=# insert into t1 values (1);  
ERROR:  cannot execute INSERT in a read-only transaction  

4、软锁定可破解

postgres=# begin transaction read write;  
BEGIN  
postgres=# insert into t1 values (1);  
INSERT 0 1  
postgres=# end;  
COMMIT  

解锁实例

硬解锁

1、重命名recovery.conf到recovery.done

cd $PGDATA  

mv recovery.conf recovery.done  

2、重启数据库

pg_ctl restart -m fast  

软解锁

1、设置default_transaction_read_only

postgres=# alter system set default_transaction_read_only=off;  
ALTER SYSTEM  

2、重载配置

postgres=# select pg_reload_conf();  
 pg_reload_conf   
----------------  
 t  
(1 row)  

3、所有会话自动进入read only的默认事务模式。

reload前

postgres=# show default_transaction_read_only ;  
 default_transaction_read_only   
-------------------------------  
 on  
(1 row)  

reload后

postgres=# show default_transaction_read_only ;  
 default_transaction_read_only   
-------------------------------  
 off  
(1 row)  

写恢复  
postgres=# insert into t1 values (1);  
INSERT 0 1  

推荐博主德哥:https://developer.aliyun.com/article/746269

相关文章

  • PostgreSQL数据库实例只读锁问题

    锁定的实现方法有若干种。 硬锁定,直接将数据库切换到恢复模式,绝对不会有写操作出现。 软锁定,设置default_...

  • mysql全局锁和表锁

    MySQL中的锁可以分为三类:全局锁,表级锁和行锁。 全局锁 全局锁是对整个数据库加锁,可以让整个数据库处于只读状...

  • 阿里云RDS数据库创建只读数据库

    穷人,因为公司要增加只读数据库,所以自己先充钱实践一下。 阿里云的RDS数据库就支持创建只读实例,操作很简单,只要...

  • MySQL锁

    极客时间MySQL专栏总结 全局锁 对整个数据库加读锁: 使用这个命令之后,数据库会处于只读状态,其它线程以下这些...

  • MyBatis-Plus乐观锁插件的使用

    乐观锁是为了解决应用多实例,数据库单一实例时,并发修改同一条记录可能造成的并发问题。一般来说,乐观锁的实现方案都是...

  • Oracle vs PostgreSQL,研发注意事项(1)-查

    Oracle数据库,查询语句不会锁表,但PostgreSQL在开启事务后,查询数据表会锁表,在试图DROP/TRU...

  • MySQL锁

    MySQL锁分类 全局锁 表级锁 行锁 间隙锁 next-key lock 全局锁 作用范围:对整个数据库实例加锁...

  • druid链接postgresql数据库

    1.添加postgresql数据库连接驱动,compile("org.postgresql:postgresql:...

  • 5、全局锁和表锁

    根据加锁范围:MySQL里面的锁可以分为:全局锁、表级锁、行级锁 全局锁: 对整个数据库实例加锁。 MySQL提供...

  • mysql之锁(全局&表&行)

    根据加锁的范围,MYSQL里面的锁大致分为全局锁、表级锁、行锁。 全局锁:对整个数据库实例加锁。命令:Flush ...

网友评论

      本文标题:PostgreSQL数据库实例只读锁问题

      本文链接:https://www.haomeiwen.com/subject/xvppcktx.html