2.4.4 視圖設(shè)計(jì)
視圖是虛擬的數(shù)據(jù)庫表,在使用時(shí)要遵循以下原則:
從一個(gè)或多個(gè)庫表中查詢部分?jǐn)?shù)據(jù)項(xiàng);
為簡(jiǎn)化查詢,將復(fù)雜的檢索或字查詢通過視圖實(shí)現(xiàn);
提高數(shù)據(jù)的安全性,只將需要查看的數(shù)據(jù)信息顯示給權(quán)限有限的人員;
視圖中假如嵌套使用視圖,級(jí)數(shù)不得超過3級(jí);
由于視圖中只能固定條件或沒有條件,所以對(duì)于數(shù)據(jù)量較大或隨時(shí)間的推移逐漸增多的庫表,不宜使用視圖;可以采用實(shí)體化視圖代替。
除非凡需要,避免類似Select * from [TableName] 而沒有檢索條件的視圖;
視圖中盡量避免出現(xiàn)數(shù)據(jù)排序的SQL語句。
2.4.5 包設(shè)計(jì)
存儲(chǔ)過程、函數(shù)、外部游標(biāo)必須在指定的數(shù)據(jù)包對(duì)象PACKAGE中實(shí)現(xiàn)。存儲(chǔ)過程、函數(shù)的建立如同其它語言形式的編程過程,適合采用模塊化設(shè)計(jì)方法;當(dāng)具體算法改變時(shí),只需要修改需要存儲(chǔ)過程即可,不需要修改其它語言的源程序。當(dāng)和數(shù)據(jù)庫頻繁交換數(shù)據(jù)是通過存儲(chǔ)過程可以提高運(yùn)行速度,由于只有被授權(quán)的用戶才能執(zhí)行存儲(chǔ)過程,所以存儲(chǔ)過程有利于提高系統(tǒng)的安全性。
存儲(chǔ)過程、函數(shù)必須檢索數(shù)據(jù)庫表記錄或數(shù)據(jù)庫其他對(duì)象,甚至修改(執(zhí)行Insert、Delete、Update、Drop、Create等操作)數(shù)據(jù)庫信息。假如某項(xiàng)功能不需要和數(shù)據(jù)庫打交道,則不得通過數(shù)據(jù)庫存儲(chǔ)過程或函數(shù)的方式實(shí)現(xiàn)。在函數(shù)中避免采用DML或DDL語句。
在數(shù)據(jù)包采用存儲(chǔ)過程、函數(shù)重載的方法,簡(jiǎn)化數(shù)據(jù)包設(shè)計(jì),提高代碼效率。存儲(chǔ)過程、函數(shù)必須有相應(yīng)的出錯(cuò)處理功能。
2.4.6 安全性設(shè)計(jì)
4.4.6.1 治理默認(rèn)用戶
在生產(chǎn)環(huán)境中,必須嚴(yán)格治理sys和system用戶,必須修改其默認(rèn)密碼,禁止用該用戶建立數(shù)據(jù)庫應(yīng)用對(duì)象。刪除或鎖定數(shù)據(jù)庫測(cè)試用戶scott 。
2.4.6.2 數(shù)據(jù)庫級(jí)用戶權(quán)限設(shè)計(jì)
必須按照應(yīng)用需求,設(shè)計(jì)不同的用戶訪問權(quán)限。包括應(yīng)用系統(tǒng)治理用戶,普通用戶等,按照業(yè)務(wù)需求建立不同的應(yīng)用角色。
用戶訪問另外的用戶對(duì)象時(shí),應(yīng)該通過創(chuàng)建同義詞對(duì)象synonym進(jìn)行訪問。
2.4.6.3 角色與權(quán)限
確定每個(gè)角色對(duì)數(shù)據(jù)庫表的操作權(quán)限,如創(chuàng)建、檢索、更新、刪除等。每個(gè)角色擁有剛好能夠完成任務(wù)的權(quán)限,不多也不少。在應(yīng)用時(shí)再為用戶分配角色,則每個(gè)用戶的權(quán)限等于他所兼角色的權(quán)限之和。
2.4.6.4 應(yīng)用級(jí)用戶設(shè)計(jì)
應(yīng)用級(jí)的用戶帳號(hào)密碼不能與數(shù)據(jù)庫相同,防止用戶直接操作數(shù)據(jù)庫。用戶只能用帳號(hào)登陸到應(yīng)用軟件,通過應(yīng)用軟件訪問數(shù)據(jù)庫,而沒有其它途徑操作數(shù)據(jù)庫。
2.4.6.5 用戶密碼治理
用戶帳號(hào)的密碼必須進(jìn)行加密處理,確保在任何地方的查詢都不會(huì)出現(xiàn)密碼的明文。
2.5 SQL編寫
2.5.1 字符類型數(shù)據(jù)
SQL中的字符類型數(shù)據(jù)應(yīng)該統(tǒng)一使用單引號(hào)。非凡對(duì)純數(shù)字的字串,必須用單引號(hào),否則會(huì)導(dǎo)致內(nèi)部轉(zhuǎn)換而引起性能問題或索引失效問題。利用trim(),lower()等函數(shù)格式化匹配條件。
2.5.2 復(fù)雜sql
對(duì)于非常復(fù)雜的sql(非凡是有多層嵌套,帶子句或相關(guān)查詢的),應(yīng)該先考慮是否設(shè)計(jì)不當(dāng)引起的。對(duì)于一些復(fù)雜SQL可以考慮使用程序?qū)崿F(xiàn)。
USER_TAB_COMMENTS 數(shù)據(jù)字典
Comment on 可加注解
2.5.3 高效性
2.5.3.1 避免In子句
使用In 或 not In子句時(shí),非凡是當(dāng)子句中有多個(gè)值時(shí),且查詢數(shù)據(jù)表數(shù)據(jù)較多時(shí),速度會(huì)明顯下降。可以采用連接查詢或外連接查詢來提高性能。
Char 比 varchar 查詢時(shí)高詢
在進(jìn)行查詢及建立索引時(shí),char比varchar的效率要高,當(dāng)然varchar在存儲(chǔ)上比char要好
2.5.3.2 避免嵌套的Select子句
這個(gè)實(shí)際上是In子句的特例。
2.5.3.3 避免使用Select * 語句
假如不是必要取出所有數(shù)據(jù),不要用*來代替,應(yīng)給出字段列表,注:不含select count(*)。
2.5.3.4 避免不必要的排序
不必要的數(shù)據(jù)排序大大的降低系統(tǒng)性能。
2.5.4 健壯性
2.5.4.1 Insert語句
使用Insert語句一定要給出要插入值的字段列表,這樣即使更改了表結(jié)構(gòu)加了字段也不會(huì)影響現(xiàn)有系統(tǒng)的運(yùn)行。
2.5.4.2 Count(*)、Count(*)、count(distinct id)的區(qū)別
Select count(*) from testtab
得到表testtab的記錄數(shù)
select count(id) from testtab
得到表testtab id字段非空記錄數(shù)
select count(distinct id) from testtab
得到表testtab id字段值非相同記錄數(shù)
2.5.4.3 Not null 為字段類型性質(zhì)的約束
本約束功能在后期無語法使期失效,可使用修改字段類型方式
alter table modify 字段名 類型 not null
alter table modify 字段名 類型
2.5.4.4 外鍵值可用null的問題
外鍵列如沒有明確說明not null,可插入null記錄(而null是在外部表的記錄中沒有的),如無可插null記錄的想法,要對(duì)外鍵字段加not null約束。
2.5.4.5 序列 sequence 跳號(hào)的問題
sequence 因回滾,系統(tǒng)崩潰(使用cache 內(nèi)的值將認(rèn)為已用),多表引用都將使其跳號(hào),所以不能用于為連續(xù)序號(hào) utl_row.cast_to_row
2.5.4.6 unicn/ intersect/ minus 使用ordey by的注重事項(xiàng)
以上語句進(jìn)行連表操作,而表同表的字段順序的類型相同但字段標(biāo)題名可不同,使用ordey by時(shí)后面假如是字段名,要求所有的表的字段標(biāo)題名相同,否則用字段的順序號(hào)
select id,name,year from user1
union
select no,name,to_number(null) year from user2
order by 1,name,year
2.5.5 安全性
2.5.5.1 Where 條件
無論在使用Select,還是使用破壞力極大的Update和Delete語句時(shí),一定要檢查Where條件判定的完整性,不要在運(yùn)行時(shí)出現(xiàn)數(shù)據(jù)的重大丟失。假如不確定,最好先用Select語句帶上相同條件來果一下結(jié)果集,來檢驗(yàn)條件是否正確。
2.5.6 完整性
有依靠關(guān)系的表,例如主外鍵關(guān)系表,在刪除父表時(shí)必須級(jí)聯(lián)刪除其子表相應(yīng)數(shù)據(jù),或則按照某種業(yè)務(wù)規(guī)則轉(zhuǎn)移該數(shù)據(jù)。9I中表中字段縮小及變類型,字段為空或表空,varchar和char長(zhǎng)度不變可任意改,字段名和表名可字段可用 ALTER TABLE table SET UNUSED (column) 設(shè)定為不可用,注重?zé)o命令再設(shè)為可用
3 備份恢復(fù)設(shè)計(jì)原則
3.1 數(shù)據(jù)庫eXP/imp備份恢復(fù)
Oracle數(shù)據(jù)庫的Exp、Imp提供了數(shù)據(jù)快速的備份和恢復(fù)手段,提供了數(shù)據(jù)庫級(jí)、用戶級(jí)和表級(jí)的數(shù)據(jù)備份恢復(fù)方式。這種方法一般作為數(shù)據(jù)庫輔助備份手段。
3.1.1 數(shù)據(jù)庫級(jí)備份原則
在數(shù)據(jù)庫的數(shù)據(jù)量比較小,或數(shù)據(jù)庫初始建立的情況下采用。不適合7*24的在線生產(chǎn)環(huán)境數(shù)據(jù)庫備份。
3.1.2 用戶級(jí)備份原則
在用戶對(duì)象表數(shù)據(jù)容量比較小、或則用戶對(duì)象初始建立的情況下使用。
3.1.3 表級(jí)備份原則
主要在以下場(chǎng)合采用的備份方式:
參數(shù)表備份
靜態(tài)表備份
分區(qū)表的分區(qū)備份。
3.2 數(shù)據(jù)庫冷備份原則
數(shù)據(jù)庫冷備份必須符合以下原則:
數(shù)據(jù)庫容量比較小。
數(shù)據(jù)庫答應(yīng)關(guān)閉的情況。
3.3 Rman備份恢復(fù)原則
這種方式適用于7*24環(huán)境下的聯(lián)機(jī)熱備份情形。
3.3.1 Catalog數(shù)據(jù)庫
單獨(dú)建立備份恢復(fù)用的數(shù)據(jù)庫實(shí)例,盡可能與生產(chǎn)環(huán)境的數(shù)據(jù)庫分開,確保catalog與生產(chǎn)數(shù)據(jù)庫的網(wǎng)絡(luò)連接良好。在9I系統(tǒng)使用良好的備份策略以可,支持完全使用控制文件保存catalog信息,備份策略如下:
backup spfile format '/data/backup/%d_SPFILE_%T_%s_%p.bak';
sql "alter system archive log current";
backup archivelog all format '/data/backup/%d_ARC_%T_%s_%p.bak' delete all input;
backup current controlfile format '/data/backup/%d_CTL_%T_%s_%p.bak';
在spfile、控制文件、數(shù)據(jù)庫全丟的情況下可通過下面的方式恢復(fù)
RMAN> connect target
connected to target database (not started)
RMAN> startup
RMAN> restore spfile from '/data/backup/COMMDB_SPFILE_20030411_9_1.bak';
SQL> startup
ORA-00205: error in identifying controlfile, check alert log for more info
RMAN> restore controlfile from 'd:/DB92_CTL_20031113_9_1.BAK';
Mout database:
RMAN> recover database;
RMAN> alter database open resetlogs;
注重:對(duì)數(shù)據(jù)庫設(shè)定控制文件保存?zhèn)浞菪畔?65天,具體語句如下。
alter system set control_file_record_keep_time=365 SCOPE=BOTH;
3.3.2 Archive Log
設(shè)置Archive Log 的位置,確保存儲(chǔ)介質(zhì)有足夠的空間來保留指定時(shí)間內(nèi)archive log的總量。
建設(shè)定期對(duì)RMAN進(jìn)行全備份,刪除冗余歸檔日志文件。
3.3.3 全備份策略
對(duì)于小容量數(shù)據(jù)庫,可以采用全備份策略。對(duì)于大容量數(shù)據(jù)庫,必須制定全備份策略方案,備份時(shí)對(duì)archive log進(jìn)行轉(zhuǎn)儲(chǔ),同時(shí)冷備份catalog 數(shù)據(jù)庫。
3.3.4 增量備份策略
對(duì)于大容量數(shù)據(jù)庫,必須制定增量備份、累積備份和全備份的周期,備份時(shí)對(duì)archive log進(jìn)行轉(zhuǎn)儲(chǔ),同時(shí)冷備份catalog 數(shù)據(jù)庫。
3.3.5 恢復(fù)原則
采用Rman腳本進(jìn)行數(shù)據(jù)庫恢復(fù)。數(shù)據(jù)庫恢復(fù)有以下幾種:
3.3.5.1 局部恢復(fù)
主要用于恢復(fù)表空間、數(shù)據(jù)文件,一般不影響數(shù)據(jù)庫其他操作。
3.3.5.2 完全恢復(fù)
數(shù)據(jù)庫恢復(fù)到故障點(diǎn),由catalog當(dāng)前數(shù)據(jù)庫決定。
3.3.5.3 不完全恢復(fù)
恢復(fù)到數(shù)據(jù)庫的某一時(shí)間點(diǎn)或備份點(diǎn)。
恢復(fù)catalog數(shù)據(jù)庫。
恢復(fù)數(shù)據(jù)庫control file 。
恢復(fù)到數(shù)據(jù)庫某一時(shí)間點(diǎn)。
重設(shè)日志序列。
3.4 備用數(shù)據(jù)庫原則
數(shù)據(jù)庫系統(tǒng)在以下情況下可以考慮采用備用數(shù)據(jù)庫data guard原則:
數(shù)據(jù)庫容量適中。
數(shù)據(jù)庫嚴(yán)格要求7*24不間斷,或間斷時(shí)間要求控制在最小范圍內(nèi)。
數(shù)據(jù)庫要求有異地備份冗余。
3.5 一些小經(jīng)驗(yàn)
使用oemc的oms時(shí),首選項(xiàng)要求是節(jié)點(diǎn)和數(shù)據(jù)庫分別加入系統(tǒng)用戶(如:administrator)和數(shù)據(jù)庫DBA用戶(system)。節(jié)點(diǎn)的系統(tǒng)用戶必須有批處理作業(yè)登錄的權(quán)限
agent 不能啟動(dòng),lisnter修改后都要手動(dòng)刪除oracle/ora9/network/agent 中的*.q文件
oracle/admin/my9i/bdump 中是用戶的出錯(cuò)日志
改變表的空間的方式alter table hr.ssss move TABLESPACE example(要重建索引); 或用imp導(dǎo)入時(shí),設(shè)定導(dǎo)入用戶只有某一表空間的使用權(quán),無RESOURCE角色和UNLIMITED TABLESPACE權(quán)限
aleter system set log_checkpoint_to_alter=true,后可報(bào)警文件發(fā)現(xiàn)checkpoint的起動(dòng)和結(jié)束時(shí)間。
3.6 系統(tǒng)調(diào)優(yōu)知識(shí)
3.6.1.1 生成狀態(tài)報(bào)表(statspack的使用)
使用(存放位置@?/rdbms/admin/)的文件生成報(bào)表用戶
@?/rdbms/admin/Spcreate.sql建表
將timed_statistics設(shè)定true
使用生成的perfstat用戶登錄,執(zhí)行以下語句手動(dòng)收集信息
Exex statspack.snap
Exec statspack.snap(I_SNAP_LEVEL=>0,I_MODEFY_PRAMETER=>TRUE) 0級(jí),最少10最大
使用下面的語句生成狀態(tài)報(bào)表
@?/rdbms/admin/SPReport.sql
其他相關(guān)文件
delete stats$snapshot ;清原來記錄數(shù)據(jù)
@?/rdbms/admin/Saputo.sql
select job from user_jobs 取用戶作業(yè)號(hào)
exec dbms_remove(作業(yè)號(hào))
timed_statistics=true要求
@?/rdbms/admin/spdrop.sql ;
3.6.1.2 sql追蹤
設(shè)定全部用戶跟蹤
alter system set sql_trace=true;
用戶級(jí)別跟蹤
alter session set sql_trace=true;
用戶的跟蹤文件生成在 admin/{pid}/udump/{pid} _ora_{ SPID}.trc 中,spid從下面語句得到
SELECT b.name bkpr, s.username, p.spid,s.sid,s.serial# FROM v$bgprocess b, v$session s, v$process p WHERE p.addr = b.paddr(+) AND p.addr = s.paddr and s.username=user;
DBA對(duì)特定用戶跟蹤
exec dbms_system_set_Sql_trace_in_session(sid,serial#,true)
信息從下面得到
SELECT b.name bkpr, s.username, p.spid,s.sid,s.serial#,osuser,s.program
FROM v$bgprocess b, v$session s, v$process p
WHERE p.addr = b.paddr(+)
AND p.addr = s.paddr;
/*p.spid用于sql_trace時(shí)日志編號(hào),dbms_system.set_sql_trace_in_session(sid,erial#,true)*/
用戶的跟蹤文件生成在 admin/{pid}/udump 中
系統(tǒng)的跟蹤文件生成在admin/{pid}/bdump/alert_{pid}.log
tkprof.exe將log文件生成格式化文本
在av Rd(ms) 20以上說明表空間使用過用頻繁,考慮將表分開其他表空間上
系統(tǒng)變量fast_start_mttr_target的值要大到不產(chǎn)生log等待,當(dāng)然也可通過加log組使其不等待
reao log大小應(yīng)為每30分鐘切換一次
建議表空間的利用率不超80%
buffer hit 要達(dá)80%以上為好
3.6.1.3 內(nèi)存調(diào)整
一般的內(nèi)存分配原則
SGA 50%(其中80% DATA BUFFER,15% SHARE POOL,5其他)
PGA30%
OS 20%
例如:2G的WINDOWS的平臺(tái),OS 300M,SAG 1.2G,PGA 500M
內(nèi)存分配的基本單位
SGA《=128M 4M
SGA》128M 64位系統(tǒng)16M,32M系統(tǒng)8M
動(dòng)態(tài)分配時(shí)總值不可大于sga_max_size
通過V$SGA_DYNAMIC_FREE_MEMORY取空閑內(nèi)存空間
在縮小時(shí)假如內(nèi)存空間實(shí)際在應(yīng)用中,CPU利用率將達(dá)100%,最后將語句出錯(cuò)。
V$SGASTAT 可看實(shí)際的使用情況
Redo log buffer一般在5M內(nèi),可通過v$sessuon_wait看是否等,v$sysstat
可也通過報(bào)警文件看是否等切換,方法可加組。可通過nologging(數(shù)據(jù)庫也要設(shè)定支持nologging)方法減少日志文件產(chǎn)生量。
java_pool 沒有設(shè)定時(shí),使用shared_pool_size
3.6.1.3.1 shared_pool
本緩沖區(qū)用于sql語句,pl sql等的對(duì)象保存
Cursor_sharing{ExactSimilarforce} 游標(biāo)共享設(shè)定
Force方式適用OLTP數(shù)據(jù)庫,Exact方式適合數(shù)據(jù)倉庫,similar為智能方式
hard parses 硬SQL語句分析,每秒要底于100次,小要加大shared_pool
soft parse 軟SQL語句分析,OLTP要達(dá)90%以上,小要加大shared_pool
不建議用無命名PL SQL段
假如有大PL SQL(存儲(chǔ)過程)對(duì)象可強(qiáng)制保存于內(nèi)存,也可加大SHARED_POOL_RESERVED_SIZE,大小不可過SHARED_POOL_SIZE的50%,不然實(shí)例不能起動(dòng)
3.6.1.3.2 db_cache
本緩沖區(qū)用于數(shù)據(jù)庫數(shù)據(jù)對(duì)象保存
db_cache_advice 為on,可以提出通過企業(yè)治理器看到系統(tǒng)建議
通過select * from v$system_event 進(jìn)行系統(tǒng)查看。
發(fā)現(xiàn)存在free buffer waits,說明不能將data buffer及時(shí)寫入data file;
可通過增加加CPU后,加db_writer_processes=CPU數(shù)改善。
也可設(shè)disk_asynch_io為true,使用異步IO(前提同要操作系統(tǒng)支持)db_writer_processes=1時(shí)(只有一個(gè)CPU的情況下),也可通加大dbwr_io_slaves來改善。db_writer_processes>1,不可用本功能
調(diào)整效果排序:異步IO>CPU>dbwr_io_slaves
Buffer Busy Waits大說明出現(xiàn)IO沖突
Buffer Busy Waits 大 和 dbbock大說明全表掃描多,說明數(shù)據(jù)不能讀入,可加大
db_cache_size來改善.
Undo block大要加大回滾段(手動(dòng)治理方式,9I默認(rèn)是自動(dòng)治理)
undo header 大要加大回滾段(手動(dòng)治理方式,9I默認(rèn)是自動(dòng)治理)
db_cache命中率99%,不是唯一因素,關(guān)系是不要出現(xiàn)等待。建議達(dá)90%以上。
內(nèi)存使用建議:
系統(tǒng)可以設(shè)三個(gè)緩沖區(qū),建表時(shí)可設(shè)定用那個(gè)緩沖區(qū)(默認(rèn)在db_cache_size)
db_cache_size (默認(rèn)區(qū))
db_keep_cache_size (常訪問,小于db_keep_cache_size的10%的表可放于本區(qū))
db_recycle_cache_size (一個(gè)事物完成后常時(shí)間不再使用,或兩倍大小于緩沖區(qū))
3.6.2 排序的優(yōu)化
9I為專用服務(wù)器時(shí)系統(tǒng)變量workarea_size_policy 設(shè)定為auto, statistics_level設(shè)定為 TYPICAL 可獲取v$pga_target_advice中的優(yōu)化建議。參數(shù)pga_aggregate_target值為所有連接用戶可用排序內(nèi)存。
9I為共享服務(wù)器時(shí)workarea_size_policy設(shè)定為menaul, sort_area_size值為每用戶排序內(nèi)存。
假如內(nèi)存不足將使用TEMP表空間進(jìn)行排序,排序使用比率disk/meme應(yīng)小于5%
盡量少用排序,假如使用排序功能,盡量在字段上加索引進(jìn)行優(yōu)化。
SQL分析模式:RBO(基于規(guī)則)方案小表(驅(qū)動(dòng)表)放在最后,優(yōu)先使用索引,對(duì)SQL語句要求嚴(yán)格(8I以前的模式);CBO (基于開銷)根據(jù)統(tǒng)計(jì)值進(jìn)行選擇開銷最少,性能最優(yōu)的最佳方式進(jìn)行,但本方式DBA(使用analyze table語句)要定期進(jìn)行分析統(tǒng)計(jì).系統(tǒng)設(shè)定通過optimizer_mode 系統(tǒng)參數(shù)
說明: 指定優(yōu)化程序的行為。假如設(shè)置為 RULE, 就會(huì)使用基于規(guī)則的優(yōu)化程序, 除非查詢含有提示。假如設(shè)置為 CHOOSE, 就會(huì)使用基于成本的優(yōu)化程序, 除非語句中的表不包含統(tǒng)計(jì)信息。ALL_ROWS 或 FIRST_ROWS
始終使用基于成本的優(yōu)化程序。
值范圍: RULE CHOOSE FIRST_ROWS ALL_ROWS
默認(rèn)值: CHOOSE
{rule(RBO)choose(自動(dòng)選擇)fist_rows fist_rows_nall_row}
3.6.3 統(tǒng)計(jì)信息
進(jìn)行某表的統(tǒng)計(jì)分析
EXECUTE dbms_stats.gather_table_stats ('HR','EMPLOYEES');
查看結(jié)果
SELECT num_rows, blocks, empty_blocks as empty,
avg_space, chain_cnt, avg_row_len
FROM dba_tables
WHERE owner = 'HR'
AND table_name = 'EMPLOYEES';
4 設(shè)計(jì)工具
統(tǒng)一使用sybase power designer設(shè)計(jì)工具,在該工具上完成物理模型的設(shè)計(jì)。
所有的數(shù)據(jù)庫對(duì)象盡可能在物理模型上進(jìn)行設(shè)計(jì),而且每個(gè)物理模型都要有相應(yīng)的文字描述。
所有的數(shù)據(jù)庫對(duì)象變更以數(shù)據(jù)庫物理模型為基準(zhǔn)。為了避免字符敏感問題,產(chǎn)生的腳本以大寫字母為標(biāo)準(zhǔn)。