您的位置:首页 > 数据库

基础知识补漏-数据库的启动和关闭

2016-09-08 14:59 344 查看
数据库的启动和关闭

实例是一组后台进程和内存,因此每次启动数据库到nomount状态打开实例时,更像是每次都创建实例。

unix/Linux上可以通过file命令查看oracle执行文件是64位还是32位

[oracle@10g bin]$ file oracle

oracle: setuid setgid ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), not stripped

为啥用64位oracle数据库

32位的oracle数据库最多只能使用1.7g内存,会极大约束oracle的性能,生产环境中,应当使用64位的系统和数据库。

oracle可以用strings命令打印出来

[oracle@10g bin]$ strings $ORACLE_HOME/bin/oracle |grep radiohead

I'm a creep, I'm a winner, what the hell am I doing here.I don't belong here - radiohead

只要有参数文件就能启动实例,最少只需要一个参数db_name就可以启动实例。

PID是数据库内部的编号,os id是该进程在操作系统上的进程编号

PMON started with pid=2, OS id=2609

9i的后台日志不记录os id

PMON是第一个启动的后台进程,将监视其余的进程。

通过v$process可以看到对应于操作系统的每个进程信息

SQL> select addr,pid,spid,username,program from v$process;

ADDR                    PID SPID         USERNAME

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

PROGRAM

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

00000000A81EBA50          1

PSEUDO

00000000A81EC248          2 5514         oracle

oracle@10g (PMON)

00000000A81ECA40          3 5516         oracle

oracle@10g (PSP0)

latch通常被称为闩,是数据库的串行锁机制,主要用来控制内存上的并发,在多处理系统上,oracle进程通过自旋(spin)进行latch争夺。

v$process是操作系统到数据库的入口,然后进入数据库内部需要创建session,以v$session管理,下面举个应用的例子:

故障时,通过top看到两个占据了很高cpu的资源

$ top

load averages: 1.61, 1.28, 1.25 HSWAPJSDB 10:50:44 172 processes: 160 sleeping, 1 running, 3 zombie, 6 stopped, 2 on cpu

CPU states: % idle, % user, % kernel, % iowait, % swap Memory: 4.0G real, 1.4G free, 1.9G swap in use, 8.9G swap free

PID USERNAME THR PR NCE SIZE RES STATE TIME FLTS CPU COMMAND 

20521 oracle 1 40 0 1.8G 1.7G run 6:37 0 47.77% oracle 

20845 oracle 1 40 0 1.8G 1.7G cpu02 0:41 0 40.98% oracle

然后得到更详细的信息

$ ps -ef|grep 20521

oracle 20909 20875 0 10:50:53 pts/10 0:00 grep 20521

oracle 20521 1 47 10:43:59 ? 6:45 oraclejshs (LOCAL=NO)

$ ps -ef|grep 20845

oracle 20845 1 44 10:50:00 ? 0:55 oraclejshs (LOCAL=NO)

oracle 20918 20875 0 10:50:59 pts/10 0:00 grep 20845

local=no证明该进程来自应用,我们可以通过pid查看sql文本,然后进行优化

SELECT

FROM WHERE

/*+ ORDERED */

sql_text

v$sqltext a

(a.hash_value, a.address) IN (

SELECT DECODE (sql_hash_value,

0, prev_hash_value,

sql_hash_value ),

DECODE (sql_hash_value, 0, prev_sql_addr, sql_address) FROM v$session b

WHERE b.paddr = (SELECT addr

FROM v$process c

WHERE c.spid = '&pid'))

ORDER BY piece ASC

/

参数文件的选择顺序spfileorcl.ora > spfile.ora > initorcl.ora

unix/linux的参数文件路径为$ORACLE_HOME/dbs,windows参数文件的路径为$ORACLE_HOME\database

实例的后台进程的名字由oracle_sid决定。

在同一$ORACLE_HOME下,oracle通过oracle_sid分辨数据库实例,实例名可以相同。不同的$ORACLE_HOME下,两实例的oracle_sid可以相同。

数据库内部视图v$instance中也记录着一个instance_name,这个instance_name来自sid,始终与oracle_sid保持一致。因此一个数据库可能出现这两处的instance_name不一致:

