扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
为配合应用变更,主机维护,异常宕机重启等工作,需要进行重启数据库,重启ORACLE集群软件,主机。为保障数据库启停操作的规范性,特定制该操作规范。
按需规划网站可以根据自己的需求进行定制,做网站、成都网站制作构思过程中功能建设理应排到主要部位公司做网站、成都网站制作的运用实际效果公司网站制作网站建立与制做的实际意义
该规范只针对数据库以及使用ORACLE集群软件的集群环境,主机集群、集群文件系统、主机重启等规范由其他应用维护厂家提供。
数据库名称 | 数据库负责人 | 联系方式 | 业务负责人 | 联系方式 |
ZWDB | ||||
公司 | 联系人 | 联系方式 | 紧急联系人 | 联系方式 |
业务支撑室 | ||||
$ 为操作系统命令行提示符,表明该操作命令为普通用户操作系统命令。
# 为操作用户根用户提示符,表明该操作命令使用root用户进行。
SQL> 为SQL命令提示符,表明该操作命令为SQL命令。
以下操作,如无特殊说明,均使用oracle用户进行操作。在进行停监听、停实例、kill用户进程和数据库进程之前,一定要得到用户以及管理人员的确认,以防止误操作造成的故障。
确认当前登录主机与操作主机一致。
$hostname
$echo $ORACLE_SID
该操作由应用厂家完成,数据库中检查类型为USER的进程是否有减少。
SQL>SELECT INST_ID, COUNT(1) FROM GV$SESSION WHERE TYPE = 'USER' GROUP BY INST_ID;
如果仍然有大量的用户类型的进程存在,检查进程名及主机信息,告知应用厂家进行处理。
SQL> SET LINESIZE 120;
SQL> COL MACHINE FOR A30;
SQL>SELECT INST_ID, PROGRAM, MACHINE, COUNT(1) FROM GV$SESSION WHERE TYPE = 'USER' GROUP BY INST_ID, PROGRAM, MACHINE ORDER BY 4;
非集群环境下,数据库默认的监听名称为LISTENER,可以通过下面的命令查询当前运行的数据库监听的名称:
$ps -ef | grep tns
/oracle/app/oracle/product/10.2.0/db/bin/tnslsnrLISTENER_RAC10G1 -inherit
蓝色部分,就是数据库监听的名称,非标准监听名称,可以通过下面命令进行关闭:
$lsnrctl stopLISTENER_RAC10G1
通过
$ps -ef | grep tns
命令检查监听是否正常关闭。
如果监听不能正常关闭,也可以使用 kill -9的方式杀掉监听进程。
集群环境下,可以通过常规的lsnrctl命令关闭监听,也可以通过srvctl命令或crs命令的方式关闭监听。但是建议使用srvctl命令进行资源管理操作。
集群环境中的停监听操作,根据要求停库要求进行对应主机的操作。
a.查询集群中监听运行状态
$crs_stat -t | grep lsnr
ora....G1.lsnr application ONLINE ONLINE rac10g1
ora....G2.lsnr application ONLINE ONLINE rac10g2
b.停止节点监听
根据需要,停止相应数据库主机的监听程序
$srvctl stop listener -n rac10g1
c.停止SCAN_LISTENER (11g)
ORACLE 11G 中引入了SCAN_LISTENER的概念,应该如果需要停止11g集群的所有实例,需要停止SCAN_LISTENER。
$srvctl stopscan_listener
d.查询集群中监听运行状态
确保操作节点的监听被停止。
$crs_stat -t | grep lsnr
ora....G1.lsnr application OFFLINE OFFLINE
ora....G2.lsnr application ONLINE ONLINE rac10g2
Ø其他停止监听的方式:
a.通过lsnrctl命令方式停监听,该操作需要在集群中所有节点进行
$ ps -ef | grep tns
/oracle/app/oracle/product/10.2.0/db/bin/tnslsnrLISTENER_RAC10G1 -inherit
$ lsnrctl stop LISTENER_RAC10G1
b.通过crs_stop命令停监听
$ crs_stat | grep lsnr
NAME=ora.rac10g1.LISTENER_RAC10G1.lsnr
NAME=ora.rac10g2.LISTENER_RAC10G2.lsnr
$ crs_stop
Usage: crs_stop resource_name [...] [-f] [-q] ["attrib=value ..."]
crs_stop -c cluster_member [...] [-q] ["attrib=value ..."]
crs_stop -all [-q]
该命令使用的参数为集群资源,因此参数为NAME说对应的整个值
$ crs_stopora.rac10g1.LISTENER_RAC10G1.lsnr
检查数据库的非本地会话连接,该操作所有节点都需要进行,需要注意进程运行的用户:
$ps -ef | grep "LOCAL=NO"
如果存在大量的进程,表明仍有大量应用进程没有停止,通过下面的命令进行检查:
SQL> SET LINESIZE 120;
SQL> COL MACHINE FOR A30;
SQL>SELECT INST_ID, PROGRAM, MACHINE, COUNT(1) FROM GV$SESSION WHERE TYPE = 'USER' GROUP BY INST_ID, PROGRAM, MACHINE ORDER BY 4;
可以通过kill -9的方式,杀掉非本地连接(该操作需要应用厂家确认后才能进行):
$hostname
$id
$ps -ef | grep "LOCAL=NO" | awk '{print $2}' | xargs kill -9
注意:在ORACLE11G的版本,由于监听程序运行在grid用户下,因此LOCAL=NO的进程属组可能是grid用户。在需要之前需要进行确认。
为保证在数据库关闭过程中,所有的脏数据都写入磁盘,日志都完成归档操作。建议在执行关闭数据库操作前,进行日志切换和检查点操作。
将集群中所有节点的脏数据写入到数据文件:
SQL>alter system checkpointglobal;
global参数针对集群数据库,单实例数据库无需该参数。
对集群中所有实例,进行日志切换操作,日志切换操作建议执行多次:
SQL>alter system archive log current;
在非归档模式下,该命令无法正常执行,可以通过在各节点执行:
SQL>alter system switch logfile;
命令进行替代。
再次执行检查点操作:
SQL>alter system checkpointglobal;
确保停库时,ACTIVE状态的日志不大于1组:
SQL>SELECT INST_ID,GROUP#, STATUS, ARCHIVED FROM GV$LOG WHERE STATUS IN ('ACTIVE', 'CURRENT');
确保MTTR时间在可接受的范围内(数据库异常关闭,启动后恢复所需时间):
SQL> SET LINESIZE 120;
SQL>SELECT RECOVERY_ESTIMATED_IOS,ACTUAL_REDO_BLKS,TARGET_REDO_BLKS,LOG_FILE_SIZE_REDO_BLKS,TARGET_MTTR,ESTIMATED_MTTR FROM GV$INSTANCE_RECOVERY;
通过immediate的方式,进行数据库关闭操作
SQL>shutdown immediate;
Ø停实例
在停止部分实例的情况下,需要使用停实例的方式来停止指定的数据库实例。
$ hostname
$ id
$ ps -ef | grep ora_smon
$srvctl stop instance -d
Ø停数据库
通过srvctl命令方式关闭数据库:
$crs_stat | grep db$
NAME=ora.crmdb.db
$srvctl stop database -dcrmdb
通过crs_stat命令检查数据库是否正常关闭,inst及db资源就是对应的实例和数据库资源:
$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora....b1.inst application OFFLINE OFFLINE
ora....b2.inst application OFFLINE OFFLINE
ora.crmdb.db application OFFLINE OFFLINE
注意:ORACLE 11G版本中,crs资源中已经不在有实例的信息。
注意,该操作可能会造成数据库的损坏,非特×××况下不建议采用该操作。
如果上述步骤无法正常关闭数据库,可采用中止PMON进程或shutdown abort方式非正常中止数据库运行,数据库实例的核心进程全部关闭后,注意检查操作系统的共享内存段是否已释放。在共享内存段释放前不要重新起动数据库。
SQL> shutdown abort;
$ipcs -m | grep oracle
0x61a4a848 3047431 oracle 640 132120576 14
如果返回结果中仍然有oracle的共享内存信息,表明数据库没有完全停止,检查是否仍然有遗留进程,或者等待共享内存资源的释放。
在执行abort操作后,一定要执行一次正常的数据库起停操作,防止异常操作带来的数据损坏
SQL>startup;
SQL> shutdown immediate;
停数据库集群需要使用root用户。该操作需要在集群中所有节点进行。
执行该操作前,需要检查数据库是否正常停止:
$crs_stat -t
确保,资源中以inst/db结尾的资源状态已经为OFFLINE。如果状态为ONLINE,请参照前面的停数据库步骤进行操作。
集群的停止操作,需要在CRS_HOME(10g)/GRID_HOME(11g)的bin目录下进程:
#cd /oracle/app/oracle/product/10.2.0/crs/bin
#./crsctl stop crs
Stopping resources. This could take several minutes.
Successfully stopped CRS resources.
Stopping CSSD.
Shutting down CSS daemon.
Shutdown request successfully issued.
检查关闭结果:
#crsctl check crs
Failure 1 contacting CSS daemon
Cannot communicate with CRS
Cannot communicate with EVM
确保该命令没有返回结果:
#ps -ef | grep oracle | grep d.bin
以CRMDB为例:
$ hostname
SQL> show parameter instance;
SQL> SELECT INST_ID, PROGRAM, MACHINE, COUNT(1) FROM GV$SESSION WHERE TYPE = 'USER' GROUP BY INST_ID, PROGRAM, MACHINE ORDER BY 4;
$ crs_stat | grep lsnr
$ srvctl stop listener -n crmdb1 -l LISTENER_CRMDB1
$ srvctl stop listener -n crmdb2 -l LISTENER_CRMDB2
$ srvctl stop listener -n crmdb3 -l LISTENER_CRMDB3
$ ps -ef | grep "LOCAL=NO" | awk '{print $2}' | xargs kill -9
SQL> alter system checkpoint global;
SQL> alter system archive log current;
SQL> alter system archive log current;
SQL> alter system archive log current;
SQL> alter system archive log current;
SQL> alter system archive log current;
SQL> alter system archive log current;
SQL> alter system checkpoint global;
$ crs_stat | grep db$
$ srvctl stop database -d crmdb
# crsctl start crs
以下操作,如无特殊说明,均使用oracle用户进行操作。正常情况下在集群启动会,会将所有相关资源自动启动。但可能存在特殊情况,如资源启动状态设置为disable、手工停止集群未重启主机的情况,需要手工进行资源的启动操作。
启动数据库集群需要使用root用户。该操作需要在集群中所有节点进行。
命令的执行,需要在bin目录下进行:
# cd /oracle/app/oracle/product/10.2.0/crs/bin
[root@rac10g1 bin]#
[root@rac10g1 bin]#crsctl start crs
Attempting to start CRS stack
The CRS stack will be started shortly
该过程可能时间较久,可以通过监控集群相关的进行以及crs日志进行跟踪:
[root@rac10g1 bin]# ps -ef | grep d.bin
[root@rac10g1 bin]# cd ../log/rac10g1/crsd/
[root@rac10g1 crsd]# tail -f crsd.log
集群启动成功后,可以通过crs_stat命令查看集群状态:
# crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora....0g1.gsd application ONLINE ONLINE rac10g1
ora....0g1.ons application ONLINE ONLINE rac10g1
ora....0g1.vip application ONLINE ONLINE rac10g1
集群启动成功后,要确保集群资源中的gsd/ons/vip进程状态为ONLINE,并且运行在自己的节点上。
非集群环境下,数据库默认的监听名称为LISTENER,可以通过listener.ora配置文件,查看监听的名称:
$ cd $ORACLE_HOME/network/admin
[oracle@rac10g1 admin]$
$ cat listener.ora
LISTENER_RAC10G1 =
(DESCRIPTION_LIST = ........
)
通过lsnrctl start命令进行监听的启动:
$ lsnrctl start LISTENER_RAC10G1
通过lsnrctl status命令,检查监听的运行状态:
$ lsnrctl status LISTENER_RAC10G1
集群环境下,可以通过srvctl命令进行监听的启动。
查询集群中监听的名称:
$ crs_stat | grep lsnr
NAME=ora.rac10g1.LISTENER_RAC10G1.lsnr
NAME=ora.rac10g2.LISTENER_RAC10G2.lsnr
执行srvctl命令
$ srvctl start listener -h
Usage: srvctl start listener -n
-n
-l "
-h Print usage
$ srvctl stop listener -nrac10g1-lLISTENER_RAC10G1
通过open的方式,该方式是startup的默认方式,进行数据库启动操作:
SQL> startup;
通过srvctl命令方式启动数据库:
$ srvctl start database -d crmdb
检查各节点的alert日志,跟踪数据库关闭过程:
$ cd $ORACLE_BASE/admin/${DB_NAME}/bdump
$ tail -f alert_crmdb1.log
${DB_NAME}参数为数据库名。
通过crs_stat命令检查数据库是否正常启动,inst及db资源就是对应的实例和数据库资源:
$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora....b1.inst application ONLINE ONLINE rac10g1
ora....b2.inst application ONLINE ONLINE rac10g2
ora.crmdb.db application ONLINE ONLINE rac10g2
确保每个实例的运行状态都为OPEN状态:
SQL>ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SQL>SELECT INST_ID, STARTUP_TIME, STATUS FROM GV$INSTANCE ORDER BY INST_ID;
查看当时数据库配置的所有service
$srvctl config service -d crmdb
srvcrmdb1 PREF: crmdb1 AVAIL: crmdb2
srvcrmdb2 PREF: crmdb2 AVAIL: crmdb1
通过srvctl命令启动service:
$srvctl start service -d crmdb -s srvcrmdb1
$ srvctl start service -d crmdb -s srvcrmdb2
查看service的运行状态:
$srvctl status service -d crmdb
Service srvcrmdb1 is running on instance(s) crmdb1
Service srvcrmdb2 is running on instance(s) crmdb2
通过vip地址和scan(11g)地址,进行数据库远程登录测试,确保所有实例都能够登录成功。
$sqlplus system/password@rac10g1-vip:1521/crmdb
$sqlplus system/password@rac10g2-vip:1521/crmdb
$sqlplus system/password@scan_ip:1521/crmdb
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流