ORACLE備份策略之一(精華)

第一章. 概要

1、瞭解什麼是備份
2、瞭解備份的重要性
3、理解數據庫的兩種運行方式
4、理解不同的備份方式及其區別
5、瞭解正確的備份策略及其好處

第二章. 瞭解備份的重要性

可以說,從計算機系統出世的那天起,就有了備份這個概念,計算機以其強大的速度處理能力,取代了很多人爲的工作,但是,往往很多時候,它又是那麼弱不禁風,主板上的芯片、主板電路、內存、電源等任何一項不能正常工作,都會導致計算機系統不能正常工作。當然,這些損壞可以修復,不會導致應用和數據的損壞。但是,如果計算機的硬盤損壞,將會導致數據丟失,此時必須用備份恢復數據。
其實,在我們的現實世界中,已經就存在很多備份策略,如RAID技術,雙機熱備,集羣技術發展的不就是計算機系統的備份和高可用性嗎?有很多時候,系統的備份的確就能解決數據庫備份的問題,如磁盤介質的損壞,往往從鏡相上面做簡單的恢復,或簡單的切換機器就可以了。
但是,上面所說的系統備份策略是從硬件的角度來考慮備份與恢復的問題,這是需要代價的。我們所能選擇備份策略的依據是:丟是數據的代價與確保數據不丟失的代價之比。還有的時候,硬件的備份有時根本滿足不了現實需要,假如你誤刪了一個表,但是你又想恢復的時候,數據庫的備份就變的重要了。ORACLE本身就提供了強大的備份與恢復策略,這裏我們只討論ORACLE備份策略,以下的備份都是指ORACLE數據庫備份,恢復將放到下一講中。
所謂備份,就是把數據庫複製到轉儲設備的過程。其中,轉儲設備是指用於放置數據庫拷貝的磁帶或磁盤。
能夠進行什麼樣的恢復依賴於有什麼樣的備份。作爲 DBA,有責任從以下三個方面維護數據庫的可恢復性:
·使數據庫的失效次數減到最少,從而使數據庫保持最大的可用性;
·當數據庫不可避免地失效後,要使恢復時間減到最少,從而使恢復的效率達到最高;
·當數據庫失效後,要確保儘量少的數據丟失或根本不丟失,從而使數據具有最大的可恢復性。
災難恢復的最重要的工作是設計充足頻率的硬盤備份過程。備份過程應該滿足系統要求的可恢復性。例如,如果數據庫可有較長的關機時間,則可以每週進行一次冷備份,並歸檔重做日誌,對於24*7的系統,或許我們考慮的只能是熱備份。 如果每天都能備份當然會很理想,但要考慮其現實性。企業都在想辦法降低維護成本,現實的方案纔可能被採用。只要仔細計劃,並想辦法達到數據庫可用性的底線,花少量的錢進行成功的備份與恢復也是可能的。

第三章. 瞭解ORACLE的運行方式

ORACLE數據庫有兩種運行方式:一是歸檔方式(ARCHIVELOG),歸檔方式的目的是當數據庫發生故障時最大限度恢復數據庫,可以保證不丟失任何已提交的數據;二是不歸檔方式(NOARCHIVELOG),只能恢復數據庫到最近的回收點(冷備份或是邏輯備份)。我們根據數據庫的高可用性和用戶可承受丟失的工作量的多少,對於生產數據庫,強烈要求採用爲歸檔方式;那些正在開發和調試的數據庫可以採用不歸檔方式。
如何改變數據庫的運行方式,在創建數據庫時,作爲創建數據庫的一部分,就決定了數據庫初始的存檔方式。一般情況下爲NOARCHIVELOG方式。當數據庫創建好以後,根據我們的需要把需要運行在歸檔方式的數據庫改成ARCHIVELOG方式。

3.1改變不歸檔方式爲爲歸檔方式

