1. 程式人生 > >Oracle資料庫物件的邏輯、物理、記憶體結構

Oracle資料庫物件的邏輯、物理、記憶體結構

Oracle資料庫物件的邏輯、物理、記憶體結構

一、先談談資料庫和例項:

例項是個動態概念,它由一系列程序和記憶體區域組成;而資料庫是個靜態概念,主要指的是構成資料庫的一系列檔案。一般情況下例項與資料庫是一對一的,但是在多例項資料庫環境下,一個數據庫可以對應多個例項。例項 instance =程序 + 程序所使用的記憶體(SGA)
資料庫 database=物理作業系統檔案或磁碟(disk)的集合(redo檔案+control檔案+data檔案+臨時檔案)資料庫例項也稱作伺服器, 是用來訪問資料庫檔案集的儲存結構及後臺程序的集合.
1
、一個數據庫可以被多個例項訪問(稱為真正的應用群集選項).
2

、一個例項在其生存期內只能裝載(alterdatabase mount)和開啟(alterdatabase open)一個數據庫
3
Oracle的例項在啟動以後,只能load一次資料庫,如果想把資料庫與Instance斷開,然後再重新掛在一個數據庫Instance,那麼就需要你首先把資料庫Instance程序結束,然後重新建立這個instance的一個程序,再load另外一個數據庫。否則肯定要拋除ORA-16169錯誤,說資料庫已經被開啟。因為一個數據庫Instance在其生存期中最多隻能load和開啟一個instance.
4
、另外例項可以在沒有資料檔案的情況下單獨啟動 startup nomount ,
通常沒什麼意義。

二、資料庫的邏輯和物理結構

資料庫(例項)——X表空間——X——X擴充套件(區)——X資料塊--OS Block對應的資料字典:
v$database--dba_tablespaces
user_tablespaces-- dba_segmentsuser_segments--dba_extentsuser_Extents--extent(或segment)表中的一個欄位BLOCKS
資料庫、表空間、段、擴充套件、資料塊為邏輯結構資料檔案(dba_data_files)、作業系統塊為物理結構

資料檔案有以下型別:

