col name for a40 col value for a40 col describ for a40 set linesize 130
SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ FROM SYS.x$ksppi x, SYS.x$ksppcv y WHERE x.inst_id = USERENV (‘Instance‘) AND y.inst_id = USERENV (‘Instance‘) AND x.indx = y.indx AND upper(x.ksppinm) like ‘%NUMA%‘;
alter system set "_enable_NUMA_optimization"= false scope=spfile; alter system set "_db_block_numa"=1 scope=spfile;
(11)、搭建A主机数据库的物理DG B,具体过程可以参考官方联机文档。
2、切换物理DG, 把B主机上的数据库切换为逻辑备库的过程: (1)、首先在备库上停掉日志应用: alter database recover managed standby database cancel; (2)、从主库上获取备库所需的数据字典信息 sql> exec dbms_logstdby.build –-主库执行 (3)、切换物理备库至逻辑备库 Sql> alter database recover to logical standby lstydb;
--其中lstydb为逻辑备库的db_name=lstydb--这个可以自己另启一个不用跟主库一样。 (4)、关闭数据库 Sql> shutdown immediate (5)、启动至mount状态 Sql> startup mount。 (6)、备库重建密码文件 orapwd file=$ORACLE_HOME/dbs/orapwstydb password=oracle entries=5 ignorecase=y force=y (7)、创建备库归档目录 mkdir –p /u01/app/oracle/archive/stydb (8)、修改备库参数 alter system set log_archive_dest_1=‘location=/u01/app/oracle/archive/stydb valid_for=(online_logfiles,all_roles) db_unique_name=stydb‘;
alter system set log_archive_dest_2=‘location=/u01/app/oracle/archive
valid_for=(standby_logfiles,standby_roles) db_unique_name=stydb‘; (9)、 打开逻辑备库 Sql> alter database open resetlogs;
(10)、 启用sql apply Sql> alter database start logical standby apply immediate (11)、 备库检查 Sql> SELECT db_unique_name,open_mode, database_role, switchover_status,guard_status,protection_mode from v$database;
总结 逻辑备库主要用于数据库的滚动升级,可在不停机的状态下升级db,实现高可用性~~
3、升级B主机上的逻辑备库(数据库软件从oracle 10.2.0.4升级到oracle 11.2.0.3)过程: 参考文档:Complete Checklist for Manual Upgrades to 11gR2 [ID 837570.1] 第一部分 - 安装11gR2软件 这里对软件的安装就不详细说明了,可以参考相应的文档。 这里需要注意的是:如果你想在11gr2上打上最新的PSU或CPU,可以先在软件级别上打上PSU或CPU,这样就不用跑两次catbundle.sql,减少停机时间。 第二部分 - 初步检查 (1)、 在升级之前,确保所有的组件和对象都是valid: col comp_name format a20 col status format a30 col version format a10 select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version from dba_registry order by comp_name; --针对组件 select substr(object_name,1,40) object_name,substr(owner,1,15) owner,object_type from dba_objects where status=‘INVALID‘ order by owner,object_type; --针对对象 如果有invalid的对象,运行utlrp.sql重新编译对象。 (2)、 确保sys和system下没有重复的对象: col object_name format a20 col object_type format a21 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‘; 上面这条语句只能返回以下4条记录: OBJECT_NAME OBJECT_TYPE ---------------------------------------- --------------- DBMS_REPCAT_AUTH PACKAGE BODY DBMS_REPCAT_AUTH PACKAGE AQ$_SCHEDULES_PRIMARY INDEX AQ$_SCHEDULES TABLE 如果有其它记录返回,则必须根据下面这篇文档把重复记录删除: How to Clean Up Duplicate Objects Owned by SYS and SYSTEM Schema [ID 1030426.6] 第三部分 - 升级前工作 Step 1. 从11gR2的Oracle Home下拷贝以下文件至一个临时文件夹: $ORACLE_HOME/rdbms/admin/utlu112i.sql
Step 2. 登陆数据库,运行:
$ sqlplus ‘/ as sysdba‘ SQL> spool upgrade_info.log SQL> @utlu112i.sql SQL> spool off SQL> 生成的upgrade_info.log里的内容很重要,后续步骤要根据该文件的内容做相应的修改,因此一定要保留下来。
Step 3. 从下面这篇文档里可以下载到脚本dbupgdiag.sql: Script. to Collect DB Upgrade/Migrate Diagnostic Information (dbupgdiag.sql) [ID 556610.1] 运行这个脚本: cd <location of the script> $ sqlplus / as sysdba sql> alter session set nls_language=‘American‘; sql> @dbupgdiag.sql sql> exit 如果该脚本报告有invalid对象,运行以下命令重编译无效对象: $ cd $ORACLE_HOME/rdbms/admin $ sqlplus "/ as sysdba" SQL> @utlrp.sql
Step 6. 检查Timezone版本,主要参考: Actions For DST Updates When Upgrading To Or Applying The 11.2.0.2 Patchset [ID 1201253.1] 注意:11g的软件里已经自带了版本1-14的Timezone。 先检查一下当前timezone版本: SQL> conn / as sysdba Connected. SQL>SELECT version FROM v$timezone_file; 根据当前timezone的版本,又分三种情况: 1)等于14:这已经是11g需要的版本了,所以升级前后都不需要做任何事,这种情况很罕见。 2)高于14:升级前,必须得给11g软件打上该timezone版本的DST补丁,这种情况也很罕见。 3)低于14:大多数都是这种情况,在升级前不需要在11g软件层面打补丁,在升级后需要再数据库层面将Timezone升级至14,具体看后面的步骤
Step 7. 检查国家字符集是否是UTF8或AL16UTF16: select value from NLS_DATABASE_PARAMETERS where parameter = ‘NLS_NCHAR_CHARACTERSET‘; 如果是,则什么都不用做;如果不是,那你就惨了,跟着下面长长的这篇文档一步一步做吧: The National Character Set ( NLS_NCHAR_CHARACTERSET ) in Oracle 9i, 10g and 11g [ID 276914.1]
Step 10. 备份Enterprise Manager Database Control Data,因为本例并没有使用EM,所以不需要该步骤。
Step 11. 配置网络ACL‘s,在本例中不需要配置。
Step 12. 使用以下语句生产分析数据字典的脚本 (as sysdba): Set verify off Set space 0 Set line 120 Set heading off Set feedback off Set pages 1000 Spool analyze.sql
SELECT ‘Analyze cluster "‘||cluster_name||‘" validate structure cascade;‘ FROM dba_clusters WHERE owner=‘SYS‘ UNION SELECT ‘Analyze table "‘||table_name||‘" validate structure cascade;‘ FROM dba_tables WHERE owner=‘SYS‘ AND partitioned=‘NO‘ AND (iot_type=‘IOT‘ OR iot_type is NULL) UNION SELECT ‘Analyze table "‘||table_name||‘" validate structure cascade into invalid_rows;‘ FROM dba_tables WHERE owner=‘SYS‘ AND partitioned=‘YES‘;
Step 13. 确保所有的snapshot都已被成功刷新,且replication已被关闭: SELECT DISTINCT(TRUNC(last_refresh)) FROM dba_snapshot_refresh_times;
Step 14. 确保当前没有文件需要介质恢复: SELECT * FROM v$recover_file; 上面语句没有返回结果才是正确的。
Step 15. 确保当前没有文件运行在备份模式下: SELECT * FROM v$backup WHERE status != ‘NOT ACTIVE‘; 上面语句没有返回结果才是正确的。
Step 16. 解决分布式事务。 先查询是否还有分布式事务: SQL> select * from dba_2pc_pending; 如果有返回结果,则: SQL> SELECT local_tran_id FROM dba_2pc_pending; SQL> EXECUTE dbms_transaction.purge_lost_db_entry(‘‘); SQL> COMMIT;
Step 17. 检查是否有Standby数据库存在: SELECT SUBSTR(value,INSTR(value,‘=‘,INSTR(UPPER(value),‘SERVICE‘))+1) FROM v$parameter WHERE name LIKE ‘log_archive_dest%‘ AND UPPER(value) LIKE ‘SERVICE%‘; 如果有返回结果,则在升级之前,要保证Standby和Primary是处于同步的状态。
Step 18. 禁用所有的batch和cron jobs
Step 19. 确保用户SYS和SYSTEM的默认表空间都是SYSTEM: SQL> SELECT username, default_tablespace FROM dba_users WHERE username in (‘SYS‘,‘SYSTEM‘); 如果不是,则要用以下语句修改为SYSTEM: SQL> ALTER user SYS default tablespace SYSTEM; SQL> ALTER user SYSTEM default tablespace SYSTEM;
Step 20. 确保AUD$表建在SYS用户下和SYSTEM表空间下: SQL> SELECT owner,tablespace_name FROM dba_tables WHERE table_name=‘AUD$‘; 如果不是,则要做相应的修改。
Step 21. 检查是否有外部认证的SSL用户: SQL> SELECT name FROM sys.user$ WHERE ext_username IS NOT NULL AND password = ‘GLOBAL‘; 如果有,则在升级之后记得要做Step 34。
Step 22. 记下数据文件、联机日志文件和控制文件的位置: SQL> SELECT name FROM v$controlfile; SQL> SELECT file_name FROM dba_data_files; SQL> SELECT group#, member FROM v$logfile; 且备份listener.ora, tnsnames.ora, sqlnet.ora等文件。
Step 32. Timezone数据库层面的升级。 注意:该步骤是否执行是和Step 6中的检查结果相关的,只有当Timezone的版本小于14时,才需要执行该步骤。 主要参考:Updating the RDBMS DST version in 11gR2 (11.2.0.1 and up) using DBMS_DST [ID 977512.1] 1)Timezone升级前的准备工作: 先检查一下当前的timezone版本: conn / as sysdba SELECT version FROM v$timezone_file; SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE ‘DST_%‘ ORDER BY PROPERTY_NAME; 一个典型的输出是: PROPERTY_NAME VALUE ------------------------------ ------------------------------ DST_PRIMARY_TT_VERSION 4 DST_SECONDARY_TT_VERSION 0 DST_UPGRADE_STATE NONE 然后开始准备工作: alter session set "_with_subquery"=materialize; exec DBMS_DST.BEGIN_PREPARE(14); 接着检查准备状态: SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE ‘DST_%‘ ORDER BY PROPERTY_NAME; 一个典型的输出是: PROPERTY_NAME VALUE ------------------------------ ------------------------------ DST_PRIMARY_TT_VERSION 4 DST_SECONDARY_TT_VERSION 14 DST_UPGRADE_STATE PREPARE -- truncate logging tables if they exist. TRUNCATE TABLE SYS.DST$TRIGGER_TABLE; TRUNCATE TABLE sys.dst$affected_tables; TRUNCATE TABLE sys.dst$error_table; -- log affected data set serveroutput on BEGIN DBMS_DST.FIND_AFFECTED_TABLES (affected_tables => ‘sys.dst$affected_tables‘, log_errors => TRUE, log_errors_table => ‘sys.dst$error_table‘); END; / 下面的语句都不能有返回结果: SELECT * FROM sys.dst$affected_tables; SELECT * FROM sys.dst$error_table; SELECT * FROM sys.dst$error_table where ERROR_NUMBER= ‘1883‘; SELECT * FROM sys.dst$error_table where ERROR_NUMBER= ‘1878‘; SELECT * FROM sys.dst$error_table where ERROR_NUMBER not in (‘1878‘,‘1883‘); -- end prepare window, the rows above will stay in those tables. EXEC DBMS_DST.END_PREPARE; -- check if this is ended SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE ‘DST_%‘ ORDER BY PROPERTY_NAME; 一个典型的输出是: PROPERTY_NAME VALUE ------------------------------ ------------------------------ DST_PRIMARY_TT_VERSION 4 DST_SECONDARY_TT_VERSION 0 DST_UPGRADE_STATE NONE
2)真正开始升级Timezone conn / as sysdba shutdown immediate; startup upgrade; set serveroutput on purge dba_recyclebin; TRUNCATE TABLE SYS.DST$TRIGGER_TABLE; TRUNCATE TABLE sys.dst$affected_tables; TRUNCATE TABLE sys.dst$error_table; alter session set "_with_subquery"=materialize; EXEC DBMS_DST.BEGIN_UPGRADE(14); SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE ‘DST_%‘ ORDER BY PROPERTY_NAME; 一个典型的输出是: PROPERTY_NAME VALUE ------------------------------ ------------------------------ DST_PRIMARY_TT_VERSION 14 DST_SECONDARY_TT_VERSION 4 DST_UPGRADE_STATE UPGRADE 下面这条语句应该没有返回结果: SELECT OWNER, TABLE_NAME, UPGRADE_IN_PROGRESS FROM ALL_TSTZ_TABLES where UPGRADE_IN_PROGRESS=‘YES‘; 重启数据库: shutdown immediate startup 升级相关的table: alter session set "_with_subquery"=materialize; set serveroutput on VAR numfail number BEGIN DBMS_DST.UPGRADE_DATABASE(:numfail, parallel => TRUE, log_errors => TRUE, log_errors_table => ‘SYS.DST$ERROR_TABLE‘, log_triggers_table => ‘SYS.DST$TRIGGER_TABLE‘, error_on_overlap_time => FALSE, error_on_nonexisting_time => FALSE); DBMS_OUTPUT.PUT_LINE(‘Failures:‘|| :numfail); END; / 如果没有错误,则结束升级: VAR fail number BEGIN DBMS_DST.END_UPGRADE(:fail); DBMS_OUTPUT.PUT_LINE(‘Failures:‘|| :fail); END; / 最后一次检查: SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE ‘DST_%‘ ORDER BY PROPERTY_NAME; 典型输出是: PROPERTY_NAME VALUE ------------------------------ ------------------------------ DST_PRIMARY_TT_VERSION 14 DST_SECONDARY_TT_VERSION 0 DST_UPGRADE_STATE NONE SELECT * FROM v$timezone_file; FILENAME VERSION -------------------- ---------- timezlrg_14.dat 14
Step 33. 该步骤可省略。
Step 34. 升级外部认证SSL用户。 由于本例是从10.2升级到11g,所以可忽略该步骤。
Step 35. 如果在Step 9中,你关闭了Vault,则必须在此步骤重新启用。 Note 453903.1- Enabling and Disabling Oracle Database Vault in UNIX
Step 36. 忽略
Step 37. 创建spfile: SQL> create spfile from pfile;
Step 38. 锁住系统用户,可忽略。
Step 39. 升级Oracle Text,可忽略。
Step 40. 升级Oracle Clusterware,可忽略。
Step 41. 配置EM,可忽略。
最后,记得修改compatible参数: SQL> ALTER SYSTEM SET COMPATIBLE = ’11.2.0’ SCOPE=SPFILE;
4、切换逻辑DG,把B主机上的数据库切换为主库过程: (1)、检查主库上SWITCHOVER_STATUS 的状态值,这里会有两种值,分别是 TO STANDBY 和 SESSIONS ACTIVE 。如果是其他的值,这里就要暂停一下,解决掉这个问题才能继续下一步。 SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; SWITCHOVER_STATUS -------------------- SESSIONS ACTIVE (2)、将主库设置为logical standby 的切换准备阶段 SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY; Database altered. (3)、检查主库上SWITCHOVER_STATUS 的状态值,应该是PREPARING SWITCHOVER SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; SWITCHOVER_STATUS -------------------- PREPARING SWITCHOVER (4)、将逻辑备库设置为主库的切换准备阶段 SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY; Database altered. (5)、执行结束后,V$DATABASE.SWITCHOVER_STATUS 的值应该是PREPARING SWITCHOVER 。 SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; SWITCHOVER_STATUS -------------------- PREPARING SWITCHOVER (6)、第九步,将备库切换成主库 在备库上执行这个SQL A LTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 到这一步,我们已经完成了切换工作。主库变成了备库,备库变成了主库,已经是一个新的data guard 环境。 但是,要使这个DATAGUARD 环境真正运行起来,主库和备库的初始化参数需要做一些修改。 将原来的备库上的初始化参数修改一下, 修改为 alter system set fal_client=‘‘ scope=both; alter system set fal_server=‘‘ scope=both; alter system set log_archive_dest_1=‘location=+VG2/‘ scope=both; alter system set log_archive_dest_2=‘SERVICE=SWITCH_READER LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=XXXDB‘ scope=both;
将原来的主库上的初始化参数修改一下, 修改为 alter system set fal_client=‘SWITCH_STANDBY‘ scope=both; alter system set fal_server=‘SWITCH_PRIMARY‘ scope=both; alter system set log_archive_dest_1=‘LOCATION=+VG2/ VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=XXXdB‘ scope=both; alter system set log_archive_dest_2=‘LOCATION=+LOGVG/ VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=XXXDB‘ scope=both; 新的备库,就是原来的主库,要加上standby logfile 。 ALTER DATABASE ADD STANDBY LOGFILE group 21 (‘+VG2/standby_redo21.log‘) SIZE 52428800 reuse; ALTER DATABASE ADD STANDBY LOGFILE group 22 (‘+VG2/standby_redo22.log‘) SIZE 52428800 reuse; ALTER DATABASE ADD STANDBY LOGFILE group 23 (‘+VG2/standby_redo23.log‘) SIZE 52428800 reuse;
这种转换方式,可以用于数据库的数据迁移工作。
(7)、如果switch over失败,可以考虑直接激活逻辑DG 把B主机上的数据库变成主库: -----------由于备库现在是11g主库是10g并且主要目标是实现滚动升级,所以可以直接激活逻辑备库,之后再搭建一个11g的新物理备库。 alter database stop logical standby apply; alter database activate logical standby database ;