1.關閉數據庫,備份已有的數據,改變數據庫的運行方式是對數據庫的重要改動,所以要對數據庫做備份,對可能出現的問題作出保護。
2. 修改初試化參數,使能自動存檔修改(添加)初始化文件init[SID].ora參數:
log_archive_start=true #啓動自動歸檔
log_archive_format=ARC%T%S.arc #歸檔文件格式
log_archive_dest=/arch12/arch #歸檔路徑
8i中,可以最多有五個歸檔路徑,並可以歸檔到其它服務器,如備用數據庫(standby database)服務器
3.啓動InstanceMount狀態,即加載數據庫但不打開數據庫:
$>SVRMGRL
SVRMGRL >connect internal
SVRMGRL >startup mount
4.發出修改命令
SVRMGRL >alter database archivelog;
SVRMGRL>alter database open;

3.2 改變歸檔狀態爲不歸檔狀態

與以上步驟相同,但有些操作不一樣,主要是在以上的b操作中,現在爲刪除或註釋該參數,在d操作中,命令爲
SVRMGRL >alter database noarchivelog;
注意,從歸檔方式轉換到非歸檔方式後一定要做一次數據庫的全冷備份,防止意外事件的發生。

第四章. ORACLE備份的分類

簡單的按照備份進行的方式,可以分爲邏輯備份、冷備份(脫機備份)、熱備份(聯機備份),其實冷備份與熱備份又可以合稱爲物理備份
按照備份的工具,可以分爲EXP/IMP備份、OS拷貝、RMAN、第三方工具,如VERITAS
以下我們將從多個角度來說明以上的各種備份方式

4.1 EXP/IMP邏輯備份

導入/導出是ORACLE倖存的最古老的兩個命令行工具了,其實我從來不認爲Exp/Imp是一種好的備份方式,正確的說法是Exp/Imp只能是一個好的轉儲工具,特別是在小型數據庫的轉儲,表空間的遷移,表的抽取,檢測邏輯和物理衝突等中有不小的功勞。當然,我們也可以把它作爲小型數據庫的物理備份後的一個邏輯輔助備份,也是不錯的建議。
對於越來越大的數據庫,特別是TB級數據庫和越來越多數據倉庫的出現,EXP/IMP越來越力不從心了,這個時候,數據庫的備份都轉向了RMAN和第三方工具。下面我們還是簡要介紹一下EXP/IMP的使用。

4.1.1 使用方法

Exp parameter_name=value
Or Exp parameter_name=(value1,value2……)
只要輸入參數help=y就可以看到所有幫助
如:
C:>set nls_lang=simplified chinese_china.zhs16gbk
C:>exp -help
Export: Release 8.1.6.0.0 - Production on 星期四 4 10 19:09:21 2003
(c) Copyright 1999 Oracle Corporation. All rights reserved.
通過輸入 EXP 命令和用戶名/口令,您可以
在用戶 / 口令之後的命令:
實例: EXP SCOTT/TIGER
或者,您也可以通過輸入跟有各種參數的 EXP 命令來控制“導出”
的運行方式。要指定參數,您可以使用關鍵字:
格式: EXP KEYWORD=value KEYWORD=(value1,value2,...,valueN)
實例: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
TABLES=(T1: P1,T1: P2),如果 T1 是分區表
USERID 必須是命令行中的第一個參數。
關鍵字 說明(默認) 關鍵字 說明(默認)
--------------------------------------------------------------------------
USERID 用戶名/口令 FULL 導出整個文件 (N)
BUFFER 數據緩衝區的大小 OWNER 所有者用戶名列表
FILE 輸出文件 (EXPDAT.DMP) TABLES 表名列表
COMPRESS 導入一個範圍 (Y) RECORDLENGTH IO 記錄的長度
GRANTS 導出權限 (Y) INCTYPE 增量導出類型
INDEXES 導出索引 (Y) RECORD 跟蹤增量導出 (Y)
ROWS 導出數據行 (Y) PARFILE 參數文件名
CONSTRAINTS 導出限制 (Y) CONSISTENT 交叉表一致性
LOG 屏幕輸出的日誌文件 STATISTICS 分析對象 (ESTIMATE)
DIRECT 直接路徑 (N) TRIGGERS 導出觸發器 (Y)
FEEDBACK 顯示每 x (0) 的進度
FILESIZE 各轉儲文件的最大尺寸
QUERY 選定導出表子集的子句
下列關鍵字僅用於可傳輸的表空間
TRANSPORT_TABLESPACE 導出可傳輸的表空間元數據 (N)
TABLESPACES 將傳輸的表空間列表
在沒有警告的情況下成功終止導出。
C:>
幫助已經很詳細的說明了參數的意義和使用方法,並列舉了幾個簡單的例子,注意的是,從8i開始,已經開始支持數據子集的方法,就是可以指定自己的Where條件,可以從表中導出一行或多行數據。
注意上面的set nls_lang=simplified chinese_china.zhs16gbk,通過設置環境變量,可以讓exp的幫助以中文顯示,如果set nls_lang=American_america.字符集,那麼你的幫助就是英文的了。
增量和累計導出必須在全庫方式下才有效,而且,大多數情況下,增量和累計導出並沒有想象中的那麼有效。ORACLE9i開始,不再支持增量導出和累計導出。

