归档

ORACLE数据库的开发环境和测试环境中,数据库的日志模式和自动归档模式一般都是不设置的,这样有利于系统应用的调整,也免的生成大量的归档日志文件将磁盘空间大量的消耗。但在系统上线,成为生产环境时,将其设置为日志模式并自动归档就相当重要了,因为,这是保证系统的安全性,有效预防灾难的重要措施。这样,通过定时备份数据库和在两次备份间隔之间的日志文件,可以有效的恢复这段时间的任何时间点的数据,可以在很多时候挽回或最大可能的减少数据丢失。

一、 要使OARCLE 数据库进行日志的自动归档,需要做两方面的事情;
1.是数据库日志模式的设置(可为Archive Mode 和No Archive Mode);2.就是自动归档模式设置(Automaticarchival,可为Enabled 和Disabled)。
SQL> archive log list

Database log mode         No Archive Mode

Automatic archival           Disabled

Archive destination         USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     57

Current log sequence             59


二、 如何查看数据库的现行日志和自动归档模式的设置
可用archive log list 命令来查看。
运行在日志自动归档模式下的数据库系统查看结果如下(一般是生产环境):
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /backup/archivelog
Oldest online log sequence 2131
Next log sequence to archive 2133
Current log sequence 2133
没有启动数据库日志模式和自动归档的数据库系统查看结果如下(一般是测试环境):
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/app/oracle/product/8.1.7/dbs/arch
Oldest online log sequence 194
Current log sequence 196

三. 数据库日志模式的设置
在创建数据库时,可以在CREATEDATABASE 语句中指定数据库的日志模式。假如没有指明,则缺省为NOARCHIVELOG 模式。由于如果在创建数据库时指明是Archive Mode的话,会增加约20%的创建时间,而在以后启动INSTANCE时再设置的话,一般只用去几秒的时间,所以一般在创建数据库时是不设置为ARCHIVE MODE 的。
将数据库的日志模式设置切换(ArchiveMode 和No Archive Mode 之间的切换)的步骤和操作如下:
1. 关闭运行的数据库实例
SQL> shutdown
在进行日志模式切换之前,必须将运行的数据库正常关闭。
2. 备份数据库
该备份跟以后产生的日志一起用于将来的灾难恢复(很重要,如要改为归档日志模式,没有这个数据库备份,仅有日志文件是无法从该时间点恢复的)。
3. 启动数据库实例到mount 状态,但不要打开。
SQL> startup mount
4. 切换数据库日志模式。
SQL> alter database archivelog;(设置数据库为归档日志模式)或
SQL> alter database noarchivelog;(设置数据库为非归档日志模式)
5. 打开数据库
SQL> alter database open;
6. 确认数据库现在处于归档日志模式。
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination for example: $ORACLE_HOME/dbs/arch
Oldest on-line log sequence 275
Next log sequence 277
Current log sequence 278
7. 将这个时间点的redo logs 归档
SQL> archive log all;
8. 确认新产生的日志文件已在相应的归档目录下面。

四. 自动归档模式设置(Automatic archival,可为Enabled 和Disabled)。
在该模式下,数据库启动一个arch 进程,专门负责将redo logs 写到系统归档设备的相应目录下。在数据库的参数文件中设置参数(一般是在$ORACLE_HOME/dbs/init*.ora文件中):
LOG_ARCHIVE_START=
LOG_ARCHIVE_DEST=
LOG_ARCHIVE_FORMAT=
LOG_ARCHIVE_START:
如要求自动归档的话,则设为TRUE,如要求为非自动归档的话,则设为FALSE
LOG_ARCHIVE_DEST:
该参数设定了archive logs 归档存放的路径。
LOG_ARCHIVE_FORMAT:
该参数设定了archive logs 的命名格式。例如,如将格式设为: arch%s.arc
log 文件将为: arch1.arc,arch2.arc, arch3.arc
这几个参数设置只有在数据库实例启动前设置才能生效,如果在数据库运行中进行设置,要使其生效,必须重起数据库。
如果数据库正在运行中,不能即刻重起,要设置其为自动归档模式,则做如下操作:
SQL> ALTER SYSTEM ARCHIVE LOG START;
如要设置其为非自动归档模式(取消自动归档),则:
SQL> ALTER SYSTEM ARCHIVE LOG STOP;

但如果数据库重起后,给语句修改的结果就失效了,自动归档的设置还是按照系统参数文件中的LOG_ARCHIVE_START 的值来设置。

五. 几种设置情况:
1. Database log mode Archive Mode,Automatic archival Enabled
这是在大部分生产环境中的ORACLE 数据库日志及归档模式设置,这种情况下,做好数据库的定期备份(有热备和冷备)和归档日志备份,可有效的将数据库恢复到有归档日志的全部时间点。
2. Database log mode Archive Mode,Automatic archival Disabled
这种情况下,数据库不能自动归档,需要进行手工归档。如果所有在线日志都写满了,又没有的及时进行手工归档的话,由于LGWR 没有可用的在线日志可写,数据库将会挂在这儿,只有进行手工归档后,有可用的在线日志后才能继续。在生产环境中应该避免这种情况。
手工归档操作如下:
SQL> ALTER SYSTEM ARCHIVELOG ALL;
数据库将会把在线日志进行归档处理
3. Database log mode NOArchive ModeAutomatic archival Enabled
有些情况下,数据库管理员只在数据库参数文件中设置了LOG_ARCHIVE_START=TRUE,然后在数据库起来后查看到ARCH 归档进程已经起来了,可是尽管ORACLE 已经作了几次日志切换,但还是没有归档日志,这时的设置就是这种情况,如果数据库不是处在ARVHIVELOG 模式,redolog 还是不会被归档。
4. Database log mode NO Archive Mode,Automatic archival Disabled
这种设置是刚安装的oracle 数据库的缺省设置,开发环境也大部分如此。即没有进行归档。

 

 

