掘金 后端 ( ) • 2024-04-15 09:28

theme: awesome-green

作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验
擅长主流数据Oracle、MySQL、PG、openGauss运维
备份恢复,安装迁移,性能优化、故障应急处理等

可提供技术业务:
1.DB故障处理/疑难杂症远程支援
2.Mysql/PG/Oracle/openGauss
数据库部署及数仓搭建
•••
微信:jem_db
QQ交流群:587159446
公众号:IT邦德
•••

@TOC

1.RAC One Node介绍

Oracle Real Application Clusters One Node
(Oracle RAC One Node)是从
Oracle Database 11g release 2(11.2)
起提供的Oracle Database Enterprise Edition
的一个选项。

Oracle RAC One Node是启用了
Oracle RAC的数据库的单个实例,
仅在正常操作下在群集中的一个节点上运行。

使用Oracle RAC One Node,服务器的可扩展性没有限制,
如果应用程序需要的资源超过单个节点所能提供的资源,
则您可以将应用程序联机升级到Oracle RAC。
如果运行Oracle RAC One Node的节点过载,
则可以将实例重新定位到群集中的另一个节点。
使用Oracle RAC One Node,
您可以使用在线数据库重新定位功能来重新定位数据库实例,
而不会让应用程序用户停机。
或者,您可以使用Resource Manager实例缓存
来限制集群中每个服务器的单个数据库实例的CPU消耗,
并在必要时根据需求场景动态更改此限制。
使用单一客户端访问名称(SCAN)连接到数据库,
客户端可以独立于运行服务的节点来定位服务。
因此,重新定位Oracle RAC One Node实例对客户端
来说基本上是透明的,具体取决于客户端连接.

2.创建RAC One Node

可以使用DBCA创建Oracle RAC One Node数据库或者
手动创建的脚本也是可以的
Oracle RAC单节点数据库也可能是
从单个实例Oracle数据库或Oracle RAC数据库
转换而来的结果。
通常,Oracle提供的工具会向Oracle Clusterware
注册Oracle RAC单节点数据库
如果您的Oracle RAC One Node数据库
没有自动向Oracle Clusterware注册,
请使用srvctl add database命令将Oracle RAC One Node数据库添加到集群中。
$ srvctl add database -dbtype  
RACONENODE [-server server_list]
[-instance instance_name] [-timeout timeout]

3.RAC切换到RAC One Node

在将Oracle RAC数据库转换为Oracle RAC单节点数据库之前,
必须首先确保Oracle RAC数据库只有一个实例。
如果您的Oracle RAC数据库由管理员管理,并且有多个实例,
则必须使用srvctl remove instance
命令删除除一个实例以外的所有实例。
如果您的Oracle RAC数据库是策略管理的,
并且有多个实例,
则必须使用srvctl stop instance命令
停止除一个实例以外的所有实例。
Related Topics
1.srvctl remove instance
2.srvctl stop instance
3.srvctl convert database

3.1 查看资源状态

[root@rac01 ~]$ crsctl status res -t
从这里看到,数据库的名字叫racdb

3.2.查看实例

[oracle@rac01 ~]$ srvctl status database -d racdb
Instance racdb1 is running on node rac01
Instance racdb2 is running on node rac02

3.3 查看数据库详细信息

[oracle@rac01 ~]$ srvctl config database -d racdb
Database unique name: racdb
Database name: racdb
Oracle home: /u01/app/oracle/product/19.0.0/dbhome_1
Oracle user: oracle
Spfile: +DATA/RACDB/PARAMETERFILE/spfile.268.1159380643
Password file: +DATA/RACDB/PASSWORD/pwdziprodb.256.1159380269
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: ARCH,DATA
Mount point paths:
Services:
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: oper
Database instances: racdb1,racdb2
Configured nodes: rac01,rac02
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
从上图中,可以看到数据库名,
oracle_home,实例名,以及重要的TYPE为RAC

3.4.删除实例

只留下一个,RACOneNode只有一个实例是活动状态
[oracle@rac01 ~]$ srvctl remove instance 
-d racdb -i rac02 -f

说明:加上-f参数可以强制关闭实例并将实例删除

3.5 新增service

如果不新增service,无法进行转换

[oracle@rac01 ~]$ srvctl add service -h  
--查看新增service的帮助
[oracle@rac1 ~]$ srvctl add service
-d prodb
-s rac
-r rac01
-P BASIC
-e SELECT
-m BASIC
-y AUTOMATIC

[oracle@rac01 ~]$ srvctl start service 
-d racdb -s rac

说明:service名字为rac,TFA类型为BASIC

3.6 转换为RAC One Node

[oracle@rac01 ~]$ srvctl convert database 
-d racdb -c RACONENODE -i rac01

3.7 再次查看状态

[oracle@rac01 ~]$ srvctl config database -d racdb

这里可以看到TYPE是RACOneNode。
Instance name prefix是实例的前缀,
后续会生成racdb1_1和racdb1_2实例

3.8 测试一下HA

[oracle@rac01 ~]$ srvctl relocate database 
-d racdb -n rac02

[oracle@rac01 ~]$ srvctl relocate database 
-d racdb -n rac01

4.RAC One Node切换到RAC

通过以Oracle RAC One Node数据库所有者的身份登录
并输入以下SRVCTL命令,
srvctl convert database 
-db db_unique_name -dbtype RAC

您可以将Oracle RAC One Node数据库
转换为Oracle RAC数据库:

4.1 进行转换

[oracle@rac01 ~]$ srvctl convert database 
-d racdb -c rac

4.2 查看数据库信息

[oracle@rac01 ~]$ srvctl config database 
-d racdb
从这里可以看到TYPE是RAC

4.3.新增实例

[oracle@rac01 ~]$ srvctl add instance 
-d racdb -i racdb1_2 -n rac02

4.4 启动实例

[oracle@rac01 ~]$ srvctl start instance 
-d racdb -i racdb1_2

4.5 再次查看数据库的状态

[oracle@rac01 ~]$ srvctl config database 
-d racdb

5.其他事项

5.1 RAC的SPFILE

在实际工作中,发现有一些RAC实例的SPFILE是
在各自的ORACLE_HOME/dbs下,
现在想将其修改到共享目录(asm磁盘)中
1.将spfile建入共享目录中
create pfile-'/tmp/pfile.txt' from spfile;
create spfile='+DATA/racdb/spfileracdb.ora' 
from pfile='/tmp/pfile.txt';

2.将spfile的路径写入
ORACLE_HOME/dbs/initracdb1.ora
ORACLE_HOME/dbs/initracdb2.ora

[oracle@rac01 ~]$ vi initracdb1.ora
SPFILE='+DATA/racdb/spfileracdb.ora' 

[oracle@rac02 ~]$ vi initracdb2.ora
----------------------------------
SPFILE='+DATA/racdb/spfileracdb.ora' 
----------------------------------

3.同步到RAC集群的配置文件
srvctl modify database 
-d racdb 
-p '+DATA/racdb/spfileracdb.ora'

4.重启实例

srvctl stop instance -d racdb -i racdb2
srvctl start instance -d racdb -i racdb2
srvctl stop instance -d racdb -i racdb1
srvctl start instance -d racdb -i racdb1

5.2 转换后启动报错

在启动racdb2的时候,可能会报如下错误

ORA-01102: cannot mount database in EXCLUSIVE mode
这是需要修改参数cluster_database=true即可

alter system set cluster_database=true sid='*' scope=spfile;
--查看数据库状态
srvctl config database -d racdb