一、描寫敘述
從oracle 10g開始,oracle引入了段顧問(Segment Advisor),用于檢查數據庫中是否有與存儲空間相關的建議,而且從10gR2開始,oracle自己主動調度并執(zhí)行一個段顧問作業(yè),定時分析數據庫中的段,并將分析結果放在內部表中。可是非常多情況下,
作為DBA,我們都會將oracle自帶的各種調度作業(yè)(統(tǒng)計信息收集、段顧問、SQL顧問等等)禁用,進而通過手工進行控制執(zhí)行類似作業(yè)(或者為了節(jié)省資源)。因此非常多情況下,我們都沒實用到段顧問這個非常實用的功能。這篇文章就是講述在
表對象和表空間級別
通過手工執(zhí)行段顧問來生成段建議的方法。
二、作用
- 優(yōu)化SQL語句時,能夠幫助我們更準確的推斷是否須要回收表內的碎片空間。假設不執(zhí)行段顧問建議,我們必須得通過create table as select一張暫時表方式才干準確的得知是否有必要進行表空間回收,以及空間的回收率等等信息。
- 優(yōu)化SQL語句時,能夠幫助我們準確推斷是否須要重建或者move表來消除表內的行鏈接。能夠想想,假設沒有這個建議,我們又須要做多少工作來推斷。
- 日常主動維護時,能夠幫助我們主動發(fā)現表內碎片較多和行鏈接較嚴重的表對象列表,有助于我們提前處理,避免類似問題的發(fā)生。
三、段顧問的分析結果類型
- 適合進行段收縮操作來回收空間的段
- 具有大量行鏈接的段
- 可能會從OLTP壓縮中受益的段
四、手工執(zhí)行段顧問步驟
- 創(chuàng)建一個段顧問任務
- 為這個任務分配一個對象(指定以表對象或者表空間級別來運行,同一時候制定username和表名或者表空間名)
- 設置任務參數(運行段顧問運行時的一些參數,比如:運行時長限制參數、僅生產與空間相關建議/全部類型的對象生成建議)
- 運行這個任務
五、手工執(zhí)行段顧問的代碼
declare
??my_task_id? number ;
??obj_id? number ;
??my_task_name?varchar2( 100 );
??my_task_desc?varchar2( 500 );
begin
??my_task_name?: = 'advisor_test?tab?Advice' ; ? - - 執(zhí)行任務名,能夠隨意指定,只是建議為有意義的名稱
??my_task_desc?: = 'Manual?Segment?Advisor?Run' ; - - 執(zhí)行任務描寫敘述,能夠隨意指定,只是建議為有意義的描寫敘述
- - - - - step? 1
?? / * ?創(chuàng)建一個段顧問任務? * /
??dbms_advisor.create_task(
??advisor_name? = > ? 'Segment?Advisor' , ? - - 執(zhí)行段顧問任務這個參數必須指定為Segment?Advisor
??task_id? = > ?my_task_id,
??task_name? = > ?my_task_name,
??task_desc? = > my_task_desc);
- - - - - step? 2
?? / * ?為這個任務分配一個對象? * /
??dbms_advisor.create_object(
??task_name = > my_task_name,
??object_type = > 'TABLE' , ? ? ?? - - 指定對象級別,假設為表對象則為 'TABLE' ,假設為表空間級別則為 'TABLESPACE'
??attr1 = > 'DBMON' , ? ? ? ? ? ?? - - - 假設在表對象級別執(zhí)行,這個屬性為username,表空間級別這個屬性為表空間名字
??attr2? = > ? 'ADVISOR_TEST' , ? ? - - - 假設在表對象級別執(zhí)行,這個屬性為表名,表空間級別這個屬性為 null
??attr3? = > ? NULL ,
??attr4 = > null ,
??attr5 = > null ,
??object_id = > obj_id);
- - - - - step? 3
/ * ?設置任務參數? * /
??dbms_advisor.set_task_parameter(
??task_name? = > ?my_task_name,
/ * ?設置段顧問執(zhí)行參數 "ecommend_all" 的值,為 TRUE 則為全部類型的對象的生成建議,為 FALSE 則僅生成與空間相關的建議? * /
/ * ?還有一個滾問執(zhí)行參數 "time_limit" ,制定顧問執(zhí)行的時間限制,默認值為無限制? * /
?? parameter = > 'recommend_all' , ? - - -
?? value = > 'TRUE' );
- - - - - step? 4
/ * ?運行這個任務? * /
??dbms_advisor.execute_task(my_task_name);
end ;
/
??my_task_id? number ;
??obj_id? number ;
??my_task_name?varchar2( 100 );
??my_task_desc?varchar2( 500 );
begin
??my_task_name?: = 'advisor_test?tab?Advice' ; ? - - 執(zhí)行任務名,能夠隨意指定,只是建議為有意義的名稱
??my_task_desc?: = 'Manual?Segment?Advisor?Run' ; - - 執(zhí)行任務描寫敘述,能夠隨意指定,只是建議為有意義的描寫敘述
- - - - - step? 1
?? / * ?創(chuàng)建一個段顧問任務? * /
??dbms_advisor.create_task(
??advisor_name? = > ? 'Segment?Advisor' , ? - - 執(zhí)行段顧問任務這個參數必須指定為Segment?Advisor
??task_id? = > ?my_task_id,
??task_name? = > ?my_task_name,
??task_desc? = > my_task_desc);
- - - - - step? 2
?? / * ?為這個任務分配一個對象? * /
??dbms_advisor.create_object(
??task_name = > my_task_name,
??object_type = > 'TABLE' , ? ? ?? - - 指定對象級別,假設為表對象則為 'TABLE' ,假設為表空間級別則為 'TABLESPACE'
??attr1 = > 'DBMON' , ? ? ? ? ? ?? - - - 假設在表對象級別執(zhí)行,這個屬性為username,表空間級別這個屬性為表空間名字
??attr2? = > ? 'ADVISOR_TEST' , ? ? - - - 假設在表對象級別執(zhí)行,這個屬性為表名,表空間級別這個屬性為 null
??attr3? = > ? NULL ,
??attr4 = > null ,
??attr5 = > null ,
??object_id = > obj_id);
- - - - - step? 3
/ * ?設置任務參數? * /
??dbms_advisor.set_task_parameter(
??task_name? = > ?my_task_name,
/ * ?設置段顧問執(zhí)行參數 "ecommend_all" 的值,為 TRUE 則為全部類型的對象的生成建議,為 FALSE 則僅生成與空間相關的建議? * /
/ * ?還有一個滾問執(zhí)行參數 "time_limit" ,制定顧問執(zhí)行的時間限制,默認值為無限制? * /
?? parameter = > 'recommend_all' , ? - - -
?? value = > 'TRUE' );
- - - - - step? 4
/ * ?運行這個任務? * /
??dbms_advisor.execute_task(my_task_name);
end ;
/
六、查詢段顧問分析結果的語句
(
1
)
select ?
?? / * ? "|chr(13)||chr(10)" 為windows平臺的換行符,假設是linux等其他平臺,請用 "chr(10)" 取代? * /
? 'Task?name?????:' ||f.task_name||chr( 13 )||chr( 10 )|| ?
? 'Segment?name??:' ||o.attr2????||chr( 13 )||chr( 10 )||
? 'Sement?type???:' ||o. type ?????||chr( 13 )||chr( 10 )||
? 'partition?name:' ||o.attr3????||chr( 13 )||chr( 10 )||
? 'Message???????:' ||f.message??||chr( 13 )||chr( 10 )||
? 'More?info?????:' ||f.more_info?TASK_ADVICE
? from ?dba_advisor_findings?f,dba_advisor_objects?o
where ?o.task_id = f.task_id
?? and ?o.object_id = f.object_id
?? and ?f.task_name? = ? 'advisor_test?tab?Advice'
order ? by ?f.task_name;
( 2 )?
通過查詢 TABLE (dbms_space.asa_recommendations(all_runs = > 'TRUE' ,show_manual = > 'TRUE' ,show_findings = > 'FALSE' ))來查看建議;
第一個參數 true 表示執(zhí)行歷次執(zhí)行結果, false 表示近期一次的結果
第二個參數 true 表示返回手工執(zhí)行段顧問的結果, false 表示返回自己主動執(zhí)行段顧問的結果
第三個參數 true 表示僅顯示分析結果, false 表示顯示分析結果和分析建議
備注:案例中使用( 1 )語句來查看分析結果
select ?
?? / * ? "|chr(13)||chr(10)" 為windows平臺的換行符,假設是linux等其他平臺,請用 "chr(10)" 取代? * /
? 'Task?name?????:' ||f.task_name||chr( 13 )||chr( 10 )|| ?
? 'Segment?name??:' ||o.attr2????||chr( 13 )||chr( 10 )||
? 'Sement?type???:' ||o. type ?????||chr( 13 )||chr( 10 )||
? 'partition?name:' ||o.attr3????||chr( 13 )||chr( 10 )||
? 'Message???????:' ||f.message??||chr( 13 )||chr( 10 )||
? 'More?info?????:' ||f.more_info?TASK_ADVICE
? from ?dba_advisor_findings?f,dba_advisor_objects?o
where ?o.task_id = f.task_id
?? and ?o.object_id = f.object_id
?? and ?f.task_name? = ? 'advisor_test?tab?Advice'
order ? by ?f.task_name;
( 2 )?
通過查詢 TABLE (dbms_space.asa_recommendations(all_runs = > 'TRUE' ,show_manual = > 'TRUE' ,show_findings = > 'FALSE' ))來查看建議;
第一個參數 true 表示執(zhí)行歷次執(zhí)行結果, false 表示近期一次的結果
第二個參數 true 表示返回手工執(zhí)行段顧問的結果, false 表示返回自己主動執(zhí)行段顧問的結果
第三個參數 true 表示僅顯示分析結果, false 表示顯示分析結果和分析建議
備注:案例中使用( 1 )語句來查看分析結果
七、
案例1(表對象級別執(zhí)行)
SQL
>
?
create
?
table
?advisor_test?
as
?
select
?
*
?
from
?dba_objects;
Table ?created
SQL > ? insert ? into ?advisor_test? select ? * ? from ?advisor_test;
72525 ? rows ?inserted
SQL > ? /
145050 ? rows ?inserted
SQL > ? /
290100 ? rows ?inserted
SQL > ? commit ;
Commit ?complete
SQL > ? delete ?advisor_test? where ?rownum < 100000 ;
99999 ? rows ?deleted
SQL > ? /
99999 ? rows ?deleted
SQL > ? commit ;
Commit ?complete
declare
??my_task_id? number ;
??obj_id? number ;
??my_task_name?varchar2( 100 );
??my_task_desc?varchar2( 500 );
begin
??my_task_name?: = 'advisor_test?tab?Advice' ;
??my_task_desc?: = 'Manual?Segment?Advisor?Run' ;
- - - - - step? 1
??dbms_advisor.create_task(
??advisor_name? = > ? 'Segment?Advisor' ,
??task_id? = > ?my_task_id,
??task_name? = > ?my_task_name,
??task_desc? = > my_task_desc);
- - - - - step? 2
??dbms_advisor.create_object(
??task_name = > my_task_name,
??object_type = > 'TABLE' ,
??attr1 = > 'DBMON' ,
??attr2? = > ? 'ADVISOR_TEST' ,
??attr3? = > ? NULL ,
??attr4 = > null ,
??attr5 = > null ,
??object_id = > obj_id);
- - - - - step? 3
??dbms_advisor.set_task_parameter(
??task_name? = > ?my_task_name,
?? parameter = > 'recommend_all' ,
?? value = > 'TRUE' );
- - - - - step? 4
??dbms_advisor.execute_task(my_task_name);
end ;
/
Table ?created
SQL > ? insert ? into ?advisor_test? select ? * ? from ?advisor_test;
72525 ? rows ?inserted
SQL > ? /
145050 ? rows ?inserted
SQL > ? /
290100 ? rows ?inserted
SQL > ? commit ;
Commit ?complete
SQL > ? delete ?advisor_test? where ?rownum < 100000 ;
99999 ? rows ?deleted
SQL > ? /
99999 ? rows ?deleted
SQL > ? commit ;
Commit ?complete
declare
??my_task_id? number ;
??obj_id? number ;
??my_task_name?varchar2( 100 );
??my_task_desc?varchar2( 500 );
begin
??my_task_name?: = 'advisor_test?tab?Advice' ;
??my_task_desc?: = 'Manual?Segment?Advisor?Run' ;
- - - - - step? 1
??dbms_advisor.create_task(
??advisor_name? = > ? 'Segment?Advisor' ,
??task_id? = > ?my_task_id,
??task_name? = > ?my_task_name,
??task_desc? = > my_task_desc);
- - - - - step? 2
??dbms_advisor.create_object(
??task_name = > my_task_name,
??object_type = > 'TABLE' ,
??attr1 = > 'DBMON' ,
??attr2? = > ? 'ADVISOR_TEST' ,
??attr3? = > ? NULL ,
??attr4 = > null ,
??attr5 = > null ,
??object_id = > obj_id);
- - - - - step? 3
??dbms_advisor.set_task_parameter(
??task_name? = > ?my_task_name,
?? parameter = > 'recommend_all' ,
?? value = > 'TRUE' );
- - - - - step? 4
??dbms_advisor.execute_task(my_task_name);
end ;
/
已運行
SQL > ? select
?? 2 ?? ? / * ? "|chr(13)||chr(10)" 為windows平臺的換行符,假設是linux等其他平臺,請用 "chr(10)" 取代? * /
?? 3 ??? 'Task name ? ? :' ||f.task_name||chr( 13 )||chr( 10 )||
?? 4 ??? 'Segment name ?:' ||o.attr2 ? ?||chr( 13 )||chr( 10 )||
?? 5 ??? 'Sement type ? :' ||o. type ?? ? ||chr( 13 )||chr( 10 )||
?? 6 ??? 'partition name:' ||o.attr3 ? ?||chr( 13 )||chr( 10 )||
?? 7 ??? 'Message ? ? ? :' ||f.message ?||chr( 13 )||chr( 10 )||
?? 8 ??? 'More info ? ? :' ||f.more_info TASK_ADVICE
?? 9 ??? from ?dba_advisor_findings f,dba_advisor_objects o
? 10 ?? where ?o.task_id = f.task_id
? 11 ?? ? and ?o.object_id = f.object_id
? 12 ?? ? and ?f.task_name? = ? 'advisor_test tab Advice'
? 13 ?? order ? by ?f.task_name;
TASK_ADVICE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Task? name ?? ? :advisor_test tab Advice
Segment? name ??:ADVISOR_TEST
Sement? type ?? : TABLE
partition? name :
Message ? ? ? :啟用表 DBMON.ADVISOR_TEST 的行移動并運行收縮, 預計能夠節(jié)省? 285435
31 ?字節(jié)。
More ?info ? ? :分配空間: 75497472 : 已用空間: 46953941 : 可回收空間: 28543531 :
SQL > ? select
?? 2 ?? ? / * ? "|chr(13)||chr(10)" 為windows平臺的換行符,假設是linux等其他平臺,請用 "chr(10)" 取代? * /
?? 3 ??? 'Task name ? ? :' ||f.task_name||chr( 13 )||chr( 10 )||
?? 4 ??? 'Segment name ?:' ||o.attr2 ? ?||chr( 13 )||chr( 10 )||
?? 5 ??? 'Sement type ? :' ||o. type ?? ? ||chr( 13 )||chr( 10 )||
?? 6 ??? 'partition name:' ||o.attr3 ? ?||chr( 13 )||chr( 10 )||
?? 7 ??? 'Message ? ? ? :' ||f.message ?||chr( 13 )||chr( 10 )||
?? 8 ??? 'More info ? ? :' ||f.more_info TASK_ADVICE
?? 9 ??? from ?dba_advisor_findings f,dba_advisor_objects o
? 10 ?? where ?o.task_id = f.task_id
? 11 ?? ? and ?o.object_id = f.object_id
? 12 ?? ? and ?f.task_name? = ? 'advisor_test tab Advice'
? 13 ?? order ? by ?f.task_name;
TASK_ADVICE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Task? name ?? ? :advisor_test tab Advice
Segment? name ??:ADVISOR_TEST
Sement? type ?? : TABLE
partition? name :
Message ? ? ? :啟用表 DBMON.ADVISOR_TEST 的行移動并運行收縮, 預計能夠節(jié)省? 285435
31 ?字節(jié)。
More ?info ? ? :分配空間: 75497472 : 已用空間: 46953941 : 可回收空間: 28543531 :
八、案例2(表空間級別執(zhí)行)
declare
??my_task_id? number ;
??obj_id? number ;
??my_task_name?varchar2( 100 );
??my_task_desc?varchar2( 500 );
begin
??my_task_name?: = 'Tablespace Advice' ;
??my_task_desc?: = 'Manual?Segment?Advisor?Run' ;
- - - - - step? 1
??dbms_advisor.create_task(
??advisor_name? = > ? 'Segment?Advisor' ,
??task_id? = > ?my_task_id,
??task_name? = > ?my_task_name,
??task_desc? = > my_task_desc);
- - - - - step? 2
??dbms_advisor.create_object(
??task_name = > my_task_name,
??object_type = > 'TABLESPACE' ,
??attr1 = > 'USERS' ,
??attr2? = > ? null ,
??attr3? = > ? NULL ,
??attr4 = > null ,
??attr5 = > null ,
??object_id = > obj_id);
- - - - - step? 3
??dbms_advisor.set_task_parameter(
??task_name? = > ?my_task_name,
?? parameter = > 'recommend_all' ,
?? value = > 'TRUE' );
- - - - - step? 4
??dbms_advisor.execute_task(my_task_name);
end ;
/
SQL > ? select
?? 2 ?? ? / * ? "|chr(13)||chr(10)" 為windows平臺的換行符,假設是linux等其他平臺,請用 "chr(10)" 取代? * /
?? 3 ??? 'Task name ? ? :' ||f.task_name||chr( 13 )||chr( 10 )||
?? 4 ??? 'Segment name ?:' ||o.attr2 ? ?||chr( 13 )||chr( 10 )||
?? 5 ??? 'Sement type ? :' ||o. type ?? ? ||chr( 13 )||chr( 10 )||
?? 6 ??? 'partition name:' ||o.attr3 ? ?||chr( 13 )||chr( 10 )||
?? 7 ??? 'Message ? ? ? :' ||f.message ?||chr( 13 )||chr( 10 )||
?? 8 ??? 'More info ? ? :' ||f.more_info TASK_ADVICE
?? 9 ??? from ?dba_advisor_findings f,dba_advisor_objects o
? 10 ?? where ?o.task_id = f.task_id
? 11 ?? ? and ?o.object_id = f.object_id
? 12 ?? ? and ?f.task_name? = ? 'Tablespace Advice'
? 13 ?? order ? by ?f.task_name;
TASK_ADVICE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Task? name ?? ? :Tablespace Advice
Segment? name ??:T_SCEGAOKAOQUERY_GZ
Sement? type ?? : TABLE
partition? name :
Message ? ? ? :此對象中的空暇空間小于? 10MB 。
More ?info ? ? :分配空間: 65536 : 已用空間: 8192 : 可回收空間: 57344 :
Task? name ?? ? :Tablespace Advice
Segment? name ??:T_SCEGAOKAOQUERY_GZ
Sement? type ?? : TABLE
partition? name :
TASK_ADVICE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Message ? ? ? :此對象中的空暇空間小于? 10MB 。
More ?info ? ? :分配空間: 3145728 : 已用空間: 2871921 : 可回收空間: 273807 :
Task? name ?? ? :Tablespace Advice
Segment? name ??:T_SCEGAOKAOQUERY
Sement? type ?? : TABLE
partition? name :
Message ? ? ? :此對象中的空暇空間小于? 10MB 。
More ?info ? ? :分配空間: 46137344 : 已用空間: 44837534 : 可回收空間: 1299810 :
- - - - - - - - 為了排版,省略后面的輸出 - - - - - - - - - - - - - -
??my_task_id? number ;
??obj_id? number ;
??my_task_name?varchar2( 100 );
??my_task_desc?varchar2( 500 );
begin
??my_task_name?: = 'Tablespace Advice' ;
??my_task_desc?: = 'Manual?Segment?Advisor?Run' ;
- - - - - step? 1
??dbms_advisor.create_task(
??advisor_name? = > ? 'Segment?Advisor' ,
??task_id? = > ?my_task_id,
??task_name? = > ?my_task_name,
??task_desc? = > my_task_desc);
- - - - - step? 2
??dbms_advisor.create_object(
??task_name = > my_task_name,
??object_type = > 'TABLESPACE' ,
??attr1 = > 'USERS' ,
??attr2? = > ? null ,
??attr3? = > ? NULL ,
??attr4 = > null ,
??attr5 = > null ,
??object_id = > obj_id);
- - - - - step? 3
??dbms_advisor.set_task_parameter(
??task_name? = > ?my_task_name,
?? parameter = > 'recommend_all' ,
?? value = > 'TRUE' );
- - - - - step? 4
??dbms_advisor.execute_task(my_task_name);
end ;
/
SQL > ? select
?? 2 ?? ? / * ? "|chr(13)||chr(10)" 為windows平臺的換行符,假設是linux等其他平臺,請用 "chr(10)" 取代? * /
?? 3 ??? 'Task name ? ? :' ||f.task_name||chr( 13 )||chr( 10 )||
?? 4 ??? 'Segment name ?:' ||o.attr2 ? ?||chr( 13 )||chr( 10 )||
?? 5 ??? 'Sement type ? :' ||o. type ?? ? ||chr( 13 )||chr( 10 )||
?? 6 ??? 'partition name:' ||o.attr3 ? ?||chr( 13 )||chr( 10 )||
?? 7 ??? 'Message ? ? ? :' ||f.message ?||chr( 13 )||chr( 10 )||
?? 8 ??? 'More info ? ? :' ||f.more_info TASK_ADVICE
?? 9 ??? from ?dba_advisor_findings f,dba_advisor_objects o
? 10 ?? where ?o.task_id = f.task_id
? 11 ?? ? and ?o.object_id = f.object_id
? 12 ?? ? and ?f.task_name? = ? 'Tablespace Advice'
? 13 ?? order ? by ?f.task_name;
TASK_ADVICE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Task? name ?? ? :Tablespace Advice
Segment? name ??:T_SCEGAOKAOQUERY_GZ
Sement? type ?? : TABLE
partition? name :
Message ? ? ? :此對象中的空暇空間小于? 10MB 。
More ?info ? ? :分配空間: 65536 : 已用空間: 8192 : 可回收空間: 57344 :
Task? name ?? ? :Tablespace Advice
Segment? name ??:T_SCEGAOKAOQUERY_GZ
Sement? type ?? : TABLE
partition? name :
TASK_ADVICE
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Message ? ? ? :此對象中的空暇空間小于? 10MB 。
More ?info ? ? :分配空間: 3145728 : 已用空間: 2871921 : 可回收空間: 273807 :
Task? name ?? ? :Tablespace Advice
Segment? name ??:T_SCEGAOKAOQUERY
Sement? type ?? : TABLE
partition? name :
Message ? ? ? :此對象中的空暇空間小于? 10MB 。
More ?info ? ? :分配空間: 46137344 : 已用空間: 44837534 : 可回收空間: 1299810 :
- - - - - - - - 為了排版,省略后面的輸出 - - - - - - - - - - - - - -
備注:最后能夠執(zhí)行delete_task來刪除任務,例如以下
exec dbms_advisor.delete_task(task_name => 'Tablespace Advice');
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