如何手工删除归档日志文件?(如果采用RMNA备份后则不用手工删除)
一、先手工删除归档日志文件
二、用RMAN删除数据库记录的归档列表信息
1) 进入本数据库的rman,在命令行模式输入"rman target /",进入rman,查看提示,确认连接的是否是本库?
2) 查看归档日志文件的状态:
RMAN> list archivelog all;
3) 删除操作系统中的日志文件(到操作系统级进行手工删除,也可以是第一步;
4) 将归档日志信息进行更新;
RMAN> crosscheck archivelog all;
RMAN> delete expired archivelog all; (确认时键入"yes")
RMAN> exit

 一 设置为归档方式

[xhtml] view plaincopyprint?

1.  1 sql> archive log list;   #查看是不是归档方式  

2.  2 sql> alter system set log_archive_start=true scope=spfile

#启用主动归档  

3.     sql> alter system set log_archive_dest='location=/oracle/ora9/oradata/arch' scope=spfile;  

      #设置归档路径  

4.     sql> alter system set log_archive_dest_1='location=/oracle/ora9/oradata/arch1' scope=spfile;  

5.     sql> alter system set log_archive_dest_2='location=/oracle/ora9/oradata/arch2' scope=spfile;  

6.        #如果归档到两个位置,则可以通过上边方法实现  

7.    sql> alter system set log_archive_format='arch_%d_%t_%r_%s.log'  #设置归档日记款式  

8.  3 sql> shutdown immediate;  

9.  4 sql> startup mount;    #打开控制文件,不打开数据文件  

10. 5 sql> alter database archivelog; #将数据库切换为归档模式  

11. 6 sql> alter database open;   #将数据文件打开  

12. 7 sql> archive log list;   #查看此时是否处于归档模式  

13. 8 查询以确定数据库位于archivelog模式中且归档过程正在运行  

14. sql> select log_mode from v$database;  

15. SQL> select log_mode from v$database;

16.  

17. LOG_MODE

18. ------------

19. NOARCHIVELOG

20.  

21. Elapsed: 00:00:00.05

22. sql> select archiver from v$instance;  

Elapsed: 00:00:00.03

SQL> select archiver from  v$instance;

 

ARCHIVE

-------

STOPPED

23. 9 日志切换  

24. sql> alter system switch logfile;  

25. 10 这次日志切换将归档写到两个目标地,  

26.   1,即第二步的/oracle/ora9/oradata/arch1和/oracle/ora9/oradata/arch1,要是要对目录确认  

27.   

28. 在oracle情况中运行如下查询:  

29. sql> select name from v$archived_log;  

30. 而后在操作系统中确认查询所列出的文件  

二 设置非归档方式

[java] view plaincopyprint?

1.  1 sql> archive log list;   #查看是否是归档方式  

2.  2 sql> alter system set log_archive_start=false scope=spfile; #禁用自动归档  

3.  3 sql> shutdown immediate;  

4.  4 sql> startup mount;    #打开控制文件,不打开数据文件  

5.  5 sql> alter database noarchivelog; #将数据库切换为非归档模式  

6.  6 sql> alter database open;   #将数据文件打开  

7.  7 sql> archive log list;   #查看此时便处于非归档模式  

三 归档相关命令

 

[java] view plaincopyprint?

1.  archive log stop;  

2.  archive log start;  

3.  archive log list;  

4.    

5.  show parameters;  

6.  show parameters log_archive_start;  

7.  SQL> show parameter log_archive_start;

8.   

9.  NAME                    TYPE    VALUE

10. ------------------------------------ ----------- ------------------------------

11. log_archive_start           boolean FALSE

12. show parameters log_archive_max_process; #归档进程数  

13. alter system set log_archive_max_process=5; #将归档进程数改为5  

14. select * from v$bgprocess;    #检察后台进程  

 

SMON是Oracle数据库至关重要的一个后台进程,SMON 是System Monitor 的缩写,意即:系统监控。

在数据库启动过程中,SMON排在CKPT进程之后,在Oracle9i中排在第六号的位置:

PMON started with pid=2
DBW0 started with pid=3
LGWR started with pid=4
CKPT started with pid=5
SMON started with pid=6

RECO started with pid=7

SMON负责系统监视已经一些系统清理及恢复工作,这些工作主要包括:
1.清理临时空间以及临时段
SMON
负责在数据库启动时清理临时表空间中的临时段,或者一些异常操作过程遗留下来的临时段,例如,当创建索引过程中,创建期间分配给索引的Segment被标志为TEMPORARY,如果CreateIndex (或rebuild Index等)会话因某些原因异常中断,SMON负责清理这些临时段。
2.接合空闲空间
DMT(字典管理表空间)中,SMON负责把那些在表空间中空闲的并且互相是邻近的Extent接合成一个较大的空闲扩展区,这需要表空间的pctincrease设置为非零值。
3.执行实例恢复(Instance recovery)
在实例恢复过程中,SMON的工作包括三个环节:应用Redo执行前滚、打开数据库提供访问、回滚未提交数据

Tue Apr 22 21:31:10 2008
SMON: enabling cache recovery
Tue Apr 22 21:31:10 2008
ARC0: Completed archiving log 1 thread 1 sequence 238
Tue Apr 22 21:31:11 2008
Undo Segment 1 Onlined
Undo Segment 2 Onlined
Undo Segment 3 Onlined
Undo Segment 4 Onlined
Undo Segment 5 Onlined
Undo Segment 6 Onlined
Undo Segment 7 Onlined
Undo Segment 8 Onlined
Undo Segment 9 Onlined
Undo Segment 10 Onlined
Successfully onlined Undo Tablespace 1.
Tue Apr 22 21:31:11 2008
SMON: enabling tx recovery
Tue Apr 22 21:31:11 2008
Database Characterset is ZHS16GBK
replication_dependency_tracking turned off (no async multimaster replicationfound)
Completed: ALTER DATABASE OPEN

