精华内容
下载资源
问答
  • 我见到过的,听到过的数据库归档的方法有以下几种1 数据通过人工的手段来进行清理,直接将表换名字,然后在重建一个新的表,承接数据。首先这样的做法一个字,快,这是这样做法的好处所在,但另一方面要考虑的问题...

    bacdb9be831b8992ab4ded934308d723.png

    到数据归档,很多人的第一个概念就是,不就是无用的数据,换个地方放吗,直接拷贝,删除不就得了,有那么麻烦。

    我见到过的,听到过的数据库归档的方法有以下几种

    1  数据通过人工的手段来进行清理,直接将表换名字,然后在重建一个新的表,承接数据。

    首先这样的做法一个字,快,这是这样做法的好处所在,但另一方面要考虑的问题就是,业务要不要停,涉及的人有多少,如果光是IT 的还好说,但恰恰这样做,绝对不会光光牵扯 IT, 业务的人一定是要牵扯进来,然后就是各种流程和通知,要在几点几点,某个业务,甚至整体业务暂时停止。

    2  数据通过MYSQL dump 或者其他的备份方式,将数据备份出来,在将数据恢复到数据归档库中,然后将备份的数据直接手动清理掉,这样的做法速度也很快,对业务的影响也比较小,基本上可以算是透明的方式了,但还是避免不了人工的介入,并且也不可能是天天这样做。

    3  数据通过工具的方式来进行处理,例如pt-archiver 的方式来进行数据的归档和清理,但这个工具貌似bug不少,pt-1126

    a99e98fd3e34b0acfc25a991dde9a56c.png

    4  自己设计数据归档

    自己设计数据归档的面就广了,有使用程序来做的,例如JAVA ,Python等等,也有使用存储过程来进行的。

    下面就是一个MYSQL 针对一个数据库表归档的案例(这个案例也是有缺陷的,但目前是秉承着够用就好,以及时间成本的原则)

    首先设计一个归档要考虑的问题如下

    1 归档表的大小,以及每日最大,或最小的归档数据量,或者数据过期时间

    同时归档表是否必须是全量的数据归档,还是可以抛弃一些数据,例如有一些日志的归档中可能存在一些无用的数据,是否还必须全量的归档等等都是要考虑的问题,归档数据并不一定是原封不动的归档,有的逻辑上,只归档一些数据关键点也是可以的。

    2 归档的数据量,数据归档一般根据上面的东西,归档有一次性归档,和规律有固定日期的归档,一次性的归档一般归档的数据量比较大,而有规律的归档则归档的数据量并不大,对比两者的方式,其实定期归档(有规律)的要有优势一些,主要是数据是不断灌入的,而数据的归档如果也是不断输出的,这样整体这个表的数据量就会有一个平衡,不会一下子少了很多,要不就是在清理的前一天,数据量已经大到一定的水平,有可能影响性能。

    3 归档的方法,自己定义数据的归档方面,可以每次归档将数据灌入一个表,也可以定期的将数据写入不同的归档表,例如已归档日期和后缀的方式来将每次写入的数据进行分割,或者建立分区表的方式来进行归档。

    4  归档的方式是否灵活,有的归档的方法仅仅针对一个表来进行归档,有的方法是可以灵活配置,可以任意扩展。那就都任意扩展,灵活配置不就好了,其实随着能任意扩展或者灵活配置,则工作量就会变大,这也要考虑一个性价比,具体要考虑表的数量以及归档的方式。

    下面就是一个简单的例子,需求是一张表每天数据量在40- 50 万,主要都是来自于客户的短信以及消息发送的内容。表中的数据要保留半年之内的,其余的数据可以移走。

    以下以最简单的自动化的方案来讲

    下图是基于案例来讲的

    因为数据库是MYSQL 所以考虑了归档一次是多大的批量,避免归档数据量过大的时候将生产库hang 死,另外配置表主要的功能是有两个 1 限制一次拷贝和清理的数据量,2 控制拷贝过期数据的日期限制

    bd9e351b0d5fd33aac270ffeec9bca23.png

    下面是这段代码,如果看的不方便,下面有截图

    DELIMITER $$

    DROP PROCEDURE IF EXISTS  archive_data;

    create PROCEDURE archive_data()

    BEGIN

    declare row_s int;  #最大执行多少次每次1000条

    declare save_month tinyint;  #保留多少月之前的数据

    declare times int;  #执行次数记录

    declare min_row_s int;  #当前数据库最小的tid

    declare archive_date datetime;

    select @times := 1;  #设置每天初始清理次数初始值

    select @row_s := max_row_clean from db_archive.db_config order by id limit 1;  #获取当前配置库数据

    select @save_month := archive_save_date from db_archive.db_config order by id limit 1;

    select @min_row_s := min(tid) from msgcdb.t_sms_message; #获取当前系统最小的TID号

    select @max_row_s := max(tid) from msgcdb.t_sms_message; #获取当前系统最大的TID号

    select @archive_date := DATE_SUB(CURDATE(), INTERVAL @save_month MONTH);

    select @row_s, @save_month,@archive_date,@min_row_s,@max_row_s;

    if @min_row_s = @max_row_s then

    set @times = @row_s + 1;

    elseif @min_row_s is null then

    set @times = @row_s + 1;

    end if;

    insert into db_archive.archive_log (save_month,times,min_row_s,max_row_s,archive_date,row_s,insert_time,delete_time,type_s) values (@save_month,@times,@min_row_s,@max_row_s,@archive_date,@row_s,sysdate(),sysdate(),'initial');

    select @times, @min_row_s;

    while @times < @row_s DO

    begin

    insert into db_archive.t_sms_message (tid,summary_id,uid,code,channel,batch_id,done_time,phone,sms_content,create_time,send_time,storage_time,status,estimatedTime,operate_type,origin,creator_id ,dept_id,del_flag,priority,template_id,repetitions_num)

    select tid,summary_id,uid,code,channel,batch_id,done_time,phone,sms_content,create_time,send_time,storage_time,status,estimatedTime,operate_type,origin,creator_id ,dept_id,del_flag,priority,template_id,repetitions_num

    from msgcdb.t_sms_message

    where tid >= @min_row_s and tid < @min_row_s + 1000 and status <> 0 and storage_time < @archive_date;

    set @times = @times + 1;

    insert into db_archive.archive_log (save_month,times,min_row_s,max_row_s,archive_date,row_s,insert_time,delete_time,type_s) values (@save_month,@times,@min_row_s,@max_row_s,@archive_date,@row_s,sysdate(),sysdate(),'inserted');

    delete from msgcdb.t_sms_message where tid >= @min_row_s and tid < @min_row_s + 1000 and status <> 0 and storage_time < @archive_date;

    insert into db_archive.archive_log (save_month,times,min_row_s,max_row_s,archive_date,row_s,insert_time,delete_time,type_s) values (@save_month,@times,@min_row_s,@max_row_s,@archive_date,@row_s,sysdate(),sysdate(),'deleted');

    select @min_row_s,@max_row_s;

    select @min_row_s := min(tid) from msgcdb.t_sms_message;

    select @max_row_s := max(tid) from msgcdb.t_sms_message;

    select @min_row_s,@max_row_s;

    if @min_row_s = @max_row_s then

    set @times = @row_s + 1;

    elseif @min_row_s is null then

    set @times = @row_s + 1;

    end if;

    end;

    END WHILE;

    END$$

    DELIMITER ;

    f6fbefff72c92a70a0df211fc8b853aa.png

    07dfa0ec5d94874e35749b80ce754b73.png

    be94a21927367a830fe3db02a8619108.png

    配置表

    624dc6cc2350455288faf5cf1e16401c.png

    归档日志表

    152902d3e49f9808a645499032b13838.png

    为什么要这么设计,其实寻根溯源有两点

    1 简单有效,够用原则

    2 设计配置表的主要原因是对于非IT 人员,例如project manager 或者其他的人员,也可以调整归档的时间,例如 archive_save_date 的数字就是保留多少月的数据,max_row_clean,就是当前的数字 *1000 就是每天最大的归档数据量。通过这两个参数双重限制每天的归档的数据量,避免归档的时间太长,影响了备份,或其他操作。而日志表本身就是一个查看归档成功失败的东西,其中的type_s  就是表现数据归档操作状态的东西,通过日志表可以反映归档多少数据,每次操作消耗的时间,以及当前操作获取的系统变量是什么,方便出现故障时,查看到底归档的数据少不少,或者大致可能出现问题。

    下面是这两个表的结构

    ebde090424b2bc28f12e5399245d0704.png

    这样归档有没有缺点,当然有,缺点马上就可以说出几个

    1 为什么还要在本地机归档数据,不应该是传送到其他机器上吗

    2 为什么不设置每次归档的数量限制(每次限制操作的行数),这对MYSQL不是很用吗,为什么要写死。

    3  为什么要用MYSQL 存储过程来做,使用python不是更灵活

    其实一言难尽,都和需求有关,所以很多设计出来的东西,外人一看一堆毛病,如果你进入到他的内部,一段时间估计你就懂得为什么会设计出这样或那样的东西。

    最近有一句话挺时髦,资本根本不care你技术不技术,除非你做到行业NO.1,才有可能翻个身。

    4176b25d3ab1ddb838453a70df74b9a7.png

    群里有一些免费书,可自取

    20e173d907283c510d7cadb8d6463dda.png

    7314c7b43ee947e8b7711a0cb2f477bd.png

    展开全文
  • 到数据归档,很多人的第一个概念就是,不就是无用的数据,换个地方放吗,直接拷贝,删除不就得了,有那么麻烦。我见到过的,听到过的数据库归档的方法有以下几种1 数据通过人工的手段来进行清理,...

    到数据归档,很多人的第一个概念就是,不就是无用的数据,换个地方放吗,直接拷贝,删除不就得了,有那么麻烦。

    我见到过的,听到过的数据库归档的方法有以下几种

    1  数据通过人工的手段来进行清理,直接将表换名字,然后在重建一个新的表,承接数据。

    首先这样的做法一个字,快,这是这样做法的好处所在,但另一方面要考虑的问题就是,业务要不要停,涉及的人有多少,如果光是IT 的还好说,但恰恰这样做,绝对不会光光牵扯 IT, 业务的人一定是要牵扯进来,然后就是各种流程和通知,要在几点几点,某个业务,甚至整体业务暂时停止。

    2  数据通过MYSQL dump 或者其他的备份方式,将数据备份出来,在将数据恢复到数据归档库中,然后将备份的数据直接手动清理掉,这样的做法速度也很快,对业务的影响也比较小,基本上可以算是透明的方式了,但还是避免不了人工的介入,并且也不可能是天天这样做。

    3  数据通过工具的方式来进行处理,例如pt-archiver 的方式来进行数据的归档和清理,但这个工具貌似bug不少,pt-1126

    4  自己设计数据归档

    自己设计数据归档的面就广了,有使用程序来做的,例如JAVA ,Python等等,也有使用存储过程来进行的。

    下面就是一个MYSQL 针对一个数据库表归档的案例(这个案例也是有缺陷的,但目前是秉承着够用就好,以及时间成本的原则)

    首先设计一个归档要考虑的问题如下

     

    1 归档表的大小,以及每日最大,或最小的归档数据量,或者数据过期时间

       同时归档表是否必须是全量的数据归档,还是可以抛弃一些数据,例如有一些日志的归档中可能存在一些无用的数据,是否还必须全量的归档等等都是要考虑的问题,归档数据并不一定是原封不动的归档,有的逻辑上,只归档一些数据关键点也是可以的。

    2 归档的数据量,数据归档一般根据上面的东西,归档有一次性归档,和规律有固定日期的归档,一次性的归档一般归档的数据量比较大,而有规律的归档则归档的数据量并不大,对比两者的方式,其实定期归档(有规律)的要有优势一些,主要是数据是不断灌入的,而数据的归档如果也是不断输出的,这样整体这个表的数据量就会有一个平衡,不会一下子少了很多,要不就是在清理的前一天,数据量已经大到一定的水平,有可能影响性能。

    3 归档的方法,自己定义数据的归档方面,可以每次归档将数据灌入一个表,也可以定期的将数据写入不同的归档表,例如已归档日期和后缀的方式来将每次写入的数据进行分割,或者建立分区表的方式来进行归档。

    4  归档的方式是否灵活,有的归档的方法仅仅针对一个表来进行归档,有的方法是可以灵活配置,可以任意扩展。那就都任意扩展,灵活配置不就好了,其实随着能任意扩展或者灵活配置,则工作量就会变大,这也要考虑一个性价比,具体要考虑表的数量以及归档的方式。

    下面就是一个简单的例子,需求是一张表每天数据量在40- 50 万,主要都是来自于客户的短信以及消息发送的内容。表中的数据要保留半年之内的,其余的数据可以移走。

    以下以最简单的自动化的方案来讲

    下图是基于案例来讲的

    因为数据库是MYSQL 所以考虑了归档一次是多大的批量,避免归档数据量过大的时候将生产库hang 死,另外配置表主要的功能是有两个 1 限制一次拷贝和清理的数据量,2 控制拷贝过期数据的日期限制

    下面是这段代码,如果看的不方便,下面有截图

    DELIMITER $$

    DROP PROCEDURE IF EXISTS  archive_data;

    create PROCEDURE archive_data()

    BEGIN

      declare row_s int;  #最大执行多少次每次1000条

      declare save_month tinyint;  #保留多少月之前的数据

      declare times int;  #执行次数记录

      declare min_row_s int;  # 当前数据库最小的tid

      declare archive_date datetime;

      select @times := 1;  #设置每天初始清理次数初始值 

      select @row_s := max_row_clean from db_archive.db_config order by id limit 1;  #获取当前配置库数据

      select @save_month := archive_save_date from db_archive.db_config order by id limit 1; 

      select @min_row_s := min(tid) from msgcdb.t_sms_message; #获取当前系统最小的TID号

      select @max_row_s := max(tid) from msgcdb.t_sms_message; #获取当前系统最大的TID号

      select @archive_date := DATE_SUB(CURDATE(), INTERVAL @save_month MONTH);

      select @row_s, @save_month,@archive_date,@min_row_s,@max_row_s;

      

        if @min_row_s = @max_row_s then 

        set @times = @row_s + 1;

        elseif @min_row_s is null then

        set @times = @row_s + 1;

        end if; 

        

       insert into db_archive.archive_log (save_month,times,min_row_s,max_row_s,archive_date,row_s,insert_time,delete_time,type_s) values (@save_month,@times,@min_row_s,@max_row_s,@archive_date,@row_s,sysdate(),sysdate(),'initial');

     

       select @times, @min_row_s;

         while @times < @row_s DO

            begin

    insert into db_archive.t_sms_message (tid,summary_id,uid,code,channel,batch_id,done_time,phone,sms_content,create_time,send_time,storage_time,status,estimatedTime,operate_type,origin,creator_id ,dept_id,del_flag,priority,template_id,repetitions_num) 

            select tid,summary_id,uid,code,channel,batch_id,done_time,phone,sms_content,create_time,send_time,storage_time,status,estimatedTime,operate_type,origin,creator_id ,dept_id,del_flag,priority,template_id,repetitions_num 

            from msgcdb.t_sms_message 

            where tid >= @min_row_s and tid < @min_row_s + 1000 and status <> 0 and storage_time < @archive_date; 

    set @times = @times + 1;

             insert into db_archive.archive_log (save_month,times,min_row_s,max_row_s,archive_date,row_s,insert_time,delete_time,type_s) values (@save_month,@times,@min_row_s,@max_row_s,@archive_date,@row_s,sysdate(),sysdate(),'inserted');

            

        delete from msgcdb.t_sms_message where tid >= @min_row_s and tid < @min_row_s + 1000 and status <> 0 and storage_time < @archive_date;

            insert into db_archive.archive_log (save_month,times,min_row_s,max_row_s,archive_date,row_s,insert_time,delete_time,type_s) values (@save_month,@times,@min_row_s,@max_row_s,@archive_date,@row_s,sysdate(),sysdate(),'deleted');

           

            select @min_row_s,@max_row_s;

            select @min_row_s := min(tid) from msgcdb.t_sms_message;

            select @max_row_s := max(tid) from msgcdb.t_sms_message;

            select @min_row_s,@max_row_s;

                if @min_row_s = @max_row_s then 

    set @times = @row_s + 1;

                elseif @min_row_s is null then

                set @times = @row_s + 1;

                end if; 

               

            end;

         END WHILE;

    END$$

    DELIMITER ;

    配置表

    归档日志表

    为什么要这么设计,其实寻根溯源有两点

    1 简单有效,够用原则

    2 设计配置表的主要原因是对于非IT 人员,例如project manager 或者其他的人员,也可以调整归档的时间,例如 archive_save_date 的数字就是保留多少月的数据,max_row_clean,就是当前的数字 *1000 就是每天最大的归档数据量。通过这两个参数双重限制每天的归档的数据量,避免归档的时间太长,影响了备份,或其他操作。而日志表本身就是一个查看归档成功失败的东西,其中的type_s  就是表现数据归档操作状态的东西,通过日志表可以反映归档多少数据,每次操作消耗的时间,以及当前操作获取的系统变量是什么,方便出现故障时,查看到底归档的数据少不少,或者大致可能出现问题。

    下面是这两个表的结构

    这样归档有没有缺点,当然有,缺点马上就可以说出几个

    1 为什么还要在本地机归档数据,不应该是传送到其他机器上吗

    2 为什么不设置每次归档的数量限制(每次限制操作的行数),这对MYSQL不是很用吗,为什么要写死。

    3  为什么要用MYSQL 存储过程来做,使用python不是更灵活

    其实一言难尽,都和需求有关,所以很多设计出来的东西,外人一看一堆毛病,如果你进入到他的内部,一段时间估计你就懂得为什么会设计出这样或那样的东西。

    最近有一句话挺时髦,资本根本不care你技术不技术,除非你做到行业NO.1,才有可能翻个身。

    群里有一些免费书,可自取

    展开全文
  • oracel数据库默认存档模式为关闭状态,要实现数据的热备份,需要改变数据库的存档模式,将其打开。并且需要注意的是数据库的存档模式的操作需要在MOUNT实例中进行,且数据库不能处于OPEN状态。下面将进行详细介绍:1...

    在实际应用中,我们需要实现对数据的备份,其实现方式主要有冷备份和热备份两种。现在我们主要讨论热备份的具体操作。热备份也称为联机备份,在数据库的存档模式下进行备份。oracel数据库默认存档模式为关闭状态,要实现数据的热备份,需要改变数据库的存档模式,将其打开。并且需要注意的是数据库的存档模式的操作需要在MOUNT实例中进行,且数据库不能处于OPEN状态。下面将进行详细介绍:

    1. 打开存档模式:

    1.1 首先使用sqlplus登录到sys用户,使用SQL:archive log list 查看当前数据库的存档模式。

    此时可以看出当前数据库为默认的非存档模式。

    1.2 使用SQL:alter system set log_archive_start=true scope=spfile; --修改系统的日志方式为存档模式--

    shutdown immediate; --关闭数据库,因为不能在open状态下进行操作--

    startup mount; --启动mount实例,但不是启动数据库--

    alter database archivelog; --更改数据库为存档模式--

    1.3 此时我们使用SQL:archive log list 进行查看,已经更改为存档模式。

    1.4 最后别忘了使用SQL:alter database open;打开数据库。

    2. 关闭存档模式:

    前面已经提到,数据的存档模式的操作必须要在mount实例中进行,且数据库要处于非open状态。所有关闭存档模式前,我们需要查看当前数据库的状态,并且关闭数据库,启动mount实例,才可进行操作。其具体操作为:

    2.1 使用SQL:select status from v$instance;查看当前数据库的状态,正常情况下一般都处于open状态。

    2.2 使用SQL:shutdown immediate; --关闭数据库,因为数据库当前状态为open--

    startup mount; --启动mount实例--

    alter database noarchivelog; --改变数据库存档模式为非存档模式--

    2.3 此时使用SQL:archive log list 查看,存档模式已经变更为非存档模式。

    2.4 再次使用SQL:select status from v$instance;进行查看数据库的当前状态,当前状态为mount状态。

    2.5 最后别忘记使用SQL:alter database open;打开数据库。

    2.6 再次使用SQL:select status from v$instance;查看数据库状态,为open状态。

    最后使用快捷键Crtl + C 退出sqlplus。

    展开全文
  • 我见到过的,听到过的数据库归档的方法有以下几种1 数据通过人工的手段来进行清理,直接将表换名字,然后在重建一个新的表,承接数据。首先这样的做法一个字,快,这是这样做法的好处所在,但另一方面要考虑的问题...

    1d5651e571c1e34d38d8df9471f67979.png

    到数据归档,很多人的第一个概念就是,不就是无用的数据,换个地方放吗,直接拷贝,删除不就得了,有那么麻烦。

    我见到过的,听到过的数据库归档的方法有以下几种

    1  数据通过人工的手段来进行清理,直接将表换名字,然后在重建一个新的表,承接数据。

    首先这样的做法一个字,快,这是这样做法的好处所在,但另一方面要考虑的问题就是,业务要不要停,涉及的人有多少,如果光是IT 的还好说,但恰恰这样做,绝对不会光光牵扯 IT, 业务的人一定是要牵扯进来,然后就是各种流程和通知,要在几点几点,某个业务,甚至整体业务暂时停止。

    2  数据通过MYSQL dump 或者其他的备份方式,将数据备份出来,在将数据恢复到数据归档库中,然后将备份的数据直接手动清理掉,这样的做法速度也很快,对业务的影响也比较小,基本上可以算是透明的方式了,但还是避免不了人工的介入,并且也不可能是天天这样做。

    3  数据通过工具的方式来进行处理,例如pt-archiver 的方式来进行数据的归档和清理,但这个工具貌似bug不少,pt-1126

    a34ad7784145cea14fccd5c31b434afd.png

    4  自己设计数据归档

    自己设计数据归档的面就广了,有使用程序来做的,例如JAVA ,Python等等,也有使用存储过程来进行的。

    下面就是一个MYSQL 针对一个数据库表归档的案例(这个案例也是有缺陷的,但目前是秉承着够用就好,以及时间成本的原则)

    首先设计一个归档要考虑的问题如下

    1 归档表的大小,以及每日最大,或最小的归档数据量,或者数据过期时间

       同时归档表是否必须是全量的数据归档,还是可以抛弃一些数据,例如有一些日志的归档中可能存在一些无用的数据,是否还必须全量的归档等等都是要考虑的问题,归档数据并不一定是原封不动的归档,有的逻辑上,只归档一些数据关键点也是可以的。

    2 归档的数据量,数据归档一般根据上面的东西,归档有一次性归档,和规律有固定日期的归档,一次性的归档一般归档的数据量比较大,而有规律的归档则归档的数据量并不大,对比两者的方式,其实定期归档(有规律)的要有优势一些,主要是数据是不断灌入的,而数据的归档如果也是不断输出的,这样整体这个表的数据量就会有一个平衡,不会一下子少了很多,要不就是在清理的前一天,数据量已经大到一定的水平,有可能影响性能。

    3 归档的方法,自己定义数据的归档方面,可以每次归档将数据灌入一个表,也可以定期的将数据写入不同的归档表,例如已归档日期和后缀的方式来将每次写入的数据进行分割,或者建立分区表的方式来进行归档。

    4  归档的方式是否灵活,有的归档的方法仅仅针对一个表来进行归档,有的方法是可以灵活配置,可以任意扩展。那就都任意扩展,灵活配置不就好了,其实随着能任意扩展或者灵活配置,则工作量就会变大,这也要考虑一个性价比,具体要考虑表的数量以及归档的方式。

    下面就是一个简单的例子,需求是一张表每天数据量在40- 50 万,主要都是来自于客户的短信以及消息发送的内容。表中的数据要保留半年之内的,其余的数据可以移走。

    以下以最简单的自动化的方案来讲

    下图是基于案例来讲的

    因为数据库是MYSQL 所以考虑了归档一次是多大的批量,避免归档数据量过大的时候将生产库hang 死,另外配置表主要的功能是有两个 1 限制一次拷贝和清理的数据量,2 控制拷贝过期数据的日期限制

    75eeddbd09a5cf917ad546f0d32fe98b.png

    下面是这段代码,如果看的不方便,下面有截图

    DELIMITER $$

    DROP PROCEDURE IF EXISTS  archive_data;

    create PROCEDURE archive_data()

    BEGIN

      declare row_s int;  #最大执行多少次每次1000条

      declare save_month tinyint;  #保留多少月之前的数据

      declare times int;  #执行次数记录

      declare min_row_s int;  # 当前数据库最小的tid

      declare archive_date datetime;

      select @times := 1;  #设置每天初始清理次数初始值 

      select @row_s := max_row_clean from db_archive.db_config order by id limit 1;  #获取当前配置库数据

      select @save_month := archive_save_date from db_archive.db_config order by id limit 1; 

      select @min_row_s := min(tid) from msgcdb.t_sms_message; #获取当前系统最小的TID号

      select @max_row_s := max(tid) from msgcdb.t_sms_message; #获取当前系统最大的TID号

      select @archive_date := DATE_SUB(CURDATE(), INTERVAL @save_month MONTH);

      select @row_s, @save_month,@archive_date,@min_row_s,@max_row_s;

        if @min_row_s = @max_row_s then 

        set @times = @row_s + 1;

        elseif @min_row_s is null then

        set @times = @row_s + 1;

        end if; 

       insert into db_archive.archive_log (save_month,times,min_row_s,max_row_s,archive_date,row_s,insert_time,delete_time,type_s) values (@save_month,@times,@min_row_s,@max_row_s,@archive_date,@row_s,sysdate(),sysdate(),'initial');

       select @times, @min_row_s;

         while @times < @row_s DO

            begin

    insert into db_archive.t_sms_message (tid,summary_id,uid,code,channel,batch_id,done_time,phone,sms_content,create_time,send_time,storage_time,status,estimatedTime,operate_type,origin,creator_id ,dept_id,del_flag,priority,template_id,repetitions_num) 

            select tid,summary_id,uid,code,channel,batch_id,done_time,phone,sms_content,create_time,send_time,storage_time,status,estimatedTime,operate_type,origin,creator_id ,dept_id,del_flag,priority,template_id,repetitions_num 

            from msgcdb.t_sms_message 

            where tid >= @min_row_s and tid < @min_row_s + 1000 and status <> 0 and storage_time < @archive_date; 

    set @times = @times + 1;

             insert into db_archive.archive_log (save_month,times,min_row_s,max_row_s,archive_date,row_s,insert_time,delete_time,type_s) values (@save_month,@times,@min_row_s,@max_row_s,@archive_date,@row_s,sysdate(),sysdate(),'inserted');

        delete from msgcdb.t_sms_message where tid >= @min_row_s and tid < @min_row_s + 1000 and status <> 0 and storage_time < @archive_date;

            insert into db_archive.archive_log (save_month,times,min_row_s,max_row_s,archive_date,row_s,insert_time,delete_time,type_s) values (@save_month,@times,@min_row_s,@max_row_s,@archive_date,@row_s,sysdate(),sysdate(),'deleted');

            select @min_row_s,@max_row_s;

            select @min_row_s := min(tid) from msgcdb.t_sms_message;

            select @max_row_s := max(tid) from msgcdb.t_sms_message;

            select @min_row_s,@max_row_s;

                if @min_row_s = @max_row_s then 

    set @times = @row_s + 1;

                elseif @min_row_s is null then

                set @times = @row_s + 1;

                end if; 

            end;

         END WHILE;

    END$$

    DELIMITER ;

    7f917f0623b5c6740da869f8774f0003.png

    b2dcb51a9dbd46ee379e3993a67a1636.png

    465f262fb42be27147afb4513c22afdc.png

    配置表

    09b60161e3dcdf8b249e4126f80ad1ad.png

    归档日志表

    9763cdfaf57435a30659f70ed027cf8d.png

    为什么要这么设计,其实寻根溯源有两点

    1 简单有效,够用原则

    2 设计配置表的主要原因是对于非IT 人员,例如project manager 或者其他的人员,也可以调整归档的时间,例如 archive_save_date 的数字就是保留多少月的数据,max_row_clean,就是当前的数字 *1000 就是每天最大的归档数据量。通过这两个参数双重限制每天的归档的数据量,避免归档的时间太长,影响了备份,或其他操作。而日志表本身就是一个查看归档成功失败的东西,其中的type_s  就是表现数据归档操作状态的东西,通过日志表可以反映归档多少数据,每次操作消耗的时间,以及当前操作获取的系统变量是什么,方便出现故障时,查看到底归档的数据少不少,或者大致可能出现问题。

    下面是这两个表的结构

    a3ec70681e5f47e8403b95bed423eea7.png

    这样归档有没有缺点,当然有,缺点马上就可以说出几个

    1 为什么还要在本地机归档数据,不应该是传送到其他机器上吗

    2 为什么不设置每次归档的数量限制(每次限制操作的行数),这对MYSQL不是很用吗,为什么要写死。

    3  为什么要用MYSQL 存储过程来做,使用python不是更灵活

    其实一言难尽,都和需求有关,所以很多设计出来的东西,外人一看一堆毛病,如果你进入到他的内部,一段时间估计你就懂得为什么会设计出这样或那样的东西。

    最近有一句话挺时髦,资本根本不care你技术不技术,除非你做到行业NO.1,才有可能翻个身。

    76bc9d7131f859112b30547d02599123.png

    群里有一些免费书,可自取

    20a5fdc93670d444ec010936a3688d9f.png

    e8fcfa9d3c8813e83c358c294f6c96f1.png

    展开全文
  • 我见到过的,听到过的数据库归档的方法有以下几种1 数据通过人工的手段来进行清理,直接将表换名字,然后在重建一个新的表,承接数据。首先这样的做法一个字,快,这是这样做法的好处所在,但另一方面要考虑的问题...
  • 首先查看数据库归档模式和磁盘使用情况,确定归档文件放到什么位置:[oracle@gisdbserver ~]$ sqlplus / as sysdbaSQL> archive log listDatabase log mode No Archive ModeAutomatic arch...
  • 1.数据库在非归档模式下的备份SQL> archive log list;数据库日志模式 非存档模式自动存档 禁用存档终点 USE_DB_RECOVERY_FILE_DEST最早的联机日志序列 3244当前日志序列 3246RMAN> run2> {3> allocate ...
  • 数据库开启归档; 2.创建数据文件之后的所有归档日志都在线; 3.数据文件或者表空间没有进行过备份,数据库也没有全库备场景:1.数据库开启归档;2.创建数据文件之后的所有归档日志都在线;3.数据文件或者表空间没有...
  • 文章的前面回把开启归档模式及设置归档日志格式等内容放到前面,便于查阅及理清思路。后面会对每一部都进行详细的描述 SQLgt; a文章的前面回把开启归档模式及设置归档日志格式等内容放到前面,便于查阅及理清思路。...
  • Mysql数据库大表归档操作

    千次阅读 2015-11-04 17:41:05
    mysql数据库归档
  • Mysql数据库大表归档操作某个时间点对数据表做了一个归档。以下的操作是在当前的数据库新建表用于存储历史数据,然后再对生产表做一个清理操作。如果有条件的话可以把归档的数据放在一台新的数据库服务器上。(具体的...
  • {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行...
  • 简介当你的 MySQL 数据库上业务跑了一段时间之后,就会有一些冷数据了,有些冷数据业务根本不会去查询,那么这些冷数据就需要从交易库归档到历史库。这样做主要有两方面原因:节约成本,因为交易库的服务器硬件会比...
  • 解决 CentOS网卡eth0启用不了问题转自:http://www.centoscn.com/CentosBug/osbug/2014/0423/2850.html [root@localhost Desktop]# service net ...C&num;获取运行程序的进程IDC#获取运行程序的进程ID [DllImport...
  • 数据库开启归档模式之后,虽然可以保障数据的完整性,然而一定程度上会消耗系统性能,另一个比较关键的地方就是,增加了维护的成本,因此需要做好管理工作,实际生产环境中有很多由于开启了日志归档,没有做好管理...
  • 在Oracle数据库的开发环境和测试环境中,数据库的日志模式和自动归档模式一般都是不设置的,这样有利于系统应用的调整,也免在Oracle数据库的开发环境和测试环境中,数据库的日志模式和自动归档模式一般都是不设置的...
  • 本文介绍如何启动或关闭数据库归档模式 Oracle 数据库可以运行在2种模式下:归档模式( archivelog )和非归档模式( noarchivelog ) 归档与非归档的区别请参考ORACLE相关文档。 数据库循环使用LOG文件,若数据库处于非...
  • 实例运行状态下 ,自动归档方式和手动归档方式的相互转变。 1.可以用命令archive log list 来查看归档的方式, SQL archive log list Database log mode Archive Mode Automatic archival Enable欢迎进入Oracle社区...
  • 原标题:MySQL数据库数据归档回收工具使用场景分享-爱可生 更方便的数据归档 pt-archiver某些存在时效性的数据,在达到一定条件后,需要进行归档和回收处理。pt-archiver 工具可以帮助我们快速的进行数据行的归档和...
  • 更方便的数据归档 pt-archiver某些存在时效性的数据,在达到一定条件后...# 归档到其他数据库,并删除原表中对应的行pt-archiver --source h=172.20.134.1,P=5722,u=repl,p=repl,D=sbtest,t=sbtest1,A=utf8 --where ...
  • 一 设置为归档方式1 sql> archive log list; #查看是不是归档方式2 sql> alter system set log_archive_start=true scope=spfile; #启用主动归档sql> alter system set log_archive_dest=''location=/...
  • Postgresql数据库根据归档日志还原时间点 一、Postgresql数据库根据归档日志还原 www.2cto.com 1、备份运行的data目录 # mv data data_bak 2、解压前天备份的全备到data目录下面 # tar -zxvf fullbackup20121031.tar...
  • 更方便的数据归档 pt-archiver某些存在时效性的数据,在达到一定条件后...# 归档到其他数据库,并删除原表中对应的行pt-archiver --source h=172.20.134.1,P=5722,u=repl,p=repl,D=sbtest,t=sbtest1,A=utf8 --where ...
  • MySQL 8.0.17发布了,看了下release note,发现果真如之前预期的那样,恢复了redo log归档(redo log archiving)功能。之所以说是“恢复”,那是因为在InnoDB非常古老的版本(MySQL 4.0.6之前的版本)才存在,之后就...
  • 温馨提示:请确保系统没任何通话任务时,执行以下修改操作。由于大量通话造成...1、服务器上停止asterCC的mysql服务进入asterCC服务器的CentOS系统,如下执行查看当前数据库正处于运行状态:service mysqld sta...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 689
精华内容 275
关键字:

mysql数据库归档

mysql 订阅