暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql 数据库自增列达到最大值

原创 黄超 2021-09-14
2315

【问题描述】

插入数据时候报错,mysql错误 1264 Out of range value for column ‘字段’ at row 1

【问题分析】

查看表结构:show create table A \G;发现报错字段是int 类型,自增字段,AUTO_INCREMENT=21474836478

查看官方说明
bigint.png

查看数据记录:select count(*) from A;发现有1亿左右的数据量。因为长期的不断插入和删除,自增字段一直往上增长。

自增字段已达到int最大值,需要改变字段类型为bigint

【问题处理】

若是生产环境,不能停业务,需要在线处理。但是直接在线修改表结构,会阻塞对这个表的DML操作.

方法一、使用第三方工具pt-online-schema-change

1.percona-toolkit安装依赖包

yum -y install perl-Digest-MD5
yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey

2.安装percona-toolkit

rpm -ivh percona-toolkit-3.0.12-1.el7.x86_64.rpm

3.在线修改字段类型

pt-online-schema-change --user=dbaman --p=xxxx --host=192.168.1.110 --alter=“MODIFY COLUMN ID bigint(20) NOT NULL AUTO_INCREMENT” D=database_a,t=A –execute

方法二、利用Mysql数据库主从架构

在从库直接alter修改了字段类型bigint,然后切换主从。注意查看同步状态,主从同步没有延迟才能切换。

方法三、改表名

1.新增一个同样结构表

create table A_new like A;

2.改名

rename table A to A_old;
rename table A_new to A;

3.旧表改字段类型

ALTER TABLE A_old MODIFY COLUMN ID bigint(20) NOT NULL AUTO_INCREMENT ;
show create table A_old\G

4.改名

rename table A to A_tmp;
rename table A_old to A;

5.补上数据

insert into A(filed1,filed2,……) select filed1,filed2,…… from A_tmp;

【总结建议】

1. 自增字段类型建议使用bigint

2. 数据量大的表,建议分表

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论