一种基于大表数据分割的数据比对方法及设备与流程

文档序号:29793262发布日期:2022-04-23 18:11阅读:137来源:国知局
一种基于大表数据分割的数据比对方法及设备与流程

1.本发明涉及数据库数据处理技术领域,特别是涉及一种基于大表数据分割的数据比对方法及设备。


背景技术:

2.随着信息化建设的高速发展,业务越来越复杂,各个业务之间的耦合性也越来越强,常常出现不同的业务需要访问同一份数据,在这种情况下,被各个业务访问的数据常常成了热点数据,数据访问的竞争会导致业务性能的下降。为了解决这个问题,通常的处理方法是将这份数据做多个副本,每个业务访问不同的数据副本。而这种情况下,各个副本的数据一致性显得尤为重要。
3.数据比对通常以表为单位,比对方法包含以下三个步骤:
4.1.分别从需要比对的副本中,读取比对表的数据。
5.2.将读取到的数据,以数据行为单位进行md5加密计算。
6.3.对两边数据的md5进行比较,查找不一致的md5值。
7.在步骤1中,通常使用单线程读取比对表的数据,在数据量不大的情况下,读取比对表数据耗时短,但是当单表数据量巨大时,存在以下问题:
8.1、单表数据读取的时间过长,影响数据比对的效率。
9.2、在多版本的数据库系统中,查询结果集部分数据需要从undo(撤销)空间中获取,数据读取时间过长时,undo空间中的部分数据会被数据库系统覆盖,导致读取失败。同时,步骤3需要在所有数据获取完成后才能进行,影响了数据比对效率。
10.鉴于此,如何克服现有技术所存在的缺陷,解决上述技术问题,是本技术领域待解决的难题。


技术实现要素:

11.针对现有技术的以上缺陷或改进需求,本发明提供一种基于大表数据分割的数据比对方法及设备,针对数据量大的表,将数据分割为多个小的数据集,数据获取时,通过申请叶子节点数与分割数相同的完全二叉树,来同时获取不同的数据集,加快数据获取速度;同时,采用二叉树叶子节点的方式进行比对,每个叶子节点相当于一个线程,来比对其中的一组数据集,不一致的数据则进入下一轮比对,可以极大的节省比对时间,提升比对效率。
12.本发明实施例采用如下技术方案:
13.第一方面,本发明提供了一种基于大表数据分割的数据比对方法,包括:
14.将待比对的两个表数据都分割成相同的若干份;
15.申请叶子节点数与分割份数相同的完全二叉树,且每个叶子节点记录一对待比对的数据;
16.对每个叶子节点的数据进行比对以得到不一致数据,对不一致数据进行两两比对,直到只剩最后一份不一致数据。
17.进一步的,所述将待比对的两个表数据都分割成相同的若干份具体包括:
18.从配置中获取数据分割的结果集个数m;
19.从数据库副本中查询待比对表的表号、数据存储所占用的数据页的文件号以及数据页号,按照文件号以及数据页号的顺序,将数据页分割成m份。
20.进一步的,将数据页分割成m份的具体流程包括:
21.获取表的数据页数n;
22.确定每份分割数据的数据页数为t=n/m;
23.数据分割步骤:每分割一份数据,令n=n-t,m=m-1;
24.判断是否m=0,若是则结束分割流程,若否则回到所述数据分割步骤。
25.进一步的,在将数据页分割成m份后,根据每份数据中的起始页,计算每份数据的起始rowid,并根据本份数据的起始rowid以及下一份数据的起始rowid生成本份数据的查询语句,以通过该查询语句获取本份数据的结果集。
26.进一步的,所述申请叶子节点数与分割份数相同的完全二叉树,且每个叶子节点记录一对待比对的数据具体包括:
27.将待比对的两个表数据都分割成m份后,申请叶子节点数为m的完全二叉树,并在第i个叶子节点记录第i对需要比对的数据子集;其中,i为大于等于1且小于等于m的整数。
28.进一步的,所述对每个叶子节点的数据进行比对以得到不一致数据,对不一致数据进行两两比对,直到只剩最后一份不一致数据具体包括:
29.将初始的每个叶子节点的数据进行比对以得到第一个表数据副本的不一致数据以及第二个表数据副本的不一致数据,并将每个节点比对出的两个不一致数据作为一组差异数据;
30.将每两组差异数据输入到一个新的叶子节点进行比对,以得到一组新的差异数据,重复该步骤,直到最后一个叶子节点比对完成,只剩下最后一组差异数据也即最后一份不一致数据;
31.输出该最后一份不一致数据以生成比对差异报告。
32.进一步的,所述叶子节点的结构包括result1-》db1_left、result1-》db2_left、result2-》db1_left及result2-》db2_left,其中,result1表示二叉树左节点的数据,result2表示二叉树右节点的数据,db1_left表示比对后第一个表数据副本中不一致的数据,db2_left表示比对后第二个表数据副本中不一致的数据。
33.进一步的,在初始状态下,第i个叶子节点的result1-》db1_left记录从第一个待比对表数据副本中读取的第i个数据子集,第i个叶子节点的result1-》db2_left为空,第i个叶子节点的result2-》db1_left为空,第i个叶子节点的result2-》db2_left记录从第二个待比对表数据副本中读取的第i个数据子集。
34.进一步的,每个叶子节点进行比对时,由result1-》db1_left与result2-》db2_left进行比对,result1-》db2_left与result2-》db1_left进行比对,比对出的两个db1_left合并形成新的db1_left,比对出的两个db2_left合并形成新的db2_left,合并后的db1_left、db2_left作为一组新的差异数据输入新的叶子节点进行下一轮比对。
35.另一方面,本发明提供了一种基于大表数据分割的数据比对设备,具体为:包括至少一个处理器和存储器,至少一个处理器和存储器之间通过数据总线连接,存储器存储能
被至少一个处理器执行的指令,指令在被处理器执行后,用于完成第一方面中的基于大表数据分割的数据比对方法。
36.与现有技术相比,本发明的有益效果在于:针对数据量大的表,将数据分割为多个小的数据集,数据获取时,通过申请叶子节点数与分割数相同的完全二叉树,来同时获取不同的数据集,加快数据获取速度;同时,采用二叉树叶子节点的方式进行比对,每个叶子节点相当于一个线程,来比对其中的一组数据集,不一致的数据则进入下一轮比对,可以极大的节省比对时间,提升比对效率。
附图说明
37.为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
38.图1为本发明实施例1提供的一种基于大表数据分割的数据比对方法流程图;
39.图2为本发明实施例1提供的步骤100具体流程图;
40.图3为本发明实施例1提供的将数据页分割成m份的具体流程图;
41.图4为本发明实施例1提供的确定rowid范围的示例图;
42.图5为本发明实施例1提供的步骤300具体流程图;
43.图6为本发明实施例1提供的二叉树叶子节点的具体内存结构示意图;
44.图7为本发明实施例1提供的叶子节点获取数据示意图;
45.图8为本发明实施例1提供的具体的叶子节点比对示意图;
46.图9为本发明实施例1提供的每一个叶子节点的具体比对过程示意图;
47.图10为本发明实施例2提供的db1与db2具体比对过程示意图;
48.图11为本发明实施例3提供的一种基于大表数据分割的数据比对设备结构示意图。
具体实施方式
49.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
50.本发明是一种特定功能系统的体系结构,因此在具体实施例中主要说明各结构模组的功能逻辑关系,并不对具体软件和硬件实施方式做限定。
51.此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
52.实施例1:
53.为了陈述方便,本发明实施例将源端日志中的事务称为“单事务”,多个单事务合并以后形成的事务称为“多事务”。
54.如图1所示,本发明实施例提供一种基于大表数据分割的数据比对方法,具体步骤如下。
55.步骤100:将待比对的两个表数据都分割成相同的若干份。该步骤针对数据量大的表,将数据分割为多个小的数据集。本实施例中,在确定分割的小数据集个数后,待进行比对的两个表数据所属的两个副本在对表数据进行分割后的数据集个数相同。
56.步骤200:申请叶子节点数与分割份数相同的完全二叉树,且每个叶子节点记录一对待比对的数据。该步骤在数据获取时,通过申请叶子节点数与分割数相同的完全二叉树,来同时获取不同的数据集,可以加快数据获取速度。
57.步骤300:对每个叶子节点的数据进行比对以得到不一致数据,对不一致数据进行两两比对,直到只剩最后一份不一致数据。该步骤采用二叉树叶子节点的方式进行比对,每个叶子节点相当于一个线程,来比对其中的一组数据集,不一致的数据则进入下一轮比对,可以极大的节省比对时间,提升比对效率。
58.通过上述步骤,本优选实施例将原本的大表数据分割成一个个小数据集,然后通过二叉树的叶子节点来同时获取一个个对应的小数据集,并通过叶子节点来对这些小数据集进行比对,这样的比对方式相较于背景技术中的传统比对方式,可以极大的节省比对时间,提升比对效率。
59.具体的,如图2所示,在本优选实施例中,对于上述步骤100(将待比对的两个表数据都分割成相同的若干份),本优选实施例可以将其扩充为以下步骤:
60.步骤101:从配置中获取数据分割的结果集个数m。该步骤从配置中获取的结果集个数m,也即是事先设计的准备分割出的小数据集个数。
61.步骤102:从数据库副本中查询待比对表的表号、数据存储所占用的数据页的文件号以及数据页号,按照文件号以及数据页号的顺序,将数据页分割成m份。该步骤可以对两个数据库副本的表数据同时进行操作以节约时间。例如待比对的两个表数据分别为副本db1的表数据以及副本db2的表数据,那么可以分别同时对副本db1以及副本db2的表数据进行处理,查询其待比对表的表号tabid、数据存储所占用的数据页的文件号fno及数据页号block_id,按照fno,block_id的顺序,将数据页分割成m份。
62.对于上述将数据页分割成m份的具体过程,如图3所示,其具体流程如下。在获取分割数m后,再获取表的数据页数n;确定每份分割数据的数据页数为t=n/m(也即第i个分割数据页个数为t=n/m,i属于1到m间的整数);然后进入数据分割步骤:每分割一份数据,令n=n-t,m=m-1;判断是否m=0,若是则说明已将数据页分割完成,结束分割流程,若否则回到所述数据分割步骤,继续分割一份数据,并令n=n-t,m=m-1后重新判断是否m=0,一直循环到m=0后结束分割流程。
63.基于上述过程,本优选实施例还在将数据页分割成m份后,根据每份数据中的起始页,计算每份数据的起始rowid,并根据本份数据的起始rowid以及下一份数据的起始rowid生成本份数据的查询语句,以通过该查询语句获取本份数据的结果集。该过程中根据tabid,fno,block_id计算rowid的函数称为frid。
64.如图4所示,为本优选实施例中计算起始rowid以及确定rowid范围的示例图。该例子中分割数m=3,也即将表t1分割成了三个小数据集,然后通过frid函数分别计算出每个小数据集的起始rowid。例如图中第一个小数据集的起始rowid为:aaavo7aaeaaaaitaaa,第二个小数据集的起始rowid为:aaavo7aaeaaaaivaaa,第三个小数据集的起始rowid为:aaavo7aaeaaaaixaaa,那么就可以得到第一个小数据集的rowid区间范围为:
[aaavo7aaeaaaaitaaa,aaavo7aaeaaaaivaaa),第二个小数据集的rowid区间范围为:[aaavo7aaeaaaaivaaa,aaavo7aaeaaaaixaaa),第三个小数据集的rowid区间范围为:[aaavo7aaeaaaaixaaa,+∞)。需注意的是,最后一个小数据集因为没有下一个数据集的起始rowid,所以以+∞进行代替。在得到每个小数据集的rowid区间后,就可以根据rowid区间范围生成本份数据的查询语句,以通过该查询语句获取本份数据的结果集,获取的结果集也即是该小数据集的数据。
[0065]
在本优选实施例中,对于上述步骤200(申请叶子节点数与分割份数相同的完全二叉树,且每个叶子节点记录一对待比对的数据),本优选实施例可将其体现为:将待比对的两个表数据都分割成m份后,申请叶子节点数为m的完全二叉树,并在第i个叶子节点记录第i对需要比对的数据子集;其中,i为大于等于1且小于等于m的整数。本实施例中,若mpart[i]的数据获取完成时,mpart[i]加一,当mpart[i]=2时,表示副本db1及副本db2第i个子数据集均获取完成,可以进行比对。
[0066]
如图5所示,在本优选实施例中,步骤300(对每个叶子节点的数据进行比对以得到不一致数据,对不一致数据进行两两比对,直到只剩最后一份不一致数据)具体可扩展为如下步骤:
[0067]
步骤301:将初始的每个叶子节点的数据进行比对以得到第一个表数据副本的不一致数据以及第二个表数据副本的不一致数据,并将每个节点比对出的两个不一致数据作为一组差异数据。
[0068]
步骤302:将每两组差异数据输入到一个新的叶子节点进行比对,以得到一组新的差异数据,重复该步骤,直到最后一个叶子节点比对完成,只剩下最后一组差异数据也即最后一份不一致数据。该步骤中最后一个节点的比对结果,即为整个比对任务的比对结果。
[0069]
步骤303:输出该最后一份不一致数据以生成比对差异报告。
[0070]
如图6所示,为本优选实施例中二叉树叶子节点的具体内存结构示意图,其中,叶子节点的结构包括result1-》db1_left、result1-》db2_left、result2-》db1_left及result2-》db2_left,其中,db1_left表示比对后第一个表数据副本中不一致的数据,db2_left表示比对后第二个表数据副本中不一致的数据,result1表示二叉树左节点的数据,result2表示二叉树右节点的数据,flag表示数据填充情况,flag=2表示result1和result2数据已经填充。
[0071]
在初始状态下,第i个叶子节点的result1-》db1_left记录从第一个待比对表数据副本中读取的第i个数据子集,第i个叶子节点的result1-》db2_left为空,第i个叶子节点的result2-》db1_left为空,第i个叶子节点的result2-》db2_left记录从第二个待比对表数据副本中读取的第i个数据子集。
[0072]
如图7所示为叶子节点获取数据示意图,图中叶子节点结构包括result1-》db1_left、result1-》db2_left、result2-》db1_left及result2-》db2_left,在获取数据时,叶子节点的左右节点均通过rowid范围的查询语句来分别从副本db1以及副本db2中获取数据集,获取成功后,因为此时叶子节点为初始状态,所以result1-》db1_left记录的是从副本db1中获取的数据,而result1-》db2_left则为空,同理,result2-》db2_left记录的是从副本db2中获取的数据,而result2-》db1_left则为空。
[0073]
下面以一个具体的叶子节点比对的例子来对步骤300(步骤301-步骤303)进行进
一步的说明。如图8所示,假设分割成的数据集个数m=5,那么初始的叶子节点数也为5,图8中node1、node2、node3、node4、node5分别表示初始的5个叶子节点,每个初始叶子节点的结构均为result1-》db1_left、null、null、result2-》db2_left。第一轮的比对为初始5个叶子节点的比对,每个叶子节点的result1-》db1_left与result2-》db2_left比对后形成一组不一致数据,也即副本db1的不一致数据以及副本db2的不一致数据,然后将第一个叶子节点比对出来的一组不一致数据记录到新的叶子节点(node6)中的左节点以作为node6中的result1-》db1_left、result1-》db2_left,将第二个叶子节点比对出来的一组不一致数据记录到新的叶子节点(node6)中的右节点以作为node6中的result2-》db1_left、result2-》db2_left。同理,第3、4个叶子节点比对后的不一致数据记录到新的叶子节点(node7)中以进行第二轮比对。需说明的是,当同一轮的叶子节点数为单数的原因,那么比对后会有一组比对出的不一致数据在下一轮轮空,当遇到轮空的数据时,将其再往下延迟一轮进行比对即可,如本例子中第5个叶子节点,因为第1-4个节点刚好两两一组,所以第五个节点的不一致数据轮空,而第1-4个节点比对后形成的新的节点node6以及node7也刚好两个一组,所以第5个叶子节点再次轮空一轮,当node6以及node7比对后形成的node8进行比对时,此时只能再产生一组不一致数据,便可以将第5个叶子节点(node5)的不一致数据与node8的不一致数据记录到一个新的叶子节点(node9)来进行比对,最后这个node9比对出的不一致数据也即为最后比对出的差异数据,将此差异数据生成比对差异报告即可完成数据的比对。
[0074]
在上述比对过程中,对于每一个叶子节点的具体比对过程如图9所示:从图9可以看出,节点中每个result中的db1_left和db2_left为上一个节点比对的结果,所以每个叶子节点进行比对时,result1-》db1_left只需与result2-》db2_left进行比对,result2-》db1_left只需与result1-》db2_left进行比对。在初始叶子节点中,result2-》db1_left与result1-》db2_left均为空,比对结果一致。而在其他轮的叶子节点比对中,result1-》db1_left与result2-》db2_left会比对出一组db1中多余的数据以及db2中多余的数据,result2-》db1_left与result1-》db2_left也会比对出一组db1中多余的数据以及db2中多余的数据,此时需要将比对出的两个db1_left(db1中多余的数据)合并形成新的db1_left,比对出的两个db2_left(db2中多余的数据)合并形成新的db2_left,合并后的db1_left、db2_left作为一组新的差异数据输入新的叶子节点的左节点或右节点来进行下一轮比对。
[0075]
综上所述,本实施例针对数据量大的表,将数据分割为多个小的数据集,数据获取时,通过申请叶子节点数与分割数相同的完全二叉树,来同时获取不同的数据集,加快数据获取速度;同时,采用二叉树叶子节点的方式进行比对,每个叶子节点相当于一个线程,来比对其中的一组数据集,不一致的数据则进入下一轮比对,可以极大的节省比对时间,提升比对效率。
[0076]
实施例2:
[0077]
基于实施例1提供的基于大表数据分割的数据比对方法,本实施例2通过一个具体的实施场景来对本发明进行更详细的说明。
[0078]
本实施例中副本db1的表t1(tabid=88635)包含5个数据页(531-535),所以数据页均在文件号fno=4的文件中,数据具体分布如下:
[0079]
页号数据范围5311~100
532101~200533201~300534301~400535401~500
[0080]
副本db2的表t1(tabid=88699)包含6个数据页(575-580),所以数据页均在文件号fno=4的文件中,数据具体分布如下:
[0081]
页号数据范围5750~99576100~199577200~300578301~400579401~500580501-600
[0082]
假设m=3,则db1中,每个分割的数据页数为[1,2,2],分割后结果如下:
[0083]
数据分割页号数据范围part15311~100part2532~533101~300part3534~535301~500
[0084]
在db2中,每个分割的数据页数为[2,2,2],分割后结果如下:
[0085]
数据分割页号数据范围part1575-5760~199part2577-578200~400part3579-580401~600
[0086]
具体比对过程如图10所示,首先,建立3个初始叶子节点node1、node2、node3,其中node1中的result1-》db1_left、result1-》db2_left、result2-》db1_left及result2-》db2_left依次记录数据为1~100、null、null、0~199;node2中的result1-》db1_left、result1-》db2_left、result2-》db1_left及result2-》db2_left依次记录数据为101~300、null、null、200~400;node3中的result1-》db1_left、result1-》db2_left、result2-》db1_left及result2-》db2_left依次记录数据为301~500、null、null、401~600。
[0087]
对node1、node2、node3中的数据进行比对,其中,node1比对出的不一致数据的结果可依次列为null(db1不一致数据)、null(db2不一致数据)、null(db1不一致数据)、0,101~199(db2不一致数据),将db1不一致数据合并、db2不一致数据合并,最后node1比对出的不一致数据即为null(db1不一致数据)、0,101~199(db2不一致数据)。
[0088]
对于node2,其比对出的不一致数据的结果可依次列为101~199(db1不一致数据)、null(db2不一致数据)、null(db1不一致数据)、301~400(db2不一致数据),将db1不一致数据合并、db2不一致数据合并,最后node2比对出的不一致数据即为101~199(db1不一致数据)、301~400(db2不一致数据)。
[0089]
对于node3,其比对出的不一致数据的结果可依次列为301~400(db1不一致数
据)、null(db2不一致数据)、null(db1不一致数据)、501~600(db2不一致数据),将db1不一致数据合并、db2不一致数据合并,最后node3比对出的不一致数据即为301~400(db1不一致数据)、501~600(db2不一致数据)。
[0090]
第一轮比对完成后,开始第二轮比对,将node1以及node2比对出的不一致数据记录到一个新的叶子节点(node4),此时,node3比对出的不一致数据轮空,暂时不记录到新的叶子节点。对于第二轮比对的node4,其result1-》db1_left、result1-》db2_left、result2-》db1_left及result2-》db2_left依次记录数据为null、0,101~199、101~199、301~400。对其进行比对,得到比对出的不一致数据的结果可依次列为null(db1不一致数据)、0(db2不一致数据)、null(db1不一致数据)、301~400(db2不一致数据),将db1不一致数据合并、db2不一致数据合并,最后node4比对出的不一致数据即为null(db1不一致数据)、0,301~400(db2不一致数据)。
[0091]
第二轮比对完成后,开始第三轮比对,此时node4比对出的不一致数据与上一轮轮空的node3比对出的不一致数据可凑为一对,将两者的数据记录到新的叶子节点(node5),记录后node5的result1-》db1_left、result1-》db2_left、result2-》db1_left及result2-》db2_left依次记录数据为null、0,301~400、301~400、501~600。对node5进行比对,得到比对出的不一致数据的结果可依次列为null(db1不一致数据)、0(db2不一致数据)、null(db1不一致数据)、501~600(db2不一致数据),将db1不一致数据合并、db2不一致数据合并,最后node5比对出的不一致数据即为null(db1不一致数据)、0,501~600(db2不一致数据)。将该不一致数据输出为比对报告,完成所有比对。
[0092]
终上所述,本实施例将数据分割为多个小的数据集,数据获取时,通过申请叶子节点数与分割数相同的完全二叉树,来同时获取不同的数据集,加快数据获取速度;同时,采用二叉树叶子节点的方式进行比对,每个叶子节点相当于一个线程,来比对其中的一组数据集,不一致的数据则进入下一轮比对,可以极大的节省比对时间,提升比对效率。
[0093]
实施例3:
[0094]
在上述实施例1至实施例2提供的基于大表数据分割的数据比对方法的基础上,本发明还提供了一种可用于实现上述方法的基于大表数据分割的数据比对设备,如图11所示,是本发明实施例的设备架构示意图。本实施例的基于大表数据分割的数据比对设备包括一个或多个处理器21以及存储器22。其中,图11中以一个处理器21为例。
[0095]
处理器21和存储器22可以通过总线或者其他方式连接,图11中以通过总线连接为例。
[0096]
存储器22作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1至实施例2中的基于大表数据分割的数据比对方法、系统。处理器21通过运行存储在存储器22中的非易失性软件程序、指令以及模块,从而执行基于大表数据分割的数据比对设备的各种功能应用以及数据处理,即实现实施例1至实施例2的基于大表数据分割的数据比对方法。
[0097]
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0098]
程序指令/模块存储在存储器22中,当被一个或者多个处理器21执行时,执行上述实施例1至实施例2中的基于大表数据分割的数据比对方法,例如,执行以上描述的图1所示的各个步骤。
[0099]
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(readonlymemory,简写为:rom)、随机存取存储器(randomaccessmemory,简写为:ram)、磁盘或光盘等。
[0100]
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1