SQL> select instance_name from v$instance; INSTANCE_NAME --------------------------------

julia

  SQL> show parameter instance_name

NAME  TYPE
VALUE

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

instance_name string eygle

10g之后instance_name动态获取,将不会出现此问题。

v$instance视图与数据库实例的生命周期相关,可以通过此视图获得数据库的启动时间等:

COLUMN STARTED_AT format a25

COLUMN UPTIME format a50

SELECT TO_CHAR (startup_time, 'DD-MON-YYYY HH24:MI:SS') started_at,

 TRUNC (SYSDATE - (startup_time))

 || ' day(s), ' || TRUNC ( 24 * ((SYSDATE - startup_time) -

 TRUNC (SYSDATE - startup_time)))

 || ' hour(s), '|| MOD (TRUNC ( 1440 * ( (SYSDATE - startup_time) -

 TRUNC (SYSDATE - startup_time))),60)

 || ' minute(s), '|| MOD (TRUNC ( 86400 * ( (SYSDATE - startup_time) -

 TRUNC (SYSDATE - startup_time))),60)

 ||' seconds' uptime

 FROM v$instance;

从安装过程来看,是db_name影响sid,而不是sid影响db_name。

db_name不可超过8个字符。

db_name记录在数据文件,日志文件和控制文件中,数据库启动过程中参数文件中的db_name和控制文件中的数据库名称不一致,则数据库不能启动,因此我们在部署dataguard修改参数文件时不修改db_name。

一个数据库可以被任何一个实例挂在打开(在满足一些限制条件下),在非并行模式(ops/rac)下,一个数据库同时只能被一个实例加载。

在nomount出现问题,通常是系统问题,os类错误一般说明系统资源不足,这在Linux/unix下和信号量等参数设置有关。

重启主机应当极其慎重,很多隐藏的故障可能在重启时爆发出来。

给系统打补丁时有必要服务器重启确认。

挂载数据库之后才能查看v$controlfile视图

SQL> startup nomount;

SQL> select * from v$controlfile;

no rows selected

SQL> show parameter control_files

NAME  TYPE
VALUE

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

control_files string /opt/oracle/oradata/conner/control01.ctl, 
/opt/oracle/oradata/conner/control02.ctl,
/opt/oracle/oradata/conner/control03.ctl

SQL> alter database mount;

Database altered.

SQL> select * from v$controlfile;

STATUS  NAME

------- ----------------------------------------
/opt/oracle/oradata/conner/control01.ctl 
/opt/oracle/oradata/conner/control02.ctl 
/opt/oracle/oradata/conner/control03.ctl

启动了实例之后,实际上数据库的后台进程已经运行。

通过v$recover_file可以发现数据文件丢失状况:

SQL> select * from v$recover_file;

FILE# ONLINE ONLINE_ ERROR CHANGE# TIME

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

 3 ONLINE ONLINE FILE NOT FOUND 0

SQL> select name from v$datafile where file#=3;

NAME 

------------------------------------------------------------------------/opt/oracle/oradata/eygle/eygle01.dbf

数据库挂载时,控制文件记录mount id,然后启动心跳,3秒更新一次控制文件,可以用下方命令3秒转储两次控制文件信息:

alter session set events 'immediate trace name CONTROLF level 8' ;

控制文件在mount状态下发生改变的只有心跳,可以用diff查看

[oracle@jumper udump]$ diff conner_ora_25542.trc conner_ora_25706.trc ...

64c63

< heartbeat: 588983634 mount id: 1408096182

---

> heartbeat: 588983636 mount id: 1408096182

心跳主要用于OPS/RAC环境,但是在单实例环境中同样也存在。可以这样查:

SELECT CPHBT from X$KCCCP;

挂载过程中还需要口令文件,Linux在$ORACLE_HOME/dbs/orapw<ORACLE_SID>,windows上位于%ORACLE_HOME%\database\PWD<ORACLE_SID>.ora。口令文件存放sysdba/sysoper用户的用户名和口令。如果不存在口令文件,远程用户将无法使用这两个身份登陆数据库。初始化参数 remote_login_passwordfile和口令文件的使用有关。

