注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL 整型字段 “integer out of range” 一例  

2012-02-14 15:49:26|  分类: PG案例分析 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


        今天检查数据库时,发现一个日志库根目录使用率比较高,由于 /var/applog/pg_log 用来存放 postgresql
 日志,猜测 postgresql 有大量日志,经查,果然目录 /var/applog/pg_log 下有大量日志,每天的日志有 2G
 左右,且日志里有大量以下内容。


--1 csv 日志
2012-02-14 14:35:30.640 CST,"accessstat","accessstat",18107,"192.168.169.71:43743",4ed49343.46bb,5331,"INSERT",2011-11-29 16:09:39 CST,168/45813,0,ERROR,22003,"integer out of range",,,,,,"INSERT INTO tbl_tmp(imsi, termipaddr, accessipaddr, networkID, conntype, smsCenter, cellId, dialTime, connectTime, dialRatio, connectRatio, exitReason, reconnresult) VALUES ('460028469626829', '117.136.7.71', '192.168.169.71', 0, 0, '', 0, 2306, 221, -1, -1, 1, 1);

   备注:猜测可能有整型字段长度不够,于是查询手册确认下。
  
  
--2 手册上ERROR代码表   

  Error    Code

 Meaning

 Condition Name

 22003  NUMERIC VALUE OUT OF RANGE  numeric_value_out_of_range
    


--3 INSERT SQL

INSERT INTO tbl_tmp
  (xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx,
   xxxxxxxxxx)
VALUES
  ('460021452274418',
   '117.136.7.72',
   '192.168.169.70',
   0,
   0,
   '8613800452500',
   0,
   56,
   1098,
   -1,
   -1,
   0,
   0);

   

     备注:从 INSERT 语句来看,推测是主键 seq 的问题,seq 类型为 integer。
 

--4 查看表结构

 accessstat=> \d tbl_tmp
                              Table "skytf.tbl_tmp"
    Column    |         Type          |                              Modifiers                             
--------------+-----------------------+---------------------------------------------------------------------
 seq          | integer               | not null default nextval('tbl_tmp_seq_seq'::regclass)
 xxxx         | character varying(16) | not null
 xxxxxxxxxx   | character varying(16) | not null
 xxxxxxxxxxxx | character varying(16) | not null
 xxxxxxxxx    | smallint              | not null
 xxxxxxxx     | smallint              | not null
 xxxxxxxxx    | character varying(16) | not null
 xxxxxx       | integer               | not null
 xxxxxxxx     | integer               | not null
 xxxxxxxxxxx  | integer               | not null
 xxxxxxxxx    | smallint              | not null
 xxxxxxxxxxxx | smallint              | not null
 xxxxxxxxxx   | smallint              | not null
 xxxxxxxxxxxx | smallint              | not null
 xxxxxxxx     | date                  | not null default now()
Indexes:
    "tbl_tmp_pkey" PRIMARY KEY, btree (seq)
Inherits: tbl_tmp
Tablespace: "tbs_accessstat_idx"
   

--5 查看序列 next 值
accessstat=> select nextval('tbl_tmp_seq_seq');
  nextval  
------------
 2148607080
(1 row)


--6 数据类型 integer 范围是 ( -2147483648 to +2147483647 )
accessstat=> select 2148607080-2147483647;
 ?column?
----------
  1123433
(1 row)

    备注:可见 pk 已经超出了 integer 的范围。
  

--7 处理方法
   最有效的方法是将字段 seq 类型由 integer 扩为 bigint 类型,由于 pg 扩字段需要重写表,
   那么还得想办法清理历史数据,由于这张表是日志表,和开发人员确认后,可以清理历史数据,
   只保留当月数据即可。


--8 更改字段类型( integer -> bigint )
accessstat=> alter table tbl_tmp alter column seq  type bigint;
ALTER TABLE
Time: 83110.885 ms

     备注:建议清理历史数据后再执行修改字段操作。


--9 附: Numeric Type

Name

Storage Size

Description

Range


smallint
2 bytes small-range integer -32768 to +32767

integer
4 bytes typical choice for integer -2147483648 to +2147483647

bigint
8 bytes large-range integer -9223372036854775808 to 9223372036854775807

decimal
variable user-specified precision, exact no limit

numeric
variable user-specified precision, exact no limit

real
4 bytes variable-precision, inexact 6 decimal digits precision

double precision
8 bytes variable-precision, inexact 15 decimal digits precision

serial
4 bytes autoincrementing integer 1 to 2147483647

bigserial
8 bytes large autoincrementing integer 1 to 9223372036854775807

  评论这张
 
阅读(30270)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016