数据库中间件数据归档

Posted 微创智云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库中间件数据归档相关的知识,希望对你有一定的参考价值。

Shell -数据归档  mysql版本  Oracle版本


版本规划


v1.0

dbnode_tables.list 表规则配置信息

#模块    表名    数据保留天数    转出日期字段    转入历史表名    是否分库[1:分库0:未分库]    描述

如:ams  t_ams_test  5                date_time      t_ams_test_his   0                           ams测试表

模块

表名

数据保留天数

转出日期字段

转入历史表名

是否分库

[1:分库0:未分库]

描述















 


v2.0

dbnode_tables.list

#模块    表名              归档类型    归档周期      归档日期字段       归档历史表    转入历史表名    是否分库[1:分库0:未分库]    描述

                (按天DAY、按月MOUNTH、按年YEAR)


归档设计

Liunx 操作系统定时吊起Shell脚本

 

数据归档-Shell脚本整体设计

两层循环:

第一层为遍历数据库节点

第二层为遍历数据库节点对应的表规则,根据表规则进行数据迁移

 


MySQL

sh_data_node_datatrans_sit.sh

#!/bin/bash
#set -x
###########################################################
# 模块: sh_data_node_datatrans.sh
# 作者: Fx_demon
# 修改记录
# 日期
# 修改人
# 修改描述 《数据归档》
################################################################
 
filePath=/opt/datatrans

currDate=`date +"%Y%m%d"`

while read line
do
   dbip=`echo $line | awk -F ' ' '{print $1}'`
   dbport=`echo $line | awk -F ' ' '{print $2}'`
   dbname=`echo $line | awk -F ' ' '{print $3}'`
   dbpwd=`echo $line | awk -F ' ' '{print $4}'`
   dbsch=`echo $line | awk -F ' ' '{print $5}'`
   dbnode=`echo $line | awk -F ' ' '{print $6}'`
   
   echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
   echo " 节点执行信息: mysql -h $dbip -P${dbport} -u${dbname} -p${dbpwd} ${dbsch}"
   echo "=========================================================================================="  >> $filePath/logs/execute_$currDate.log  
   
    while read line
     do
       moduleName=`echo $line | awk -F ' ' '{print $1}'`
       moduleTable=`echo $line | awk -F ' ' '{print $2}'`
       day=`echo $line | awk -F ' ' '{print $3}'`
       transFiled=`echo $line | awk -F ' ' '{print $4}'`
       moduleHisTable=`echo $line | awk -F ' ' '{print $5}'`
       moduleIsShare=`echo $line | awk -F ' ' '{print $6}'`
       moduleDes=`echo $line | awk -F ' ' '{print $7}'`
        
        echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
        echo " 归档数据表信息:模块:${moduleName} 表:${moduleTable}  ${day}天 ${moduleIsShare} < 1:分库0:不分库 " >> $filePath/logs/execute_$currDate.log
        echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log  
        if [ $dbnode -eq 1 ]; then
            echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
            echo " 开始处理主节点${dbnode}归档数据表  " >> $filePath/logs/execute_$currDate.log
            if [ $moduleIsShare -eq 0 ]; then
                echo " 主节点表:${moduleTable} 不分库 " >> $filePath/logs/execute_$currDate.log
                echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
            else
                echo " 主节点表:${moduleTable} 分库" >> $filePath/logs/execute_$currDate.log
                echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
            fi
            
               echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
               echo ${moduleHisTable}" 创建历史表开始 "     >> $filePath/logs/execute_$currDate.log    
               runsql=" CREATE TABLE  IF NOT EXISTS  ${moduleHisTable}  LIKE  ${moduleTable}  "
               echo " 1. 在schame:" ${dbsch} ",dbnode:" ${dbnode} "上执行创建表sql:" $runsql
               runsqlExecute="${runsql}"
               #echo "mysql -h $dbip -P${dbport} -u${dbname} -p${dbpwd} ${dbsch}  -e \"${runsqlExecute}\" -N -s >$filePath/logs/${dbsch}_${moduleName}_create.log"
               mysql -h $dbip -P${dbport} -u${dbname} -p${dbpwd} ${dbsch} -e "${runsqlExecute}" -N -s >$filePath/logs/${dbsch}_${moduleName}_create.log
               echo "归档信息 - 数据库节点: ${dbnode} 模块:${moduleName} 表:${moduleTable}  ${day}天 " >> $filePath/logs/execute_$currDate.log
               
               echo  ${moduleHisTable}" 创建历史表结束 " >> $filePath/logs/execute_$currDate.log
               echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
               
               echo " 2. "${moduleTable}  " 迁移数据开始 AND 删除数据开始 " >> $filePath/logs/execute_$currDate.log
                    
                runTransDataSQL="
                        begin;
                          set @dt = now();
                              INSERT INTO $moduleHisTable  SELECT * FROM $moduleTable
                              WHERE $transFiled   
                                BETWEEN  DATE_SUB(@dt , interval $day day) AND  @dt
                                ORDER BY $transFiled ASC;
                                
                                DELETE FROM $moduleTable  WHERE $transFiled   
                                BETWEEN  DATE_SUB(@dt , interval $day day) AND  @dt
                            ORDER BY $transFiled ASC;
                        commit;"
                runTransDataSQLEND="${runTransDataSQL}"
                echo "运行归档SQL: ${runTransDataSQLEND}" >> $filePath/logs/execute_$currDate.log
                mysql -h $dbip -P${dbport} -u${dbname} -p${dbpwd} ${dbsch} -e "${runTransDataSQLEND}" -N -s >$filePath/logs/${dbsch}_${moduleName}_${moduleTable}_${dbnode}_datatrans.log
                
                if [ $? -ne 0 ]; then
                    echo "数据归档失败" >> $filePath/logs/execute_$currDate.log
                else
                    echo "数据归档成功" >> $filePath/logs/execute_$currDate.log
                fi
                                
               echo ${moduleTable}" 迁移数据结束 AND 删除数据结束 " >> $filePath/logs/execute_$currDate.log
               echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
                
        else
           echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
           if [ $moduleIsShare -eq 0 ]; then
                continue
            else
                echo " 开始处理分片节点${dbnode}归档数据表  " >> $filePath/logs/execute_$currDate.log
                echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
                echo "分片节点 ${moduleTable} 分库数据归档处理开始"
                echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
                echo ${moduleHisTable}" 创建历史表开始 "     >> $filePath/logs/execute_$currDate.log    
                runsql=" CREATE TABLE  IF NOT EXISTS  ${moduleHisTable}  LIKE  ${moduleTable}  "
                echo " 1. 在schame:" ${dbsch} ",dbnode:" ${dbnode} "上执行创建表sql:" $runsql  >> $filePath/logs/execute_$currDate.log
                runsqlExecute="${runsql}"
                #echo "mysql -h $dbip -P${dbport} -u${dbname} -p${dbpwd} ${dbsch}  -e \"${runsqlExecute}\" -N -s >$filePath/logs/${dbsch}_${moduleName}_create.log"
                mysql -h $dbip -P${dbport} -u${dbname} -p${dbpwd} ${dbsch} -e "${runsqlExecute}" -N -s >$filePath/logs/${dbsch}_${moduleName}_create.log
                echo "归档信息 - 数据库节点: ${dbnode} 模块:${moduleName} 表:${moduleTable}  ${day}天 " >> $filePath/logs/execute_$currDate.log
               
                echo  ${moduleHisTable}" 创建历史表结束 " >> $filePath/logs/execute_$currDate.log
                echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
               
                echo " 2. "${moduleTable}  " 迁移数据开始 AND 删除数据开始 " >> $filePath/logs/execute_$currDate.log
                    
                runTransDataSQL="
                        begin;
                          set @dt = now();
                              INSERT INTO $moduleHisTable  SELECT * FROM $moduleTable
                              WHERE $transFiled   
                                BETWEEN  DATE_SUB(@dt , interval $day day) AND  @dt
                                ORDER BY $transFiled ASC;
                                
                                DELETE FROM $moduleTable  WHERE $transFiled   
                                BETWEEN  DATE_SUB(@dt , interval $day day) AND  @dt
                            ORDER BY $transFiled ASC;
                        commit;"
                runTransDataSQLEND="${runTransDataSQL}"
                echo "运行归档SQL: ${runTransDataSQLEND}"  >> $filePath/logs/execute_$currDate.log
                mysql -h $dbip -P${dbport} -u${dbname} -p${dbpwd} ${dbsch} -e "${runTransDataSQLEND}" -N -s >$filePath/logs/${dbsch}_${moduleName}_${moduleTable}_${dbnode}_datatrans.log
                
                if [ $? -ne 0 ]; then
                    echo "数据归档失败"  >> $filePath/logs/execute_$currDate.log
                else
                    echo "数据归档成功"  >> $filePath/logs/execute_$currDate.log
                fi
                                
                echo ${moduleTable}" 迁移数据结束 AND 删除数据结束 " >> $filePath/logs/execute_$currDate.log
                echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
                
            fi
        fi
        
       echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log       
   done <$filePath/sit_dbnode_tables.list
   echo "$dbip ${dbport} ${dbname} ${dbsch} 迁移数据结束" >> $filePath/logs/execute_$currDate.log
   echo "==========================================================================================" >> $filePath/logs/execute_$currDate.log
