作者:稀饭
1、什么是数据转储
对于任何一个IT产品线,其一般都会有后台的数据存储,IT产品线上面产生的大量数据基于各类型的数据库完成落表和储存。数据转储是当数据库或数据表中数据量过大时,判断出可进行转移且不影响实际生产作业的数据,将这部分数据转储到备份数据库或数据表中。数据转储能有效降低数据库或数据单表的数据量,在执行一些生产作业(如查询)时,可以优化查询逻辑,加快查询速度。
2、单表数据转储
考虑比较常见的一类数据转储场景:单表转储。这种场景一般是发生在数据量较大的单表上,由于数据量过多,导致后台或前台的生产作业难度或延迟较高,例如前台提供一个选择器对涉及到的商品进行选择,而后台触发的SQL需要查询全量表,当批量查询或者是一些特殊情况下的查询将降低后台执行的性能,导致查询速度过慢,在数据量大的情况下将会显著放大查询的问题。
3、静态单表数据转储的基本过程
现在假设需要转储的单表为n行m列的二维表,表是静态表,或转储操作的时间范围内是静态表,即:

转储的目标是把数据量压到k行以内,即转储后该单表的行数≤k。
(1)备份转储表需新创建的场景(首次转储)
Step 1 创建一张备份表,字段数量与格式和需进行转储的静态表一致,表空间足量;
Step 2 将需转储的静态表中的数据,根据查询条件,查询出所有需转移的数据;
Step 3 将所有需转移的数据写入到转储表中;
Step 4 将被转移的数据从被转储的静态表中删除。
(2)备份转储表已有数据的场景(第n次转储)
Step 1 判断现有的备份转储表和当前需转储的静态表各字段是否一致;
Step 2 在不一致时需对字段进行调整(如增加字段、长度扩容等)使其先保持一致,当字段一致后,将需转储的静态表中的数据,根据查询条件,查询出所有需转移的数据;
Step 3 判断这些需转移的数据中的主键是否和备份转储表中有重叠,对于有重叠的部分,根据实际的业务逻辑采取覆写或不插入的处理,把所有需转移的数据写入到转储表中;
Step 4 将所有实际被转移的数据从被转储的静态表中删除。
从上面两个静态数据表转储的场景中可以看到,对于首次转储的场景处理起来比较简单,只要考虑建表、插入和删除三个动作。而对于二次转储或第n次转储的场景,则需要考虑的更多一些,比如是否字段保持一致,是否主键重复等。
4、动态单表数据的转储过程
现在假设需要转储的单表为n行m列的二维表,表是动态表,或转储操作的时间范围内数据至少存在≥1列进行动态更新的,即:

转储的目标是把数据量压到k行以内,即转储后该单表的行数≤k。
(1)需转储的数据为静态
当表虽然是动态更新的,但需要转移的这部分数据是静态的(或在转储期间内静态),则一般不受表更新的影响,但需要考虑转移过程中是否会发生锁表。如果发生锁表,会导致数据表无法被操作,影响数据新增和更新。
Step 1 判断现有的备份转储表和当前需转储的静态表各字段是否一致,不一致时需先处理;
Step 2 根据查询条件,查询出所有需要转移的静态数据,并基于这部分数据的主键,和备份转储表中已有数据的主键进行判断,根据业务逻辑确定实际要转储的数据部分;
Step 3 将这部分需要转储的数据写入到转储表中;
Step 4 在不产生锁表(如使用循环删除的方式)的条件下,将这部分数据进行删除。
(2)需转储的数据包含动态数据
当需要转移的数据中包含动态数据且符合实际业务场景时,则需要处理的重要一点就是:假如转储过程中数据发生更新,怎么判断。一种方式是通过停机将数据更新锁死,或只记录转储时间戳结点时该部分动态数据的状态,这种是基于业务逻辑进行状态锁定。但实际中必然是希望转储时取的数据状态是最后一刻的时间的状态。这种情况可以考虑在数据往转储表插入的过程中,增加一个中间表用来记录这部分被转移的数据的更新日志,并在转移结束的时刻锁定状态,然后对转储表数据和中间日志表数据进行匹配,取日志表中该数据最后一次更新时的结果作为转储表中这部分数据的最后结果。
5、非单表的转储
单表转储在实际生产中是比较理想化的,实际产品线中表与表之间是有很多关联的,转储任何一张表,都需要把对应关联的表进行处理或对等转储,不然会影响实际生产环境,这种需要结合产品线的实际场景进行逻辑设计,比较复杂和一事一议,但逻辑均可在某个环节以单表静态和单表动态进行处理,在这里不进行详述。
广告区↓





