postgresql恢复数据, 自增处理

postgresql恢复数据, 自增处理

pg中有一个自增类型, serial

serial类型会创建一个序列, sequence

使用pg_dump备份数据并不会记录sequence的最大值

在恢复数据时, 序列会重建, 起始值为0

解决这个问题, 要么在pg_dump时指定生成insert语句

insert语句会触发sequence, 理所当然的会将序列最大值恢复

默认是copy csv格式

insert的速度 会比copy慢些

要么手动指定序列最大值

我的做法

drop function if exists restore_seq ();
create or replace function restore_seq()
  returns void as $$
declare
    statements cursor for
    -- 序列, 跟字段本身是没有关系的, 一个序列可以被多个字段使用, 可以手动使用
    -- 这个sql查询了当前database中所有默认值为自增类型的字段
    -- 通过拼接查询得到的table_name, column_name得到序列的名字
    -- 然后通过select max 重新设置序列的起始值
    -- 此方法限制有二, 1: 序列名不要改动, 使用pg默认的即可 2: 一个序列不要被多个字段共用
    select c.table_schema, c.table_name, c.column_name, c.column_default
    from information_schema.columns c
           inner join pg_catalog.pg_statio_all_tables st
               on c.table_schema = st.schemaname and c.table_name = st.relname
           left join pg_catalog.pg_description pgd
               on (pgd.objoid = st.relid and pgd.objsubid = c.ordinal_position)
    where c.column_default :: text like ‘%nextval%‘
  /*
      and c.table_catalog = ‘demo‘
      and c.table_schema = ‘test‘
      and c.table_name = ‘t_b‘
  */;
  declare seq_full_name      text;
  declare table_full_name    text;
  declare max_value          bigint = 1;
  declare query_max_sql      text;
  declare alter_sequence_sql text;
begin
  for stmt in statements loop
    seq_full_name := stmt.table_name || ‘_‘ || stmt.column_name || ‘_seq‘;
    table_full_name := stmt.table_schema || ‘.‘ || stmt.table_name;
    query_max_sql := (‘select max(‘ || stmt.column_name || ‘) from ‘ || table_full_name);
    /*
    raise notice ‘%‘, seq_full_name;
    raise notice ‘%‘, table_full_name;
    raise notice ‘%‘, query_max_sql;
   */
    execute query_max_sql
    into max_value;

    alter_sequence_sql := (‘alter sequence ‘ || seq_full_name || ‘ restart with ‘ || max_value);
    raise notice ‘%‘, alter_sequence_sql;

    execute alter_sequence_sql;
  end loop;
end;
$$
language plpgsql;

select restore_seq();

原文地址:https://www.cnblogs.com/zhangtianxiao/p/10322519.html

时间: 2024-08-01 19:35:25

postgresql恢复数据, 自增处理的相关文章

Postgresql插入数据返回自增id

Postgresql插入数据返回自增id 一.设置自增id 新建字段  并且将字段属性设置为serial 二.插入返回 insert语句增加return 例如:insert into point(pointtype,pointx,pointy,pointval)values(1,2,3,4) RETURNING id;

利用mysql的binlog恢复数据

MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与master同步. 1.开启binary log功能 需要修改mysql的配置文件,本篇的实验环境是win7,配置文件为mysql安装目录\MySQL Server 5.1下的my.ini,添加一句log_bin = mysql_bin即可      eg:      [mysqld]            

Linux下面的mysql的bin-log恢复数据

转自:http://blog.sina.com.cn/s/blog_13dd6daa80102wbht.html 一.开启binlog日志: 编辑打开mysql配置文件my.cnf,在[mysqld]区块设置/添加 log-bin=mysql-bin  确认是打开状态(值 mysql-bin 是日志的基本名或前缀名),重启mysqld服务使配置生效.日志刷新命令:mysql> flush logs. 二.也可登录mysql服务器,通过mysql的变量配置表,查看二进制日志是否已开启 mysql>

MySQL借助ibd文件恢复数据技巧?

磁盘坏道.断电等意外不是常态,但遇上了就足够你"惊心动魄"!如果是数据库损坏造成的数据丢失,Binlog也不可用了,怎么办?为了在短时间内无损恢复数据以保证业务稳定性,除了利用binlog,我们还修炼了一招新的恢复技能! 还记得我们之前写过的<只需一招,让失控的研发爱上你>吗?前文提到过我们日常使用的比较多的两种数据库恢复方法是: 以上两种方法都可以实现实时性的回档,但是你会认为有了这两种技能就够了吗? 不-.! 在线上这种错综复杂的架构中,其实还有很多未知的原因,我们是没

Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废话不多说,下面是梳理的binlog日志操作解说: 一.初步了解binlogMySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的. DDL-

postgresql恢复备份主从

参考 http://www.postgres.cn/docs/11/app-pg-dumpall.html http://m.blog.chinaunix.net/uid-20665047-id-5817656.html http://www.postgres.cn/docs/11/continuous-archiving.html#BACKUP-ARCHIVING-WAL https://blog.csdn.net/yaoqiancuo3276/article/details/80826073

MySQL binlog日志恢复数据

我们了解了MySQL 的 binlog 日志的开启方式以及 binlog 日志的一些原理和常用操作,我们知道,binlog 有两大作用,一个是使用 binlog 恢复数据,另一个就是用来做主从复制.本篇笔记就是来记录如何使用 binlog 日志来做数据恢复.当然了,使用 binlog 日志所恢复的数据只能是部分数据,并不能够使用 binlog 日志来做数据库的备份,如果想要做数据库备份,依然要使用我们传统的备份方法,而 binlog 可以作为增量备份. 视频链接:http://www.ronco

安卓性能优化之Activity和Fragment通过onSaveInstanceState()保存和恢复数据

Activity和Fragment 都有自己的生命周期,而且很类似.Fragment比Activity多了onAttach()和onCreateView()这些方法.整体它们两者是一样的周期,都会经历从创建视图( onCreate(),onCreateView(),onStart() )到暂停( onPause(), onStop() ) 到重新返回( onResume() ) 到最后销毁( onDetroyView(), onDestroy() ) 这些方法. 之前有提过,熟悉组件的这些生命周

使用rman恢复数据小结

恢复前提有数据备份 以 alter database open resetlogs 开机以后多要做一次全备(以前的备份失效了) 恢复参数文件: restore spfile from '/home/oracle/bak/PROD4_25s8i1dp_1_1.spfile'; 恢复控制文件: rman>restore controlfile from '/home/oracle/bak/ctl_PROD4_20170705_68_1'; rman>alter database mount; 恢复