主库:
Oracle Rac双节点
灾备:
Oracle Rac双节点
搭建方式:
ADG
数据库版本:
oracle 19c 19.18
需求:
出于安全原因,参数redo_transport_user,是定义传输redo日志的用户,默认使用sys用户传输,修改原因:
1)不希望仅将如此高特权的用户用于重做传输
2)sys用户锁定后主备库传输中断故生产环境下需要更改其他用户传输。
Oracle手册:传输用户需要有SYSDBA或者SYSOPER权限,但是通过实际测试来看,只有SYSDBA是不行的,必须有SYSOPEN权限才行。
1.备份参数文件 --主、备库
--主库
SQL>create pfile='/home/oracle/pfile_primary_bak.20220711' from spfile;
--备库
SQL>create pfile='/home/oracle/pfile_standby_bak.20220711' from spfile;
2.建立redo_transport_user的用户
SQL> drop user dguser cascade;
User dropped.
SQL> show parameter redo_transport_user
NAME TYPE VALUE
------------------- ---------- --------
redo_transport_user string <--缺省没有定义redo_transport_user.值为空,默认使用sys用户
--主库:
--建用户
SQL> create user dguser identified by yzz666;
User created.
--授权
SQL> grant sysoper,session to dguser ;
Grant succeeded.
--查权限
SQL> select * from v$pwfile_users
USERNAME SYSDBA SYSOPER SYSAS
-------------------- ------- -------------- -----
SYS TRUE TRUE FALSE
dguser FALSE TRUE FALSE
3.主库密码文件拷贝到备库: --主库
检查当前主库密码文件路径
19 RAC
SQL> set linesize 200 pagesize 9999
SQL> col file_name for a70
SQL> select * from v$passwordfile_info;
或
$ srvctl config databse -d `srvctl config database`
grid用户从ASM磁盘组拷贝密码文件
$asmcmd
ASMCMD > Cd +DATA/密码文件路径
ASMCMD > ls
pwddbm.256.960160015
ASMCMD >pwcopy +DATA/密码文件路径 /tmp/pwd[db_uniquena_name]
$ls -l /tmp/pwd[db_uniquena_name]
标注内容按照实际环境更改
计算文件MD5码
$ shalsum /tmp/pwd[db_uniquena_name]
将密码文件传输到备库
$ scp /tmp/pwd[db_uniquena_name] grid@备库ip:/tmp/pwd[db_uniquena_name]
如11g版本
默认$ORACLE_HOME/dbs下,由于密码文件不在磁盘组中,需主备库各个节点密码文件一致,主库各个节点也需cp
4.主库暂时禁用redo传输 --主库执行
SQL> show parameter log_archive_dest_state_n
SQL> alter system set log_archive_dest_state_2=defer scope=both sid='*';
System altered.
5.备库端验证密码文件完整性 --备库执行
备库端计算密码文件MD5码,与主库对比,确保密码文件的完整性
$ shalsum /tmp/pwd[db_uniquena_name]
6.停备库--备库执行
$su - oracle
SQL> alter database recover managed standby database cancel;
$srvctl stop databse -d `srvctl config database`
$srvctl config databse -d `srvctl config database` <--检查密码文件路径
7.密码文件拷贝到ASM磁盘组 --备库执行
$ su - grid
$ asmcmd
ASMCMD > cd +DATA/密码文件路径
ASMCMD > rm 旧的密码文件 <====删除旧的密码文件
ASMCMD > pwcopy --dbuniquename [dbuniquename ] -f /tmp pwd[dbuniquename] '+DATA/密码文件路径' <====拷贝新的密码文件,注意路径和名称保持和srvctl config database中输出一致
8.启动备库 --备库执行
$ su - oracle
$ srvctl start database -d `srvctl config database`
9.密码文件检查 --主备库执行
SQL>select a.username,a.sysoper,a.account_status from v$pwfile_users a;
10.修改redo_transport_user参数 --主备库执行
SQL> alter system set redo_transport_user=dguser scope=both sid='*';
System altered.
11.主库启动redo传输 --主库执行
oracle 用户执行
SQL> show parameter log_archive_dest_state_n
SQL> alter system set log_archive_dest_state_2=ebable scope=both;
System altered.
12.备库启用MRP --备库执行
SQL > alter database recover managed standby database using current logfile disconnect from session ;
SQL > select open_mode,switchover_status,database_role from gv$datasbse;
13.备库同步状态检查
--查询max(sequence)#:
SQL> select max(sequence) from v$archive_log;
SQL> select sequence#,name,standby_dest,applied,deleted from v$archived_log where archived='YES' order by sequence# desc;
--查询managed_standby:
SQL> select process,group#,thread#,sequence# from v$managed_standby;
--主备库上执行对比时间小于5秒:
SQL> select to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd hh24:mi:ss') from v$database;
--检查日志队列是否正常传输
SQL> select sequence#,applied,first_time,next_time from v$archived_log order by sequence#;
--查看备库数据库状态
SQL> select open_mode from v$database;
OPEN_MODE
-------------
MOUNTED
--把备库启动到open only下:
SQL> alter database open read only;
--主库检查LNS进程:
SQL> select process,status from v$managed_standby; <--如果没有LNS进程,则需要检查DG环境.
--检查主备库角色和其他信息
备库:
SQL> select database_role,protection_mode,open_mode from v$database;
主库:select database_role,open_mode from gv$database;
--在备库查看data guard为哪种日志接受方式:
SQL> select process,client_process,sequence#,status from v$managed_standby;
--检查日志队列是否正常传输:
SQL> select sequence#,applied,first_time,next_time from v$archived_log order by sequence#;
--检查两边的日志同步情况:
SQL> select sequence# from v$archived_log where applied='YES';
----->检查主备库状态没问题,至此,本工作完成
14.这样做的好处:
--安全,用户dguser没有权限登录数据库.
$ sql -s -l dguser/dguser666@pdb
ERROR:
ORA-01045: user A lacks CREATE SESSION privilege; logon denied
SP2-0751: Unable to connect to Oracle. Exiting SQL*Plus
--如果使用as sysoper登录,显示用户是PUBLIC.除了一些操作数据库的管理权限,其它建表相关的的操作不允许.
$ sqlplus a/xxxxxxx as sysoper
SQL*Plus: Release 11.2.0.4.0 Production on Wed Jan 3 10:11:31 2018
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
PUBLIC@book> create table a ( b number); <--无法建表
create table a ( b number)
*
ERROR at line 1:
ORA-01031: insufficient privileges
15.拓展:对于RAC 11g数据库
主库、备库均为双节点,需注意:
1)11g不同于19c,19C密码文件在asm中,11g在$ORACLE_HOME/dbs下
2)密码文件要四台机器(主备一致)
3)修改redo_transport_user参数需主备库分别执行
实施过程:
把主库一节点(调整参数redo_transport_user的节点)中的密码文件scp备库节点一、备库节点二,然后在把主库1的密码文件scp到主库2节点,需保持4个节点一致
(拷前mv备份原密码文件),
$mv 密码文件 密码文件_bak
SQL> log_archive_dest_state_n=defer/enable后
切换归档
SQL> alter system archive log current;
SQL> alter system set redo_transport_user=dguser;
System altered.
SQL> show parameter redo_transport_user
NAME TYPE VALUE
------------------- ---------- ------
redo_transport_user string dguser