oracle归档模式作用,oracle的归档模式

一、查看oracle数据库是否为归档模式:

1.select name,log_mode from v$database;

NAME               LOG_MODE

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

QUERY           NOARCHIVELOG

2.使用ARCHIVE LOG LIST 命令

Database log mode              No Archive Mode

Automatic archival             Disabled

Archive destination            /data/oracle/product/10.2.0/db_1//dbs/arch

Oldest online log sequence     739

Current log sequence           741

二、什么是Oracle归档模式?

Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里。一般数据库至少要有2个联机重做日志组。当一个联机重做日志组被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行。

如果数据库处于非归档模式,联机日志在切换时就会丢弃. 而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档。比如,当前在使用联机重做日志1,当1写满的时候,发生日志切换,开始写联机重做日志2,这时联机重做日志1的内容会被拷贝到另外一个指定的目录下。这个目录叫做归档目录,拷贝的文件叫归档重做日志。

数据库使用归档方式运行时才可以进行灾难性恢复。

1.归档日志模式和非归档日志模式的区别

非归档模式只能做冷备份,并且恢复时只能做完全备份.最近一次完全备份到系统出错期间的数据不能恢复.

归档模式可以做热备份,并且可以做增量备份,可以做部分恢复.

用ARCHIVE LOG LIST 可以查看期模式状态时归档模式还是非归档模式.

三、配置数据库的归档模式

改变非归档模式到归档模式:

1)SQL>SHUTDOWN NORMAL/IMMEDIATE;

2)SQL>START MOUNT;

3)SQL>ALTER DATABASE ARCHIVELOG;

4)SQL>ALTER DATABASE OPEN;

5)SQL>做一次完全备份,因为非归档日志模式下产生的备份日志对于归档模式已经不可用了.这一步非非常重要!

改变归档模式到非归档模式:

1)SQL>SHUTDOWN NORMAL/IMMEDIATE;

2)SQL>START MOUNT;

3)SQL>ALTER DATABASE NOARCHIVELOG;

4)SQL>ALTER DATABASE OPEN;

3.启用自动归档: LOG_ARCHIVE_START=TRUE

归档模式下,日志文件组不允许被覆盖(重写),当日志文件写满之后,如果没有进行手动归档,那么系统将挂起,知道归档完成为止.

这时只能读而不能写.

运行过程中关闭和重启归档日志进程

SQL>ARCHIVE LOG STOP

SQL>ARCHIVE LOG START

4.手动归档: LOG_ARCHIVE_START=FALSE

归档当前日志文件

SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;

归档序号为052的日志文件

SQL>ALTER SYSTEM ARCHIVE LOG SEQUENCE 052;

归档所有日志文件

SQL>ALTER SYSTEM ARCHIVE LOG ALL;

改变归档日志目标

SQL>ALTER SYSTEM ARCHIVE LOG CURRENT TO '&PATH';

5.归档模式和非归档模式的转换

第4步的逆过程.

6.配置多个归档进程

Q:什么时候需要使用多个归档进程?

A:如果归档过程会消耗大量的时间,那么可以启动多个归档进程,这是个动态参数,可以用ALTER SYSTEM动态修改.

SQL>ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=10;

Oracle9i中最多可以指定10个归档进程

与归档进程有关的动态性能视图

v$bgprocess,v$archive_processes

7.配置归档目标,多归档目标,远程归档目标,归档日志格式

归档目标 LOG_ARCHIVE_DEST_n

本地归档目标:

SQL>LOG_ARCHIVE_DEST_1 = "LOCATION=D:ORACLEARCHIVEDLOG";

远程归档目标:

SQL>LOG_ARCHIVE_DEST_2 = "SERVICE=STANDBY_DB1";

强制的归档目标,如果出错,600秒后重试:

SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_4 = "LOCATION=E:ORACLEARCHIVEDLOG MANDATORY REOPEN=600";

可选的归档目标,如果出错,放弃归档:

SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_3 = "LOCATION=E:ORACLEARCHIVEDLOG OPTIONAL";

归档目标状态:关闭归档目标和打开归档目标

关闭归档目标1

SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1 = DEFER

打开归档目标2

SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2 = ENABLE

归档日志格式

LOG_ARCHIVE_FORMAT

8.获取归档日志信息

V$ARCHVIED_LOG

V$ARCHVIE_DEST

V$LOG_HISTORY

V$DATABASE

V$ARCHIVE_PROCESSES

我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:

alter system kill session ’sid,serial#’ ;