4.离线(Offline)回滚段
在自动回滚段管理(AUM)中负责Offline不再需要的回滚段,日志中会记录类似如下信息:

Fri May 2 15:43:21 2008
SMON offlining US=11
SMON offlining US=12
SMON offlining US=13
SMON offlining US=14
SMON offlining US=15
SMON offlining US=16
SMON offlining US=17
SMON offlining US=18
SMON offlining US=19
SMON offlining US=20
SMON offlining US=21
SMON offlining US=22
SMON offlining US=23

5.执行并行恢复
以下信息来自9i日志:

Fri May 11 21:30:45 2007
SMON: Parallel transaction recovery tried


Also Record
some English Note About SMON:

The SMON background process performs all system monitoringfunctions on the Oracle database. The SMON process performs a "warmstart" each time that Oracle is re-started, ensuring that any in-flighttransaction at the time of the last shutdown are recovered. For example, if Oracle crashed hard with a powerfailure, the SMON process is attached at startup time, and detects anyuncompleted work, using the rollback segments to recover the transactions.In addition, SMON performs periodic cleanup of temporary segments that are nolonger needed, andalso perform tablespace operations, coalescing contiguous free extents intolarger extents.

$ps -ef | grep smon

oracle   31144    1  0 11:10 ?        00:00:00 ora_smon_orcl

PMON进程:该进程在用户进程出现故障时执行进程恢复,负责清理内存储区和释
放该进程所使用的资源。例:它要重置活动事务表的状态,释放封锁,将该故障
的进程的ID从活动进程表中移去。PMON还周期地检查调度进程(DISPATCHER)和
服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。
PMON有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。

SQL> show parameter dispatcher

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
dispatchers                          string      (PROTOCOL=TCP) (SERVICE=orclXD
                                                 B)
max_dispatchers                      integer

SQL> ed
已写入 file afiedt.buf

  1  alter system set
  2  dispatchers="(protocol=tcp)(dispatcher=2)"
  3* scope=both
SQL> /

系统已更改。

SQL> show parameter dispatcher

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
dispatchers                          string      (protocol=tcp)(dispatcher=2)
max_dispatchers                      integer

SQL> show parameter dispatcher;

 

NAME                 TYPE  VALUE

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

dispatchers              string (PROTOCOL=TCP) (SERVICE=ora10X

                         DB)

max_dispatchers          integer

 

共享服务器的配置
1.设置 DISPATCHERS 参数:
   
pfile 中添加:

 

*.DISPATCHERS='(PROTOCOL=TCP)(SERVICE=SKYSH)(DISPATCHERS=2)(PROTOCOL=IPC)(DISPATCHERS=1)'

 

    以上方法启动之后,DISPATCHER 的端口是随机分配的,如果要固定每个 DISPATCHER 的端口,可以用一下方法:
   
使用不同端口:

 

*.DISPATCHERS='(ADDRESS=(PROTOCOL=TCP)(PORT=5000))(DISPATCHERS=1)','(ADDRESS=(PROTOCOL=TCP)(PORT=5001))(DISPATCHERS=1)'

 

    使用相同端口:

 

*.dispatchers='(ADDRESS=(PROTOCOL=TCP)(PORT=5130))(SERVICE=SKYSHR)(DISPATCHERS=1)'

 


   
如果是 spfile 启动,先用 create pfile from spfile 创建 pfile,修改好之后,再用 create spfile from pfile 创建 spfile
   
注:虽然 DISPATCHERS 是动态参数,但只能用 alter system set DISPATCHERS 来临时添加删除 dispatcher,重启之后又恢复原值,且不能使用 scope 参数。
   
其中,SERVICE=SKYSH 参数可以不指定,如果不指定,则需要指定 service_names instance_name 初始参数,当 instance 启动时,PMON 会动态将 SERVICE 或者 service_names 指定的值邦定到 LISTENER,并生成 dispatchers
    DISPATCHERS=2
如果不指定,那么默认值是 1
    PROTOCOL
:当使用 Shared Server 连接时,必须通过 Oracle Net Services,即使客户端和数据库在同一台机子上,如果在 Windows NT 上,dispatchers 只能使用TCP/IP协议。

 

2.设置客户端 tnsnames.ora 文件:

 

SKY3 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.0.123)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SKYSH.heysky.net)
      (SERVER = SHARED)
    )
  )

 

    其中,SERVICE_NAME = SKYSH.heysky.net 中的值必须是动态邦定的 service_name.db_domain,否则会产生 ORA-12523 错误:

 

ERROR:
ORA-12523: TNS:listener could not find instance appropriate for the clientconnection

 

    使用共享服务器连接,必须指定 (SERVER = SHARED),如果不指定,则作为 DEDICATE 连接。

 

3.SHARED_SERVERS 参数:
   
该参数指定当 instance 启动时,初始生成的共享服务器进程数量,如果要使用共享服务器,该值必须大于 0,否则将产生 ORA-12520 错误:

 

ERROR:
ORA-12520: TNS:listener could not find available handler for requested type ofserver

 

    通过动态改变该参数,可以增加减少默认的共享服务器进程数量,或者在不停止数据库的情况下禁止共享服务器。当动态将其设置为 0 时,共享服务器进程在完成所有工作,并空闲一段时间之后终止,可以通过查看 v$shared_server 动态视图来查看共享服务器的状态。

 

4.其他一些相关参数:
    MAX_DISPATCHERS
