集群环境搭建
操作系统规划
|
节点 |
系统版本 |
cpu |
内存 |
|
节点一 |
RHEL7.6 |
>=32 |
>=256G |
|
节点二 |
RHEL7.6 |
>=32 |
>=256G |
备注:两个系统配置需完全一样。以上为最低配置,可以对应增大。系统版本 RHEL7.6 为 19C 最佳实践版本。
主机文件规划
两个节点:
|
挂载点 |
大小 |
|
/ |
100G |
|
/oracle |
100G |
|
/swap |
32G |
|
/backup |
1T+ |
备注:以上文件系统都必须建立单独的 lv 设备。
主机网卡规划
|
节点 |
网卡数 |
用途 |
|
节点一 |
2 张物理网卡或则4张物理网卡 |
一个网卡用于集群内部的私有通信(私有网卡),另一个网卡用于提供对外服务(公共网卡) |
|
节点二 |
2 张物理网卡或者4张物理网卡 |
备注:4张网卡可以两两做bond(冗余)。
规划
|
节点 |
IP 规划 |
用途 |
|
节点一 |
提供2个公网IP |
一个为物理IP,一个为VIP |
|
提供1个私网IP(不对外,自行设置) |
用于集群之间通信IP | |
|
节点二 |
提供2个公网IP |
一个为物理IP,一个为VIP |
|
提供1个私网IP(不对外,自行设置) |
用于集群之间通信IP | |
|
提供1个SCAN IP |
SCAN IP |
备注:客户需要提供 5 个公网 IP 地址,两个私网 IP 地址。
共享存储规划
|
磁盘名称 |
大小 |
|
OCRVOTE |
3 块5G盘 |
|
DATA |
1.5T+ |
备注:共享存储需要映射到两台主机,并且主机上看到的磁盘名字对应一致。
安装前准备
两台主机安装上述配置完成之后,需要将相应介质上传至主机上,如下:
|
上传节点 |
上传目录 |
上传安装包 |
说明 |
|
节点一 |
/oracle |
系统镜像ISO rhel-server-7.6-x86_64-dvd.iso |
集群安装前,系统配置使用 |
|
LINUX.X64_193000_db_home.zip |
数据库软件安装包 | ||
|
LINUX.X64_193000_grid_home.zip |
集群软件安装包 | ||
|
p34130714_190000_Linux-x86-64.zip p6880880_190000_Linux-x86-64.zip |
数据库和集群补丁包 | ||
|
compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm |
额外需要操作系统包 |
目标库数据同步后打开(12.1.0.2单机)
业务停止
业务停止,确保无新增数据写入。
源库和目标库禁止自动作业任务
|
alter system set job_queue_processes=0 scope=both sid='*'; |
源库双节点关闭后,启动一号节点
源库关闭,重新启动一号节点实例,并确保无业务会话连接至数据库。在一号节点切换归档,数据完全同步后,打开目标库。
|
srvctl stop database -d XX 一号节点: startup 切换归档: alter system swich logfile; |
目标库打开
|
停止应用归档: ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 将STANDBY数据库切换为PRIMARY数据库: ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH; 或 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; 检查状态: SELECT DATABASE_ROLE FROM V$DATABASE; 打开目标库: ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; ALTER DATABASE OPEN; 或者 shutdown immediate; startup;
|
源库正常关闭
源库一号节点正常关闭:
|
shutdown immediate; |
至此,完成源库到目标库数据同步及切换。
和SYSTEM重复对象检查
|
select object_name, object_type from dba_objects where (object_name,object_type) in (select object_name,object_type from dba_objects where owner = 'SYS') and owner = 'SYSTEM'; |
无效对象检查
|
create table object_2021 as select * from dba_objects; select count(*) from object_2021 where status='INVALIED'; |
确认数据文件不需要介质恢复且不处于backup模式
|
select * from v$recover_file; SELECT * FROM v$backup WHERE status != 'NOT ACTIVE'; |
密码状态为 EXPIRED 的用户检查
确保业务用户正常:
|
备注: 在开始升级之前,请确定是否要对密码处于 EXPIRED 状态且其帐户处于 LOCKED 状态的默认 Oracle 数据库帐户使用密码身份验证。
在升级到 Oracle Database 19c 之后,默认的 Oracle 账号(没有设置密码并且处于 EXPIRED 和 LOCKED 状态)会被置为 NO AUTHENTICATION 状态。
由于此新功能,这些默认账号会变为 schema-only 帐户,并无法使用密码验证。此功能的好处是管理员不再需要定期修改这些 Oracle 默认账号的密码。
此功能还可以降低未授权者使用默认密码侵入这些帐户的安全风险。
如果要在升级期间阻止将这些 Oracle 帐户设置为仅 schema-only 帐户,则必须在开始升级之前为该帐户设置有效的强密码,或者在升级后为这些帐户设置有效的强密码, 或者在升级前解锁帐户。
升级后,管理员还可以为仅 schema-only 启用密码身份验证。 但是,为了更好的安全性, Oracle 建议您将这些帐户保留为 schema-only 账号。 |
处理分布式事务
|
SQL>
IF THIS RETURNS ROWS YOU SHOULD DO THE FOLLOWING: SQL> SELECT LOCAL_TRAN_ID FROM DBA_2PC_PENDING; SQL> EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(''); SQL> COMMIT; |
检查
如果安装了 Oracle Multimedia 或者 Oracle Spatial ,在安装前检查 PUBLIC synonym AREA 。它应当被定义为 OGC_AREA 的同义词,否则会导致升级后一些 DB 组件是失效的状态
|
SQL> select owner, synonym_name, table_owner, table_name from dba_synonyms where synonym_name = 'AREA';
OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME ------------ -------------------- --------------- -------------------- PUBLIC AREA MDSYS OGC_AREA
|
禁用所有自定义的 before/after DDL 类型的触发器
|
SQL> SELECT TRIGGER_NAME,TRIGGER_TYPE,STATUS,ACTION_TYPE FROM all_triggers where trigger_name like '%DDL%';
SQL> SELECT TRIGGER_NAME,TRIGGER_TYPE,STATUS,ACTION_TYPE FROM all_triggers where TRIGGERING_EVENT like '%DDL%';
ALTER TRIGGER GGS_DDL_TRIGGER_BEFORE DISABLE;
|
收集数据字典统计信息
|
EXEC DBMS_STATS.GATHER_DICTIONARY_STATS; |
执行preupgrade.jar升级预检
19c 用 preupgrade.jar 替换了 utlu112i.sql 来执行预检工作,这个 java 程序会生成两个 sql 脚本文件来修复一些简单的问题,比如提前收集字典统计信息之类,但是很多仍然需要手工操作
preupgrade.jar 语法如下
$Earlier_release_Oracle_home/jdk/bin/java -jar $New_release_Oracle_home/rdbms/admin/preupgrade.jar [FILE|TERMINAL] [TEXT|XML] [DIR output_dir]
FILE|TERMINAL 指定检查结果输出到终端还是文件,默认是文件
TEXT|XML 指定结果格式是文本还是 XML ,默认是文本
DIR - 指定日志输出到 <output_dir> 目录 .
如果没有指定 output_dir 目录,则优先到 $ORACLE_BASE/cfgtoollogs/<dbname>/preupgrade/ 目录,如果没有 ORACLE_BASE 环境变量则到 $ORACLE_HOME/cfgtoollogs/<db_name>/preupgrade/
|
~ export ORACLE_BASE=/u01/app/oracle #### 注意要用 12c 的 jdk 来执行 export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1 export ORACLE_SID=XX
$ORACLE_HOME/jdk/bin/java -jar /oracle/product/19.3.0/dbhome_1/rdbms/admin/preupgrade.jar file text dir ./precheck.log
================== PREUPGRADE SUMMARY ================== /home/oracle/precheck.log/preupgrade.log /home/oracle/precheck.log/preupgrade_fixups.sql /home/oracle/precheck.log/postupgrade_fixups.sql
Execute fixup scripts as indicated below:
Before upgrade:
Log into the database and execute the preupgrade fixups @/home/oracle/precheck.log/preupgrade_fixups.sql
After the upgrade:
Log into the database and execute the postupgrade fixups @/home/oracle/precheck.log/postupgrade_fixups.sql
|
日志显示:
|
more preupgrade.log Report generated by Oracle Database Pre-Upgrade Information Tool Version 19.0.0.0.0 Build: 1 on 2021-01-05T16:47:28 ......... ......... ORACLE GENERATED FIXUP SCRIPT ============================= All of the issues in database XX which are identified above as AFTER UPGRADE "(AUTOFIXUP)" can be resolved by executing the following
SQL>@/home/oracle/precheck.log/postupgrade_fixups.sql
|
执行:
|
@/home/oracle/precheck.log/preupgrade_fixups.sql |
正式升级数据库 ,刷数据字典升级数据库
把参数文件从 12C $ORACLE_HOME/dbs 下复制到 19C $ORACLE_HOME/dbs 下。
以 19c 软件启动
|
source .profile19c echo $ORACLE_HOME SQL> startup upgrade
cd / oracle /product/19.3.0/dbhome_1/bin nohup ./dbupgrade & |
复制tnsnames.ora和密码文件到19c环境
|
$ cp $ORACLE_HOME/network/admin/tnsnames.ora . $ cp $ORACLE_HOME/dbs/orapwXX . |
|
备注: 如果 REMOTE_LOGIN_PASSWORDFILE 初始化参数设置为 EXCLUSIVE ,则使用 ORAPWD 创建或迁移密码文件。 Oracle Database 12c 及更高版本为 ORAPWD 提供了一个新选项,用于从现有数据库迁移密码文件。
对于 Oracle Database 12c 第 2 版( 12.2 )及更高版本,如果 REMOTE_LOGIN_PASSWORDFILE 设置为 SHARED ,则会收到升级前检查验证警告。 您可以选择以下选项之一来解决此问题:
通过设置 REMOTE_LOGIN_PASSWORDFILE = NONE 完全禁用基于密码文件的身份验证
通过设置 REMOTE_LOGIN_PASSWORD = EXCLUSIVE 限制基于密码文件的身份验证 |
重新打开数据库刷无效对象
|
sqlplus / as sysdba SQL> SQL> startup |
组件状态检查:
|
SQL>col COMP_NAME for a55; SQL> set pages 400; SQL> select comp_name,version,status from dba_registry; |
修复无效对象:
|
$ sqlplus "/ AS SYSDBA" SQL> @ |
此时 dba_registry 内所有组件状态从 UPGRADED 变为 VALID 。
如果组件 Oracle Real Application Clusters 的状态为 OPTION OFF ,则 当转换为RAC后,再 对该组件进行重新编译。
执行 Post-Upgrade Status 工具, utlusts.sql 并且检查升级的日志
|
$ sqlplus "/as sysdba" SQL> STARTUP SQL> @?/rdbms/admin/utlusts.sql |
注意 : 之前版本的 utluNNNs.sql 在 19c 上被替换为 utlusts.sql
注意 : 如果执行 utlusts.sql 时碰到错误 "ORA-06502: PL/SQL: numeric or value error: character string buffer too small" ,那么执行
|
$ sqlplus "/as sysdba" SQL> STARTUP SQL> @?ORACLE_HOME/rdbms/admin/utlusts.sql TEXT |
数据库升级后 ,无效对象比对
对比之前的无效对象进行确认
|
select owner,object_name from dba_objects where status<>'VALID' and object_name not in (select object_name from object_2021 where status<>'VALID'); |
执行预检生成的修复脚本
|
SQL>@/home/oracle/precheck.log/postupgrade_fixups.sql |
重新收集统计信息
升级那些使用 DBMS_STATS 创建的统计信息表(Statistics Tables)
|
如果我们使用 DBMS_STATS.CREATE_STAT_TABLE 手工创建了一些统计信息表( statistics tables ),那么执行下面的命令来升级这些表(如果没有创建过统计信息表,那这一步骤可以忽略)。例如:
EXECUTE DBMS_STATS.UPGRADE_STAT_TABLE('SYS', 'dictstattab'); 对每个统计信息表都要执行一遍上面的命令。 |
修改RAC参数文件
|
mv /oracle/app/product/19.3.0/db_1/dbs/initXX1.ora /oracle/app/product/19.3.0/db_1/dbs/initXX1.ora.bak |
|
vi /oracle/app/product/19.3.0/db_1/dbs/initXX1.ora *.audit_file_dest=xxx *.compatible=xxx *.control_files=xxx *.db_block_size=8192 *.db_create_file_dest='+DATA' *.db_domain='' *.db_file_multiblock_read_count=16 *.db_name='XX' *.db_recovery_file_dest='+DATA' *.db_recovery_file_dest_size=429496729600 *.dispatchers='(PROTOCOL=TCP) (SERVICE=XXXDB)' *.job_queue_processes=0 *.log_archive_dest_1='LOCATION=+DATA' *.log_archive_format='%t_%s_%r.dbf' *.open_cursors=300 *.pga_aggregate_target=21474800000 *.processes=3000 *.remote_login_passwordfile='exclusive' *.sessions=3305 *.sga_max_size=85899300000 *.sga_target=80899300000 *.undo_management='AUTO' *.undo_retention=86400 *.undo_tablespace='UNDOTBS1' *.diagnostic_dest='/oracle/app' *.cluster_database=true *.db_files=500 *.remote_listener='rac-scanip:1521' XX1.instance_number=1 XX2.instance_number=2 XX2.thread=2 XX1.thread=1 XX2.undo_tablespace='UNDOTBS2' XX1.undo_tablespace='UNDOTBS1' |
|
使用ORACLE_SID=XX1 startup nomount 创建: create spfile='+data' from pfile; |
修改双节点$ORACLE_HOME/dbs 目录下参数文件,指向asm中的spfile路径
一节点:
|
vi $ORACLE_HOME/dbs/initXX1.ora SPFILE='+data/XX/PARAMETERFILE/spfile.434.989222673' |
二节点:
|
vi $ORACLE_HOME/dbs/initXX2.ora SPFILE='+data/XX/PARAMETERFILE/spfile.434.989222673' |
注意:如果实例从单机的名称变成rac的名称,那么两个节点的密码文件名字都需要作出相应的更改。
添加二节点资源
|
shutdown immediate; export ORACLE_SID=XX1 startup; 创建二节点undo (如果undotbs2已经拷贝过来,这步忽略) create undo tablespace undotbs2 datafile '+DATA/XX/datafile/undotbs02.dbf' size 1G autoextend on; |
创建二节点日志文件
|
alter database add logfile thread 2 group 8 '+DATA/XX//ONLINELOG/redo2_01' size 800m; alter database add logfile thread 2 group 9 '+DATA/XX/ONLINELOG/redo2_02' size 800m;
|
激活2节点redo
|
alter database enable thread 2; |
重置temp文件
|
SQL> select file_name from dba_temp_files;
create temporary tablespace temp1 tempfile '+DATA' size 1G autoextend on; alter database default temporary tablespace temp1; drop tablespace temp including contents and datafiles; create temporary tablespace temp tempfile '+DATA' size 1G autoextend on; alter database default temporary tablespace temp; drop tablespace temp1 including contents and datafiles;
( 删除临时表空间hang,尝试推出当前会话,重新登陆后删除。)
|
刷新RAC组件
|
SQL>spool on SQL>spool catclust.txt SQL>@?/rdbms/admin/catclust.sql SQL>spool off
刷新完成后,重新编译无效对象 SQL>@?/rdbms/admin/utlrp.sql |
将数据库及实例加入集群管理
二节点:
检查二节点是否存在目录 :*.audit_file_dest='/oracle/app/admin/XX/adump'
一节点:
手工关闭正在运行的实例
|
shutdown immediate;
su - oracle srvctl add database -d XX -o '/oracle/app/product/19.3.0/db_1' -p '+data/XX/PARAMETERFILE/spfile.434.989222673' srvctl add instance -d XX -i XX1 -n rac1 srvctl add instance -d XX -i XX2 -n rac2
srvctl start instance -d XX -n rac1 srvctl start instance -d XX -n rac2 srvctl status database -d XX |
查看磁盘组版本:
|
select name,state,type,total_mb,compatibility,database_compatibility from v$asm_diskgroup; |
修改磁盘组版本:
|
ALTER DISKGROUP data SET ATTRIBUTE 'compatible.asm' = '19.0.0.0.0'; ALTER DISKGROUP data SET ATTRIBUTE 'compatible.rdbms' = '19.0.0.0.0'; |
磁盘组的属性只能增大,不能减小,如果增大过程出现错误,那么只能通过重建磁盘组来调整兼容性属性值。
重启两节点验证有没有报错
|
srvctl stop database -d XX srvctl start database -d XX su – gird crs_stat –t |
启动之前的DDL触发器:
|
SQL> SELECT TRIGGER_NAME,TRIGGER_TYPE,STATUS,ACTION_TYPE FROM all_triggers where trigger_name like '%DDL%'; TRIGGER_NAME TRIGGER_TYPE STATUS ACTION_TYPE ------------------------------ ---------------- -------- ----------- GGS_DDL_TRIGGER_BEFORE BEFORE EVENT ENABLED PL/SQL NO_VM_DDL BEFORE EVENT DISABLED PL/SQL
ALTER TRIGGER GGS_DDL_TRIGGER_BEFORE ENABLE; |
开启自动任务:
|
alter system set job_queue_processes=1000 scope=both sid='*'; |
