结论:
统计前10台的消耗空间的数据库对象,为了清晰起见,我基于不同的段对象进行分别抽取
--抽取TOP10的TABLE
select owner,segment_name,gb from (select owner,segment_name,bytes/1024/1024/1024 as gb,rownum rn from dba_segments where segment_type='TABLE' order by 3 desc) where rn<=10;
----提取top10的table partition
select owner,segment_name,gb
from (select owner,segment_name,gb,rownum rn
from (select owner,segment_name,sum(bytes/1024/1024/1024) as gb
from dba_segments
where segment_type='TABLE PARTITION'
group by owner,segment_name
order by 3 desc))
where rn<=10;
--获取top 10的table subpartition
select owner,segment_name,gb
from (select owner,segment_name,gb,rownum rn
from (select owner,segment_name,sum(bytes/1024/1024/1024) as gb
from dba_segments
where segment_type='TABLE SUBPARTITION'
group by owner,segment_name
order by 3 desc))
where rn<=10;
--获取TOP10的INDEX
select owner,segment_name,gb from (select owner,segment_name,bytes/1024/1024/1024 as gb,rownum rn from dba_segments where segment_type='INDEX' order by 3 desc) where rn<=10;
--获取TOP10的INDEX PARTITION
select owner,segment_name,gb
from (select owner,segment_name,gb,rownum rn
from (select owner,segment_name,sum(bytes/1024/1024/1024) as gb
from dba_segments
where segment_type='INDEX PARTITION'
group by owner,segment_name
order by 3 desc))
where rn<=10;
--获取TOP10的INDEX SUBPARTITION
select owner,segment_name,gb
from (select owner,segment_name,gb,rownum rn
from (select owner,segment_name,sum(bytes/1024/1024/1024) as gb
from dba_segments
where segment_type='INDEX SUBPARTITION'
group by owner,segment_name
order by 3 desc))
where rn<=10;
--获取TOP10的LOBSEGMENT
select owner,segment_name,gb from (select owner,segment_name,bytes/1024/1024/1024 as gb,rownum rn from dba_segments where segment_type='LOBSEGMENT' order by 3 desc) where rn<=10;
--获取TOP10的LOB PARTITION
select owner,segment_name,gb
from (select owner,segment_name,gb,rownum rn
from (select owner,segment_name,sum(bytes/1024/1024/1024) as gb
from dba_segments
where segment_type='LOB PARTITION'
group by owner,segment_name
order by 3 desc))
where rn<=10;
--获取TOP10的CLUSTER
select owner,segment_name,gb from (select owner,segment_name,bytes/1024/1024/1024 as gb,rownum rn from dba_segments where segment_type='CLUSTER' order by 3 desc) where rn<=10;
引子
今天在巡检数据库服务器的文件系统时,发现承载数据文件的文件系统剩余率极小,于是客户让我在数据库中排查下哪些数据库对象最消耗空间,然后考虑可否
优化与调整,减少不必要的空间占用与资源浪费。
测试
1,数据库段对象共计12种,我们主要研究如下类型:
index,index parittion,
lob partition,lob segment,logindex,
cluster,
table,table SUBPARTITION,table PARTITION,
nested table,
type2 undo,
SQL> select distinct segment_type from dba_segments;
SEGMENT_TYPE
------------------
ROLLBACK
INDEX
TABLE SUBPARTITION
LOBINDEX
TABLE PARTITION
NESTED TABLE
TYPE2 UNDO
TABLE
LOBSEGMENT
CLUSTER
INDEX PARTITION
SEGMENT_TYPE
------------------
LOB PARTITION
12 rows selected.
2,我们先测试table,table partition,table SUBPARTITION
---table segment
SQL> create table t_non_partition(a int,b int);
Table created.
SQL> insert into t_non_partition values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> set linesize 300
SQL> select segment_name,segment_type from user_segments where lower(segment_name)='t_non_partition';
SEGMENT_NAME SEGMENT_TYPE
--------------------------------------------------------------------------------- ------------------
T_NON_PARTITION TABLE
--table partition
SQL> create table t_partition(a int,b int) partition by range(a) (partition p1 values less than(10),partition p2 values less than(maxvalue));
Table created.
分区表即使不插入数据也会默认分配段空间,默认每个段大小为65536BYTE
SSQL> col segment_name for a20
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='t_partition';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------- ------------------ ----------
T_PARTITION TABLE PARTITION 65536
T_PARTITION TABLE PARTITION 65536
SQL> insert into t_partition values(1,1);
1 row created.
SQL> insert into t_partition values(11,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='t_partition';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------- ------------------ ----------
T_PARTITION TABLE PARTITION 65536
T_PARTITION TABLE PARTITION 65536
SQL> insert into t_partition select level,level from dual connect by level<=100000;
100000 rows created.
SQL> commit;
Commit complete.
可见table segment仅占dba_segments 1条记录,即仅分配一个segment,而table partition会根据分区表的分表个数,相应分配几个段,同时在dba_segments也占用相应个数的记录
SQL> select owner,segment_name,segment_type,bytes from dba_segments where lower(segment_name)='t_partition';
OWNER SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ -------------------- ------------------ ----------
SCOTT T_PARTITION TABLE PARTITION 65536
SCOTT T_PARTITION TABLE PARTITION 2097152
--table SUBPARTITION
2个分区,每个分区有3个子分区,共计6个子分区
SQL> create table t_subpart(a int,b int) partition by range(a) subpartition by hash(b) subpartitions 3(partition p1 values less than(10),partition p2 values less than(maxvalue));
Table created.
子分区表和分区表一样,段的个表即子分区的个数,所以子分区表和分区表同理
SQL> col segment_name for a20
SQL> set linesize 300
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='t_subpart';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------- ------------------ ----------
T_SUBPART TABLE SUBPARTITION 65536
T_SUBPART TABLE SUBPARTITION 65536
T_SUBPART TABLE SUBPARTITION 65536
T_SUBPART TABLE SUBPARTITION 65536
T_SUBPART TABLE SUBPARTITION 65536
T_SUBPART TABLE SUBPARTITION 65536
6 rows selected.
2,继续测试index,index parittion,index subpartition
--index
SQL> create table t_index(a int,b int);
Table created.
SQL> create index idx_t_index on t_index(a);
Index created.
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='idx_t_index';
no rows selected
SQL> insert into t_index values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='idx_t_index';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------- ------------------ ----------
IDX_T_INDEX INDEX 65536
--index partition
SQL> drop index IDX_T_INDEX;
Index dropped.
本地分区索引的基表必须要为分区表
SQL> create index idx_t_index_local on t_index(a) local;
create index idx_t_index_local on t_index(a) local
*
ERROR at line 1:
ORA-14016: underlying table of a LOCAL partitioned index must be partitioned
全局索引的基表可以不用分区
SQL> create index idx_t_index_local on t_index(a) global;
Index created.
但是全局索引的段类型仍是index,和普通索引段类型一样
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='idx_t_index_local';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------- ------------------ ----------
IDX_T_INDEX_LOCAL INDEX 65536
SQL> create table t_index(a int,b int) partition by range(a) (partition p1 values less than(10),partition p2 values less than(maxvalue));
Table created.
SQL> create index idx_t_index on t_index(a) local;
Index created.
可见index partition和table partition原理一样
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='idx_t_index';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------- ------------------ ----------
IDX_T_INDEX INDEX PARTITION 65536
IDX_T_INDEX INDEX PARTITION 65536
index subpartition同理,不再测试
3,lob partition,lobsegment,lobindex,
--lobsegment
SQL> col segment_name for a50
SQL> select segment_name,segment_type from dba_segments where lower(segment_type) like '%lobsegment%' and rownum=1;
SEGMENT_NAME SEGMENT_TYPE
-------------------------------------------------- ------------------
SYS_LOB0000000109C00005$$ LOBSEGMENT
SQL> show user
USER is "SCOTT"
SQL> create table t_lob(a int,b blob);
Table created.
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='t_lob';
no rows selected
SQL> col column_name for a50
SQL> col segment_name for a50
SQL> set linesize 300
SQL> select table_name,column_name,segment_name from user_lobs where lower(table_name)='t_lob';
TABLE_NAME COLUMN_NAME SEGMENT_NAME
------------------------------ -------------------------------------------------- --------------------------------------------------
T_LOB B SYS_LOB0000082940C00002$$
SQL> insert into t_lob values(1,'1');
1 row created.
SQL> commit;
Commit complete.
可见表的lob列会分配一个独立的段,且其段名和dba_lobs的段名相同,段类型为lobsegment
SQL> select segment_name,segment_type,bytes from user_segments where segment_name='SYS_LOB0000082940C00002$$';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------------------------------------- ------------------ ----------
SYS_LOB0000082940C00002$$ LOBSEGMENT 65536
--lob partition
SQL> drop table t_lob purge;
Table dropped.
SQL> create table t_lob(a int,b blob) partition by range(a) (partition p1 values less than(10),partition p2 values less than(maxvalue));
Table created.
可见lob partition和table partition一样道理
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_type)='lob partition';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------------------------------------- ------------------ ----------
SYS_LOB0000082943C00002$$ LOB PARTITION 65536
SYS_LOB0000082943C00002$$ LOB PARTITION 65536
---lobindex
SQL> drop table t_lob purge;
Table dropped.
SQL> create table t_lob(a int,b blob);
Table created.
SQL> set linesize 300
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_type) like '%lob%';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------------------------------------- ------------------ ----------
SYS_IL0000082952C00002$$ LOBINDEX 65536
SYS_LOB0000082952C00002$$ LOBSEGMENT 65536
SQL> drop table t_lob purge;
Table dropped.
可见只要表包含lob列,ORACLE会自动创建LOB INDEX及LOB SEGMENT 2个类型的段,一个用于存储LOB列数据的索引,另一个用于存储真正的LOB数据
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_type) like '%lob%';
no rows selected
SQL> create table t_lob(a int,b blob);
Table created.
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_type) like '%lob%';
no rows selected
SQL> insert into t_lob values(1,'a');
1 row created.
SQL> commit;
Commit complete.
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_type) like '%lob%';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------------------------------------- ------------------ ----------
SYS_IL0000082955C00002$$ LOBINDEX 65536
SYS_LOB0000082955C00002$$ LOBSEGMENT 65536
SQL>
4,继续研究type2 undo
SQL> select owner,segment_name,segment_type,bytes from dba_segments where lower(segment_type) like '%type2 undo%';
OWNER SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ -------------------------------------------------- ------------------ ----------
SYS _SYSSMU1_3780397527$ TYPE2 UNDO 3276800
SYS _SYSSMU2_2232571081$ TYPE2 UNDO 15859712
SYS _SYSSMU3_2097677531$ TYPE2 UNDO 15859712
SYS _SYSSMU4_1152005954$ TYPE2 UNDO 14811136
SYS _SYSSMU5_1527469038$ TYPE2 UNDO 14811136
SYS _SYSSMU6_2443381498$ TYPE2 UNDO 14811136
SYS _SYSSMU7_3286610060$ TYPE2 UNDO 15859712
SYS _SYSSMU8_2012382730$ TYPE2 UNDO 16908288
SYS _SYSSMU9_1424341975$ TYPE2 UNDO 15859712
SYS _SYSSMU10_3550978943$ TYPE2 UNDO 15859712
SYS _SYSSMU11_3764057063$ TYPE2 UNDO 2097152
OWNER SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ -------------------------------------------------- ------------------ ----------
SYS _SYSSMU12_4237347689$ TYPE2 UNDO 2097152
SYS _SYSSMU13_4009171218$ TYPE2 UNDO 2097152
SYS _SYSSMU14_85406916$ TYPE2 UNDO 2097152
SYS _SYSSMU15_19581870$ TYPE2 UNDO 2097152
SYS _SYSSMU16_330215121$ TYPE2 UNDO 2097152
SYS _SYSSMU17_2539421292$ TYPE2 UNDO 2097152
SYS _SYSSMU18_2838524032$ TYPE2 UNDO 2097152
SYS _SYSSMU19_2247644598$ TYPE2 UNDO 2097152
SYS _SYSSMU20_3287519172$ TYPE2 UNDO 2097152
SYS _SYSSMU21_979913864$ TYPE2 UNDO 2097152
SYS _SYSSMU22_1258676675$ TYPE2 UNDO 2097152
OWNER SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ -------------------------------------------------- ------------------ ----------
SYS _SYSSMU23_432372269$ TYPE2 UNDO 2097152
SYS _SYSSMU24_29215360$ TYPE2 UNDO 2097152
SYS _SYSSMU25_1959401013$ TYPE2 UNDO 2097152
SYS _SYSSMU26_1505353806$ TYPE2 UNDO 2097152
SYS _SYSSMU27_4175236021$ TYPE2 UNDO 2097152
SYS _SYSSMU28_2795037290$ TYPE2 UNDO 2097152
SYS _SYSSMU29_2912783882$ TYPE2 UNDO 2097152
SYS _SYSSMU30_3787905801$ TYPE2 UNDO 2097152
SYS _SYSSMU31_2920750614$ TYPE2 UNDO 2097152
SYS _SYSSMU32_571373598$ TYPE2 UNDO 2097152
SYS _SYSSMU33_1927177067$ TYPE2 UNDO 2097152
OWNER SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ -------------------------------------------------- ------------------ ----------
SYS _SYSSMU34_1559179680$ TYPE2 UNDO 2097152
SYS _SYSSMU35_291451185$ TYPE2 UNDO 2097152
SYS _SYSSMU36_1109293922$ TYPE2 UNDO 2097152
SYS _SYSSMU37_1481936203$ TYPE2 UNDO 2097152
SYS _SYSSMU38_469291246$ TYPE2 UNDO 2097152
SYS _SYSSMU39_1698885487$ TYPE2 UNDO 2097152
SYS _SYSSMU40_773436029$ TYPE2 UNDO 2097152
SYS _SYSSMU41_1986806182$ TYPE2 UNDO 2097152
SYS _SYSSMU42_853024593$ TYPE2 UNDO 2097152
SYS _SYSSMU43_3929672554$ TYPE2 UNDO 2097152
SYS _SYSSMU44_1441154989$ TYPE2 UNDO 2097152
OWNER SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ -------------------------------------------------- ------------------ ----------
SYS _SYSSMU45_1152487835$ TYPE2 UNDO 2097152
SYS _SYSSMU46_2885130413$ TYPE2 UNDO 2097152
SYS _SYSSMU47_2402955442$ TYPE2 UNDO 2097152
SYS _SYSSMU48_3478094676$ TYPE2 UNDO 2097152
SYS _SYSSMU49_2073140607$ TYPE2 UNDO 2097152
49 rows selected.
SQL>
可见type 2 undo就是UNDO TABLESPACE回滚表空间的段
SQL> select segment_name,owner,segment_id from dba_rollback_segs;
SEGMENT_NAME OWNER SEGMENT_ID
-------------------------------------------------- ------ ----------
SYSTEM SYS 0
_SYSSMU49_2073140607$ PUBLIC 49
_SYSSMU48_3478094676$ PUBLIC 48
_SYSSMU47_2402955442$ PUBLIC 47
_SYSSMU46_2885130413$ PUBLIC 46
_SYSSMU45_1152487835$ PUBLIC 45
_SYSSMU44_1441154989$ PUBLIC 44
_SYSSMU43_3929672554$ PUBLIC 43
_SYSSMU42_853024593$ PUBLIC 42
_SYSSMU41_1986806182$ PUBLIC 41
_SYSSMU40_773436029$ PUBLIC 40
SEGMENT_NAME OWNER SEGMENT_ID
-------------------------------------------------- ------ ----------
_SYSSMU39_1698885487$ PUBLIC 39
_SYSSMU38_469291246$ PUBLIC 38
_SYSSMU37_1481936203$ PUBLIC 37
_SYSSMU36_1109293922$ PUBLIC 36
_SYSSMU35_291451185$ PUBLIC 35
_SYSSMU34_1559179680$ PUBLIC 34
_SYSSMU33_1927177067$ PUBLIC 33
_SYSSMU32_571373598$ PUBLIC 32
_SYSSMU31_2920750614$ PUBLIC 31
_SYSSMU30_3787905801$ PUBLIC 30
_SYSSMU29_2912783882$ PUBLIC 29
SEGMENT_NAME OWNER SEGMENT_ID
-------------------------------------------------- ------ ----------
_SYSSMU28_2795037290$ PUBLIC 28
_SYSSMU27_4175236021$ PUBLIC 27
_SYSSMU26_1505353806$ PUBLIC 26
_SYSSMU25_1959401013$ PUBLIC 25
_SYSSMU24_29215360$ PUBLIC 24
_SYSSMU23_432372269$ PUBLIC 23
_SYSSMU22_1258676675$ PUBLIC 22
_SYSSMU21_979913864$ PUBLIC 21
_SYSSMU20_3287519172$ PUBLIC 20
_SYSSMU19_2247644598$ PUBLIC 19
_SYSSMU18_2838524032$ PUBLIC 18
SEGMENT_NAME OWNER SEGMENT_ID
-------------------------------------------------- ------ ----------
_SYSSMU17_2539421292$ PUBLIC 17
_SYSSMU16_330215121$ PUBLIC 16
_SYSSMU15_19581870$ PUBLIC 15
_SYSSMU14_85406916$ PUBLIC 14
_SYSSMU13_4009171218$ PUBLIC 13
_SYSSMU12_4237347689$ PUBLIC 12
_SYSSMU11_3764057063$ PUBLIC 11
_SYSSMU10_3550978943$ PUBLIC 10
_SYSSMU9_1424341975$ PUBLIC 9
_SYSSMU8_2012382730$ PUBLIC 8
_SYSSMU7_3286610060$ PUBLIC 7
SEGMENT_NAME OWNER SEGMENT_ID
-------------------------------------------------- ------ ----------
_SYSSMU6_2443381498$ PUBLIC 6
_SYSSMU5_1527469038$ PUBLIC 5
_SYSSMU4_1152005954$ PUBLIC 4
_SYSSMU3_2097677531$ PUBLIC 3
_SYSSMU2_2232571081$ PUBLIC 2
_SYSSMU1_3780397527$ PUBLIC 1
50 rows selected.
SQL>
5,我们继续测试cluster
SQL> create cluster t_cluster(a int) size 512;
Cluster created.
SQL> create table t_cluster_table1(a int,b int) cluster t_cluster(a);
Table created.
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_type) like '%cluster%';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------------------------------------- ------------------ ----------
T_CLUSTER CLUSTER 65536
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='t_cluster_table1';
no rows selected
集群表的表插入数据前,必须先为集群创建索引
SQL> insert into t_cluster_table1 values(1,1);
insert into t_cluster_table1 values(1,1)
*
ERROR at line 1:
ORA-02032: clustered tables cannot be used before the cluster index is built
为集群创建索引
SQL> create index idx_cluster on cluster t_cluster;
Index created.
SQL> insert into t_cluster_table1 values(1,1);
1 row created.
SQL> commit;
Commit complete.
可见集表中的表不会存储分配同表名的段
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='t_cluster_table1';
no rows selected
6,我们最后研究下nested table
SQL> create type t_type as object(a int,b int);
2 create table t_table_ref(a int,c t_type);
3 /
Warning: Type created with compilation errors.
SQL> show error
Errors for TYPE T_TYPE:
LINE/COL ERROR
-------- -----------------------------------------------------------------
2/1 PLS-00103: Encountered the symbol "CREATE"
SQL>
SQL> drop type t_type;
Type dropped.
创建自定义类型
SQL> create type t_type as object(a int);
2 /
Type created.
普通表的表可以引用自定义类型
SQL> create table t_table_ref(aa int,b t_type);
Table created.
SQL> insert into t_table_ref values(1,t_type(1));
1 row created.
SQL> commit;
Commit complete.
可见普能表引用自定义类型,不会为其分配nested table
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_type) like '%nest%';
no rows selected
创建嵌套表自定义类型
SQL> create type t_nest_type is table of int;
2 /
Type created.
创建一个表,其列引用上述创建的嵌套表自定义类型
SQL> create table t_nest_table(id int,val1 t_nest_type) nested table val1 store as other_tab;
Table created.
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_type) like '%nest%';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------------------------------------- ------------------ ----------
OTHER_TAB NESTED TABLE 65536
SQL> insert into t_nest_table values(1,t_nest_type(1));
1 row created.
SQL> commit;
Commit complete.
可见对于包含嵌套表类型的表,会为使用嵌套表类型的列分配一个nested table segment,为其表分配一个table segment
SQL> select segment_name,segment_type,bytes from user_segments where lower(segment_name)='t_nest_table';
SEGMENT_NAME SEGMENT_TYPE BYTES
-------------------------------------------------- ------------------ ----------
T_NEST_TABLE TABLE 65536
个人简介
8年oracle从业经验,具备丰富的oracle技能,目前在国内北京某专业oracle服务公司从事高级技术顾问。
服务过的客户:
中国电信
中国移动
中国联通
中国电通
国家电网
四川达州商业银行
湖南老百姓大药房
山西省公安厅
中国邮政
北京302医院
河北廊坊新奥集团公司
项目经验:
中国电信3G项目AAA系统数据库部署及优化
中国联通4G数据库性能分析与优化
中国联通4G数据库性能分析与优化
中国联通CRM数据库性能优化
中国移动10086电商平台数据库部署及优化
湖南老百姓大药房ERR数据库sql优化项目
四川达州商业银行TCBS核心业务系统数据库模型设计和RAC部署及优化
四川达州商业银行TCBS核心业务系统后端批处理存储过程功能模块编写及优化
北京高铁信号监控系统RAC数据库部署及优化
河南宇通客车数据库性能优化
中国电信电商平台核心采购模块表模型设计及优化
中国邮政储蓄系统数据库性能优化及sql优化
北京302医院数据库迁移实施
河北廊坊新奥data guard部署及优化
山西公安厅身份证审计数据库系统故障评估
国家电网上海灾备项目4 node rac+adg
贵州移动crm及客服数据库性能优化项目
贵州移动crm及客服务数据库sql审核项目
深圳穆迪软件有限公司数据库性能优化项目
贵州移动crm及客服数据库性能优化项目
贵州移动crm及客服务数据库sql审核项目
深圳穆迪软件有限公司数据库性能优化项目
联系方式:
手机:18201115468
qq : 305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900
itpub博客名称:wisdomone1 http://blog.itpub.net/9240380/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-1784542/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9240380/viewspace-1784542/