:最大 DISPATCHER 数量,默认值是 5,如果 DISPATCHERS 中设置的所有 DISPATCHER 数量之和大于 5,那么 MAX_DISPATCHERS 等于这个和数。

 

   MAX_SHARED_SERVERS:最大共享服务器进程,当初始分配的 SHARED_SERVERS不够时,Oracle 会继续生成共享服务器,直到这个最大值,当空闲时,Oracle 会终止空闲的进程,直到 SHARED_SERVERS中指定的值为止。

 

    CIRCUITS:改值一般等于 SESSIONS 的数量。

 

   SHARED_SERVER_SESSIONS:共享服务器连接所能用的最大 SESSION 值,一般可以设置为小于 CIRCUITS and SESSIONS -5 的值,以便给 DEDICATE 连接留下一定的 SESSION 数。

 

5.一些注意事项:
   
sysdba shared server 连接时,不能执行 start upshut down 或者 recovery 命令,否则可能出现如下错误:

 

ORA-00106: cannot startup/shutdown database whenconnected to a dispatcher

 

    当使用共享服务器的时候,需要设置 LARGE_POOL_SIZE 参数,并且要足够,因为,当使用共享服务器的时候,本来在 PGA 中的 cursor stateUser session data 信息会放到 LARGE POOL 中,如果 LARGE_POOL_SIZE 没有设置,就会放到 SHARE POOL 这将会使 SHARE POOL 产生碎片,影响性能。

 

6.一些相关动态视图:
    V$CIRCUIT
    V$SHARED_SERVER
    V$DISPATCHER
    V$SHARED_SERVER_MONITOR
    V$QUEUE
    V$SESSION

例子:查看使用哪种方式连接数据库

 

 

SQL> select sid from v$mystatwhere rownum=1;

 

      SID
----------
         9

 

SQL> select server fromv$session
  2  where sid=9;

 

SERVER
---------
SHARED

 


7.
查看 listener 信息:
   
使用 Shared Server 时,当 Instance 启动时,PMON 会动态将 service_names 参数,或 DISPATCHERS 中的 SERVICE 参数设定的值邦定到 LISTENER,并为该 SERVICE 分配相应的 DISPATCHER,这些信息可以通过 LSNRCTL 命令来获得:

 

 

C:\Documents andSettings\Administrator>lsnrctl

 

LSNRCTL for 32-bit Windows:Version 9.2.0.3.0 - Production on 17-MAY-2006 23:22:58

 

Copyright (c) 1991, 2002, OracleCorporation.  All rights reserved.

 

Welcome to LSNRCTL, type"help" for information.

 

LSNRCTL> status
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=heysky)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                    LISTENER
Version                  TNSLSNR for 32-bit Windows: Version 9.2.0.3.0 - Produc
tion
StartDate               17-MAY-2006 21:41:12
Uptime                   0 days 1 hr. 46 min. 13 sec
TraceLevel              off
Security                 OFF
SNMP                     OFF
Listener Parameter File   E:\oracle\ora92\network\admin\listener.ora
Listener Log File        E:\oracle\ora92\network\log\listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=heysky)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) forthis service...
Service "SKYSHARED.heysky.net" has 1 instance(s).
  Instance "sky", status READY, has 4 handler(s) for thisservice...
Service "SKYTEST" has 1 instance(s).
  Instance "SKY", status UNKNOWN, has 1 handler(s) for thisservice...
The command completed successfully
LSNRCTL> service
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=heysky)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) forthis service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
Service "SKYSHARED.heysky.net" has 1 instance(s).
  Instance "sky", status READY, has 4 handler(s) for thisservice...
    Handler(s):
      "DEDICATED" established:0 refused:0state:ready
         LOCAL SERVER
      "D002" established:0 refused:0current:0 max:1002 state:ready
         DISPATCHER <machine:HEYSKY, pid: 3600>
        (ADDRESS=(PROTOCOL=tcp)(HOST=heysky)(PORT=2312))
      "D001" established:0 refused:0current:0 max:1002 state:ready
         DISPATCHER <machine:HEYSKY, pid: 2748>
        (ADDRESS=(PROTOCOL=tcp)(HOST=heysky)(PORT=2311))
      "D000" established:0 refused:0current:0 max:1002 state:ready
         DISPATCHER <machine:HEYSKY, pid: 684>
        (ADDRESS=(PROTOCOL=tcp)(HOST=heysky)(PORT=2309))
Service "SKYTEST" has 1 instance(s).
  Instance "SKY", status UNKNOWN, has 1 handler(s) for thisservice...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


   
如果 LISTENER 启动,数据库的任何动态改变,比如,DISPATCHERSSERVICE_NAMES 都会动态邦定到 LISTENER,从 LSNRCTL 可以看到这些改变,如果 LISTENER 没有启动,改变之后,再启动 LISTENER,那么这些改变不会邦定到 LISTENER 上。所以一般建议,先启动 LISTENER,再启动数据库,以便能够动态邦定。

Session:在计算机中,尤其是在网络应用中,称为“会话”。
Session:在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。


Connect、session、process的区别:
  一个数据库的Connect可以有一个或多个session,同时connect也可以有一个或多个process.
  在专业服务器连接方式中,一个session对应一个process,在共享服务器方式中,一个process可以为多个session。
  一个session也可以存在若干个process中,并行同样是一个session对应一个process,主session是coordinatorsession,每个parallel process同样会对应数据库里一个单独的session。
可以从v$px_session和v$session查看。

比如某客户端连接数据库的session和process的值:
select * from v$session where terminal='RUIFEI'

select * from v$process
where addr in
(select paddr from v$session where terminal='RUIFEI')
如果是专用服务器方式连接,session和process是一样的。

 

下面摘自itpub
连接connects,会话sessions和进程pocesses的关系
每个sqllogin称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式,一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。


oracle中系统process和session的关系
 
在Shared Server中的Process 和Oracle 中的Session不是一一对应的,SharedServer中的Process 一个对应着Oracle中的一个或者一个以上的Session。我在dedicatedserver机器上试验了
数据库的session和操作系统process是对应的
即表示一个session对应一个process,但是一个process未必对应一个session

 ops$tkyte@ORA920.US.ORACLE.COM> select username from v$session where username is not 

