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

来源:互联网 发布:台湾大学知乎 编辑:程序博客网 时间:2024/05/19 19:58
数据库的启动和关闭


实例是一组后台进程和内存,因此每次启动数据库到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';























































0 0
原创粉丝点击