--=======================
-- Oracle 實例恢復
--=======================
一、Oracle實例失敗
Oracle實例失敗多為實例非一致性關閉所致,通常稱為崩潰 ( crash ) 。實例失敗的結果等同于 shutdown abort。
實例失敗的原因
電源負載故障
硬件故障
后臺進程失敗
異常關閉數據庫
實例失敗后的狀況
數據庫可能丟失已提交的事務以及存儲了未提交的事務,導致數據庫出現不一致的情況
解決方案
使用startup重新啟動實例。實例實現自動恢復,根據聯機日志文件前滾提交的事務,回滾未提交的事務
查看告警日志、跟蹤日志等找出出現故障的原因
更多常見的故障請參考: Oracle常見故障及日常規劃
二、檢查點
檢查點在體系結構中已經討論,實例的恢復與檢查點息息相關,因此再次討論檢查點進程
1.什么是檢查點
是一個數據庫事件,用于減少崩潰恢復時間,檢查點位置決定了實例恢復的起始位置
由后臺進程觸發,觸發時ckpt進程通知dbwn進程將數據緩沖區的臟數據寫入到數據文件
ckpt進程同時負責更新數據文件的頭部信息及控制文件上的檢查點信息
2.檢查點的觸發條件
在日志切換的時候 ( 自動切換或手動切換 )
數據庫用immediate, transaction ,normal選項 shutdown 數據庫的時候
用戶手動觸發 ( alter system checkpoint )
alter tablespace tablespace_name begin | end bakcup
alter tablespace tablespace_name offline
alter database datafile '<dir>' offline
alter tablespace | datafile read only
3.檢測點隊列
是一個臟數據庫鏈表
檢查點隊列中的每一條修改過的記錄包一個唯一的數據塊標識符 ( 日志文件號,塊編號,偏移量 )
最早隊列將被優先寫入到數據文件 ( 而不論期間是否被多次修改 )
最早隊列被寫入完成后將從隊列中清除
4.檢查點的分類
完全檢查點
在Oracle 8i以前,當檢查點發生時,Oracle將臟緩沖列表上的數據全部寫入到數據文件,稱為完全檢查點,又稱常規檢查點
特定的觸發條件
alter system switch logfile
shutdown normal , immediate , transactional
alter system checkpoint
增量檢查點 ( fast - start checkpoint )
主要是引入了檢查點隊列機制 , 每s,ckpt將檢查點隊列中最老的RBA更新到控制文件,RBA ( 重做日志塊地址 ) 同時將作為實例恢復的起點
增量檢查點則細分了完全檢查點,使得數據可以周期性按最老的數據塊寫入到數據文件
每一個臟塊會被移到檢查點隊列里面去,按照LRBA(Low RBA第一次對此塊修改對應的redo block address)來排列
最早寫入檢查點隊列數據塊的low rba值是最小的,即便該隊列中的最小隊列被修改多次,但修改后它在檢查點隊列里的順序不會改變
當執行增量檢查點時,DBWn從檢查點隊列按照LRBA的順序來保證先修改的數據可以按順序優先被寫出來實現檢查點的增進
此時ckpt進程使用輕量級的控制文件更新協議,將當前最低的RBA寫入控制文件
ckpt在進行輕量級更新時,并不會改寫控制文件中數據文件的檢查點信息及數據文件頭信息
僅僅是記錄控制文件檢查點SCN并根據增量檢查點寫出增進RBA信息
通過將完全檢查點轉變為增量檢查點將大大縮短實例的恢復時間
注:更新數據文件頭部及控制文件滯后于檢查點事件的發生
增量檢查點的觸發
滿足初始話文件log_checkpoint_interval、log_checkpoint_timeout、
fast_start_io_target、fast_start_mttr_target的設置的值
最小的日志文件的大小
Buffer Cacha中臟塊的數量
部分檢查點
表空間的臟數據寫入到磁盤
由 alter tablespace tablespace_name offline觸發
5.完全檢查點與增量檢查點的差異
完全檢查點會將檢查點的信息同時寫入到控制文件及數據文件
增量檢查點則只將RBA寫入到控制文件
6.查看檢查點的信息 , 設置LOG_CHECKPOINTS_TO_ALERT參數為true
ALTER SYSTEM SET LOG_CHECKPOINTS_TO_ALERT = TRUE ;
-- 查看log_checkpoints_to_alert 參數
SQL > SHOW PARAMETER log_checkpoints_to_alert
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_checkpoints_to_alertbooleanFALSE
-- 設置log_checkpoints_to_alert 參數
SQL > ALTER SYSTEM set log_checkpoints_to_alert = TRUE ;
System altered .
-- 清空告警日志文件的內容
SQL > ho cat / dev /null > / u01 / app / oracle / admin / orcl / bdump / alert_orcl . log
-- 查看數據文件頭部信息中控制文件的信息為3037172
SQL > SELECT file# , status , tablespace_name ,
2dbms_flashback . get_system_change_number cur_scn ,
3to_char ( resetlogs_time , 'yyyy-mm-dd hh24:mi:ss' ) rst_dt ,
4resetlogs_change# rst_scn ,
5to_char ( checkpoint_time , 'yyyy-mm-dd hh24:mi:ss' ) ckpt_dt ,
6checkpoint_change# ckpt_scn , checkpoint_count ckpt_cnt
7 FROM v$datafile_header ;
FILE# STATUSTABLESPACE_NAMECUR_SCN RST_DTRST_SCN CKPT_DTCKPT_SCNCKPT_CNT
---------- ------- --------------- ---------- ------------------- ---------- ------------------- ---------- ----------
1 ONLINESYSTEM3037641 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 05 : 303037172531
2 ONLINEUNDOTBS13037641 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 05 : 303037172493
3 ONLINESYSAUX3037641 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 05 : 303037172532
4 ONLINEUSERS3037641 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 05 : 303037172534
5 ONLINEEXAMPLE3037641 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 05 : 303037172489
6 ONLINETBS13037641 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 05 : 303037172412
7 ONLINETBS13037641 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 05 : 303037172407
7 rows selected .
SQL > save / u01 / app / oracle / oradata / query_1 . sql ;
Created file / u01 / app / oracle / oradata / query_1 . sql
SQL > ALTER SYSTEM SWITCH LOGFILE ; -- 切換日志
System altered .
SQL > ho cat / u01 / app / oracle / admin / orcl / bdump / alert_orcl . log | more -- 查看告警日志
Sun Jul 25 19 : 14 : 29 2010
Beginning log switch checkpoint up to RBA [0xd.2.10] , SCN : 3037657
Thread 1 advanced to log sequence 13
Current log# 3 seq# 13 mem# 0 : / u01 / app / oracle / oradata / orcl / redo3a . rdo
Current log# 3 seq# 13 mem# 1 : / u01 / app / oracle / oradata / orcl / redo3b . rdo
SQL > @/u01 / app / oracle / oradata / query_1 . sql ; -- 數據文件頭部滯后分鐘后與告警日志記錄的SCN 相同
FILE# STATUSTABLESPACE_NAMECUR_SCN RST_DTRST_SCN CKPT_DTCKPT_SCNCKPT_CNT
---------- ------- --------------- ---------- ------------------- ---------- ------------------- ---------- ----------
1 ONLINESYSTEM3037803 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 14 : 293037657532
2 ONLINEUNDOTBS13037803 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 14 : 293037657494
3 ONLINESYSAUX3037803 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 14 : 293037657533
4 ONLINEUSERS3037803 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 14 : 293037657535
5 ONLINEEXAMPLE3037803 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 14 : 293037657490
6 ONLINETBS13037803 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 14 : 293037657413
7 ONLINETBS13037803 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 14 : 293037657408
SQL > SELECT TO_CHAR ( sysdate , 'yyyy-mm-dd hh24:mi:ss' ) FROM dual ; -- 時間滯后分鐘19:19:59 - 19:14:29
TO_CHAR ( SYSDATE , 'YY'
-------------------
2010 - 07 - 25 19 : 19 : 59
SQL > ALTER SYSTEM CHECKPOINT ; -- 產生檢查點
System altered .
SQL > ho cat / u01 / app / oracle / admin / orcl / bdump / alert_orcl . log | more -- 查看告警日志中的SCN: 3037881
Sun Jul 25 19 : 14 : 29 2010
Beginning log switch checkpoint up to RBA [0xd.2.10] , SCN : 3037657
Thread 1 advanced to log sequence 13
Current log# 3 seq# 13 mem# 0 : / u01 / app / oracle / oradata / orcl / redo3a . rdo
Current log# 3 seq# 13 mem# 1 : / u01 / app / oracle / oradata / orcl / redo3b . rdo
Sun Jul 25 19 : 19 : 34 2010
Completed checkpoint up to RBA [0xd.2.10] , SCN : 3037657
Sun Jul 25 19 : 21 : 55 2010
Beginning global checkpoint up to RBA [0xd.116.10] , SCN : 3037881
Completed checkpoint up to RBA [0xd.116.10] , SCN : 3037881
SQL > @/u01 / app / oracle / oradata / query_1 . sql ; -- 數據文件頭部同步與告警日志記錄的SCN 相同,為3037881
FILE# STATUSTABLESPACE_NAMECUR_SCN RST_DTRST_SCN CKPT_DTCKPT_SCNCKPT_CNT
---------- ------- --------------- ---------- ------------------- ---------- ------------------- ---------- ----------
1 ONLINESYSTEM3037890 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 21 : 553037881533
2 ONLINEUNDOTBS13037890 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 21 : 553037881495
3 ONLINESYSAUX3037890 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 21 : 553037881534
4 ONLINEUSERS3037890 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 21 : 553037881536
5 ONLINEEXAMPLE3037890 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 21 : 553037881491
6 ONLINETBS13037890 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 21 : 553037881414
7 ONLINETBS13037890 2010 - 07 - 20 11 : 59 : 232837290 2010 - 07 - 25 19 : 21 : 553037881409
-- 查看完全檢查點
SQL > SELECT addr , indx , rtckp_scn ,
2rtckp_tim ,
3rtckp_rba_seq , rtckp_rba_bno
4 FROM x$kccrt ;
ADDRINDX RTCKP_SCNRTCKP_TIMRTCKP_RBA_SEQ RTCKP_RBA_BNO
-------- ---------- ---------------- -------------------- ------------- -------------
B7D59C100 303788107 / 25 / 2010 19 : 21 : 5513278
SQL > show parameter log_check -- 查看log_checkpoint_timeout 的值
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_checkpoint_intervalinteger0
log_checkpoint_timeoutinteger1800
log_checkpoints_to_alertbooleanTRUE
ho cat / u01 / app / oracle / admin / orcl / bdump / alert_orcl . log -- 告警日志文件中Incremental checkpoint
----------------------------------------------------------------------------------
Sun Jul 25 19 : 22 : 46 2010
Incremental checkpoint up to RBA [0xd.119.0] , current log tail at RBA [0xd.119.0]
Sun Jul 25 19 : 52 : 51 2010
Incremental checkpoint up to RBA [0xd.37a.0] , current log tail at RBA [0xd.420.0]
---------------------------------------------------------------------------------
SQL > select CPDRT , CPLRBA_SEQ|| '.' || CPLRBA_BNO|| '.' || CPLRBA_BOF "Low RBA" ,
2CPODR_SEQ|| '.' || CPODR_BNO|| '.' || CPODR_BOF "On disk RBA" , CPODS , CPODT , CPHBT
3 from x$kcccp where indx = 0 ; -- 獲得控制文件中增量檢查點的信息
CPDRT Low RBA On disk RBACPODSCPODTCPHBT
---------- ------------------- ------------- ------- ----------------------------
97 13.5574.013.6391.03041226 07 / 25 / 2010 22 : 16 : 37725323317
--CPDRT 列是檢查點隊列中的臟塊數目.
--CPODS 列是on disk rba 的scn
--CPODT 列是on disk rba 的時間戳
--CPHBT 列是心跳
7.更詳細的檢查點介紹: 針對checkpoint的概要分析
三、實例恢復
1.當打開非一致性關閉或 shutdown abort數據庫時,將導致實例恢復
2.實例恢復過程為自動
3.使用聯機重做日志文件中的信息來同步數據文件
4.涉及到兩類不同的操作
前滾:數據文件被還原到實例失敗之前的狀態
回滾:已修改但未提交的數據將被撤銷到修改之前的狀態
四、實例恢復的過程
下面的圖片來自Oracle官方教材
1.首先Oracle會比較控制文件中檢查點與數據文件頭部信息,發現數據不一致
2.從最后檢查點之后到日志文件尾部將被重新應用到數據文件,同時產生undo信息 ( 回滾 ) ,此階段也稱為cache recovery
3.數據文件中包含已提交或未提交的數據,盡管存在未提交的數據,此時數據庫已經被打開,允許用戶連接
4.未提交的事務將被回滾
5.數據文件中僅包含已提交的數據
五、調整實例恢復
1.為參數文件中對恢復過程有影響的聯機日志記錄數量和數據塊設置合適的大小
2.調整聯機日志文件的大小來影響檢查點發生的頻率
3.使用SQL命令發生檢查點事件
4.使用Fast - start fault recovery
5.幾個恢復相關的參數
LOG_CHECKPOINT_TIMEOUT --> 兩次checkpoint 之間間隔的時間(單位是秒),該參數現已很少使用
LOG_CHECKPOINT_INTERVAL --> 兩次checkpoint 之間redo block數據塊的個數(不是db_block),
--redo block size = os block size 該參數現已很少使用
FAST_START_MTTR_TARGET --> 指定多長時間完成實例恢復( 單位是秒) (后面演示中重點討論)
RECOVERY_PARALLELISM --> 指定前滾時的并發度
FAST_START_PARALLEL_ROLLBACK --> 回滾階段時預先UNDO 需要使用的塊,然后增加回滾并發度
-- 2 路CPU 建議設置為LO,四路CPU建議設置為HI,否則缺省置為false
FAST_START_IO_TARGET --> 數據庫宕機所要做的恢復所需的IO 的數量,10g之后很少使用
六、實例恢復相關的視圖
V$INSTACE_RECOVERY --> 查看fast_start_mttr_target 設置以及系統MTTR相關信息
V$FAST_START_SERVERS --> 事務回滾時相關并發信息
V$FAST_START_TRANSACTION --> 正在恢復的事務的相關信息
完全檢查點
select * from X$KCCRT where indx = 0 ;
增量檢查點
SQL > select * from X$KCCCP where indx = 0 ;
七、實例恢復演示
-- 刪除告警日志
SQL > ho rm - f / u01 / app / oracle / admin / orcl / bdump / alert_orcl . log
SQL > SELECT * FROM scott . emp WHERE ename = 'SCOTT' ;
EMPNO ENAMEJOBMGR HIREDATESALDEPTNO
---------- ------------------------------ --------- ---------- --------- ---------- ----------
7788 SCOTTANALYST7566 19 - APR - 87710020
-- 更新SCOTT 的薪水且提交事務
SQL > UPDATE scott . emp SET sal = sal / 2 WHERE ename = 'SCOTT' ;
1 row updated .
SQL > COMMIT ;
Commit complete .
-- 插入兩條新記錄且不提交事務
SQL > INSERT INTO scott . emp ( empno , ename , job ) SELECT '2001' , 'Mark' , 'Develpoer' FROM dual ;
1 row created .
SQL > INSERT INTO scott . emp ( empno , ename , job ) SELECT '2002' , 'Mary' , 'Designer' FROM dual ;
1 row created .
SQL > SELECT * FROM scott . emp WHERE empno IN ( 2001 , 2002 );
EMPNO ENAMEJOBMGR HIREDATESALDEPTNO
---------- ------------------------------ --------- ---------- --------- ---------- ----------
2001 MarkDevelpoer
2002 MaryDesigner
-- 強制關閉實例并重啟實例,則實例將自動回滾
SQL > SHUTDOWN ABORT ;
ORACLE instance shut down .
SQL > STARTUP
ORACLE instance started .
Total System Global Area251658240 bytes
Fixed Size 1218796 bytes
Variable Size 88082196 bytes
Database Buffers159383552 bytes
Redo Buffers2973696 bytes
Database mounted .
Database opened .
-- 從告警日志中獲得回滾的相關信息
SQL > ho ls / u01 / app / oracle / admin / orcl / bdump
alert_orcl . log orcl_arc0_4016 . trcorcl_arc1_4018 . trcorcl_lgwr_3995 . trc
SQL > ho cat / u01 / app / oracle / admin / orcl / bdump / alert_orcl . log
----------------------------------------------------------------
ALTER DATABASE MOUNT
Thu Jul 22 12 : 44 : 40 2010
Setting recovery target incarnation to 10
Thu Jul 22 12 : 44 : 40 2010
Successful mount of redo thread 1 , with mount id 1252833332
Thu Jul 22 12 : 44 : 40 2010
Database mounted in Exclusive Mode
Completed : ALTER DATABASE MOUNT
Thu Jul 22 12 : 44 : 41 2010
ALTER DATABASE OPEN
Thu Jul 22 12 : 44 : 41 2010
Beginning crash recovery of 1 threads -- 開始crash recovery
Thu Jul 22 12 : 44 : 41 2010
Started redo scan -- 掃描redo
Thu Jul 22 12 : 44 : 42 2010
Completed redo scan
142 redo blocks read , 58 data blocks need recovery
Thu Jul 22 12 : 44 : 42 2010
Started redo application at
Thread 1 : logseq 4 , block 3156
Thu Jul 22 12 : 44 : 42 2010
Recovery of Online Redo Log : Thread 1 Group 3 Seq 4 Reading mem 0
Mem# 0 errs 0 : / u01 / app / oracle / oradata / orcl / redo3a . rdo
Mem# 1 errs 0 : / u01 / app / oracle / oradata / orcl / redo3b . rdo
Thu Jul 22 12 : 44 : 42 2010
Completed redo application
Thu Jul 22 12 : 44 : 43 2010
Completed crash recovery at -- 完成恢復
Thread 1 : logseq 4 , block 3298 , scn 2921577
58 data blocks read , 58 data blocks written , 142 redo blocks read
Thu Jul 22 12 : 44 : 43 2010
LGWR : STARTING ARCH PROCESSES
ARC0 : Archival started
ARC1 : Archival started
LGWR : STARTING ARCH PROCESSES COMPLETE
ARC1 started with pid = 17 , OS id = 4018
ARC0 started with pid = 16 , OS id = 4016
Thu Jul 22 12 : 44 : 45 2010
Thread 1 advanced to log sequence 5
Thread 1 opened at log sequence 5
Current log# 1 seq# 5 mem# 0 : / u01 / app / oracle / oradata / orcl / redo1a . rdo
Current log# 1 seq# 5 mem# 1 : / u01 / app / oracle / oradata / orcl / redo1b . rdo
Successful open of redo thread 1
Thu Jul 22 12 : 44 : 45 2010
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set --FAST_START_MTTR_TARGET 未設置
--------------------------------------------------------------------------------------------------
-- 對scott 用戶已提交,故恢復之后為已提交的狀態
SQL > SELECT * FROM scott . emp WHERE ename = 'SCOTT' ;
EMPNO ENAMEJOBMGR HIREDATESALDEPTNO
---------- ------------------------------ --------- ---------- --------- ---------- ----------
7788 SCOTTANALYST7566 19 - APR - 87355020
-- 新增加的兩條記錄未提交,實例恢復之后被回滾
SQL > SELECT * FROM scott . emp WHERE empno IN ( 2001 , 2002 );
no rows selected
八、設置FAST_START_MTTR_TARGET參數
/*
FAST_START_MTTR_TARGET 參數的作用就是減少cache recovery 的恢復時間。
當設定了FAST_START_MTTR_TARGET 值后,數據庫管理增量檢查點寫入嘗試達到設定的目標恢復時間
如果設定的值合理,則整個恢復過程將接近所設定的時間
注:當使用FAST_START_MTTR_TARGET 參數時,應當關閉FAST_START_IO_TARGET, LOG_CHECKPOINT_INTERVAL,
LOG_CHECKPOINT_TIMEOUT 參數。如果設定這些參數將會妨礙cache recovery 滿足指定的FAST_START_MTTR_TARGET值
應當為FAST_START_MTTR_TARGET 設置合理的時間值
缺省值為0, 表示關閉檢查點自動調整功能
最大值為3600, 當設定值大于3600,將被自動取整為3600
最小值為1, 當設定為時1,事實上不切合實際因此,恢復時間也不能達到設定的目標值*/
更多關于FAST_START_MTTR_TARGET參數的優化: Instance Recovery Performance Tuning : Fast - Start Fault Recovery
-- 將fast_start_mttr_target 的值置為0
SQL > alter system set fast_start_mttr_target = 0 ;
System altered .
SQL > CREATE TABLE tb_test AS SELECT * FROM all_objects WHERE 1 = 2 ; -- 新建一張表
Table created .
SQL > INSERT INTO tb_test SELECT * FROM all_objects ; -- 插入記錄到新表
49945 rows created .
-- 下面的查詢中可以看到ESTIMATED_MTTR 為28
SQL > SELECT recovery_estimated_ios , actual_redo_blks , target_mttr , estimated_mttr ,
2optimal_logfile_size FROM v$instance_recovery ;
RECOVERY_ESTIMATED_IOS ACTUAL_REDO_BLKS TARGET_MTTR ESTIMATED_MTTR OPTIMAL_LOGFILE_SIZE
---------------------- ---------------- ----------- -------------- --------------------
76211661028
SQL > COMMIT ; -- 提交事務
Commit complete .
SQL > SELECT recovery_estimated_ios , actual_redo_blks , target_mttr , estimated_mttr ,
2optimal_logfile_size FROM v$instance_recovery ;
RECOVERY_ESTIMATED_IOS ACTUAL_REDO_BLKS TARGET_MTTR ESTIMATED_MTTR OPTIMAL_LOGFILE_SIZE
---------------------- ---------------- ----------- -------------- --------------------
76711669028
-- 由上可知,commit 僅僅是將日志緩沖區的內容更新到日志文件
SQL > ALTER SYSTEM CHECKPOINT ; -- 手動更新檢查點
System altered .
SQL > SELECT recovery_estimated_ios , actual_redo_blks , target_mttr , estimated_mttr ,
2optimal_logfile_size FROM v$instance_recovery ;
RECOVERY_ESTIMATED_IOS ACTUAL_REDO_BLKS TARGET_MTTR ESTIMATED_MTTR OPTIMAL_LOGFILE_SIZE
---------------------- ---------------- ----------- -------------- --------------------
00028
-- 上面的查詢可以看到字段RECOVERY_ESTIMATED_IOS 和ACTUAL_REDO_BLKS的值已經減少到0
-- 檢查點的產生將database buffer 中的臟內容寫入到了數據文件中
--ESTIMATED_MTTR 沒有發生變化,因為該列為非實時更新列
九、更多
Oracle實例和Oracle數據庫(Oracle體系結構)
Oracle聯機重做日志文件(ONLINE LOG FILE)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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