null;

 

USERNAME

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

OPS$TKYTE

 

onesession, ME

 

ops$tkyte@ORA920.US.ORACLE.COM>select username, program fromv$process;

 

USERNAME        PROGRAM

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

                PSEUDO

ora920          oracle@tkyte-pc-isdn.us.oracle.com(PMON)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(DBW0)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(LGWR)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(CKPT)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(SMON)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(RECO)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(CJQ0)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(QMN0)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(S000)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(D000)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(ARC0)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(ARC1)

tkyte           oracle@tkyte-pc-isdn.us.oracle.com(TNS V1-V3)

 

14rows selected.

 

youcan see all of the backgrounds and my dedicated server...

 

ops$tkyte@ORA920.US.ORACLE.COM>set autotrace on statistics;

 

Autotracefor statistics uses ANOTHER session so it can query up the stats for your

CURRENTsession without impacting the STATS for that session!

 

 

ops$tkyte@ORA920.US.ORACLE.COM>select username from v$sessionwhere username is not

null;

 

USERNAME

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

OPS$TKYTE

OPS$TKYTE

 

 

see,two sessions but....

 

Statistics

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

          0 recursive calls

          0 db block gets

          0 consistent gets

          0 physical reads

          0 redo size

        418 bytes sent via SQL*Net to client

        499 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          0 sorts (memory)

          0 sorts (disk)

          2 rows processed

 

ops$tkyte@ORA920.US.ORACLE.COM> selectusername, program from v$process;

 

USERNAME        PROGRAM

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

                PSEUDO

ora920          oracle@tkyte-pc-isdn.us.oracle.com(PMON)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(DBW0)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(LGWR)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(CKPT)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(SMON)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(RECO)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(CJQ0)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(QMN0)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(S000)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(D000)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(ARC0)

ora920          oracle@tkyte-pc-isdn.us.oracle.com(ARC1)

tkyte           oracle@tkyte-pc-isdn.us.oracle.com(TNS V1-V3)

 

14rows selected.

 

same14 processes...

 

Statistics

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

          0 recursive calls

          0 db block gets

          0 consistent gets

         0  physical reads

          0 redo size

       1095 bytes sent via SQL*Net to client

        499 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          0 sorts (memory)

          0 sorts (disk)

         14 rows processed

 

ops$tkyte@ORA920.US.ORACLE.COM>

 

 

I'lltry to put it into a single, simple paragraph:

 

Aconnection is a physical circuit between you and the database.  A connection might be

oneof many types -- most popular begin DEDICATED server and SHARED server.  Zero, one or

moresessions may be established over a given connection to the database as showabove

withsqlplus.  A process will be used by asession to execute statements.  Sometimes

thereis a one to one relationship between CONNECTION->SESSION->PROCESS (eg: anormal

dedicatedserver connection).  Sometimes there is aone to many from connection to

sessions(eg: like autotrace, one connection, two sessions, one process).  A process does

nothave to be dedicated to a specific connection or session however, for examplewhen

usingshared server (MTS), your SESSION will grab a process from a pool of processesin

orderto execute a statement.  When the call isover, that process is released back to

thepool of processes.

 

 

 

 

SQL> select status from v$instance;

 

STATUS

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

OPEN

 

Elapsed: 00:00:00.08

 

Statistics

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

           0 recursive calls

           0  dbblock gets

           0  consistentgets

           0 physical reads

           0  redosize

         411  bytes sent via SQL*Net to client

         400  bytes received via SQL*Net from client

           2 SQL*Net roundtrips to/from client

           2 sorts (memory)

           0 sorts (disk)

           1  rowsprocessed

 

Oracle体系结构由内存结构进程结构存储结构组成。其中,内存结构由SGAPGA组成进程结构由用户进程Oracle进程组成存储结构由逻辑存储物理存储组成

1,     用户在其机器上运行基于Oracle的应用程序(如:SQL*PLUS、PL/SQL Developer等),即启动用户进程

2,     客户机、服务器之间建立连接(Connect)

3,     服务器为用户建立会话(Session),并为该会话建立一个PGA(ProgramGlobal Area,程序全局区)以存储与该会话相关的信息。在同一个连接中,不同的用户有不同的会话。

4,     启动服务进程,由该服务进程负责执行该会话的各项任务。

5,     用户进程发送SQL语句(select、update、commit…。)

6,     服务器进程解析、编译、执行SQL语句,然后将结果写入数据库并返回结果给用户进程

7,     用户进程接收返回的SQL执行结果。

8,     在应用程序中显示SQL执行结果。

体系结构:

内存结构:包括SGA和PGA,使用内存最多的时SGA,同时也是影响数据库性能最大的参数。

进程结构:包括前台进程,后台进程。前台进程指服务进程,和用户进程,前台进程是根据实际需要运行的,并在需要结束后立刻停止,后台进程是指在Oracle数据库启动后,自动启动的几个操作系统进程

 存储结构:包括控制文件数据结构日志文件等操作系统文件。

2. 存储结构

存储结构   Oracle数据库的存储结构分为逻辑存储结构物理存储结构,这两种存储结构既相互独立又相互联系

逻辑存储结构主要描述Oracle数据库的内部存储结构,即从技术概念上描述在Oracle数据库种如何组织、管理数据。因此,逻辑存储结构是和操作系统平台无关的,是由Oracle数据库创建和管理的

物理存储结构主要描述Oracle数据库的外部存储结构,即在操作系统中如何组织、管理数据。因此,物理存储结构是和操作系统平台有关的。 注意:必须对这两种存储结构有清晰的理解,并且要清楚在一个具体数据库应用系统中,这两种存储结构的具体对应关系,否则就不能进行正常的管理操作、数据库备份与恢复、性能优化等。

 

 

