由于表分区用完了,程序开始报错 解决方法:增加表分区ALTERTABLEcustomeventlabelsumADDPARTITION(。。。。。。PARTITIONkvss20241209VALUESLESSTHAN(20241209),PARTITIONkvss20241216VALUESLESSTHAN(20241216),PARTITIONkvss20241223VALUESLESSTHAN(20241223),PARTITIONkvss20241230VALUESLESSTHAN(20241230)); mysql分区表在定义分区时,有时会定义一个maxvalue的分区,相当于一个默认分区,保证所有数据都能被分区表存储。 对于这种情况需要使用一下sql来添加分区 把MAXVALUE分区拆分为多个分区altertableenterprise。userprofilebak1REORGANIZEPARTITIONpmaxINTO(PARTITIONp101VALUESLESSTHAN(1646064000)ENGINEInnoDB,PARTITIONpmaxVALUESLESSTHAN(MAXVALUE)ENGINEInnoDB); 执行后: 其他分区相关sql 查看每个分区的记录行数和占用大小SELECTPARTITIONNAME,TABLEROWS,DATALENGTHFROMINFORMATIONSCHEMA。PARTITIONSWHERETABLENAMEuserprofilebak1; 清理分区数据为空,保留分区不删除,仅仅是清理数据,命令如下altertablebmscenesdataremindertruncatepartitionp20210104; 删除分区altertablebmscenesdatareminderdroppartitionp20210104; 查看所有表的可用分区数量SELECTtablename,count()FROMinformationschema。PARTITIONSWHEREtablenameNOTIN(informationschema,performanceschema,sys)ANDpartitionnameISNOTNULLANDpartitionmethodISNOTNULLANDtablerows0GROUPBYtablename;案例: 系统有操作系统表syslog,实现每天删除90天前的分区并同时建一个4天后的分区(即每天将4天后的分区创建表),步骤如下:新建普通表,只执行一次CREATETABLEsyslog(idbigint(20)NOTNULLAUTOINCREMENT,begintimedatetimeDEFAULTNULLCOMMENT开始时间,endtimedatetimeDEFAULTNULLCOMMENT结束时间,spendmillsint(11)DEFAULTNULLCOMMENT运行时长,单位ms,usernamevarchar(100)DEFAULTNULLCOMMENT用户id,logstatusint(11)NOTNULLDEFAULT0COMMENT运行状态,〔0〕成功〔1〕失败,codeint(11)NOTNULLDEFAULT0COMMENT错误码,remoteaddrvarchar(50)DEFAULTCOMMENT远程地址,requesturivarchar(255)DEFAULTNULLCOMMENT请求路径,useragenttextCOMMENT用户代理,reqdatatextNOTNULLCOMMENT请求参数,respdatalongtextNOTNULLCOMMENT返回结果,PRIMARYKEY(id)USINGBTREE,KEYidxlogbegintime(begintime)USINGBTREECOMMENT系统日志的beginTime字段索引)ENGINEInnodbDEFAULTCHARSETutf8ROWFORMATDYNAMIC修改成分区表,只执行一次,留一个当前时间的分区和将来的future分区ALTERTABLEsyslogDROPPRIMARYKEY,ADDPRIMARYKEY(id,begintime);altertablesyslogpartitionbyRANGE(todays(begintime))(PARTITIONp20210816VALUESLESSTHAN(738383),PARTITIONfutureVALUESLESSTHANMAXVALUE);每天执行以下的分区操作,进行增加一天的分区,如ALTERTABLEsyslogdropPARTITIONfuture;ALTERTABLEsyslogADDPARTITION(PARTITIONp20210817VALUESLESSTHAN(738384)ENGINEInnoDB);ALTERTABLEsyslogADDPARTITION(PARTITIONp20210818VALUESLESSTHAN(738385)ENGINEInnoDB);ALTERTABLEsyslogADDPARTITION(PARTITIONp20210819VALUESLESSTHAN(738386)ENGINEInnoDB);ALTERTABLEsyslogADDPARTITION(PARTITIONfutureVALUESLESSTHANMAXVALUEENGINEInnoDB);定时任务配置,每天执行一次分区的清理与创建304binpythonhometestuserSyslogPartitionClear。pydevnull21 脚本:!usrbinpythoncoding:utf8importmysql。connectorimportdatetimeclassSyslogPartitionClear(object):SyslogPartitionClearclearDatadefclearData(self,deleteTime,afterTime):dbNonetry:dbmysql。connector。connect(host127。0。0。1,port3306,userwebuser,password123456,databaseicnoclxwebdb,charsetutf8,useunicodeTrue)cursordb。cursor()cursor。execute(selecttodays(DATEADD(NOW(),INTERVAL4DAY)))resultscursor。fetchall()partitionIntegerValue0;forrowinresults:partitionIntegerValuerow〔0〕try:printALTERTABLEsyslogdropPARTITIONpdeleteTime;cursor。execute(ALTERTABLEsyslogdropPARTITIONpdeleteTime;)exceptException,e:printetry:printALTERTABLEsyslogdropPARTITIONfuture;cursor。execute(ALTERTABLEsyslogdropPARTITIONfuture;)exceptException,e:printetry:printALTERTABLEsyslogADDPARTITION(PARTITIONpafterTimeVALUESLESSTHAN(str(partitionIntegerValue))ENGINEInnoDB);cursor。execute(ALTERTABLEsyslogADDPARTITION(PARTITIONpafterTimeVALUESLESSTHAN(str(partitionIntegerValue))ENGINEInnoDB);)exceptException,e:printetry:printALTERTABLEsyslogADDPARTITION(PARTITIONfutureVALUESLESSTHAN(MAXVALUE)ENGINEInnoDB);cursor。execute(ALTERTABLEsyslogADDPARTITION(PARTITIONfutureVALUESLESSTHAN(MAXVALUE)ENGINEInnoDB);)exceptException,e:printedb。commit()exceptException,e:db。rollback()printefinally:db。close()ifnamemain:nowdatetime。datetime。now()deltadatetime。timedelta(days90)beforedaynowdeltadeleteTimebeforeday。strftime(Ymd)afterdaynowdatetime。timedelta(days4)afterTimeafterday。strftime(Ymd)objSyslogPartitionClear()obj。clearData(deleteTime,afterTime)