4.1.2 表空間傳輸

表空間傳輸是8i新增加的一種快速在數據庫間移動數據的一種辦法,是把一個數據庫上的格式數據文件附加到另外一個數據庫中,而不是把數據導出成Dmp文件,這在有些時候是非常管用的,因爲傳輸表空間移動數據就象複製文件一樣快。
關於傳輸表空間有一些規則,即:
·源數據庫和目標數據庫必須運行在相同的硬件平臺上。
·源數據庫與目標數據庫必須使用相同的字符集。
·源數據庫與目標數據庫一定要有相同大小的數據塊
·目標數據庫不能有與遷移表空間同名的表空間
·SYS的對象不能遷移
·必須傳輸自包含的對象集
·有一些對象,如物化視圖,基於函數的索引等不能被傳輸
可以用以下的方法來檢測一個表空間或一套表空間是否符合傳輸標準:
exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true);
select * from sys.transport_set_violation;
如果沒有行選擇,表示該表空間只包含表數據,並且是自包含的。對於有些非自包含的表空間,如數據表空間和索引表空間,可以一起傳輸。
以下爲簡要使用步驟,如果想參考詳細使用方法,也可以參考ORACLE聯機幫助。
1.設置表空間爲只讀(假定表空間名字爲APP_Data APP_Index
alter tablespace app_data read only;
alter tablespace app_index read only;
2.發出EXP命令
SQL>host exp userid=”””sys/password as sysdba”””
transport_tablespace=y tablespace=(app_data, app_index)
以上需要注意的是
·爲了在SQL中執行EXPUSERID必須用三個引號,在UNIX中也必須注意避免“/”的使用
·在816和以後,必須使用sysdba才能操作
·這個命令在SQL中必須放置在一行(這裏是因爲顯示問題放在了兩行)
3.拷貝數據文件到另一個地點,即目標數據庫
可以是cp(unix)copy(windows)或通過ftp傳輸文件(一定要在bin方式)
4.把本地的表空間設置爲讀寫
5.在目標數據庫附加該數據文件
imp file=expdat.dmp userid=”””sys/password as sysdba”””
transport_tablespace=y
“datafile=(c:tempapp_data,c:tempapp_index)”
6.設置目標數據庫表空間爲讀寫
alter tablespace app_data read write;
alter tablespace app_index read write;

4.1.3 導出/導入與字符集

明白ORACLE的多國語言設置,ORACLE多國語言設置是爲了支持世界範圍的語言與字符集,一般對語言提示,貨幣形式,排序方式和CHAR,VARCHAR2,CLOB,LONG字段的數據的顯示等有效。ORACLE的多國語言設置最主要的兩個特性就是國家語言設置與字符集設置,國家語言設置決定了界面或提示使用的語言種類,字符集決定了數據庫保存與字符集有關數據(如文本)時候的編碼規則。正如剛纔上面的一個小例子,環境變量NLS_LANG的不同,導致EXP幫助發生變化,這就是多國語言設置的作用(NLS_LANG包含國家語言設置與字符集設置,這裏起作用的是國家語言設置,而不是字符集)。
ORACLE字符集設定,分爲數據庫字符集和客戶端字符集環境設置。在數據庫端,字符集在創建數據庫的時候設定,並保存在數據庫props$表中,對於8i以上產品,已經可以採用“Alter database character set 字符集”來修改數據庫的字符集,但也僅僅是從子集到超集,不要通過update props$來修改字符集,如果是不支持的轉換,可能會失去所有與字符集有關的數據,就是支持的轉換,也可能導致數據庫的不正常工作。字符集分爲單字節字符集與多字節字符集,US7ASCII就是典型的單字節字符集,在這種字符集中length=lengthb,而ZHS16GBK就是常用的雙字節字符集,在這裏lengthb=2*length
在客戶端的字符集環境比較簡單,主要就是環境變量或註冊表項NLS_LANG,注意NLS_LANG的優先級別爲:參數文件à註冊表à環境變量àalter sessionNLS_LANG的組成爲“國家語言設置.字符集”,如nls_lang=simplified chinese_china.zhs16gbk。客戶端的字符集最好與數據庫端一樣(國家語言設置可以不一樣,如zhs16gbk的字符集,客戶端可以是nls_lang =simplified chinese_china.zhs16gbkAmeircan_America.zhs16gbk,都不影響數據庫字符的正常顯示),如果字符集不一樣,而且字符集的轉換也不兼容,那麼客戶端的數據顯示與導出/導入的與字符集有關的數據將都是亂碼。
使用一點點技巧,就可以使導出/導入在不同的字符集的數據庫上轉換數據。這裏需要一個2進制文件編輯工具即可,如uedit32。用編輯方式打開導出的dmp文件,獲取23字節的內容,如00 01,先把它轉換爲10進制數,爲1,使用函數NLS_CHARSET_NAME即可獲得該字符集:
SQL> select nls_charset_name(1) from dual;
NLS_CHARSET_NAME(1)
-------------------
US7ASCII
可以知道該dmp文件的字符集爲US7ASCII,如果需要把該dmp文件的字符集換成ZHS16GBK,則需要用NLS_CHARSET_ID獲取該字符集的編號:
SQL> select nls_charset_id('zhs16gbk') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
852
852換成16進制數,爲354,把23字節的00 01換成03 54,即完成了把該dmp文件字符集從us7asciizhs16gbk的轉化,這樣,再把該dmp文件導入到zhs16gbk字符集的數據庫就可以了。(注意,十進制數與十六進制之間的轉換,想明白其中的道理)

4.1.4 跨版本使用Exp/Imp

Exp/Imp很多時候,可以跨版本使用,如在版本7與版本8之間導出導入數據,但這樣做必須選擇正確的版本,規則爲:
·總是使用IMP的版本匹配數據庫的版本,如果要導入到816,則使用816的導入工具。
·總是使用EXP的版本匹配兩個數據庫中低的那個版本,如在815816之間互導,則使用815EXP工具。

4.2 OS備份

操作系統備份有兩類,冷備份(Cold backup)與熱備份(Hot backup),操作系統備份與以上的邏輯備份有本質的區別。邏輯備份提取數據庫的數據內容,而不備份物理數據塊。而操作系統備份則是拷貝整個的數據文件。

4.2.1 冷備份

在文件級備份開始前數據庫必須徹底關閉。關閉操作必須用帶有normalimmediatetransaction選項的shutdown來執行。
數據庫使用的每個文件都被備份下來,這些文件包括:
☆所有數據文件
☆所有控制文件
☆所有聯機REDO LOG 文件
INIT.ORA文件(可選)
作冷備份一般步驟是:
a. 正常關閉要備份的實例(instance);
b. 備份整個數據庫到一個目錄
c. 啓動數據庫
SVRMGRL>connect internal
SVRMGRL >shutdown immediate
SVRMGRL >! cp <file> <backup directory>
SVRMGRL >!tar cvf /dev/rmt/0 /u01/oradata/prod
SVRMGRL >startup
注意:如果利用腳本對數據庫進行冷備份,必須對關閉數據庫的命令進行邏輯檢查,如果發生關閉數據庫的命令不能正常執行而導致數據庫沒有正常關閉,那麼,所有的冷備份將回是無效的。

4.2.2熱備份

熱備份是當數據庫打開並對用戶有效是的OS級的數據備份。熱備份只能用於ARCHIVELOG方式的數據庫。在數據文件備份之前,對應的表空間必須通過使用ALTER TABLESPACE …… BEGIN BACKUP以備份方式放置。然後組成表空間的數據文件可以使用類似冷備份的操作系統命令進行拷貝。在數據文件用操作系統命令拷貝後,應使用ALTER TABLESPACE …… END BACKUP命令使表空間脫離熱備份方式。
熱備份沒有必要備份聯機日誌,但必須是歸檔狀態,在實例恢復的時候,可能需要用到歸檔日誌。當前聯機日誌一定要保護好或是處於鏡相狀態,當前聯機日誌的損壞,對於數據庫的損壞是巨大的,只能以數據的丟失來進行數據庫的恢復工作。
對於臨時表空間,存放的是臨時信息,在熱備份是也可以考慮不用備份,如果臨時文件發生故障,可以刪除該數據文件與表空間,重建一個臨時表空間。
熱備份的優點是顯而易見的
---- a.可在表空間或數據文件級備份,備份時間短。
---- b.備份時數據庫仍可使用。
---- c.可達到秒級恢復(恢復到某一時間點上)。
---- d.可對幾乎所有數據庫實體作恢復。
---- e.恢復是快速的,在大多數情況下在數據庫仍工作時恢復。
操作系統作熱備份的一般步驟爲:
1. 連接數據庫
SVRMGRL>connect internal;
2. 將需要備份的表空間(如User)設置爲備份方式
SVRMGRL>Alter tablespace User begin backup;
3. 拷貝數據文件
SVRMGRL>!cp /u01/oradata/prod/user01.ora /backup/prod/user01.ora
Or
$cp cp /u01/oradata/prod/user01.ora /backup/prod/user01.ora
4. 在數據文件拷貝完成後,將表空間拖體備份方式
SVRMGRL>Alter tablespace User end backup;
5. 對所有需要備份的表空間重複234
6. 使用如下的命令備份控制文件ALTER DATABSE …… BACKUP CONTROLFILE
如備份成二進制文件
alter database backup controlfile to ‘new fielname’;
備份成文本文件
alter database backup controlfile to trace;
因爲熱備份的時候,用戶還在操作數據庫,所以,最好是每個表空間處於備份狀態的時間最短,這樣就要求一個表空間一個表空間的備份,不要一起使表空間處於備份狀態而同時拷貝數據文件。
注意:如果在熱備份的時候如果數據庫中斷(如斷電),那麼在重新啓動數據庫的時候,數據庫將提示有數據文件需要恢復,你需要把正在斷電時候的處於備份狀態的數據文件通過ALTER TABLESPACE …… END BACKUP結束備份方式。具體哪個數據文件或表空間處於備份狀態,可以通過v$backupv$datafile來獲得

4.3 RMAN(備份與恢復管理器)

4.3.1 使用RMAN進行備份

4.3.1.1 瞭解RMAN

Recovery managerRMAN)是ORACLE提供的DBA工具,用語管理備份和恢復操作。RMAN只能用於ORACLE8或更高的版本中。它能夠備份整個數據庫或數據庫部件,其中包括表空間、數據文件,控制文件和歸檔文件。RMAN可以按要求存取和執行備份和恢復。
RMAN備份有如下優點
支持在線熱備份
支持多級增量備份
支持並行備份、恢復
減少所需要備份量
備份、恢復使用簡單
重要的是,使用恢復管理器允許您進行增量數據塊級的備份(這個與導出/導入的增量截然不同)。增量RMAN備份是時間和空間有效的,因爲他們只備份自上次備份以來有變化的那些數據塊。另一個空間有效的RMAN特性是它只備份數據文件中使用的數據塊,忽略空的,未用的數據塊,這個對於預分配空間的表空間有很大的好處。
9i開始,還增加了RMAN的數據塊級別的恢復,可以進一步減少數據庫恢復時間。
RMAN支持以下不同類型的備份
FULL 數據庫全備份,包括所有的數據塊
INCREMENTAL 增量備份,只備份自上次增量備份以來修改過的數據塊。需要一個0級的增量作爲增量的基礎,可以支持7級增量。
OPEN 在數據庫打開的時候使用
CLOSED
在數據庫安裝(MOUNT)但不打開的時候備份,關閉備份可以是CONSISTENTIN CONSISTENT類型的。
CONSISTENT
在數據庫安裝,單不打開,並且在安裝之前數據庫被徹底關閉(而不是被破壞或異常退出)時使用。CONSISTENT備份可以簡單的進行復原(RESTORE)而不是恢復(RECOVER)
INCONSISTENT 在數據庫打開或安裝(但不打開)時使用。在該數據庫正常關閉或崩潰後,INCONSISTENT備份需要恢復。
理解BACKUPRESTORERECOVER命令,這是RMAN最基本的三個命令,可以進行數據庫的備份,復原以及恢復操作。