重建口令文件命令如下:

orapwd file=<fname> password=<password> entries=<users>

拥有sysdba/sysoper权限的用户可以通过v$pwfile_users查到。

$ORACLE_HOME/dbs下有个文件lk<ORACLE_SID>,lk指lock,在数据库启动时创建,关闭时释放。用于系统对数据库的锁定。当系统出现异常,数据库已经关闭但是锁定未释放,会导致下次数据库无法启动,可以通过重启服务器或手工释放内存段释放锁定。错误信息如下:

Sun Apr 30 06:08:58 2006

ALTER DATABASE MOUNT

Sun Apr 30 06:08:58 2006

scumnt: failed to lock /export/product/oracle/app/dbs/lkBILL exclusive Sun Apr 30 06:08:58 2006

ORA-09968: scumnt: unable to lock file SVR4 Error: 11: Resource temporarily unavailable Additional information: 20169

热备状态会冻结表空间数据文件的检查点,并且生成额外的日志。

打开数据库时,若此前数据库异常崩溃,则scn会保持在无穷大,数据库需要执行实例恢复,完成检查后,打开数据库,锁定数据文件,同时将每个数据文件的结束scn设为无穷大。

数据文件丢失,在mount阶段把记录写在日志文件中,在open阶段在前台发出警告。

diagnostic_dest是11g的特性,为adr服务,启用之后background_dump_dest core_dump_dest user_dump_dest都会被弃用,如果设置了ORACLE_BASE,则DIAGNOSTIC_DEST = ORACLE_BASE,如果未设置ORACLE_BASE,则DIAGNOSTIC_DEST = ORACLE_HOME/log

查看隐含参数:

SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.KSPPDESC PDESC  FROM SYS.x$ksppi x, SYS.x$ksppcv y WHERE x.indx = y.indx AND x.ksppinm LIKE '%&par%';

IPS-事件打包服务,配合FDI(ADR所属,数据库的黑匣子)使用。

adrci显示当前数据库记录的incident:

adrci> show incident;

通过具体的incident_id查看更详细的信息:

adrci> show incident -mode DETAIL -p "incident_id=14601";

创建逻辑package

adrci> set homepath diag/rdbms/11gtest/11gtest

adrci> ips create package incident 14601

创建物理package,这个物理包可以发给技术支持

ips generate package 1 in /opt/oracle/diag

tnsping的是sevice_name,ping通说明网络畅通,端口一致,不代表tnsname的配置是正确的,也不能证明能连上数据库。

除了tnsname.ora外,也可以直接通过sqlplus直接连远程或本地数据库:

SQL>conn eygle/eygle@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.33.32)(PORT=1521))(CONNE CT_DATA=(SERVICE_NAME=hsbill)))



SQL> connect eygle/eygle@localhost:1521/eygle

可以通过定义多个服务名将不同用户连接区分开来,这个参数的缺省参数格式为:DB_NAME.DB_DOMAIN。

SERVICE_NAMES = sales.eygle.com, news.eygle.com

tnsname.ora文件内配置如下:

SID_LIST_LISTENER = (SID_LIST =

(SID_DESC =

(SID_NAME = PLSExtProc)

(ORACLE_HOME = /opt/oracle/product/9.2.0) (PROGRAM = extproc)

)

(SID_DESC =

(GLOBAL_DBNAME = eygle)

(ORACLE_HOME = /opt/oracle/product/9.2.0) (SID_NAME = eygle)

)

(SID_DESC =

(GLOBAL_DBNAME = julia)

(ORACLE_HOME = /opt/oracle/product/9.2.0) (SID_NAME = eygle)

) )

缺省的监听PLSExtProc是为外部存储过程调用而配置的。

数据库关闭分步操作

SQL> alter database close;

SQL> alter database dismount;

SQL> shutdown;

shutdown=shutdown normal,等待连接断开

SHUTDOWN IMMEDIATE,终止事务,回滚事务

SHUTDOWN TRANSACTIONAL,事务执行完毕后自动断开

会话级别启用10046跟踪:

alter session set events '10046 trace name context forever,level 12';
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: