基于Postgre 14的主备复制和主备切换

环境信息

系统版本: windows 10
版本:PostgreSQL14
主机IP: 192.168.10.101
备库IP:192.168.10.102

主库操作

  1. 设置pg_hba.conf添加以下:
host				all				all				0.0.0.0/0				md5  
host 		replication 		postgres 		192.168.10.102/32 			md5   #这句话的意思允许从数据库连接主数据库去拖wal日志数据
  1. 设置主库的postgresql.conf
wal_level = hot_standby #主从设置为热血模式,流复制必选
max_wal_senders = 3 #流复制允许连接进程
archive_mode = on
wal_log_hints = on #必须不然无法恢复数据

备注:仅列出主要参数,其它参数根据实际情况设置。

  1. 重载配置文件
pg_ctl reload -D $PGDATA 				 #$PGDATA为postgre下data文件地址

备库操作

  1. 使用pg_basebackup 生产备库
pg_basebackup -h 192.168.10.101 -U postgres -F p -P -R -Xs -v -D  $PGDATA 

备注:这时表空间目录,$PGDATA 目录已经复制过来了,这里使用了 -X 参数,在备份完成之后,会到主库上收集 pg_basebackup 执行期间产生的 WAL 日志,在 9.2 版本之后支持 -Xs 即stream 形式,这种模式不需要收集主库的 WAL 文件,而能以 stream 复制方式直接追赶主库。

  1. 设置从库 postgresql.conf 在原來的主库基础上追加
primary_conninfo = 'host=192.168.10.101 port=5432 user=postgres password=123456'
recovery_target_timeline = latest # 默认
hot_standby_feedback = on #可选,查询冲突时向主反馈
max_connections = 1000 # 大于等于主节点,正式环境应当重新考虑此值的大小
hot_standby = on  #在备份的同时允许查询
max_standby_streaming_delay = 30s #可选,流复制最大延迟
wal_receiver_status_interval = 10s
hot_standby_feedback = on

3.编辑standby.signal文件

standby_mode = 'on'
  1. 重新启动从节点
  2. 验证主从
select pg_is_in_recovery();   #f代表主库 t代表备库
select client_addr,sync_state from pg_stat_replication  #可以查询主库下面有多少个备库

主备切换

  1. pg12开始新增了一个pg_promote()函数,让我们可以通过SQL命令激活备库。

pg_promote()语法:

pg_promote(wait boolean DEFAULT true, wait_seconds integer DEFAULT 60)

两个参数:

wait: 表示是否等待备库的 promotion 完成或者 wait_seconds 秒之后返回成功,默认值为 true。

wait_seconds: 等待时间,单位秒,默认 60

  1. 切换实例
  • 主库操作:关闭主库,模拟主库故障:
systemctl stop postgresql
  • 备库操作:激活备库
select pg_promote(true,60);
  • 验证
select pg_is_in_recovery();   #f代表主库 t代表备库
  1. 原主库修复后,原备库降为备库
  • 新增standby.signal文件
standby_mode = 'on'
  • 数据同步
pg_rewind.exe --target-pgdata "C:\Program Files\PostgreSQL\14\data"  --source-server="host=192.168.10.102 port=5432 user=postgres password=123456" -P --debug

–target-pgdata源对象 --source-server目标对象

  • 启动主库
systemctl start postgresql
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果你想要在PostgreSQL中创建一个新表,该表与现有表的结构相同,可以使用以下步骤: 1. 在PostgreSQL中创建一个新表,例如: ``` CREATE TABLE new_table ( -- 列定义 ); ``` 2. 使用MyBatis的Mapper接口编写SQL查询语句,查询现有表的结构信息,例如: ``` SELECT column_name, data_type, character_maximum_length, is_nullable FROM information_schema.columns WHERE table_name = 'old_table'; ``` 3. 使用MyBatis的Mapper接口编写SQL插入语句,将查询结果插入到新表中,例如: ``` INSERT INTO new_table ( column_name1, column_name2, ..., column_nameN ) SELECT column_name1, column_name2, ..., column_nameN FROM old_table; ``` 4. 在Java代码中调用MyBatis的Mapper接口,执行上述SQL查询语句和插入语句,例如: ``` public interface TableMapper { @Select("SELECT column_name, data_type, character_maximum_length, is_nullable FROM information_schema.columns WHERE table_name = #{tableName}") List<ColumnInfo> getTableColumns(String tableName); @InsertProvider(type = TableProvider.class, method = "insertTableData") void insertTableData(@Param("newTableName") String newTableName, @Param("oldTableName") String oldTableName, @Param("columnInfos") List<ColumnInfo> columnInfos); } public class TableProvider { public String insertTableData(Map<String, Object> params) { String newTableName = (String) params.get("newTableName"); String oldTableName = (String) params.get("oldTableName"); List<ColumnInfo> columnInfos = (List<ColumnInfo>) params.get("columnInfos"); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("INSERT INTO ").append(newTableName).append("("); for (ColumnInfo columnInfo : columnInfos) { sqlBuilder.append(columnInfo.getColumnName()).append(","); } sqlBuilder.deleteCharAt(sqlBuilder.length() - 1); sqlBuilder.append(") SELECT "); for (ColumnInfo columnInfo : columnInfos) { sqlBuilder.append(columnInfo.getColumnName()).append(","); } sqlBuilder.deleteCharAt(sqlBuilder.length() - 1); sqlBuilder.append(" FROM ").append(oldTableName); return sqlBuilder.toString(); } } ``` 在上述代码中,ColumnInfo为自定义的类,用于存储查询结果中的列信息。TableProvider为自定义的Provider类,用于提供动态SQL语句。 注意:在执行SQL查询语句和插入语句时,需要注意字段名的大小写问题。在PostgreSQL中,字段名和表名默认是区分大小写的,因此需要保证SQL语句中的字段名和表名与数据库中的实际名称一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值