done <$filePath/sit_dbnode.list   

exit;

 

 

sit_dbnode.list
9.1.10.52 3307 root  123  dt  1
9.1.10.53 3307 root  123  dt  2

sit_dbnode_tables.list
ams  T_AMS_TEST1  5  MODIFY_TIME  T_AMS_TEST1_HIS  1  描述
ams  T_AMS_TEST2  6  MODIFY_TIME  T_AMS_TEST2_HIS  0  描述


测试表SQL :
CREATE TABLE T_AMS_TEST1 (
   ID  int(11) NOT NULL AUTO_INCREMENT ,
   BANK_NO  varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
   USER_ID  char(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
   CREAT_TIME  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
   MODIFY_TIME  timestamp NOT NULL   ,
   REMARK1  varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
   REMARK2  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
     PRIMARY KEY (ID)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
COMMENT='测试'
AUTO_INCREMENT=0
ROW_FORMAT=DYNAMIC
;

INSERT INTO t_ams_test1 (BANK_NO, USER_ID,CREAT_TIME,MODIFY_TIME,REMARK1,REMARK2)
VALUES ( '1', '1', '2017-12-20 16:34:45', '2017-12-20 16:34:48', '11', '22');



以上是关于数据库中间件数据归档的主要内容,如果未能解决你的问题,请参考以下文章

mysqldelete不用*

跳过丢失归档进行恢复

rac 11g_生产库日志组损坏处理

NSManagedObject 能否符合 NSCoding

哪位大神有MyCAT2(数据库中间件) V1.14 官方版软件百度云资源

分布式数据库中间件对比总结