被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程.

我们发现当一个session被kill掉以后,该session的paddr被修改,如果有多个session被kill,那么多个session的paddr都被更改为相同的进程地址:

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS

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

542E0E6C         11        314 542B70E8 EYGLE                          INACTIVE

542E5044         18        662 542B6D38 SYS                            ACTIVE

SQL> alter system kill session ’11,314’;

System altered.

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS

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

542E0E6C         11        314 542D6BD4 EYGLE                          KILLED

542E5044         18        662 542B6D38 SYS                            ACTIVE

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS

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

542E0E6C         11        314 542D6BD4 EYGLE                          KILLED

542E2AA4         14        397 542B7498 EQSP                           INACTIVE

542E5044         18        662 542B6D38 SYS                            ACTIVE

SQL> alter system kill session ’14,397’;

System altered.

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

SADDR           SID    SERIAL# PADDR    USERNAME                       STATUS

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

542E0E6C         11        314 542D6BD4 EYGLE                          KILLED

542E2AA4         14        397 542D6BD4 EQSP                           KILLED

542E5044         18        662 542B6D38 SYS                            ACTIVE

在这种情况下,很多时候,资源是无法释放的,我们需要查询spid,在操作系统级来kill这些进程.但是由于此时v$session.paddr已经改变,我们无法通过v$session和v$process关联来获得spid那还可以怎么办呢?

我们来看一下下面的查询:

SQL> SELECT s.username,s.status,

2  x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,

3  decode(bitand (x.ksuprflg,2),0,null,1)

4  FROM x$ksupr x,v$session s

5  WHERE s.paddr(+)=x.addr

6  and bitand(ksspaflg,1)!=0;

USERNAME                       STATUS   ADDR       KSLLAPSC   KSLLAPSN KSLLASPO       KSLLID1R KS D

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

542B44A8          0          0                       0

ACTIVE   542B4858          1         14 24069                 0    1

ACTIVE   542B4C08         26         16 15901                 0    1

ACTIVE   542B4FB8          7         46 24083                 0    1

ACTIVE   542B5368         12         15 24081                 0    1

ACTIVE   542B5718         15         46 24083                 0    1

ACTIVE   542B5AC8         79          4 15923                 0    1

ACTIVE   542B5E78         50         16 24085                 0    1

ACTIVE   542B6228        754         15 24081                 0    1

ACTIVE   542B65D8          1         14 24069                 0    1

ACTIVE   542B6988          2         30 14571                 0    1

USERNAME                       STATUS   ADDR       KSLLAPSC   KSLLAPSN KSLLASPO       KSLLID1R KS D

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

SYS                            ACTIVE   542B6D38          2          8 24071                 0

542B70E8          1         15 24081               195 EV

542B7498          1         15 24081               195 EV

SYS                            INACTIVE 542B7848          0          0                       0

SYS                            INACTIVE 542B7BF8          1         15 24081               195 EV

16 rows selected.

我们注意,红字标出的部分就是被Kill掉的进程的进程地址.

简化一点,其实就是如下概念:

SQL> select p.addr from v$process p where pid <> 1 2 minus 3 select s.paddr from v$session s;

ADDR

--------

542B70E8

542B7498

Ok,现在我们获得了进程地址,就可以在v$process中找到spid,然后可以使用Kill或者orakill在系统级来杀掉这些进程.实际上,我猜测:当在Oracle中kill session以后, Oracle只是简单的把相关session的paddr 指向同一个虚拟地址.此时v$process和v$session失去关联,进程就此中断.然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.如果此时被Kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,process退出,此时Oracle会立即启动PMON来清除该session.这被作为一次异常中断处理.

SELECT A.OWNER,

A.OBJECT_NAME,

B.XIDUSN,

B.XIDSLOT,

B.XIDSQN,

B.SESSION_ID,

B.ORACLE_USERNAME,

B.OS_USER_NAME,

B.PROCESS,

B.LOCKED_MODE,

C.MACHINE,

C.STATUS,

C.SERVER,

C.SID,

C.SERIAL#,

C.PROGRAM

FROM ALL_OBJECTS A,

V$LOCKED_OBJECT B,

V$SESSION C

WHERE ( A.OBJECT_ID = B.OBJECT_ID )

AND (B.PROCESS = C.PROCESS )

ORDER BY 1,2;

根据查询到的session_sid查询出session的详细信息:

select saddr,sid,serial#,paddr,username,status from v$session where sid='214';