从物理上看,数据库由控制文件、数据文件、重做日志文件等操作系统文件组成;

从逻辑上来看,数据库是由系统表空间、用户表空间等组成。 表空间是最大的逻辑单位,块是最小的逻辑单位。 逻辑存储结构中的块最后对应到操作系统中的块。

Oracle的逻辑存储结构是由一个或多个表空间组成。 

一个表空间(tablespace)由一组段组成   

  一个段(segment)由一组区组成   

  一个区(extent)由一批数据库块组成   

  一个数据库块(block)对应一个或多个物理块

 

数据库块(Database Block块是数据库使用的I/O最小单元,又称逻辑块或ORACLE块。

一个数据库块对应一个或多个物理块,块的大小由参数DB_BLOCK_SIZE确定。块的大小是操作系统块大小的整数倍。以Win2K为例,操作系统块(OS block)的大小为4kb,所以Oracle Block的大小可以是4kb,8kb,16kb等等。如果块的大小为4kb,某表每行的数据是100 bytes。,如果某查询语句只返回1行数据,那么,在将数据读入到数据高速缓存时,读取的数据量时4kb而不是100 bytes。 ○1数据块的结构包括块头和存储区两个部分。 第一部分:块头 标题:包括通用的块信息,如块地址/段类型等,最佳大小为85-100bytes。

表目录:存储聚集中表的信息,这些信息用于聚集段。

行目录:包括这块中的有效行信息,允许使用每行开头的2bytes。

 第二部分:存储区 空闲区:这块中能插入或修改的一组空间。 行数据区:存储表或索引的数据。 ○2控制块的几个参数:它们是互相消涨的 Pctfree(自由百分比)    20%左右    用于行的UPDATE操作,在遇到PCTFREE后,这块被填满且不能进行INSERT操作。 Pctused(占用百分比)   40%左右    用于行的INSERT的操作,当块的百分比小于PCTUSED时,可通过行DELETE或UPDATE来减少列存储。 Inittrans   在单一块中最初活动的交易事务数 Maxtrans  在单一块中最大交易事务数

(2)区(Extent) 区是数据库存储空间分配的逻辑单位,一个区由一组数据库块组成,区是由段分配的,分配的第一个区称初始区,以后分配的区称增量区。 ○1决定extent的参数: initial    最初分配的空间数(缺省为10k,5个数据块) next       下一步分配的空间数 maxextents  最大分配的extent数 minextents  最小分配的extnet数,所有重做日志回滚段的存储结构,必须成对地分配extentpctincrease 增长率,指数级增长, optimal      尽量设小,或为0(缺省为空,仅用于回滚段) freelist 

(3)段(Segment) 段是表空间中一个指定类型的逻辑存储结构,它由一个或多个区组成,段将占用并增长存储空间。 数据(表)段(Data Segment)存储表中的所有数据 索引段(Index Segment):存储表上最佳查询的所有索引数据 临时段(Temporary Segment)存储表排序操作期间建立的临时表的数据 回滚段(Rollback Segment)存储修改之前的位置和值

(4)表空间(tablespace) 表空间是最大的逻辑单位,对应一个或多个数据文件,表空间的大小是它所对应的数据文件大小的总和。 数据库、表空间、数据文件、数据库对象之间的关系,如下图:

 

表空间(tablespace)是数据库的逻辑划分,每个数据库至少有一个表空间,叫做系统表空间(system 表空间)。 一个表空间只能属于一个数据库。 每个表空间由同一个磁盘上的一个或多个文件组成, 这些文件称为数据文件。 表空间的特性:   ○1控制数据库数据磁盘分配   ○2限制用户在表空间中可以使用的磁盘空间大小   ○3表空间具有 online, offline, readonly, readwrite属性   --修改表空间的属性:   SQL> alter tablespace 表空间名称 属性;   --查询表空间状态:   SQL> select tablespace_name, status fromdba_tablespaces;   注意: system, undo, temp表空间不能设为offline属性。   ○4完成部分数据库的备份与恢复   ○5表空间通过数据文件来扩大, 表空间的大小等于构成该表空间的所以数据文件的大小只和。   --查询表空间与数据文件对应关系:   SQL> select tablespace_name, bytes, file_name fromdba_data_files;   基于表空间的几个操作:   --查询用户缺省表空间:   SQL> select username,default_tablespace from dba_users;   --查询表与存储该表的表空间:

 

SQL> select table_name, tablespace_namefrom user_tables;   --修改用户缺省表空间:   SQL> alter user username defaulttablespace tablespace_name;   --将数据从一个表空间移动到另一个表空间:   SQL> alter table table_name movetablespace tablespace_name; Oracle 10g自动创建的表空间有: ○1Example(实例表空间) ○2Sysaux(辅助系统表空间)用于减少系统负荷,提高系统的作业效率。 ○3System(系统表空间)存放关于表空间的名称、控制文件、数据文件等管理信息,是最重要的表空间。它属于Sys、System两个schema(方案),仅被这两个或其他具有足够权限的用户使用。但是均不可删除或者重命名System表空间。 ○4Temp(临时表空间) 临时表空间存放临时表和临时数据,用于排序。 ○5Undotbs(重做表空间) ○6Users(用户的表空间) 用户表空间,永久存放用户对象和私有信息,也被成为数据表空间。 一般地:系统用户使用system表空间,非系统用户使用Users表空间 2.2. 物理物理物理物理存储存储存储存储结构结构结构结构:::: 由控制文件来管理数据文件和日志文件。参数文件来寻找控制文件。                          (1)控制文件(Control File) 控制文件是一个较小的二进制文件,用于描述数据库结构。 描述信息如下: • 数据库建立的日期。 • 数据库名。 • 数据库中所有数据文件和日志文件的文件名及路径。 • 恢复数据库时所需的同步信息。 要点注意: • 在打开和存取数据库时都要访问该文件。 • 镜像控制文件。 • 记录控制文件名及路径的参数为:CONTROL_FILES 可以用SQL语句查看系统视图,如DESCv$controlfile。 查看控制文件的名称和状态:SELECTstatus,name FROM v$controlfile; 显示如下:E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTLE:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTLE:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL  (2)数据文件(Data File)

 

数据文件是物理存储Oracle数据库数据的文件。其特点如下: •  每一个数据文件只与一个数据库相联系。 •  数据文件一旦被建立则不能修改其大小。 •  一个表空间可包含一个或多个数据文件。 •  一个数据文件只能属于一个表空间。 每个表空间由同一个磁盘上的一个或多个文件组成, 这些文件叫做数据文件(datafile),数据文件只能属于一个表空间。 数据文件创建后可以改变大小。 创建新的表空间需要创建新的数据文件。 数据文件一旦加入到表空间中, 就不能从表空间中移走, 也不能与其他表空间发生联系。数据库必须的三类文件是 data file, control file, redolog file。 其他文件 prameter file,password file, archived logfiles并不是数据库必须的, 他们只是辅助数据库的。 (3)参数文件(Parameter File) 参数文件是一个文本文件,可直接使用操作系统下的文本编辑器对其内容进行修改。该文件只在建立数据库或启动实例时才被访问,在修改该文件之前必须关闭实例。 • 初始参数文件:init.ora • 生成参数文件:initSID.ora   Config.ora 参数文件的作用: •  确定存储结构的大小。 •  设置数据库的全部缺省值。 •  设置数据库的范围。 •  设置数据库的各种物理属性。 •  优化数据库性能。 参数文件中参数的数据类型: •  整型    例:DB_BLOCK_SIZE = 2048 •  字符型    例:DB_NAME = ‘ora9’ •  逻辑型    例:CHECKPOINT_PROCESS = true 3.数据库实例数据库实例数据库实例数据库实例 3.1. 概述概述概述概述:::: 实例是是存取和控制数据库的软件机制,通俗的讲实例就是操作oracle数据库的一种手段。它由系统全局区(System GlobalArea,简称SGA)和后台进程组成。 数据库启动时,Oracle首先要在内存中获取、划分、保留各种用途的区域,运行各种用途的后台,即:创建一个实例(instance);然后由该实例装载(mount)、打开(open)数据库;最后由这个实例来访问和控制数据库的各种物理结构。

• 当用户连接到数据库并使用数据库时,实际上是连接到该数据库的实例,通过实例来连接、使用数据库。 • 所以实例是用户和数据库之间的中间层。 • 实例与数据库的区别: – 数据库指的是存储数据的物理结构,总是实际存在的; – 实例则是由内存结构和一系列进程组成,可以启动和关闭。 • 一台计算机上可以创建多个Oracle数据库,一个数据库上可以有多个实例。 • 为了使实例间不混淆,每个实例都称为:SID(SystemIdentify系统标识符)加以区分。  3.2. 内存结构内存结构内存结构内存结构((((memory structure)))) 内存结构是Oracle数据库体系中最为重要的一部分,内存也是影响数据库性能的第一因素。按照内存的使用方法的不同,Oracle数据库的内存又可以分为SGA(System GlobalArea)和PGA(ProgramGlobal Area)。 SGA是ORACLE系统为实例分配的一组共享缓冲存储区,用于存放数据库数据和控制信息,以实现对数据库数据的管理和操作。         每个实例都只有一个SGA。         它是不同用户进程与服务进程进行通信的中心,数据库的各种操作主要在SGA中进行,所以称其为系统全局区。         创建实例时,Oracle为SGA分配内存;         终止实例时,释放SGA所占用的内存。 注意:必须对SGA的组成和原理有所了解 (1)数据高速缓存database buffercache (DBC): • 保存最近从数据文件中读取的数据块,其中的数据被所有用户共享。 • 两个参数影响DBC: –DB_BLOCK_SIZE  缓冲区数据块大小  – DB_BLOCK_BUFFERS  缓冲区数据块个数 • 初次访问数据时,Oracle将读取磁盘上的数据文件,将数据放入数据高速缓存,再处理数据; • 如果数据已经位于数据高速缓存中时,Oracle直接操作数据。 DBC的缓存块分为三类: • 脏缓存块  存放已经被修改过的缓存块。        当SQL修改某个缓存块中的数据,则这个缓存块被标记为脏缓存块 • 空闲缓存块 等待写入数据的空闲缓存块。 • 命中缓存块 最近正在被访问的缓存块。 Oracle通过2个列表来管理上述缓存块: •  脏列表(DIRTY):包括被修改过但尚未写到数据文件的缓冲块。 •  LRU(Least Recently Used)列表:包括空闲缓冲块、命中缓存块,以及还没有移到脏列表的缓冲块。 数据高速缓存原理:

○1读数据入DBC之前,先在LRU中搜索空闲缓存块;在搜索过程中如果发现脏缓存块,则将其移入DIRTY; ○2找到足够的空闲块,将所有数据读入; ○3如果空闲块不足,则暂停搜索,Oralce立刻启动DBWR进程,将DIRTY中的脏缓存块数据写入数据文件释放足够的空闲缓存块。 (2)重做日志高速缓存 当执行DML(DataManipulation Language, 数据操纵语言)如:update、delete、insert或者create、alter、drop 等语句时,Oracle都会为这些操作生成重做记录。重做日志高速缓存就是用于存储重做记录的缓存。 工作原理:

为提高效率,重做记录并不直接写入磁盘的重做日志文件,而是先写入重做日志缓存; 当重做日志缓存中的重做记录达到一定数量时,由LGWR进程写入重做日志。(先内存后磁盘) 当2个(至少2个)重做日志切换时,由ARCH将重做日志中的数据写入归档日志文件,以做备份。 (3)共享池 共享池保存了最近执行的SQL语句、PL/SQL程序和数据字典信息,是对SQL语句和PL/SQL程序进行语法分析、编译、执行的内存区。 库缓存(Library Cache)区包括:解析用户进程提交的SQL语句或PL/SQL程序和保存最近解析过的 SQL语句或PL/SQL程序。 数据字典区(Dictionarycache)用于存放数据字典信息行。

库缓存:Oracle DBMS执行各种SQL、PL/SQL之前,要对其进行语法上的解析、对象上的确认、权限上的判断、操作上的优化等一系列操作,并生成执行计划。库缓存保存了已经解析的SQL和PL/SQL。所以,请尽量使用预处理查询。 数据字典缓存:在Oracle运行过程中,Oracle会频繁的对数据字典中的表、视图进行访问,以便确定操作的数据对象是否存在、是否具有合适的权限等信息。数据字典缓保存了最常用的数据字典信息。数据字典缓存中存放的记录是一条一条的,而其他缓存区中保存的是数据块。     (4)大型池 大型池用于需要大内存操作提供相对独立的内存空间,以便提高性能。大型池是可选的内存结构。DBA可以决定是否需要在SGA中创建大池。需要大型池的操作有:数据库备份和恢复,大量排序的SQL语句,并行化的数据库操作。 (5)Java池 8i以后提供的对Java的支持,用于存放Java代码、Java程序等。一般不小于20M,以便虚拟机运行。  PGA是用户进程连接到数据库,并创建一个对应的会话时,由Oracle为服务进程分配的,专门用于当前用户会话的内存区。PGA是非共享的,而SGA是共享的。PGA大小由操作系统决定,并且分配后保持不变;会话终止时,自动释放PGA所占的内存。由排序区,会话区,游标区和堆栈区组成。 排序区执行order by、group by等包含排序操作的SQL语句时所产生的临时数据。      Oracle将准备排序的数据先临时存储到排序区中,并在排序区中排序,然后将排序好的数据返回给用户。 会话区保存会话所具有的权限、角色、性能统计信息。 游标区当运行带有游标(course)的PL/SQL语句时,Oracle会在共享池中为该语句分配上下文(Context),游标实际上是指向该上下文的指针。 堆栈区保存会话中的绑定变量、会话变量以及SQL语句运行时的内存结构信息。         例如:         select * from emp where emp=:a;         :a就是绑定变量,提示用户输入。         在等待用户输入时,先将该变量存入堆栈,以便可以同时运行其他语句。 3.3. 后台进程后台进程后台进程后台进程((((backgroundprocess)))) 进程是操作系统中的一个概念,是一个可以独立调用的活动,用于完成指定的任务。 进程与程序的区别是: ○1进程是动态创建的,完成后销毁;程序是静态的实体,可以复制、编辑。

○2进程强调执行过程,程序仅仅是指令的有序集合。 ○3进程在内存中,程序在外存中。 Oracle包括用户进程和Oracle进程两类。Oracle进程又包括服务器进程和后台进程。 当用户运行一个应用程序时,就建立一个用户进程。 服务器进程:处理用户进程的请求。处理过程:分析SQL命令并生成执行方案。从数据缓冲存储区中读取数据。将执行结果返回给用户。 后台进程:为所有数据库用户异步完成各种任务。主要的后台进程有: DBWR    数据库写进程 LGWR    日志写进程 CKPT      检查点写进程 SMON     系统监控进程 PMON     进程监控进程 ARCH      归档进程 RECO       恢复进程 LCKn       封锁进程 4. 数据字典数据字典数据字典数据字典 数据字典是Oracle数据库的核心组件,它由一系列只读的数据字典表和数据字典视图组成。 数据字典中记录了数据库的系统信息、实例运行的性能。 数据字典的所有者为SYS用户,其数据字典表和数据字典视图都保存在SYSTEM表空间中。 数据字典表主要保存以下信息: ○1各种方案对象的定义信息,如表、视图、索引、同义词、绪论、存储过程、函数、包、○2触发器和各种对象; ○3存储空间的分配信息; ○4安全信息(帐户、权限、角色等) ○5实例运行时的性能和统计信息 ○6其他数据库本身的基本信息  数据字典的用途: ○1Oracle通过查询数据字典表或数据字典视图来获取有关用户、方案对象、对象的定义信息; ○2每次执行DML语句修改方案对象和对象后,Oracle都在数据字典中记录下所做的修改; ○3用户可以从数据字典的只读视图中,获取各种与对象方案和对象有关的信息; ○4DBA可以从数据字典的动态性能视图中,监视实例的运行状态,为性能调整提供依据。 数据字典的由数据字典表盒数据字典视图组成。 ○1数据字典表:数据字典表属于SYS用户;大部分数据字典表的名称中都包含$这样的特殊符号。     ○2数据字典视图:数据字典表中的信息经过解密和一些加工处理后,以视图的方式呈现给用户。大多数用户都可以通过数据字典视图查询所需要的与数据库相关的系统信息。

数据字典视图查询示例 --查看当前用户的缺省表空间 select username,default_tablespacefrom user_users; --查看当前用户的角色 select * from user_role_privs; --查看当前用户的系统权限和表级权限 select * fromuser_sys_privs; select * from user_tab_privs; --显示指定用户所具有的系统权限 select * from dba_sys_privswhere grantee='GAME'; --查看用户下所有的表 select * from user_tables; --查询表信息 SELECT * FROM ALL_OBJECTSWHERE OWNER ='SCOTT' AND OBJECT_NAME='EMP';    数据字典视图根据名字前缀分为三类,关系如下图:       USER_  用户视图        ALL_ 扩展用户视图        DBA_  数据库管理员视图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值