文档章节

Greenplum迁移数据后批量更新序列值

闻术苑
 闻术苑
发布于 2016/03/29 17:16
字数 580
阅读 554
收藏 2

作为DBA,经常会涉及到数据导入导出问题,以前用pg_dump导出数据后,用psql进行导入,当时觉得sql中已经存在操作序列的语句,所以没有对应更新序列最大值。最近频繁出现序列问题。

为什么序列对数据迁移如此重要,因为在数据迁移过程中,很容易碰到序列和表数据不匹配的情况,如表的 id ( 这里假设 id 字段是主键,且用序列填充) 最大值大于序列的 next 值,这种情况将造成数据插入不进的情况,从而影响了应用的正常运行。

针对这个问题,我查了一下资料,自己写了一个批量执行的脚本,贴上来方便大家参考(水平有限,大家共同进步)。

####################这段代码稍微有点麻烦,请看下面优化版本#########################
#!/bin/bash
# author:Jeff Yuan
# date:2016-03-29

IFS=$'\n'

# 读取并生成rwnas序列更新语句存入变量,可以在下面语句中指定对应schema来操作固定schema下面的序列
update_sequence_array=$(psql -h 127.0.0.1 -p 5432 -d test -U test -c "select 'select setval(\''||table_sequence||'\',max(id)) from '||table_schema||'.'||table_name||';' from (SELECT table_schema,table_name, column_name, column_default, substring(column_default,position('(\'' in column_default)+2,position('\'::regclass' in column_default)-10) as table_sequence from information_schema.columns where column_default <> '' and table_name not like '%_1_prt_m%' and column_name = 'id' and table_schema not like '%_bak') t;")
          
#定义循环更新函数
function  update_sequence(){
for i in $update_sequence_array
do      
    echo $i
    echo "$(psql -h 127.0.0.1 -p 5432 -d test -U test -c "$i")" 
done  
}
#执行函数
update_sequence
##############下面这段代码里面做了一点优化,目前使用脚本可以传入数据库参数,提高了通用性#################
#!/bin/bash
# author:Jeff Yuan
# create date:2016-03-29
# audit date:2016-05-30
# 使用:请在脚本名后面加上要更新序列的数据库名,例如:update_sequence.sh test

IFS=$'\n'

# 参数定义
db=$1 

# 读取并生成序列更新语句存入变量
update_sequence_array=$(psql -h 127.0.0.1 -p 5432 -d $db -t -c "select 'select setval('''||table_sequence||''',max(id))'||' from '||table_name||';' from (SELECT table_schema||'.'||table_name as table_name, split_part(column_default,'''',2) as table_sequence from information_schema.columns where column_default <> '' and table_name not like '%_1_prt%' and column_name = 'id') t;")
          
#定义循环更新函数
function  update_sequence(){
for i in $update_sequence_array
do      
    echo $i
    echo "$(psql -h 127.0.0.1 -p 5432 -d $db -c "$i")" 
done  
}
#执行函数
update_sequence

 

© 著作权归作者所有

闻术苑
粉丝 62
博文 166
码字总数 68762
作品 0
济南
产品经理
私信 提问
PgSQL · 应用案例 · 经营、销售分析系统DB设计之共享充电宝

背景 共享充电宝、共享单车、共享雨伞,共享女朋友^|^,共享汽车,。。。 共享经济最近几年发展确实非常迅猛。 共享必定涉及被共享对象的管理、会员的管理等,实际上也属于一种物联网系统。 ...

阿里云RDS-数据库内核组
2017/10/10
0
0
Installation GreenPlum 5.14.0 on Oracle Linux 7.6

Greenplum主要由Master节点、Segment节点、interconnect三大部分组成。Greenplum master是Greenplum数据库系统的入口,接受客户端连接及提交的SQL语句,将工作负载分发给其它数据库实例(seg...

candon123
2018/12/07
0
0
【干货】在docker中安装配置Greenplum集群的过程

—— 原文发布于本人的微信公众号“大数据与人工智能Lab”(BigdataAILab),欢迎关注。 Greenplum是一个MPP(海量并行处理)计算框架的分布式数据库,其数据库引擎层是基于著名的Postgresq...

雪饼
2018/01/12
4
0
HybridDB for PostgreSQL , Greenplum 写入性能优化实践

标签 PostgreSQL , Greenplum , HybridDB for PostgreSQL , insert , 性能 背景 Greenplum写入数据的性能优化实践。 1 链路 尽量缩短客户端和数据库的链路,不要太多的跳数,比如NAT,PROXY...

德哥
2018/10/05
0
0
通用数据库管理工具 DBeaver 5.0.2 发布

DBeaver 5.0.2 发布,更新如下: SQL 编辑器: 增强空脚本关闭行为配置 修复资源缺失问题 结果查看器:修复 plaintext + record 模式错误 PostgreSQL: 表 DDL 中的权限授予 增加约束注释支持...

h4cd
2018/04/03
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

聊聊中国的通信行业:从“七国八制”到“中华”脊梁

本期文章和大家一起来聊一聊我曾经从事过的通信行业吧。最近各方面信息的泛滥,包括和华为的同学聊天,自己确实也感慨颇多。想想我自己本科主修通信工程,研究生再修信息与通信工程,从本科开...

CodeSheep
51分钟前
4
0
MDK:ARM M451M:exceed the range of code meory, continue to erase or not?

问题: 代码空间超限 几天前就遇到:exceed the range of code meory, continue to erase or not? 如下所示: 解决过程 开始以为中MDK软件的128KB限制,如是就不能生成HEX文件,应该链接时有提...

SamXIAO
58分钟前
1
1
OSChina 周六乱弹 —— 因违反《中华人民共和国治安管理处罚法》第四十四条之规定

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :#今日歌曲推荐# 惊艳分享谷微的单曲《安守本份》(@网易云音乐) 《安守本份》- 谷微 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
292
7
Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
8
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部