如果确保此lock无效,可以kill掉该session

alter system kill session ’sid,serial#’ ;

RMAN的备份中,可以通过Exclude命令排除某些不需要备份的表空间。

这样可以缩减备份的容量,对备份进行适当优化和调整。

排除某个表空间可以使用类似如下命令:

configure exclude for tablespace users;

其设置可以在RMAN中通过show exclude命令来查看。

如果将来想临时增加排除表空间的备份,可以通过以下命令实现:

backup database noexclude;

如果想取消排除设置则可以使用如下命令:

CONFIGURE EXCLUDE FOR TABLESPACE users CLEAR;

此外常用的排除备份命令还有:

BACKUP DATABASE SKIP READONLY, SKIP OFFLINE;

以下是一个简单的测试过程。

执行备份:

[oracle@test126 udump]$ rman target /

Recovery Manager: Release 10.2.0.1.0 - Production on Mon Oct 9 06:47:19 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: EYGLE (DBID=2590148133)

RMAN> configure exclude for tablespace users;

using target database control file instead of recovery catalog

tablespace USERS will be excluded from future whole database backups

new RMAN configuration parameters are successfully stored

RMAN> backup full database;

Starting backup at 09-OCT-06

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=527 devtype=DISK

file 4 is excluded from whole database backup

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00001 name=/opt/oracle/oradata/eygle/system01.dbf

input datafile fno=00003 name=/opt/oracle/oradata/eygle/sysaux01.dbf

input datafile fno=00002 name=/opt/oracle/oradata/eygle/undotbs01.dbf

channel ORA_DISK_1: starting piece 1 at 09-OCT-06

channel ORA_DISK_1: finished piece 1 at 09-OCT-06

piece handle=/opt/oracle/flash_recovery_area/EYGLE/backupset/2006_10_09/o1_mf_nnndf_TAG20061009T070612_2lm135od_.bkp tag=TAG20061009T070612 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:48

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

including current control file in backupset

channel ORA_DISK_1: starting piece 1 at 09-OCT-06

channel ORA_DISK_1: finished piece 1 at 09-OCT-06

piece handle=/opt/oracle/flash_recovery_area/EYGLE/backupset/2006_10_09/o1_mf_ncnnf_TAG20061009T070612_2lm14ppc_.bkp tag=TAG20061009T070612 comment=NONE

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02

Finished backup at 09-OCT-06

RMAN> exit

Recovery Manager complete.

然后关闭数据库,我们可以进行一次恢复尝试:

[oracle@test126 udump]$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Oct 9 07:07:28 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning and Data Mining options

SQL> select name from v$datafile;

NAME

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

/opt/oracle/oradata/eygle/system01.dbf

/opt/oracle/oradata/eygle/undotbs01.dbf

/opt/oracle/oradata/eygle/sysaux01.dbf

/opt/oracle/oradata/eygle/users01.dbf

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> exit

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning and Data Mining options

看看恢复进程:

[oracle@test126 udump]$ rman target /

Recovery Manager: Release 10.2.0.1.0 - Production on Mon Oct 9 07:08:40 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database (not started)

RMAN> startup mount;

Oracle instance started

database mounted

Total System Global Area 536870912 bytes

Fixed Size 1220460 bytes

Variable Size 150995092 bytes

Database Buffers 377487360 bytes

Redo Buffers 7168000 bytes

RMAN> restore database;

Starting restore at 09-OCT-06

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=542 devtype=DISK

file 4 is excluded from whole database backup

channel ORA_DISK_1: starting datafile backupset restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

restoring datafile 00001 to /opt/oracle/oradata/eygle/system01.dbf

restoring datafile 00002 to /opt/oracle/oradata/eygle/undotbs01.dbf

restoring datafile 00003 to /opt/oracle/oradata/eygle/sysaux01.dbf

channel ORA_DISK_1: reading from backup piece /opt/oracle/flash_recovery_area/EYGLE/backupset/2006_10_09/o1_mf_nnndf_TAG20061009T070612_2lm135od_.bkp

channel ORA_DISK_1: restored backup piece 1

piece handle=/opt/oracle/flash_recovery_area/EYGLE/backupset/2006_10_09/o1_mf_nnndf_TAG20061009T070612_2lm135od_.bkp tag=TAG20061009T070612

channel ORA_DISK_1: restore complete, elapsed time: 00:00:36

failover to previous backup

Finished restore at 09-OCT-06

RMAN> recover database;