4.3.1.2 瞭解恢復目錄

理解恢復目錄,RMAN可以在沒有恢復目錄(NOCATALOG)下運行,這個時候備份信息保存在控制文件。保存在控制文件的備份信息是很危險的,如果控制文件的破壞將導致備份信息的丟失與恢復的失敗,而且,沒有恢復目錄,很多RMAN的命令將不被支持。所以對於重要的數據庫,建議創建恢復目錄,恢復目錄也是一個數據庫,只不過這個數據庫用來保存備份信息,一個恢復目錄可以用來備份多個數據庫。
創建RMAN目錄,以下步驟說明了在一個數據庫中盡力RMAN目錄的過程。
1.爲目錄創建一個單獨的表空間
SQL>Create tablespace tools datafile ‘fielname’ size 50m;
2.創建RMAN用戶
SQL>Create user RMAN identified by RMAN default tablespace tools temporary tablespace temp;
3.RMAN授予權限
SQL>Grant connect , resource , recovery_catalog_owner to rman;
4.打開RMAN
$>RMAN
5.連接數據庫
RMAN>connect catalog rman/rman
6.創建恢復目錄
RMAN>Create catalog tablespace tools
註冊目標數據庫,恢復目錄創建成功後,就可以註冊目標數據庫了,目標數據庫就是需要備份的數據庫,一個恢復目錄可以註冊多個目標數據庫,註冊目標數據庫的命令爲:
$>RMAN target internal/password catalog rman/rman@rcdb;
RMAN>Register database;
數據庫註冊完成,就可以用RMAN來進行備份了,更多命令請參考ORACLE聯機手冊或《ORACLE8i備份與恢復手冊》。
註銷數據庫不是簡單的在RMAN提示下反註冊就可以了,需要運行一個程序包,過程如下:
1. 連接目標數據庫,獲得目標數據庫ID
$> RMAN target internal/password catalog rman/rman@rcdb;
RMAN-06005: connected to target database: RMAN (DBID=1231209694)
2. 查詢恢復目錄,得到更詳細的信息
SQL> SELECT db_key, db_id FROM db WHERE db_id = 1231209694;
DB_KEY DB_ID
---------- ---------------
1 1237603294
1 row selected.
3. 運行過程dbms_rcvcat.unregisterdatabase註銷數據庫,如
SQL> EXECUTE dbms_rcvcat.unregisterdatabase(1 , 1237603294)