1.資料檔案(DataFile

資料檔案用來儲存資料庫中的全部資料,例如資料庫表中的資料和索引資料

.通常以為*.dbf格式,例如:userCIMS.dbf

2.日誌檔案(RedoLogFile

日誌檔案用於記錄資料庫所做的全部變更(如增加、刪除、修改)、以便在系統發生故障時,用它對資料庫進行恢復。名字通常為Log*.dbf格式,如:Log1CIMS.dbf,Log2CIMS.dbf。  

3.控制檔案(ControlFile

每個Oracle資料庫都有相應的控制檔案,它們是較小的二進位制檔案,用於記錄資料庫的物理結構,如:資料庫名、資料庫的資料檔案和日誌檔案的名字和位置等資訊。用於開啟、存取資料庫。名字通常為Ctrl*ctl格式,如Ctrl1CIMS.ctl。  

4.配置檔案

配置檔案記錄Oracle資料庫執行時的一些重要引數,如:資料塊的大小,記憶體結構的配置等。名字通常為init*.ora格式,如:tnsname.ora。  

段(segment)是一種在資料庫中消耗物理儲存空間的任何實體,在12c中段的型別由:表(table),索引(Index),回滾(Rollback),分割槽等12種組成,下面的sql可檢視所有段的型別。

SQL> select distinctsegment_type from dba_segments;

SEGMENT_TYPE

------------------------------------------------------

LOBINDEX

INDEX PARTITION

TABLE SUBPARTITION

ROLLBACK

TABLE PARTITION

NESTED TABLE

LOB PARTITION

LOBSEGMENT

INDEX

TABLE

TYPE2 UNDO

SEGMENT_TYPE

------------------------------------------------------

CLUSTER

已選擇12行。

表和段的關係:表是段的一種(一個表可對應一個或多個段),但段不一定是表。表是邏輯物件;段是物理儲存物件

通過下面的sql語句可以檢視某個表空間的段、區、塊的分佈情況。

SQL> set pagesize 100;

SQL> col SEGMENT_NAME format a20

SQL> select SEGMENT_NAME,extent_id,block_id,blocks,bytes  fromdba_extents where  tablespace_name='USERS';

SEGMENT_NAME           EXTENT_ID   BLOCK_ID    BLOCKS            BYTES

-------------------- -------------------- ---------- ----------

OJDS$PERM_INDEX0168 865536

OJDS$NODE_INDEX0136 865536

SYS_C005161                     0152 865536

OJDS$PERMISSIONS$ 0160 865536

OJDS$INODE$      0128 865536

OJDS$BINDINGS$   0144 865536

PK_EMP                          0 200865536

PK_DEPT                 0184 865536

SALGRADE               0 216865536

BONUS                           0 208865536

EMP                             0 192865536

DEPT                            0 176865536

已選擇12行。

DBA_TABLESPACES記錄的是表空間的邏輯資訊,而DBA_DATA_FILES檢視則記錄的是物理資料檔案的資訊,這些資訊包括資料檔案的名稱、大小、所屬表空間等資訊:

SQL> selectfile_id,relative_fno,file_name,tablespace_name,round(bytes/1024/1024,2) MB from dba_data_files;

可以通過DBA_SEGMENTS查詢資料庫中段的資訊,這些資訊包括物件名稱、型別、所屬表空間、空間使用等資訊。DBA_EXTENTS檢視記錄了Segment中區的分配情況,可以通過以下兩個查詢獲得某個使用者每個區的分配情況:

SQL> select distinct OWNER from dba_extents ;

OWNER

--------------------------------------------------------------------------------

APEX_040200

MDSYS

MYMOTIF

OUTLN

CTXSYS

SYSTEM

AUDSYS

DVSYS

SCOTT

GSMADMIN_INTERNAL

ORDSYS

DBSNMP

OJVMSYS

ORDDATA

XDB

SYS

LBACSYS

WMSYS

已選擇18行。

SQL> col SEGMENT_NAME format a20

SQL> selectsegment_name,file_id,extent_id,block_id,blocks from dba_extents where OWNER='SCOTT';

SEGMENT_NAME              FILE_ID EXTENT_ID   BLOCK_ID        BLOCKS

-------------------- -------------------- ---------- ----------

SALGRADE               602168

PK_EMP                          602008

PK_DEPT                 601848

EMP                                601928

DEPT                            601768

BONUS                           602088

已選擇6行。

資料庫邏輯上最小的單元就是data block, block 可以設定為2K, 4K, 8K....

利用dba_tablespaces可以用來檢視所有表空間的基本資訊;而dba_data_files可以用來檢視相關資料檔案的資訊(需要管理員許可權)。

例:

1、檢視當前資料庫所有表空間:

SQL> select TABLESPACE_NAME fromdba_tablespaces;

TABLESPACE_NAME

---------------

SYSTEM

SYSAUX

UNDOTBS1

TEMP

USERS

MYMOTIF_TS

已選擇6行。

2、查詢當前資料庫中的所有表空間和對應的作業系統資料檔案:

SQL> col FILE_NAME format a40

SQL> selectfile_name,tablespace_name from dba_data_files;

FILE_NAME                                   TABLESPACE_NAME

-------------------------------------------------------

/u01/app/oracle/oradata/xe/system01.dbf  SYSTEM

/u01/app/oracle/oradata/xe/sysaux01.dbf  SYSAUX

/u01/app/oracle/oradata/mymotif_ts.dbf      MYMOTIF_TS

/u01/app/oracle/oradata/xe/users01.dbf      USERS

/u01/app/oracle/oradata/xe/undotbs01.dbfUNDOTBS1

3、當前使用者(scott)下的資料段:

SQL>  descuser_segments

名稱是否為空? 型別

-----------------------------------------------------------------------------

SEGMENT_NAMEVARCHAR2(128)

PARTITION_NAMEVARCHAR2(128)

SEGMENT_TYPEVARCHAR2(18)

SEGMENT_SUBTYPEVARCHAR2(10)

TABLESPACE_NAMEVARCHAR2(30)

BYTESNUMBER

BLOCKSNUMBER

EXTENTSNUMBER

INITIAL_EXTENTNUMBER

NEXT_EXTENTNUMBER

MIN_EXTENTSNUMBER

MAX_EXTENTSNUMBER

MAX_SIZENUMBER

RETENTIONVARCHAR2(7)

MINRETENTIONNUMBER

PCT_INCREASENUMBER

FREELISTSNUMBER

FREELIST_GROUPSNUMBER

BUFFER_POOLVARCHAR2(7)

FLASH_CACHEVARCHAR2(7)

CELL_FLASH_CACHEVARCHAR2(7)

INMEMORYVARCHAR2(8)

INMEMORY_PRIORITYVARCHAR2(8)

INMEMORY_DISTRIBUTEVARCHAR2(15)

INMEMORY_DUPLICATEVARCHAR2(13)

INMEMORY_COMPRESSIONVARCHAR2(17)

SQL> columnTABLESPACE_NAMEformata20

SQL> columnSEGMENT_NAMEformata20

SQL> selectSEGMENT_NAME,TABLESPACE_NAMEfromuser_segments;

SEGMENT_NAME          TABLESPACE_NAME

-------------------- --------------------

COURSE                MYMOTIF_TS

SC                    MYMOTIF_TS

STUDENT      MYMOTIF_TS

SYS_C0010000          MYMOTIF_TS

SYS_C0010005          MYMOTIF_TS

SYS_C0010008          MYMOTIF_TS

已選擇6行。

12csysdba下有3000多條記錄)

SQL>  selectSEGMENT_NAME,EXTENT_IDfromuser_extents;

SEGMENT_NAME           EXTENT_ID

-------------------- ----------

STUDENT                 0

COURSE                          0

SC                              0

SYS_C0010000                    0

SYS_C0010005                    0

SYS_C0010008                    0

已選擇6行。

12csysdba下有4920條記錄)

基本上每個物件對應一個段( Segment),只有分割槽對應多個段,這裡的物件包括表、檢視、序列、同意詞、索引、觸發器、儲存.過程等等,段可以跨越多個數據檔案。

三、Oracle Server系統程序與記憶體結構  

  當在計算機伺服器上啟動Oracle資料庫後,稱伺服器上啟動了一個Oracle例項(Instance)。ORACLE 例項(Instance)是存取和控制資料庫的軟體機制,它包含系統全域性區(SGA)和ORACLE程序兩部分。SGA是系統為例項分配的一組共享記憶體緩衝區,用於存放資料庫例項和控制資訊,以實現對資料庫中資料的治理和操作。    程序是作業系統中一個極為重要的概念。一個程序執行一組操作,完成一個特定的任務.ORACLE資料庫治理系統來說,程序由使用者程序、伺服器程序和後臺程序所組成。    當用戶執行一個應用程式時,系統就為它建立一個使用者程序。伺服器程序處理與之相連的使用者程序的請求,它與使用者程序相通訊,為相連的使用者程序的ORACLE請求服務。    為了提高系統性能,更好地實現多使用者功能,ORACLE還在系統後臺啟動一些後臺程序,用於資料庫資料操作。  

系統程序的後臺程序主要包括:

SMON 系統監控程序:(system monitor)負責完成自動例項恢復和回收分類(sort)表空間。

PMON 程序監控程序:(PRocess monitor)實現使用者程序故障恢復、清理記憶體區和釋放該程序所需資源等。

DBWR 資料庫寫程序:資料庫緩衝區的治理程序。

在它的治理下,資料庫緩衝區中總保持有一定數量的自由緩衝塊,以確保使用者程序總能找到供其使用的自由緩衝塊。

LGWR 日誌檔案寫程序:是日誌緩衝區的治理程序,負責把日誌緩衝區中的日誌項寫入磁碟中的日誌檔案上。每個例項只有一個LGWR程序。

ARCH 歸檔程序:(archiver process)把已經填滿的線上日誌檔案拷貝到一個指定的儲存裝置上。僅當日志文件組開關(switch)出現時,才進行ARCH操作。ARCH不是必須的,而只有當自動歸檔可使用或者當手工歸檔請求時才發出。

RECO 恢復程序:是在具有分散式選項時使用的一個程序,主要用於解決引用分散式事務時所出現的故障。它只能在答應分散式事務的系統中出現。

LCKn 封鎖程序:用於並行伺服器系統,主要完成例項之間的封鎖。

記憶體結構(SGA

SGAOracle為一個例項分配的一組共享記憶體緩衝區,它包含該例項的資料和控制資訊。SGA在例項啟動時被自動分配,當例項關閉時被收回。資料庫的所有資料操作都要通過SGA來進行。  SGA中記憶體根據存放資訊的不同,可以分為如下幾個區域:
1
Buffer Cache:存放資料庫中資料庫塊的拷貝。它是由一組緩衝塊所組成,這些緩衝塊為所有與該例項相連結的使用者程序所共享。緩衝塊的數目由初始化引數DB_BLOCK_BUFFERS確定,緩衝塊的大小由初始化引數DB_BLOCK_SIZE確定。大的資料塊可提高查詢速度。它由DBWR操作。

2、日誌緩衝區Redo Log Buffer:存放資料操作的更改資訊。它們以日誌項(redo entry)的形式存放在日誌緩衝區中。當需要進行資料庫恢復時,日誌項用於重構或回滾對資料庫所做的變更。日誌緩衝區的大小由初始化引數LOG_BUFFER確定。大的日誌緩衝區可減少日誌檔案I/O的次數。後臺程序LGWR將日誌緩衝區中的資訊寫入磁碟的日誌檔案中,可啟動ARCH後臺程序進行日誌資訊歸檔。
3
、共享池Shared Pool:包含用來處理的SQL語句資訊。它包含共享SQL區和資料字典儲存區。共享SQL區包含執行特定的SQL語句所用的資訊。資料字典區用於存放資料字典,它為所有使用者程序所共享。
4
Cursors:一些記憶體指標,執行待處理的SQL語句 
5
、其他資訊區:除了上述幾個資訊區外,還包括一些程序之間的通訊資訊(如封鎖資訊);在多線索伺服器配置下,還有一些程式全域性區的資訊,請求佇列和響應佇列等。

--------------------------------------------------------------------------

後臺程序詳解

oracle中的程序共分為三類:使用者程序、服務程序、後臺程序。其中後臺程序伴隨例項的啟動而啟動,他們主要是維護資料庫的穩定,相當於一個企業中的管理者及內部服務人員。他們並不會直接給使用者提供服務。
1:database write(DBWn(n
代表數字1..n,表示可能有幾個DBW在執行)--資料寫入作用:SGA中被修改的資料同步到磁碟檔案中。保證Buffer Cache中有足夠的空閒資料塊數量。觸發條件: 1、檢查點
             2
、一個服務程序在設定的時間內沒有找到空閒塊
             3
、每三秒自動喚醒一次。設定:DB_WRITER_PROCESS用來定義DBWn程序數量。(commit命令只是把記錄修改寫入日誌檔案,不是把修改後的資料寫入資料檔案)

2:log write(LGWR)--日誌檔案寫入作用:log buffer中的日誌內容寫入聯機的日誌檔案中,釋放log使用者buffer空間。觸發條件:1、使用者發出commit命令。(oracle中稱為快速提交機制(fast commit)):redo log buffer中的記錄寫入日誌檔案,寫入一條提交的記錄
            2
、三秒定時喚醒。
            3
log buffer超過1/3,或日誌數量超過1M
            4
DBWR程序觸發:DBWn檢視將髒資料塊寫入磁碟先檢測他的相關redo記錄是否寫入聯機日誌檔案,如果沒有就通知LGWR程序。在oracle中成為提前寫機制(write ahead):redo記錄先於資料記錄被寫入磁碟

3:checkpoint(CKPT)-檢查點事件作用:維護資料庫一致性狀態。檢測點時刻資料檔案與SGA中的內容一致,這不是一個單獨的程序,要和前兩個程序一起工作呦。DBWR寫入髒資料,同時觸發LGWR程序。
      CKPT
更新控制檔案中的檢查點記錄。觸發條件:日誌切換(log switch)會觸發檢查點。

4:process monitor(PMON)--程序監控作用:1、發現使用者程序異常終止,並進行清理。釋放佔用資源。(清理異常終止使用者使用的鎖)
        2
、向監聽程式動態的註冊例項。觸發條件:定時被喚醒,其他程序也會主動喚醒它。

5:system monitor:(SMON)--系統監控作用:1、負責例項恢復,前滾(Roll Forward)恢復到例項關閉的狀態,使用最後一次檢查點後的日誌程序重做。這時包括提交和未提交的事務。開啟資料庫,進行回滾(Roll Back):回滾未提交的事務。(oracle承諾commit之後資料不會丟失,現在我們可以大致的瞭解是如何實現這個承諾,以及在資料的安全性和資料庫效能之間的平衡選擇。)
        2
、負責清理臨時段,以釋放空間觸發條件:定期被喚醒或者被其他事務主動喚醒。

6:archive:(ARCn)--歸檔操作作用:發生日誌切換時把寫滿的聯機日誌檔案拷貝到歸檔目錄中。觸發條件:日誌切換時被LGWR喚醒。設定:LOG_ARCHIVE_MAX_PROCESSES可以設定oracle啟動的時候ARCn的個數。

7:manageability monitor:MMON--AWR主要的程序作用:1、收集AWR必須的統計資料,把統計資料寫入磁碟。10g中儲存在SYSAUX表空間中。
        2
、生成server--generated報警每小時把shared pool中的統計資訊寫入磁碟,或者shared pool佔用超過15%

8:manageability monitor light:MMNL:輕量級的MMON

9:memory manager:MMAN:自動內容管理作用:每分鐘都檢查AWR效能資訊,並根據這些資訊來決定SGA元件最佳分佈。設定:STATISTICS_LEVEL:統計級別
        SGA_TARGET:SGA
總大小

10:job queue coordinator:CJQ0--資料庫定時任務

11:recover writer:RVWR
  
作用:flashback database提供日誌記錄。把資料塊的前映象寫入日誌。

12:change tarcking writer:CTWR
  
作用:跟蹤資料塊的變化,把資料塊地址記錄到 change_tracking file檔案中。RMAN的增量備份將使用這個檔案來確定那些資料塊發生了變化,並進行備份。

以上是oracle中比較常見的後臺程序,不是所有的程序。其中DBWnARCn可以設定資料庫啟動時的數量。這些程序在系統中可以不止一個。

相關推薦

Oracle資料庫物件邏輯物理記憶體結構

Oracle資料庫物件的邏輯、物理、記憶體結構 一、先談談資料庫和例項: 例項是個動態概念,它由一系列程序和記憶體區域組成;而資料庫是個靜態概念,主要指的是構成資料庫的一系列檔案。一般情況下例項與資料庫是一對一的,但是在多例項資料庫環境下,一個數據庫可以對應多個例項。例項

oracle資料庫物件詳解(一)——表檢視同義詞約束索引

oracle資料庫物件是資料庫的組成部分。資料庫物件包括表,檢視,同義詞,約束、索引,序列,遊標,觸發器,函式,變數,(控制塊,異常),儲存過程,包。對資料庫的操作可以基本歸結為對資料物件的操作,常常用CREATE命令進行建立,可以使用ALTER命令修改,用DROP執行刪除操作等。 一、表

Oracle-資料庫物件(indexsynonsymviewsequencetablespace)

同義詞synonym 同義詞是資料庫物件的一個別名,Oracle可以為表、檢視、序列、過程、函式、程式包等指定一個別名 有私有同義詞,公有同義詞 建立同義詞 create [ or replace ] [ public ] sysnonym 同義詞

Oracle資料庫邏輯結構未完待續

這是一張非常基本同時也是非常重要的結構圖。物理結構很簡單,就是作業系統物理塊組成資料檔案,對於作業系統來說,資料檔案跟其他非資料庫檔案沒有區別。重點是邏輯結構。 oracle資料庫從邏輯儲存結構上來講

Oracle資料庫中查詢所有觸發器儲存過程檢視

在Oracle資料庫中查詢所有觸發器、儲存過程、檢視、表 方法一: Select object_name From user_objects Where object_type='TRIGGER';  --所有觸發器 Select object_name From user_objects Where ob

Oracle資料庫學習3之修改插入更新語句

修改語句:alter語句 1.增加一列:alter table 表名 add (欄位名 欄位型別)2.刪除一列:alter table 表名 drop(列名)3.修改某一列的名字:alter table 表名 rename column 舊名 to 新名4.修改某一列的屬性

Oracle 資料庫使用者(user)的建立刪除以及授予許可權

---------------------------------------------------------------Oracle 資料庫使用者建立學習------------------------------------------------------建立使用

常用的Oracle資料庫物件的使用

常用的Oracle的資料庫物件介紹:表、檢視、序列、索引、同義詞、約束、儲存過程、儲存函式、包和包體、觸發器 檢視    view create or replace view empinfoview     as     &nb

oracle資料庫邏輯構成(表空間,schema,user,段,區,塊)

本篇著重從資料庫的邏輯構成方面來說明oracle的體系結構,以及邏輯構成中所涉及的相關名詞的概念和相互間的關係。 1       名詞概念          資料庫 資料庫是由表空間組成的,我們可以建立資料庫併為其指定各種表空間. Schema database obje

Oracle資料庫物件簡介

Oracle資料庫資料物件中最基本的是表和檢視,其他還有約束、序列、函式、儲存過程、包、觸發器等。對資料庫的操作可以基本歸結為對資料物件的操作,理解和掌握Oracle資料庫物件是學習Oracle的捷徑。   表和檢視   Oracle中表是資料儲存的基本結構。ORACL

oracle資料庫物件

一、同義詞 1.概念:可以直接輸入其他使用者所擁有的表名,而不是通過使用者名稱、表名 2.優點:隱藏物件的名稱和所有者;對於分散式資料庫系統起到了透明位置的作用 3.型別:       私有:普通使用者建立,並且由建立該同義詞的使用者使用       公有:公用的同義詞必須

Oracle 體系結構邏輯物理存儲結構之間的關系

相關 性能 不同 檢測 一個 instance 控制 運行 不存在 Oracle數據庫從物理存儲中完全抽象出邏輯存儲。邏輯數據存儲采用“段”的形式。段的類型有很多種:典型的段是“表”。這些段以物理形式存儲在數據文件中。通過表空

Oracle資料庫邏輯備庫可以用於plsql的除錯嗎?

ORA-16224: Database Guard is enabled 我們可以通過設定 ALTER DATABASE GUARD none; 的方式來解決, 甚至可以針對 某些表進行設定,不同步, exec dbms_logstdby.skip('DML','HR',

Oracle--資料庫體系結構物理結構邏輯結構記憶體結構及後臺程序)

Oracle資料庫的體系結構包括四個方面:資料庫的物理結構、邏輯結構、記憶體結構及程序。   1. 物理結構      物理資料庫結構是由構成資料庫的作業系統檔案所決定,Oracle資料庫檔案包括:  1.1.資料檔案(Data File)     資料檔案用來儲存資料庫中

Oracle物理結構邏輯結構記憶體結構

資料庫(Database) 資料庫是一個數據的集合,不僅是指物理上的資料,也指物理、儲存及程序物件的一個組合。Oracle是一個基於B/S模式的關係型資料庫管理系統(RDBMS)。 Oracle系統體系結構由三部分組成:邏輯結構、物理結構和例項。 一、Oracl

oracle的體系結構物理結構記憶體結構邏輯結構

一、oracle例項:     oracle例項是由一組後臺程序和記憶體結構組成,可以看成是使用者與資料庫之間的橋樑;     oracle資料庫是一系列物理資料檔案的集合(如控制檔案,資料檔案,引數檔案,日誌檔案,臨時檔案等)。     它們的關係:例項可以在沒有資料檔案

oracle中的資料庫使用者方案表空間物件之間的關係 .

最近在學習oracle,給我的第一個感覺就是甲骨文的體系太龐大了(因為我之前一直使用的是mysql,輕量級的資料庫)。而開始遇到的最糾結的問題,就是怎麼理清oracle中資料庫、使用者、方案、表空間、表物件之間的關係,如果這個問題搞不清楚,接下來的學習也就會雨裡霧裡了。所以,下定決心一定把它研究清楚

修改sqlserver的資料庫物理名稱和邏輯檔名

最近在一個專案上遇到需要修改資料庫名稱、物理檔名和邏輯名稱。如下圖所示,資料庫ty_cms_lz的物理檔名是ty_cms_lz.mdf和ty_cms_lz_0.ldf,邏輯檔名是lhc_cms和lhc_cms_log。 這樣看上去很彆扭,而且資料庫一多很容

邏輯物理卷組 的關系

存儲池 軟鏈接 用戶訪問 logical 文件的 物理卷 通過 組成 比較 一、理解快照的含義 所謂快照就是照下來的那一刻保留起來作為文件的訪問通道,將沒修改之前保存在快照存儲空間中一份,訪問的是外面的數據,如果數據修改出現錯誤時,可以通過快照的訪問路徑把存儲在快照存儲空

CSS像素物理像素邏輯像素設備像素比PPIViewport

www 鏈接 issue shu hone phone 顯示器 手機 view 參照整理自:https://github.com/jawil/blog/issues/21 http://www.jianshu.com/p/