Starting recover at 09-OCT-06

using channel ORA_DISK_1

starting media recovery

media recovery complete, elapsed time: 00:00:02

Finished recover at 09-OCT-06

RMAN> alter database open;

database opened

RMAN>

配置监听的方法有3种:

Database

PLSExtProc

Executable

Database 模式是标准的配置方式,也是最常用的数据库连接方式。

PLSExtProc  模式允许PL/SQL程序访问外部程序,并且被大多数实例配置为默认连接方式

Executable  模式允许外部程序能通过一个tns连接被访问(目前没用到过)

Database 模式配置方式:

(SID_DESC =

(GLOBAL_DBNAME= querymqq)

(ORACLE_HOME= /data/oracle/product/10.2.0/db_1/)

(SID_NAME = mqq)

)

PLSExtProc模式配置方式:

(SID_DESC =

(SID_NAME = PLSExtProc)

(ORACLE_HOME = /usr/local/oracle/product/10.2.0/db_1)

(PROGRAM = extproc)

)

在我们新oracle和8.155机器上只使用PLSextProc方式配置,并不能建立连接,还得加database配置。

对PLSextProc的解释,网上也没人能说出个名堂,疑惑的提问倒是一堆一堆的。那个e文档也含糊的很。

2.监听状态

命令:lsnrctl status,红色部分为注解

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 12-3?? -2007 21:39:27

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))

STATUS of the LISTENER

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

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production

Start Date                12-3?? -2007 20:53:47

Uptime                    0 days 0 hr. 45 min. 39 sec

Trace Level               off /*关闭跟踪*/

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /usr/local/oracle/product/10.2.0/db_1/network/admin/listener.ora  /*监听配置文件地址*/

Listener Log File         /usr/local/oracle/product/10.2.0/db_1/network/log/listener.log    /*监听日志文件地址*/

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.225.158)(PORT=1521)))

Services Summary...

Service "MQQ_XPT" has 1 instance(s).

Instance "mqq", status READY, has 1 handler(s) for this service...

Service "PLSExtProc" has 1 instance(s).

Instance "PLSExtProc", status UNKNOWN/*UNKNOWN 表示是在listener.ora文件配置*/, has 1 handler(s) for this service...

Service "mqq" has 1 instance(s).

Instance "mqq", status READY/*READY表示是在DB启动PMON(监控进程)之后,自动注册DB到监听,一般在启动实例后1分钟注册监听*/, has 1 handler(s) for this service...

The command completed successfully

3.比较容易混淆的概念:

Db_name:对一个数据库(Oracle database)的唯一标识。这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了Db_domain参数,这样在数据库的标识是由Db_name和Db_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们将Db_name和Db_domain两个参数用’.’连接起来,表示一个数据库,并将该数据库的名称称为Global_name,即它扩展了Db_name。Db_name参数只能由字母、数字、’_’、’#’、’$’组成,而且最多8个字符。查看方式:show parameter db_name;

Db_domain:定义一个数据库所在的域,域只是为了更好的管理分布式oracle系统。查看方式:show parameter db_domain;

Global_name:对一个数据库(Oracle database)的唯一标识,oracle建议用此种方法命令数据库。该值是在创建数据库是决定的,缺省值为Db_name. Db_domain。在以后对参数文件中Db_name与Db_domain参数的任何修改不影响Global_name的值,如果要修改Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO ‘db_name.db_domain’。查看方式:show parameter global_name;

Service_name:该参数是oracle8i新引进的。在8i以前,我们用SID来表示标识数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name参数,该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。该参数的缺省值为Db_name. Db_domain,即等于Global_name。一个数据库可以对应多个Service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即不必Service name 必须与SID一样。查看方式:show parameter service_name;

Net service name:网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。查看方式:show parameter Net service name;

4.SQLPLUS运行时,建立连接的方式

在用户输入sqlplus system/manager@test后,sqlplus程序会自动到sqlnet.ora文件中找NAMES.DEFAULT_DOMAIN参数,假如该参数存在,则将该参数中的值取出,加到网络服务名的后面,即此例中你的输入由sqlplus system/manager@test自动变为sqlplus system/manager@test.server.com ,然后再到tnsnames.ora文件中找test.server.com网络服务名;假如NAMES.DEFAULT_DOMAIN参数不存在,则sqlplus程序会直接到tnsnames.ora文件中找test网络服务名,然后取出其中的host,port,tcp,service_name,利用这些信息将连接请求发送到正确的数据库服务器上。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值