4.3.1.3 採用RMAN進行備份

RMAN使用腳本來備份數據庫,以下是RMAN進行備份的幾個例子。
1.備份整個數據庫
backup full tag ‘basicdb’ format ‘/bak/oradata/full_%u_%s_%p’ database;
2.備份一個表空間
backup tag ‘tsuser’ format ‘/bak/oradata/tsuser_%u_%s_%p’ tablespace users;
3.備份歸檔日誌
backup tag ‘alog’ format ‘/bak/archivebak/arcbak_%u_%s_%p’ archivelog all delete input;

4.3.2 維護RMAN

4.3.2.1 查看RMAN的信息

檢查現有備份
RMAN>list backup
列出過期備份
RMAN>report obsolete
刪除過期的備份
RMAN>allocate channel for maintenance type disk;
RMAN>change backupset id delete;
RMAN>release channel;

4.3.2.2 同步或重置RMAN

如果目標數據庫物理對象發生了變化,如添加了一個數據文件,需要用如下命令同步:
RMAN>resync catalog;
如果目標數據庫reset了數據庫,需要用如下命令同步
RMAN>reset database;
當手工刪除了數據庫的歸檔文件後,要執行以下腳本同步
RMAN>allocate channel for maintenance type disk;
RMAN> change archivelog all crosscheck;
RMAN>release channel;
當手工刪除了數據庫的RMAN備份後,要執行以下腳本來同步
RMAN>allocate channel for maintenance type disk;
RMAN>crosscheck backup;
RMAN>delete expire backup;
RMAN>release channel;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章