
你所追求的,总有一天会拥抱你!
暂时未有相关通用技术能力~
阿里云技能认证
详细说明一、问题描述 Oracle 12c CDB模式下,在CDB中创建一个公共用户想要监控所有PDB的信息,发现在授予了DBA、CDB_DBA,SELECT ANY DICTIONARY 等权限后仍然不可以查看,只有登陆到具体的PDB上才能查看,这样在一些场景就有可能受到约束,下面内容将实验如何授权解决这个问题。 二、操作复现 本次测试环境是Oracle 12.1.0.2.0单机。 1、创建公共账号 [oracle@vbox66 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Mon Sep 21 21:57:45 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> create user c##test identified by test container=all; User created. SQL> grant dba,cdb_dba,resource,connect to c##test container=all; Grant succeeded. SQL> grant SELECT ANY DICTIONARY to c##test container=all; Grant succeeded. SQL> 2、登陆新创建的账号,查看权限 SQL> SELECT GRANTED_ROLE FROM dba_role_privs a WHERE a.GRANTEE = upper('c##test'); GRANTED_ROLE -------------------------------------------------------------------------------- DBA CDB_DBA RESOURCE CONNECT SQL> select * from user_sys_privs order by 1,2; USERNAME PRIVILEGE ADM COM --------------- ---------------------------------------- --- --- C##TEST SELECT ANY DICTIONARY NO YES C##TEST UNLIMITED TABLESPACE NO YES SQL> 3、账号c##test权限测试 3.1、模式PDB业务用户登陆 [oracle@vbox66 ~]$ sqlplus wrtest/wrtest@192.168.3.66:1521/wrtest SQL*Plus: Release 12.1.0.2.0 Production on Mon Sep 21 22:05:06 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Last Successful login time: Mon Sep 21 2020 22:04:28 +08:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> select userenv('sid') from dual; USERENV('SID') -------------- 75 SQL> 3.2、登陆c##test到CDB查看session信息 [oracle@vbox66 ~]$ sqlplus c##test/test@192.168.3.66:1521/orcl SQL*Plus: Release 12.1.0.2.0 Production on Mon Sep 21 22:06:40 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Last Successful login time: Mon Sep 21 2020 22:01:05 +08:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> set line 150 SQL> col USERNAME for a15 SQL> col SCHEMANAME for a15 SQL> col MACHINE for a20 SQL> select SID,SERIAL#,USERNAME,STATUS,SCHEMANAME,MACHINE,to_char(LOGON_TIME,'YYYY-MM-DD HH24:MI:SS') from v$session where USERNAME!='SYS'; SID SERIAL# USERNAME STATUS SCHEMANAME MACHINE TO_CHAR(LOGON_TIME, ---------- ---------- --------------- -------- --------------- -------------------- ------------------- 48 1264 C##TEST ACTIVE C##TEST vbox66 2020-09-21 22:06:40 SQL> 从上面信息可以发现,这里没有之前wrtest这个用户的信息,下面登陆sys用户查看信息。 [oracle@vbox66 ~]$ sqlplus c##test/test@192.168.3.66:1521/wrtest SQL*Plus: Release 12.1.0.2.0 Production on Mon Sep 21 22:17:52 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Last Successful login time: Mon Sep 21 2020 22:06:40 +08:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> set line 150 SQL> col USERNAME for a15 SQL> col SCHEMANAME for a15 SQL> col MACHINE for a20 SQL> select SID,SERIAL#,USERNAME,STATUS,SCHEMANAME,MACHINE,to_char(LOGON_TIME,'YYYY-MM-DD HH24:MI:SS') from v$session where USERNAME!='SYS'; SID SERIAL# USERNAME STATUS SCHEMANAME MACHINE TO_CHAR(LOGON_TIME, ---------- ---------- --------------- -------- --------------- -------------------- ------------------- 75 6431 WRTEST INACTIVE WRTEST vbox66 2020-09-21 22:05:06 90 43582 C##TEST ACTIVE C##TEST vbox66 2020-09-21 22:17:52 SQL> 当c##test登录到具体PDB的时候是可以看到wrtest这个用户的session信息的。 3.3、登陆sys到CDB查看信息 [oracle@vbox66 ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Mon Sep 21 22:09:18 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> set line 150 SQL> col USERNAME for a15 SQL> col SCHEMANAME for a15 SQL> col MACHINE for a20 SQL> select SID,SERIAL#,USERNAME,STATUS,SCHEMANAME,MACHINE,to_char(LOGON_TIME,'YYYY-MM-DD HH24:MI:SS') from v$session where USERNAME!='SYS'; SID SERIAL# USERNAME STATUS SCHEMANAME MACHINE TO_CHAR(LOGON_TIME, ---------- ---------- --------------- -------- --------------- -------------------- ------------------- 48 1264 C##TEST INACTIVE C##TEST vbox66 2020-09-21 22:06:40 75 6431 WRTEST INACTIVE WRTEST vbox66 2020-09-21 22:05:06 SQL> 从上面信息可以看出,sys用户是可以看到wrtest登录到PDB的信息。 3.4、尝试系统自带的dbsnmp用户是否能正常查看 [oracle@vbox66 ~]$ sqlplus dbsnmp/dbsnmp@192.168.3.66:1521/orcl SQL*Plus: Release 12.1.0.2.0 Production on Mon Sep 21 22:14:21 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Last Successful login time: Fri Sep 18 2020 14:57:56 +08:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> SELECT GRANTED_ROLE FROM dba_role_privs a WHERE a.GRANTEE = upper('dbsnmp'); GRANTED_ROLE -------------------------------------------------------------------------------- DBA CDB_DBA OEM_MONITOR DBA DV_MONITOR SQL> set line 150 SQL> col USERNAME for a15 SQL> col SCHEMANAME for a15 SQL> col MACHINE for a20 SQL> select SID,SERIAL#,USERNAME,STATUS,SCHEMANAME,MACHINE,to_char(LOGON_TIME,'YYYY-MM-DD HH24:MI:SS') from v$session where USERNAME!='SYS'; SID SERIAL# USERNAME STATUS SCHEMANAME MACHINE TO_CHAR(LOGON_TIME, ---------- ---------- --------------- -------- --------------- -------------------- ------------------- 48 1264 C##TEST INACTIVE C##TEST vbox66 2020-09-21 22:06:40 62 46829 DBSNMP ACTIVE DBSNMP vbox66 2020-09-21 22:14:21 75 6431 WRTEST INACTIVE WRTEST vbox66 2020-09-21 22:05:06 SQL> dbsnmp在和c##test权限类似的情况下却可以查看wrtest登录到PDB的session信息,之后尝试导出dbsnmp这个用户,解析dmp文件查看dbsnmp的授权语句,结果发现导出失败,原因是oracle内置账号不可以导出。 3.5、问题处理 如上面信息所示,当创建监控账号监控当前CDB下所有PDB信息的时候这个c##test就不能满足要求,查看相关资料,发现通过container_data可以满足要求,操作如下: sys用户登陆CDB,执行如下语句: SQL> alter user c##test set container_data=(CDB$ROOT,wrtest) for v_$session container=current; User altered. SQL> wrtest用户退出重新登陆,查看v$session信息 [oracle@vbox66 ~]$ sqlplus c##test/test@192.168.3.66:1521/orcl SQL*Plus: Release 12.1.0.2.0 Production on Mon Sep 21 22:27:05 2020 Copyright (c) 1982, 2014, Oracle. All rights reserved. Last Successful login time: Mon Sep 21 2020 22:17:52 +08:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> set line 150 SQL> col USERNAME for a15 SQL> col SCHEMANAME for a15 SQL> col MACHINE for a20 SQL> select SID,SERIAL#,USERNAME,STATUS,SCHEMANAME,MACHINE,to_char(LOGON_TIME,'YYYY-MM-DD HH24:MI:SS') from v$session where USERNAME!='SYS'; SID SERIAL# USERNAME STATUS SCHEMANAME MACHINE TO_CHAR(LOGON_TIME, ---------- ---------- --------------- -------- --------------- -------------------- ------------------- 48 44688 C##TEST ACTIVE C##TEST vbox66 2020-09-21 22:27:05 62 46829 DBSNMP INACTIVE DBSNMP vbox66 2020-09-21 22:14:21 75 6431 WRTEST INACTIVE WRTEST vbox66 2020-09-21 22:05:06 90 43582 C##TEST INACTIVE C##TEST vbox66 2020-09-21 22:17:52 SQL> 此时,c##test账号已经可以满足需求,当c##test需要访问很多表时该怎么处理呢,需要执行多次上面那个语句吗?,可以通过执行下面语句实现: ALTER USER c##test SET CONTAINER_DATA=ALL CONTAINER=CURRENT; 注意,也是sys登陆CDB执行 三、参考网址 https://docs.oracle.com/database/121/SQLRF/statements_4003.htm#i2058207
1、背景 某客户卡卷Redis集群数据迁移到阿里云redis,通过redis-shake工具迁移,遇到如下问题: ①源端:idc自建redis cluster,版本3.0.5,库中key基本都带过期时间 ②目标端:阿里云redis 4分片集群,版本4.0 ③通过redis-shake工具迁移,初始化完成,日志显示sync rdb done,进入增量阶段,发现目标库比源库少好多key,重试了多次,数据仍有缺失。 2、问题排查 2.1、观察redis-shake日志 sync初始化完成进入增量,日志如下: 2.2、通过redis-full-check进行校验 在上面初始化完成,进入增量后,通过redis-full-check校验数据,发现源端和目标端key相差较大,信息如下: 2.3、查看rdb文件 这次拿的的redis-shake工具备份的备份文件,在查看备份文件rdb时发现,上面目标端缺少的key在rdb中没有,但是实际在源端是存在的。 因为备份的文件看出有问题,这次去拿实际的redis rdb文件,登录到redis集群服务器,查看redis参数文件,找到rdb文件相关信息,发现 ①三个主节点配置的dbfilename dump.rdb;dir ./这两个参数都是一样的 ②去拿rdb文件,发现服务器上dump.rdb只有一个,结合上面参数的设置,怀疑三个主节点都写入到了同一个dump.rdb中 ③查看redis三个主节点启动路径,验证②中的猜测 从这里可以看到,redis集群主节点启动路径是一样的,多个节点数据都写入到了一个dump.rdb文件中。2.4、redis-shake sync 从上面看到的信息,结合本次使用的redis-shake工具,使用了sync模式,在全量初始化的时候,redis-shake需要去拿主节点的dump.rdb文件,结果源端只有一个dump.rdb文件,三个主节点之间数据互相覆盖,导致数据不完整,redis-shake进入增量之后,redis-full-check校验数据相差较大。 3、解决方法 结合这次迁移环境,源端写入的key都是带过期时间的,等目标端缺少的这些key在源端过期后,之后的增量能实时从源库同步到目标库,达到数据迁移的目的。 上面的方法只是针对这次的实际环境,最好是源端重新配置那两个参数,每个节点生成一个rdb文件,重新配置redis-shake全量+增量迁移。
一、背景 某个数据库在20200312 14:00:28-15:00:18期间,监控系统发出DBTime超出阈值告警,信息如下: 二、问题分析 1、获取期间AWR报告,进行分析 1.1、查看Elapsed、DB Time指标 通过AWR可以看到,服务器规格是4CPU16G,Elapsed*CPUs=239.36min远远小于DB Time(22,862.47min),反应awr统计的时间段数据库很繁忙。 1.2、查看Load Profile 从下图看到,DBtime中DB cpu所占比例其实并不大,DBTime大部分是在DB Wait Time上,从Top 10 Foreground Events by Total Wait Time可以看到主要是在cursor: pin S wait on X等待上。 1.3、查看Top 10 Foreground Events by Total Wait Time 从截图中可以看出,cursor: pin S wait on X等待事件占了DB time 86.9%,造成这个等待事件最常见的原因就是sql并发执行,可以从Wait Classes by Total Wait Time、SQL Statistics部分反应上面的问题。 1.4、查看Wait Classes by Total Wait Time、SQL Statistics 查看下面2个截图,可以发现当前数据库并发等待事件比较突出,之后查看SQL Statistics,发现是和用户登陆权限校验的sql有关,正常来讲,第二个截图中的一些sql不会造成cursor: pin S wait on X等待事件,这个需要在更具ash报告查看下,具体是哪些sql造成cursor: pin S wait on X。 从下面的截图来看,session数的变化也能印证可能是用户并发访问数据库引起的。 2、查看ash报告 通过awr分析,问题基本可以确定是用户并发访问数据库频繁执行sql引起cursor: pin S wait on X,但是哪些sql引起,需要从ash报告中查看。 通过下面截图可以看到,sql_id为39cbpxu5sp7zt和1dxpz6s60pyy2是造成这个现象的主要原因,接下来需要确认这两个sql频繁执行原因。 2.3、了解sql执行的情况 将上面2个sql反馈给客户后,并且询问这个期间用户登陆数据库的情况,客户反馈: ①第一个sql是用户登陆数据库做权限校验用的,第二个是获取病人信息使用的,这两个sql都是在用户登录时触发的 ②sql中使用了dblink,awr期间dblink有异常,不能正常执行 ③sql不能执行,用户端端获取不到结果,护士持续发起请求,连接数据库,最终导致了上面的情况 3、总结 上面的情况大致就是,客户端查询信息,没有得到结果,之后不断重试,并发访问,在数据库端,sql中使用了dblink,dblink在那个期间出现问题,不能执行,最终出现了上面的问题。上面如果有不正确的地方欢迎大家指正。
一、背景介绍 某客户数据库备库执行sql失败,数据库环境:主库(12.2.0.1 RAC),备库(12.2.0.1 单机)RAC到单机搭建了ADG,数据是从12.1.0.2通过erp导入的,报错信息:ORA-22303、ORA-16000、ORA-06508、ORA-06512,具体报错内容见下文。 二、问题描述 1、执行SQL&报错 2020-03-03 15:34:32.830 [job-81740957] INFO SingleTableSplitUtil - split pk [sql=SELECT * FROM ( SELECT xxx FROM xxx.xxx SAMPLE (0.1) WHERE (xxx IS NOT NULL) ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <= 15 ORDER by xxx ASC] is running... 2020-03-03 15:34:32.969 [job-81740957] ERROR JobContainer - Exception when job run com.alibaba.datax.common.exception.DataXException: Code:[DBUtilErrorCode-07], Description:[读取数据库数据失败. 请检查您的配置的 column/table/where/querySql或者向 DBA 寻求帮助.]. - 执行的SQL为:SELECT * FROM ( SELECT xxx FROM xxx.xxx SAMPLE (0.1) WHERE (xxx IS NOT NULL) ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <= 15 ORDER by xxx ASC 具体错误信息为:ORA-22303: 未找到类型 "SYS"."WRR$_REPLAY_DEP_GRAPH" ORA-16000: 数据库或可插入数据库是以只读访问方式打开的 ORA-06508: PL/SQL: 无法找到正在调用 : "SYS.DBMS_WORKLOAD_REPLAY" 的程序单元 ORA-06512: 在 "SYS.DBMS_WRR_STATE", line 4 ORA-06512: 在 "SYS.DBMS_RANDOM", line 91 - java.sql.SQLException: ORA-22303: 未找到类型 "SYS"."WRR$_REPLAY_DEP_GRAPH" ORA-16000: 数据库或可插入数据库是以只读访问方式打开的 ORA-06508: PL/SQL: 无法找到正在调用 : "SYS.DBMS_WORKLOAD_REPLAY" 的程序单元 ORA-06512: 在 "SYS.DBMS_WRR_STATE", line 4 ORA-06512: 在 "SYS.DBMS_RANDOM", line 91 三、问题排查 观察上面报错信息,通过了解背景信息,这个SQL在主库RAC环境PDB通过业务用户是可以查询的,但是在备库(单机)PDB环境执行却报错,通过下面几个方面排查解决问题。 1、备库查询其他SQL ①备库PDB业务业务用户查询其他sql能正常执行 ②备库执行上面SQL,不带DBMS_RANDOM.VALUE可以正常执行 ③主库均能正常执行 2、备库单独调用DBMS_RANDOM.VALUE 通过上面一步,可以发现SQL执行报错主要是在调用DBMS_RANDOM问题上,那么接下来对备库调用DBMS_RANDOM报错进行分析。 2.1、sys连接到CDB、PDB ①sys用户连接CDB,可以正常执行②sys切换到对应PDB,执行报错 sqlplus / as sysdba alter session set container=pdb_name; SQL> select DBMS_RANDOM.VALUE(1,8) from dual; select DBMS_RANDOM.VALUE(1,8) from dual * ERROR at line 1: ORA-22303: type "SYS"."WRR$_REPLAY_DEP_GRAPH" not found ORA-16000: database or pluggable database open for read-only access ORA-06508: PL/SQL: could not find program unit being called:"SYS.DBMS_WORKLOAD_REPLAY" ORA-06512: at "SYS.DBMS_WRR_STATE", line 4 ORA-06512: at "SYS.DBMS_RANDOM", line 91 ORA-06512: at "SYS.DBMS_RANDOM", line 137 2.2、业务用户连接到PDB模式 SQL执行报错,报错信息和如下: sqlplus user/pwd@ip:1521/pwd-server-name SQL> select DBMS_RANDOM.VALUE(1,8) from dual; select DBMS_RANDOM.VALUE(1,8) from dual * ERROR at line 1: ORA-22303: type "SYS"."WRR$_REPLAY_DEP_GRAPH" not found ORA-16000: database or pluggable database open for read-only access ORA-06508: PL/SQL: could not find program unit being called:"SYS.DBMS_WORKLOAD_REPLAY" ORA-06512: at "SYS.DBMS_WRR_STATE", line 4 ORA-06512: at "SYS.DBMS_RANDOM", line 91 ORA-06512: at "SYS.DBMS_RANDOM", line 137 3、查看数据库INVALID对象 ①主库 SYS的Object对象全部valid,业务用户有部分object invalid,对这次执行的SQL不影响。②备库 SYS的Object对象全部valid,业务用户有部分object invalid,对这次执行的SQL不影响。 4、查看用户权限 在主、备库查询完用户权限,主备是一致的,信息如下: 5、重新编译DBMS_RANDOM包 主库执行: Execute the following script to recreate DBMS_RANDOM package: @?/rdbms/admin/dbmsrand.sql 主库执行完,这个动作会同步到从库,执行完从库在调用上述DBMS_RANDOM包,问题仍没有解决 6、赋予业务用户系统表权限 上面信息观察完仍没有找到出错原因,去查相关资料,发现类似报错几乎没有,与报错号相同的但是报错内容是不一致的,再次观察报错内容,尝试赋予业务用户系统表权限,如下: 主库 sqlplus / as sysdba alter session set container=pdb_name; grant select on "SYS"."WRR$_REPLAY_DEP_GRAPH" to username; 权限赋予完,之后在备库执行查询命令,发现可以正常执行: 四、问题总结 遇到这个问题,查询相关资料很少,最后根据sql执行报错内容通过业务用户查询表 "SYS"."WRR$_REPLAY_DEP_GRAPH",发现没有权限(主备库查询结果一致),尝试赋予这个用户查询这个系统表的权限,之后在执行上述查询就可以了。 奇怪的一点,主库业务用户也是没有这个系统表查询权限的,但是执行sql可以正常执行,这也有可能触发了oracle bug。
一、问题背景 1、20191120某客户托尔斯程序运行异常,无法正常工作2、查看程序日志显示ORA-00600、ORA-02002等数据库错误3、数据库服务器信息 ①系统:CentOS 6.8(64位) ②数据库:Oracle RAC 11.2.0.4 二、问题排查&处理 1、查看数据库信息 ①首先查看了Oracle RAC集群信息,数据库集群运行正常 ②查看数据库日志,节点1运行正常,节点2 alert日志中有大量ORA600信息: Wed Nov 20 11:28:30 2019 Errors in file /u01/app/oracle/diag/rdbms/racecs/racecs2/trace/racecs2_ora_11752.trc (incident=51957): ORA-00600: internal error code, arguments: [4194], [], [], [], [], [], [], [], [], [], [], [] Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. Block recovery from logseq 946, block 733 to scn 2776710962 Recovery of Online Redo Log: Thread 2 Group 3 Seq 946 Reading mem 0 Mem# 0: +DATA/racecs/onlinelog/group_3.261.989703707 Block recovery completed at rba 946.735.16, scn 0.2776710963 Block recovery from logseq 946, block 733 to scn 2776711284 Recovery of Online Redo Log: Thread 2 Group 3 Seq 946 Reading mem 0 Mem# 0: +DATA/racecs/onlinelog/group_3.261.989703707 Block recovery completed at rba 946.849.16, scn 0.2776711285 Errors in file /u01/app/oracle/diag/rdbms/racecs/racecs2/trace/racecs2_ora_11752.trc (incident=51958): ORA-00600: internal error code, arguments: [4194], [], [], [], [], [], [], [], [], [], [], [] ORA-02002: error while writing to audit trail ORA-00600: internal error code, arguments: [4194], [], [], [], [], [], [], [], [], [], [], [] Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. ③查看当前数据库集群中每个节点上会话信息,节点1上有程序连接进来的信息,节点2基本都是系统用户会话信息 2、根据客户反馈的信息,进行下一步处理 ①客户反馈之前也遇到过目前的情况(ORA2002),之前是对system表空间进行手动resize,之后程序就会恢复正常,但是这次操作了之后也没有恢复正常,程序报错如下: ②根据客户描述的信息检查数据库审计情况 a、发现数据库审计参数AUDIT_TRAIL=DB,是数据库默认的配置 b、接下来检查system表空间信息,当前system表空间是3G,使用率70%(客户自己resize后),并且system表空间是自动扩展,看来问题不是由于审计表空间不足引起的 ③system充足的情况下,程序多次重启还是报ORA2002错误,看日志显示ORA600后紧接着就是ORA2002,为了及时恢复业务,客户也表示没有使用到数据库审计,决定关闭数据库审计功能 3、数据库修改了AUDIT_TRAIL=NONE,truncate了SYS.AUD$表数据,关闭了数据库集群,进行了重启,观察程序情况: ①程序在关闭数据库审计后启动,仍然报错,此时报错内容只剩下了ORA600 ②查看当前数据库中session信息,和之前一样,节点1有程序连接信息,节点2上没有 ③这时再查看节点2alert日志信息,ORA2002虽然没有了,但是ORA600仍然不断打印出来 Wed Nov 20 21:36:11 2019 Errors in file /u01/app/oracle/diag/rdbms/racecs/racecs2/trace/racecs2_ora_19012.trc (incident=100413): ORA-00600: internal error code, arguments: [4194], [], [], [], [], [], [], [], [], [], [], [] Incident details in: /u01/app/oracle/diag/rdbms/racecs/racecs2/incident/incdir_100413/racecs2_ora_19012_i100413.trc Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. Wed Nov 20 21:36:16 2019 Dumping diagnostic data in directory=[cdmp_20191120213616], requested by (instance=2, osid=19012), summary=[incident=100413]. Block recovery from logseq 972, block 168 to scn 2776911378 Recovery of Online Redo Log: Thread 2 Group 7 Seq 972 Reading mem 0 Mem# 0: +DATA/racecs/onlinelog/group_7.log Block recovery completed at rba 972.173.16, scn 0.2776911845 Block recovery from logseq 972, block 168 to scn 2776914575 Recovery of Online Redo Log: Thread 2 Group 7 Seq 972 Reading mem 0 Mem# 0: +DATA/racecs/onlinelog/group_7.log Block recovery completed at rba 972.657.16, scn 0.2776914576 Wed Nov 20 21:38:25 2019 Errors in file /u01/app/oracle/diag/rdbms/racecs/racecs2/trace/racecs2_ora_18696.trc (incident=100333): ORA-00600: internal error code, arguments: [4194], [], [], [], [], [], [], [], [], [], [], [] Incident details in: /u01/app/oracle/diag/rdbms/racecs/racecs2/incident/incdir_100333/racecs2_ora_18696_i100333.trc Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. ... Wed Nov 20 21:46:09 2019 Errors in file /u01/app/oracle/diag/rdbms/racecs/racecs2/trace/racecs2_ora_18732.trc (incident=100373): ORA-00600: Śҿխϳպë, ӎ˽: [4194], [], [], [], [], [], [], [], [], [], [], [] Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. Block recovery from logseq 972, block 1011 to scn 2776915928 Recovery of Online Redo Log: Thread 2 Group 7 Seq 972 Reading mem 0 Mem# 0: +DATA/racecs/onlinelog/group_7.log Block recovery completed at rba 972.1016.16, scn 0.2776915929 Block recovery from logseq 972, block 1011 to scn 2776916012 Recovery of Online Redo Log: Thread 2 Group 7 Seq 972 Reading mem 0 Mem# 0: +DATA/racecs/onlinelog/group_7.log Block recovery completed at rba 972.1031.16, scn 0.2776916013 Wed Nov 20 21:48:41 2019 Errors in file /u01/app/oracle/diag/rdbms/racecs/racecs2/trace/racecs2_ora_21433.trc (incident=100445): ORA-00600: Śҿխϳպë, ӎ˽: [4194], [ody "SYS.DBMS_STANDARD" Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. Block recovery from logseq 972, block 1011 to scn 2776915928 Recovery of Online Redo Log: Thread 2 Group 7 Seq 972 Reading mem 0 Mem# 0: +DATA/racecs/onlinelog/group_7.log Block recovery completed at rba 972.1016.16, scn 0.2776915929 Block recovery from logseq 972, block 1011 to scn 2776916447 Recovery of Online Redo Log: Thread 2 Group 7 Seq 972 Reading mem 0 Mem# 0: +DATA/racecs/onlinelog/group_7.log Block recovery completed at rba 972.1073.16, scn 0.2776916448 4、根据报错内容在MOS查看相关问题,发现文档1428786.1和这次的现象类似,并且节点2服务器在15号多次发生了异常重启,引起数据库多次异常重启 Fri Nov 15 08:32:28 2019 Active Session History (ASH) performed an emergency flush. This may mean that ASH is undersized. If emergency flushes are a recurring issue, you may consider increasing ASH size by setting the value of _ASH_SIZE to a sufficiently large value. Currently, ASH size is 16777216 bytes. Both ASH size and the total number of emergency flushes since instance startup can be monitored by running the following query: select total_size,awr_flush_emergency_count from v$ash_info; Fri Nov 15 09:06:34 2019 IPC Send timeout detected. Receiver ospid 7546 [ Fri Nov 15 09:06:34 2019 Errors in file /u01/app/oracle/diag/rdbms/racecs/racecs2/trace/racecs2_ora_7546.trc: Fri Nov 15 09:29:15 2019 minact-scn: useg scan erroring out with error e:12751 Fri Nov 15 09:53:19 2019 NOTE: ASMB terminating Errors in file /u01/app/oracle/diag/rdbms/racecs/racecs2/trace/racecs2_asmb_3794.trc: ORA-15064: communication failure with ASM instance ORA-03113: end-of-file on communication channel Process ID: Session ID: 217 Serial number: 61 Errors in file /u01/app/oracle/diag/rdbms/racecs/racecs2/trace/racecs2_asmb_3794.trc: ORA-15064: communication failure with ASM instance ORA-03113: end-of-file on communication channel Process ID: Session ID: 217 Serial number: 61 ASMB (ospid: 3794): terminating the instance due to error 15064 Termination issued to instance processes. Waiting for the processes to exit Fri Nov 15 09:53:30 2019 Instance termination failed to kill one or more processes Instance terminated by ASMB, pid = 3794 Fri Nov 15 10:16:47 2019 Starting ORACLE instance (normal) 5、根据MOS文档里面的描述,很可能就是由于实例2服务器异常重启导致数据库异常,MOS文档描述原因如下: The following error is occurring in the alert.log right before the database crashes. ORA-00600: internal error code, arguments: [4194], [#], [#], [], [], [], [], [] This error indicates that a mismatch has been detected between redo records and rollback (undo) records. ARGUMENTS: Arg [a] - Maximum Undo record number in Undo block Arg [b] - Undo record number from Redo block Since we are adding a new undo record to our undo block, we would expect that the new record number is equal to the maximum record number in the undo block plus one. Before Oracle can add a new undo record to the undo block it validates that this is correct. If this validation fails, then an ORA-600 [4194] will be triggered. This issue generally occurs when there is a power outage or hardware failure that initially crashes the database. On startup, the database does the normal roll forward (redo) and then rollback (undo), this is where the error is generated on the rollback. 大致意思是: 在向undo块添加一个新的undo记录,会将新的记录号等于undo块中的最大记录号加1。在Oracle向undo块添加一个新的undo记录之前,它会验证这是正确的。如果验证失败,将触发ORA-600[4194]。 这个问题通常发生在出现断电或硬件故障时,这些故障最初会导致数据库崩溃。在启动时,数据库执行普通的前滚(重做),然后回滚(撤消),这是在回滚时产生错误的地方。 从这里在结合实例2在15号多次重启的现象,可以看出很可能就是因为实例2服务器异常重启导致 6、根据上面定位到的问题对数据库进行修复 *创建一个新的undo表空间,使用新的undo段号,它比当前使用的段号要高。这样,当一个事务执行清除块时,对撤消段的引用不存在,并继续清除块,这样就不会在产生上面发生的内容。 实例2进行操作 ①、Create pfile='/tmp/initsid.ora' from spfile; ②、修改undo a、查看当前undo表空间位置和大小 b、实例2创建新的undo,替换之前的undo create undo tablespace undotbs3 datafile '+DATA/racecs/datafile/undotbs3.dbf' size 1500m autoextend on;(注意根据之前undo值进行替换) alter system set undo_tablespace='undotbs3' scope=spfile sid='racecs2'; ③、实例2数据库重启 shutdown immediate startup 7、操作完成之后,程序连接不在报错 三、其他 1、在数据库恢复之后,隔了一天又反馈出现问题,发现实例2服务器再一次发生了重启,这次数据库日志中到没有出现ORA600信息,数据库运行正常2、接下来应该重点排查实例2服务器异常重启原因
一、环境信息 1、服务器:Cetnos 7.22、数据库版本:11.2.0.43、RAC -> 单机 二、环境准备 目标是搭建RAC到单机的Activity DataGuard,首先RAC环境是准备完善的,接下来需要搭建一个单机环境。 1、安装数据库软件 安装过程这里不在叙述。 2、通过RAC RMAN备份还原DB ①在RAC用RMAN做全备 ②将备拷贝到单机服务器进行还原,还原过程可参考:https://yq.aliyun.com/articles/704904?spm=a2c4e.11153959.0.0.2210147cw6pHFU ③在还原过程中需要注意的几点: a、还原参数文件时注意去掉集群参数 b、还原控制文件要转化为standby: restore standby controlfile from '/software/bak/control_7eu36n34_1_1.bak'; ④还原数据之后,将数据库启动到mount状态 三、搭建DataGuard 1、修改主备参数 ①修改主库参数 官网参数介绍: https://docs.oracle.com/cd/E11882_01/server.112/e41134/create_ps.htm#SBYDB4721 https://docs.oracle.com/cd/E11882_01/server.112/e41134/log_arch_dest_param.htm#SBYDB01100 a、startup mount; create pfile='/software/pfile20190617.ora' from spfile; alter database archivelog; b、alter database force logging; select log_mode,force_logging from v$database; c、alter system set db_unique_name=xxx scope=spfile sid='*'; d、alter system set log_archive_config='DG_CONFIG=(xxx,xxxDG)' scope=spfile sid='*'; e、alter system set log_archive_dest_1='location=+BACKUPDG valid_for=(all_logfiles,all_roles) db_unique_name=xxx mandatory' scope=spfile sid='*'; f、alter system set log_archive_dest_2='service=xxxDG LGWR SYNC AFFIRM valid_for=(online_logfiles,primary_role) db_unique_name=xxxDG' scope=spfile sid='*'; g、LOG_ARCHIVE_DEST_STATE_1=ENABLE,LOG_ARCHIVE_DEST_STATE_2=ENABLE(默认是enable) h、alter system set fal_server=xxxDG scope=spfile sid='*'; i、alter system set db_file_name_convert='/s01/oracle/app/oracle/oradata/hisdgdb','+DATA/xxx/datafile' scope=spfile sid='*'; alter system set log_file_name_convert='/s01/oracle/app/oracle/oradata/hisdgdb','+DATA/xxx/onlinelog','/s01/oracle/app/oracle/oradata/hisdgdb','+BACKUPDG/xxx/onlinelog/' scope=spfile sid='*'; j、alter system set standby_file_management=AUTO scope=spfile sid='*'; k、修改完后重启数据库: srvctl status database -d db_name srvctl stop database -d db_name srvctl st database -d db_name ②修改备库参数 a、startup nomount; alter database archivelog; b、alter database force logging; select log_mode,force_logging from v$database; c、alter system set db_unique_name=xxxDG scope=spfile; d、alter system set log_archive_config='DG_CONFIG=(xxx,xxxDG)'; e、alter system set log_archive_dest_1='location=/s01/oracle/app/oracle/oradata/arch valid_for=(all_logfiles,all_roles) db_unique_name=xxxDG mandatory' scope=spfile; f、alter system set log_archive_dest_2='service=xxx LGWR SYNC AFFIRM valid_for=(online_logfiles,primary_role) db_unique_name=xxx' scope=spfile; g、LOG_ARCHIVE_DEST_STATE_1=ENABLE,LOG_ARCHIVE_DEST_STATE_2=ENABLE(默认是enable) h、alter system set fal_server=xxx; i、alter system set db_file_name_convert='+DATA/xxx/datafile','/s01/oracle/app/oracle/oradata/hisdgdb' scope=spfile; alter system set log_file_name_convert='+DATA/xxx/onlinelog','/s01/oracle/app/oracle/oradata/hisdgdb','+BACKUPDG/xxx/onlinelog/','/s01/oracle/app/oracle/oradata/hisdgdb' scope=spfile; j、alter system set standby_file_management=AUTO; k、修改完之后数据库重启: shutdown immediate; startup mount; 2、创建STANDBY日志 创建STANDBY的数量比当前redo日志数量多一组。 ①主库创建(切换为备库时生效) alter database add standby logfile thread 1 '+DATA/zlhis/onlinelog/std_redo01.log' size 50m; alter database add standby logfile thread 1 '+DATA/zlhis/onlinelog/std_redo02.log' size 50m; alter database add standby logfile thread 1 '+DATA/zlhis/onlinelog/std_redo05.log' size 50m; alter database add standby logfile thread 2 '+DATA/zlhis/onlinelog/std_redo03.log' size 50m; alter database add standby logfile thread 2 '+DATA/zlhis/onlinelog/std_redo04.log' size 50m; alter database add standby logfile thread 1 '+DATA/zlhis/onlinelog/std_redo06.log' size 50m; ②备库创建 备库虽然是单机,也需要创建thread 2的standby log,用于接收主库thread 2传过来的redo log。 alter database add standby logfile thread 1 '/s01/oracle/app/oracle/oradata/hisdgdb/std_redo01.log' size 50m; alter database add standby logfile thread 1 '/s01/oracle/app/oracle/oradata/hisdgdb/std_redo02.log' size 50m; alter database add standby logfile thread 1 '/s01/oracle/app/oracle/oradata/hisdgdb/std_redo05.log' size 50m; alter database add standby logfile thread 2 '/s01/oracle/app/oracle/oradata/hisdgdb/std_redo03.log' size 50m; alter database add standby logfile thread 2 '/s01/oracle/app/oracle/oradata/hisdgdb/std_redo04.log' size 50m; alter database add standby logfile thread 2 '/s01/oracle/app/oracle/oradata/hisdgdb/std_redo06.log' size 50m; 3、配置监听 修改主备库的tnsnames.ora文件,使主备库之间能够远程连接。在修改RAC时需要注意在2个节点上都做修改 4、开启复制 recover managed standby database using current logfile disconnect from session; --非实时应用 recover managed standby database disconnect from session; --非实时应用 alter database recover managed standby database cancel; 5、检查复制状态 select name,open_mode,database_role,protection_mode,protection_level,switchover_status from v$database; select PROCESS,PID,STATUS,THREAD#,SEQUENCE# from v$managed_standby; select GROUP#,THREAD#,SEQUENCE#,USED,ARCHIVED,STATUS from v$standby_log; select name from v$archived_log; 6、开启备库到open状态 待备库追上主库redo日志时,将备库启动到open状态: alter database recover managed standby database cancel; alter database open; recover managed standby database using current logfile disconnect from session;
一、环境信息 1、服务器:Centos 6.9 x642、网卡:2个弹性网卡,3个havip3、磁盘:软件放本地,Database和CRS、voting disk放NAS4、共享文件系统(NFS):申请创建2个NAS文件系统 二、配置NAS 1、根据文档购买配置NAS 地址: https://help.aliyun.com/document_detail/27526.html?spm=a2c4g.11186623.6.556.27c97442QMoIVR ①创建文件系统②添加挂载点 2、挂载文件系统 a、安装NFS客户端 sudo yum install nfs-utils cat /proc/sys/sunrpc/tcp_slot_table_entries //查看 b、挂载NFS文件系统 ① 创建挂载目录:mkdir /oradatamkdir /crs② 挂载:sudo mount -t nfs -o rw,bg,hard,vers=3,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 142504bf3e-rci86.cn-beijing.nas.aliyuncs.com:/ /crs --这里我是直接编辑fstab文件,之后mount -a挂载 注:用NAS 4版本安装时报错:Additional Information:rac1:Mount options did not meet the requirements [Expected = >"rw,hard,rsize>=32768,wsize>=32768,proto=tcp|tcp,vers=3|nfsvers=3|nfsv3|v3,timeo>=600,acregmin=0&acregmax=0&acdirmin=0&acdirmax=0|actimeo=0" ; Found = "rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,acregmin=0,acregmax=0,acdirmin=0,acdirmax=0,hard,noresvport,p> roto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.3.43,minorversion=0,local_lock=none,addr=192.168.3.45"]The problem occurred on nodes: rac2,rac1 Summary of the failed nodes rac2 rac1 ③ 卸载:umount /crs c、挂载NAS文件系统时需要注意的一个地方 如果NAS直接挂载到根目录下是无法对这个挂载目录更改属主的,挂载目录下的子目录可以修改,这样在执行root.sh的时候就会报错: [root@rac1 ~]# /u01/app/grid_home/root.sh Performing root user operation for Oracle 11g The following environment variables are set as: ORACLE_OWNER= grid ORACLE_HOME= /u01/app/grid_home Enter the full pathname of the local bin directory: [/usr/local/bin]: Copying dbhome to /usr/local/bin ... Copying oraenv to /usr/local/bin ... Copying coraenv to /usr/local/bin ... Creating /etc/oratab file... Entries will be added to the /etc/oratab file as needed by Database Configuration Assistant when a database is created Finished running generic part of root script. Now product-specific root actions will be performed. Using configuration parameter file: /u01/app/grid_home/crs/install/crsconfig_params Creating trace directory User ignored Prerequisites during installation Installing Trace File Analyzer Can't change ownership of /crs: Operation not permitted Filesystem of /crs/ocr is not supported Root is not able to perform superuser operations on this filesystem Check export options on NAS filer /u01/app/grid_home/perl/bin/perl -I/u 需要对NAS操作: ①cd /crs //此时NAS挂载到了/crs目录 ②mkdir crs chown grid:oinstall crs ③重新配置配置fstab 147644b13d-rck75.cn-beijing.nas.aliyuncs.com:/crs /crs nfs rw,bg,hard,nointr,nolock,vers=3,rsize=1048576,wsize=1048576,tcp,noac,hard,timeo=600,actimeo=0,retrans=2,_netdev,noresvport 0 0 d、linux自动挂载 配置/etc/fstab 142504bf3e-gam92.cn-beijing.nas.aliyuncs.com:/ /data nfs rw,hard,vers=3,rsize=1048576,wsize=1048576,hard,timeo=600,actimeo=0,retrans=2,_netdev,noresvport 0 0 --这个不能修改挂载目录属主 147644b13d-rck75.cn-beijing.nas.aliyuncs.com:/crs /data nfs rw,bg,hard,nointr,nolock,vers=3,rsize=1048576,wsize=1048576,tcp,noac,hard,timeo=600,actimeo=0,retrans=2,_netdev,noresvport 0 0 128a54b70b-coi12.cn-beijing.nas.aliyuncs.com:/data /oradata nfs rw,bg,hard,nointr,nolock,vers=3,rsize=1048576,wsize=1048576,tcp,noac,hard,timeo=600,actimeo=0,retrans=2,_netdev,noresvport 0 0 --数据盘挂载需要加nolock参数 e、修改权限和属主 chown grid:oinstall -R /crschown oracle:oinstall -R /datachmod 775 /crschmod 775 /data 三、安装数据库 1、下载安装包 2、创建用户 groupadd -g 500 oinstall groupadd -g 501 asmadmingroupadd -g 502 asmdbagroupadd -g 503 asmopergroupadd -g 504 dbagroupadd -g 505 operuseradd -g oinstall -G asmadmin,asmdba,asmoper,dba -u 500 griduseradd -g oinstall -G asmdba,dba,oper -u 501 oraclepasswd oraclepasswd grid 3、创建目录 mkdir -p /u01/app/oracle/product/11.2.0/db_1mkdir -p /u01/app/grid_basemkdir -p /u01/app/grid_homechmod -R 775 /u01chown -R oracle:oinstall /u01chown -R grid:oinstall /u01/app/grid_basechown -R grid:oinstall /u01/app/grid_home 4、修改hosts文件 192.168.3.50 rac1192.168.3.51 rac2192.168.3.12 rac1-vip192.168.3.13 rac2-vip192.168.3.219 rac1-priv192.168.3.220 rac2-priv192.168.3.14 rac-scan 5、配置对等性 /software/grid/sshsetup/sshUserSetup.sh -user grid -hosts "rac1 rac2" - noPromptPassphrase -confirm -advanced /software/database/sshsetup/sshUserSetup.sh -user oracle -hosts "rac1 rac2" - noPromptPassphrase -confirm -advanced 6、配置环境变量 #Grid Vi .bash_profile umask 022 ORACLE_BASE=/u01/app/grid_base ORACLE_HOME=/u01/app/grid_home ORACLE_SID=NFS1 //第二个节点NFS2 PATH=$ORACLE_HOME/bin:$PATH export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH #Oracle umask 022 ORACLE_BASE=/u01/app/oracle ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1 ORACLE_SID=rac1 PATH=$ORACLE_HOME/bin:$PATH export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH #export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/usr/lib #export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib export TNS_ADMIN=$ORACLE_HOME/network/admin #export NLS_LANG="simplified chinese"_china.al32utf8 #export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' #export NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SSXFF' #export NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SSXFF TZR' #alias sqlplus='rlwrap sqlplus' #alias rman='rlwrap rman' 7、修改资源限制等信息 vi /etc/sysctl.conf fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 kernel.shmmax = 4153692159 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048586 sysctl -p vi /etc/security/limits.conf oracle soft nofile 4096 oracle hard nofile 65536 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft stack 10240 grid soft nofile 4096 grid hard nofile 65536 grid soft nproc 2047 grid hard nproc 16384 grid soft stack 10240 * soft memlock 18874368 * hard memlock 18874368 8、安装依赖包 rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXp make numactl-devel sysstat unixODBC unixODBC-devel compat-libcap1.x86_64 libcap.x86_64|grep not yum install compat-libstdc++-33 elfutils-libelf-devel gcc-c++ ksh libaio-devel libstdc++-devel libXp numactl-devel unixODBC unixODBC-devel compat-libcap1 -y 9、开始安装Grid软件 这里我用图形化界面安装的,下面列出guoch过程中的几个截图: 10、安装Oracle软件 oracle软件正常安装 11、创建Database dbca -silent -createDatabase -templateName New_Database.dbt -gdbname rac -sid rac -sysPassword sys -systemPassword system -datafileDestination '/oradata' -RECOVERYAREADESTINATION '/oradata/flash_recovery_area' -storageType FS -responseFile NO_VALUE -characterset ZHS16GBK -sampleSchema true -automaticMemoryManagement true -nodeinfo rac1,rac2 安装过程中报错: [root@rac1 ~]# cat /u01/app/oracle/cfgtoollogs/dbca/rac/rac.log Creating and starting Oracle instance DBCA_PROGRESS : 1% ORA-01501: CREATE DATABASE failed ORA-00200: control file could not be created ORA-00202: control file: '/oradata/rac/control01.ctl' ORA-27086: unable to lock file - already in use ORA-01501: CREATE DATABASE failed ORA-00200: control file could not be created ORA-00202: control file: '/oradata/rac/control01.ctl' ORA-27086: unable to lock file - already in use DBCA_PROGRESS : 100% 在挂载nfs文件系统时添加nolock参数 dbca创建完需要修改参数: alter system set cluster_interconnects = '192.168.3.219' scope=spfile sid='rac1' ; alter system set cluster_interconnects = '192.168.3.220' scope=spfile sid='rac2' ; 四、其他一些信息 1、简单对数据进行压测 swingbench安装在节点1上,对节点2进行压测,当并发达到170-200时,节点2数据库TPS能达到90-100,CPU接近100%,再多TPS不会增加,并且服务器配置限制,swingbench软件并发连接上不去 2、数据库安装完一些现象 ①Grid和ASM实例只在节点二上存在,节点一上没有,如果ASM实例不启动的话,数据库只能在一个节点上启动②节点二ASM实例不启动,节点一Database可以单独启动,此时节点一服务器只有一个oracle实例,grid和asm实例不存在③刚开始在ECS安装的时候配置了组播,后发现关闭组播对数据库运行没有影响,用NFS搭建RAC应该是不用配置组播的 最后 上面罗列了一些数据库搭建完发现的问题和现象,能力有限,目前对一些现象还不是很清楚,仍需继续学习,如有问题,欢迎一起讨论 ^_^
这篇文章记录Oracle RAC通过RMAN备份如何迁移到单机DB,文章中描述了几个容易出错的地方,如下: ①RAC到单机redo文件位置处理 ②RAC多个UNDO处理 ③RAC到单机临时表空间处理下面开始文章正文。 一、备份源库 1、检查数据库大小 SQL> select sum(a.bytes - b.bytes)/1024/ 1024 "sum_used MB" 2 from (select tablespace_name, sum(bytes) bytes 3 from dba_data_files 4 group by tablespace_name) a, 5 (select tablespace_name, sum(bytes) bytes, max(bytes) largest 6 from dba_free_space 7 group by tablespace_name) b 8 where a.tablespace_name = b.tablespace_name; 2、检查备份磁盘大小 df -h 3、备份数据库 rman target / run{ allocate channel c1 type disk; allocate channel c2 type disk; allocate channel c3 type disk; allocate channel c4 type disk; backup incremental level 0 database format '/backup/fulldb_%u_%p_%c.bak'; sql 'alter system archive log current'; backup format '/backup/arc_%u_%p_%c' archivelog all; backup current controlfile format '/backup/control_%U.bak'; backup spfile format '/backup/spfile_%U.bak'; release channel c1; release channel c2; release channel c3; release channel c4; } 二、在目标端还原数据库 1、将备份文件传到目标端服务器 目标端服务器已装完数据库软件,不创建DB,安装软件过程这里就不在叙述了。 2、创建必要目录 mkdir -p /u01/oracle/app/oracle/admin/xxx/adump //其中xxx是数据库db_name mkdir -p /u01/oracle/app/oracle/oradata/hisprod mkdir -p /u01/oracle/app/oracle/oradata/arch 3、修改参数文件 将集群参数全部去除,注意如果目标端服务器配置和源端不一样,需要对应修改内存值 *.audit_file_dest='/u01/oracle/app/oracle/admin/xxx/adump' *.audit_trail='db' *.compatible='11.2.0.4.0' *.control_files='/u01/oracle/app/oracle/oradata/xxx/control01.ctl','/u01/oracle/app/oracle/oradata/xxx/control02.ctl' *.db_block_size=8192 *.db_create_file_dest='/s01/oracle/app/oracle/oradata/xxx' *.db_domain='' *.db_name='xxx' *.deferred_segment_creation=FALSE *.diagnostic_dest='/s01/oracle/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=xxxDB)' *.memory_target=1932735283 *.nls_territory='CHINA' *.O7_DICTIONARY_ACCESSIBILITY=TRUE *.open_cursors=300 *.optimizer_index_caching=80 *.optimizer_index_cost_adj=20 *.processes=500 *.sec_case_sensitive_logon=FALSE *.undo_tablespace='UNDOTBS1' 修改完成后数据库启动到nomount状态 [oracle@wrtest dbs]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Sun Jun 9 13:56:49 2019 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SQL> startup nomount pfile='/u01/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/pfile.ora'; ORACLE instance started. Total System Global Area 1937457152 bytes Fixed Size 2254464 bytes Variable Size 1275070848 bytes Database Buffers 654311424 bytes Redo Buffers 5820416 bytes SQL> SQL> create spfile from pfile='/u01/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/pfile.ora'; File created. SQL> SQL> shutdown immediate; ORA-01507: database not mounted ORACLE instance shut down. SQL> startup nomount; ORACLE instance started. Total System Global Area 1937457152 bytes Fixed Size 2254464 bytes Variable Size 1275070848 bytes Database Buffers 654311424 bytes Redo Buffers 5820416 bytes SQL> 4、恢复控制文件 从备份文件中恢复从之文件,操作如下: RMAN> restore controlfile from '/software/bak/control_7eu36n34_1_1.bak'; Starting restore at 09-JUN-19 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=9 device type=DISK channel ORA_DISK_1: restoring control file channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 output file name=/u01/oracle/app/oracle/oradata/xxx/control01.ctl output file name=/u01/oracle/app/oracle/oradata/xxx/control02.ctl Finished restore at 09-JUN-19 RMAN> SQL> select status from v$instance; STATUS ------------ STARTED SQL> alter database mount; Database altered. SQL> select status from v$instance; STATUS ------------ MOUNTED SQL> 5、设置归档 alter database archivelog; alter system set log_archive_dest_1='location=/u01/oracle/app/oracle/oradata/arch'; 6、还原数据文件 catalog start with '/software/bak'; run { set newname for datafile 4 to '/u01/oracle/app/oracle/oradata/xxx/users01.dbf'; set newname for datafile 3 to '/u01/oracle/app/oracle/oradata/xxx/undotbs01.dbf'; set newname for datafile 2 to '/u01/oracle/app/oracle/oradata/xxx/sysaux.dbf'; set newname for datafile 1 to '/u01/oracle/app/oracle/oradata/xxx/system.dbf'; set newname for datafile 5 to '/u01/oracle/app/oracle/oradata/xxx/undotbs02.dbf'; set newname for datafile 6 to '/u01/oracle/app/oracle/oradata/xxx/xxx1.dbf'; set newname for datafile 7 to '/u01/oracle/app/oracle/oradata/xxx/xxx2.dbf'; set newname for datafile 8 to '/u01/oracle/app/oracle/oradata/xxx/xxx3.dbf'; set newname for datafile 9 to '/u01/oracle/app/oracle/oradata/xxx/xxx4.dbf'; set newname for tempfile 1 to '/u01/oracle/app/oracle/oradata/xxx/temp01.dbf'; set newname for tempfile 2 to '/u01/oracle/app/oracle/oradata/xxx/xxx5.dbf'; restore database; switch datafile all; switch tempfile all; } 注:在还原数据文件时,数据库默认的临时表空间在数据文件还原后是会创建数据文件,其他自己手动创建的临时表空间则不会生成,需要手动处理。 7、修改redo日志位置 select GROUP#,STATUS,TYPE,MEMBER from v$logfile; alter database rename file '+DATA/xxx/onlinelog/group_1.302.978617245' to '/u01/oracle/app/oracle/oradata/xxx/redo01_1.log'; alter database rename file '+BACKUPDG/xxx/onlinelog/group_1.1215.978617247' to '/u01/oracle/app/oracle/oradata/xxx/redo01_2.log'; alter database rename file '+DATA/xxx/onlinelog/group_2.303.978617247' to '/u01/oracle/app/oracle/oradata/xxx/redo02_1.log'; alter database rename file '+BACKUPDG/xxx/onlinelog/group_2.866.978617247' to '/u01/oracle/app/oracle/oradata/xxx/redo02_2.log'; alter database rename file '+DATA/xxx/onlinelog/group_3.306.978617337' to '/u01/oracle/app/oracle/oradata/xxx/redo03_1.log'; alter database rename file '+BACKUPDG/xxx/onlinelog/group_3.1243.978617337' to '/u01/oracle/app/oracle/oradata/xxx/redo03_2.log'; alter database rename file '+DATA/xxx/onlinelog/group_4.307.978617337' to '/u01/oracle/app/oracle/oradata/xxx/redo04_1.log'; alter database rename file '+BACKUPDG/xxx/onlinelog/group_4.1227.978617337' to '/u01/oracle/app/oracle/oradata/xxx/redo04_2.log'; 8、恢复数据库 RMAN> recover database; Starting recover at 09-JUN-19 using channel ORA_DISK_1 starting media recovery channel ORA_DISK_1: starting archived log restore to default destination channel ORA_DISK_1: restoring archived log archived log thread=2 sequence=7886 channel ORA_DISK_1: restoring archived log archived log thread=1 sequence=9475 channel ORA_DISK_1: restoring archived log archived log thread=1 sequence=9476 channel ORA_DISK_1: restoring archived log archived log thread=2 sequence=7887 channel ORA_DISK_1: restoring archived log archived log thread=1 sequence=9477 channel ORA_DISK_1: restoring archived log archived log thread=2 sequence=7888 channel ORA_DISK_1: restoring archived log archived log thread=2 sequence=7889 channel ORA_DISK_1: restoring archived log archived log thread=1 sequence=9478 channel ORA_DISK_1: restoring archived log archived log thread=1 sequence=9479 channel ORA_DISK_1: restoring archived log archived log thread=2 sequence=7890 channel ORA_DISK_1: reading from backup piece /software/bak/arc_7pu36obs_1_1 channel ORA_DISK_1: piece handle=/software/bak/arc_7pu36obs_1_1 tag=TAG20190603T193613 channel ORA_DISK_1: restored backup piece 1 channel ORA_DISK_1: restore complete, elapsed time: 00:00:15 archived log file name=/u01/oracle/app/oracle/oradata/arch/1_9475_978617245.dbf thread=1 sequence=9475 archived log file name=/u01/oracle/app/oracle/oradata/arch/2_7886_978617245.dbf thread=2 sequence=7886 archived log file name=/u01/oracle/app/oracle/oradata/arch/1_9476_978617245.dbf thread=1 sequence=9476 archived log file name=/u01/oracle/app/oracle/oradata/arch/2_7887_978617245.dbf thread=2 sequence=7887 archived log file name=/u01/oracle/app/oracle/oradata/arch/1_9477_978617245.dbf thread=1 sequence=9477 archived log file name=/u01/oracle/app/oracle/oradata/arch/2_7888_978617245.dbf thread=2 sequence=7888 archived log file name=/u01/oracle/app/oracle/oradata/arch/2_7889_978617245.dbf thread=2 sequence=7889 archived log file name=/u01/oracle/app/oracle/oradata/arch/1_9478_978617245.dbf thread=1 sequence=9478 archived log file name=/u01/oracle/app/oracle/oradata/arch/1_9479_978617245.dbf thread=1 sequence=9479 archived log file name=/u01/oracle/app/oracle/oradata/arch/2_7890_978617245.dbf thread=2 sequence=7890 unable to find archived log archived log thread=2 sequence=7891 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of recover command at 06/09/2019 14:36:05 RMAN-06054: media recovery requesting unknown archived log for thread 2 with sequence 7891 and starting SCN of 1730567738 SQL> select status from v$instance; STATUS ------------ MOUNTED SQL> alter database open resetlogs; Database altered. SQL> 9、修复临时数据文件 select user,temporary_tablespace from dba_users; create temporary tablespace tmp1 tempfile '/u01/oracle/app/oracle/oradata/xxx/tmp1.dbf' size 2G autoextend on; alter user user01 temporary tablespace tmp1; drop tablespace tmpa including contents and datafiles; 10、删除多余的日志组 select b.member,a.group#,thread#,a.status from v$log a,v$logfile b where a.group#=b.group# order by a.thread#,b.group#; alter database disable thread 2; alter database drop logfile group 3; alter database drop logfile group 4; 11、清理多余undo select name from v$tablespace where name like '%UNDO%'; drop tablespace undotbs2 including contents and datafiles; 至此,完成从RAC恢复到单机操作!
Oracle提供了7种闪回技术,分别为:闪回drop、闪回查询、闪回数据归档、闪回表、闪回版本查询、闪回事务、闪回数据库。此次验证下Oracle数据库闪回drop和闪回查询。 一、闪回DROP 又名闪回删除。 1、理解回收站(recyclebin) 从管理的角度为每个用户“分配”一个回收站,但这个回收站并不实际开辟空间(只是个逻辑容器),当drop table时(非purge),原来的表所使用的段中的数据并没有真正的删除。实际上是把table的段名以回收站方式重命名。该段所在表空间不足需要扩展时,回收站中的信息会被自动清除。(先清除后扩展) 示例: SQL> show parameter recyclebin NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ recyclebin string ON 当初始化参数recyclebin为on时,每个用户都有了自己的回收站(延迟参数,session下次连接有效)如果参数设为off 就取消了用户的回收站,那么当你drop table就相当于purge了。 SQL> create tablespace test datafile '/u01/oradata/prod/test01.dbf' size 1m; SQL> create table scott.t1(id int) tablespace test; SQL> select segment_name from dba_segments where tablespace_name='TEST'; 查看test表空间下有了一个段 SEGMENT_NAME T1 SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST'; 看这个段有多少空闲空间 SUM(BYTES) ---------- 917504 SQL> insert into scott.t1 values(1); SQL> insert into scott.t1 select * from scott.t1; 将表空间撑满 / / 第 1 行出现错误: ORA-01653: 表 SCOTT.T1 无法通过string (在表空间 TEST 中) 扩展 SQL> select count(*) from scott.t1; COUNT(*) ---------- 65536 SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST'; 没有空闲空间 SQL> drop table scott.t1; SQL> select segment_name from dba_segments where tablespace_name='TEST'; SEGMENT_NAME --------------------------------------------------------------------------------- BIN$4KZBTYTKocDgQAB/AQAKRA==$0 SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST'; SUM(BYTES) ---------- 983040 请看,TEST表空间中的空闲空间又回来了,这说明如果test表空间不够时,这部分空闲空间是可以被重新利用的,实际上即使你设置了表空间autoextend特性,Oracle 会先使用recyclebin,若空间还不够,再考虑autoextend. SQL> create table scott.emp1 tablespace test as select * from scott.emp; 挤占test表空间 SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST'; SUM(BYTES) ---------- 917504 SQL> select segment_name from dba_segments where tablespace_name='TEST'; SEGMENT_NAME --------------------------------------------------------------------------------- EMP1 t1表的数据已经被冲掉了,使用闪回删除无法找回了。 2、关于回收站中的对象的闪回和清除 闪回和清除的顺序不同闪回使用LIFO (后进先出)清除使用FIFO (先进先出)假设回收站里有两个t1表,看以下两条语句: SQL> flashback table t1 to before drop; 闪回的是最新的那个t1表。 SQL> purge table t1; 清除的是最旧的那个t1表。 如果想避免混淆,可以直接给出回收站里的表名 SQL> flashback table " BIN$qrJLbL74ZgvgQKjA8Agb/A==$0" to befroe drop; (注意双引号) SQL> purge table "BIN$qrJLbL74ZgvgQKjA8Agb/A==$0"; SQL> purge recyclebin; 清空回收站 3、如何恢复同一个schema下准备闪回的表已有同名的对象存在,闪回drop需要重命名. SQL> flashback table t1 to before drop rename to test_old; 4、system 表空间的对象没有回收站,所以在sys下缺省使用system表空间时,drop table会直接删除对象 5、如果一个表上面有索引和约束,drop后再闪回表,索引和约束还在吗? create table t (id int,name char(10)); alter table t add constraint pk_t primary key(id); insert into t values (1,'test1'); insert into t values (2,'test2'); commit; SQL> select * from t; ID NAME ---------- ---------- 1 test1 2 test2 看一眼约束和索引 SQL> select * from user_indexes; SQL> select * from user_constraints; SQL> drop table t; 表被drop到回收站,再看一眼约束和索引 SQL> select * from user_indexes; 索引不见了 SQL> select * from user_constraints; 约束有,但乱码(除外键约束外) SQL> flashback table t to before drop; 再看约束和索引 SQL> select * from user_indexes; 索引回来了,但乱码 SQL> select * from user_constraints; 约束也在,但乱码 分别重命名索引和约束 SQL> alter index "BIN$yF3hbvIbioTgQAB/AQAJlg==$0" rename to pk_t; SQL> alter table t rename constraint "BIN$yF3hbvIaioTgQAB/AQAJlg==$0" to pk_t; 6、查看闪回区内容 select OBJECT_NAME,ORIGINAL_NAME,OPERATION,CREATETIME,DROPTIME from user_recyclebin; select * from tab; 二、闪回查询 flashback query:(用于DML 误操作并且commit) 1、要点: 利用在undo tablespace 里已经提交的undo block(未被覆盖),可以查询表的过去某个时间点的数据。通过设置undo_retention参数设置前镜像的保留时间。查询的语法:select … as of scn | timestamp 2、undo_retention 可以通过show parameter undo_retention查看该参数的值,默认900,单位是秒。关于undo_retention的介绍可以查看lian链接:link 3、示例: sys: create table scott.student (sno int,sname char(10),sage int); insert into scott.student values(1,'tt1',21); insert into scott.student values(2,'tt2',22); insert into scott.student values(3,'tt3',23); insert into scott.student values(4,'tt4',24); commit; SQL> select * from scott.student; SQL> select current_scn from v$database; 取scn 1或者查询当前时间 SQL> delete scott.student where sno=1; SQL> commit; SQL> select * from scott.student; SQL> select current_scn from v$database; 取scn 2 SQL> update scott.student set sage=50; SQL> commit; SQL> select * from scott.student; SQL>select * from scott.student as of scn scn1; 闪回查询到scn1; SQL>select * from scott.student as of scn scn2; 闪回查询到scn2; SQL>select * from scott.student as of timestamp to_timestamp('2019-03-18 11:31:01','YYYY-MM-DD HH24:MI:SS'); //闪回查询基于时间 4、查看 DELETE 及 UPDATE 操作修改的数据: SQL> SELECT * FROM tab AS OF TIMESTAMP to_timestamp('time_point', 'yyyy-mm-dd hh24:mi:ss') MINUS SELECT * FROM tab; 其中将查询得 tab 表在 time_point 时点之后因 DELETE 及 UPDATE 操作修改的数据。 5、查看 INSERT 操作修改的数据: SQL> SELECT * FROM tab MINUS SELECT * FROM tab AS OF TIMESTAMP to_timestamp('time_point', 'yyyy-mm-dd hh24:mi:ss'); 其中将查询得 tab 表在 time_point 时点之后因 INSERT 操作修改的数据。 参考文章1、http://www.cnblogs.com/autopenguin/p/5952671.html
一、概述 linux环境下,Oracle数据库通过DBLink远程连接MySQL数据库。 二、环境信息 1、Oracle ①操作系统:Linux X86-64 ②数据库版本:11.2.0.4.0 ③字符集:SIMPLIFIED CHINESE_CHINA.AL32UTF8 2、MySQL ①操作系统:Linux i686 ②数据库版本:5.7.21 ③字符集:UTF8 三、配置UnixODBC 1、下载UnixODBC安装包 软件地址:ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.0.tar.gz 2、安装 ①root用户执行 cd /usr/local tar zxvf unixODBC-2.3.0.tar.gz ② 编译安装 cd unixODBC-2.3.0/ ./configure --prefix=/usr/local/unixODBC-2.3.0 --includedir=/usr/include --libdir=/usr/lib64 --bindir=/usr/bin --sysconfdir=/etc make make install 3、测试 执行命令:odbcinst -j,如果安装成功会显示: [root@vbox66 local]# odbcinst -j unixODBC 2.3.0 DRIVERS............: /etc/odbcinst.ini SYSTEM DATA SOURCES: /etc/odbc.ini FILE DATA SOURCES..: /etc/ODBCDataSources USER DATA SOURCES..: /root/.odbc.ini SQLULEN Size.......: 8 SQLLEN Size........: 8 SQLSETPOSIROW Size.: 8 [root@vbox66 local]# unixODBC所需的头文件都被安装到了/usr/inlucde下,编译好的库文件安装到了/usr/lib64下,与unixODBC相关的可执行文件安装到了/usr/bin下,配置文件放到了/etc下。 四、配置odbc连接MyDQL 1、下载文件 https://cdn.mysql.com//Downloads/Connector-ODBC/5.1/mysql-connector-odbc-5.1.13-1.x86_64.rpm 2、rpm安装 rpm -ivh mysql-connector-odbc-5.1.13-1.x86_64.rpm 3、配置odbc.ini文件 vi /etc/odbc.ini [testdb] Description = mysql Driver = MySQL ODBC 5.1 Driver Server = 192.169.31.103 //MySQL服务器IP Database = test //MySQL数据库名 Port = 3306 //端口 USER = user_name //数据库用户名 Password = passwd //用户民密码 Socket = Option = 3 Stmt = CHARSET = UTF8 //数据库字符集 4、测试odbc连接MySQL 运行命令: isql testdb -v //testdb为odbc.ini文件中中括号中的内容 [root@vbox66 lib64]# isql testdb -v +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> show databases; +-----------------------------------------------------------------+ | Database | +-----------------------------------------------------------------+ | information_schema | | aaa | | jrjctest | | mysql | | otter | | performance_schema | | sbtest | | sys | | test | | test1 | | test_wr | | wr | | wr_test1 | | www | +-----------------------------------------------------------------+ SQLRowCount returns 14 14 rows fetched odbc连接MySQL成功! 五、配置Oracle通过DBLink访问MySQL 1、修改环境变量 su - oracle vi .bash_profile export ODBCINI=/etc/odbc.ini 2、配置Oracle监听 ①cd $ORACLE_HOME/network/admin vi listener.ora 添加如下信息: SID_LIST_LISTENER= (SID_LIST= (SID_DESC= (SID_NAME=dg4odbc) (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1) (PROGRAM=dg4odbc) ) ) 官方文档解释如下: ②修改tnsnames.ora vi tnsnames.ora 添加如下信息: dg4odbc = (DESCRIPTION= (ADDRESS = (PROTOCOL =tcp)(HOST = vbox66)(PORT = 1521)) (CONNECT_DATA = (SID = dg4odbc)) (HS=OK) ) 官方文档解释如下: ③配置ODBC监听 cd $ORACLE_HOME/hs/admin vi initdg4odbc.ora //注意,这里init后面的内容要和之前配置 SID_NAME(dg4odbc)一致 HS_FDS_CONNECT_INFO=testdb HS_FDS_TRACE_LEVEL = on HS_FDS_SHAREABLE_NAME=/usr/lib64/libodbc.so HS_FDS_SUPPORT_STATISTICS=FALSE HS_LANGUAGE="simplified chinese_china.al32utf8" //提供具有非oracle数据源的字符集、语言和区域信息的异构服务 HS_NLS_NCHAR=UCS2 //NVARCHAR/NCHAR和图形数据类型通常以Unicode格式存储数据。unicode字符集因数据库的不同而不同,设置此参数外部数据库保持一致 set ODBCINI=/etc/odbc.ini ④重启测试监听配置 oracle用户执行: lsnrctl stop lsnrctl start alter system register;(数据库中执行) lsnrctl status; tnsping dg4odbc 显示以上信息则表示监听配置成功! 3、创建DBLink ①su - oracle sqlplus / as sysdba create public database link myodbc connect to "wangrui" identified by "wangrui" using 'dg4odbc'; --注意:wangrui和wangruit是MySQL用户名和密码,都需要使用双引号,dg4odbc使用单引号。 ②select * from "a2"@myodbc1; 六、可能会遇到的问题 1、 SYS@vbox66in>select "id" from t1@myodbc1; select "id" from t1@myodbc1 * 第 1 行出现错误: ORA-28500: 连接 ORACLE 到非 Oracle 系统时返回此信息: [ 原因:有一些内容显示不全,检查odbc监听文件,查看HS_LANGUAGE参数,配置为和数据库字符集一致 2、 SYS@vbox66in>select "id" from "t1"@myodbc1; select "id" from "t1"@myodbc1 * 第 1 行出现错误: ORA-28500: 连接 ORACLE 到非 Oracle 系统时返回此信息: ORA-28541: HS 初始化文件的第 8 行发生错误。 ORA-02063: 紧接着 2 lines (起自 MYODBC1) 原因:NVARCHAR/NCHAR和图形数据类型通常以Unicode格式存储数据。unicode字符集因数据库的不同而不同,需要修改HS_NLS_NCHAR=UCS2 3、 SYS@vbox66in>select * from a2@myodbc1; select * from a2@myodbc1 * 第 1 行出现错误: ORA-00942: 表或视图不存在 [MySQL][ODBC 5.1 Driver][mysqld-5.7.21-log]Table 'test.A2' doesn't exist {42S02,NativeErr = 1146} ORA-02063: 紧接着 2 lines (起自 MYODBC1) 原因:MySQL数据中是区分大小写的,表需要用双引号引起来
数据库迁移有多种方法可以实现,在有网络的情况下可以通过工具实现数据库迁移,简单稳定高效,而且停机时间可以控制在很短的时间甚至不需要停机。但是当没有外网的情况下就方式就比较少了,下面介绍通过Rman备份恢复的方式来迁移Oracle数据库,将停机时间最小化。 一、收集源库信息 1、查看当前数据库的实际大小 select sum(a.bytes - b.bytes)/1024/ 1024 "sum_used MB" from (select tablespace_name, sum(bytes) bytes from dba_data_files group by tablespace_name) a, (select tablespace_name, sum(bytes) bytes from dba_free_space group by tablespace_name) b where a.tablespace_name = b.tablespace_name; 2、查看数据库安装目录 ①通过.bash_profile查看ORACLE_SID、ORACLE_HOME、ORACLE_BASE的路径 ②查看源数据库的审计文件目录 show parameter audit ③查看控制文件的路径和数量、数据文件的路径 控制文件:show parameter control 数据文件:select name from v$datafile; ④查看是否开启闪回区,如果开启查看对应路径和大小 show parameter recover ⑤查看归档文件路径 show parameter log_archive_dest ⑥查看数据库服务器内存,目标实例配置要大于等于这个配置,否则在还原参数文件时可能会出现SGA不够的情况 查看服务器内存:grep MemTotal /proc/meminfo 查看SGA大小:show parameter sga 二、准备目标服务器环境 根据上面源库的信息安装Oracle软件(不需要dbca创建数据库),需要注意的是要提前创建审计目录,在创建的时候要和源库查询出来的目录一致,同时归档日志目录、数据文件目录、闪回区的目录也一并创建完成。 三、迁移数据库 在环境全部准备完成后,开始准备迁移数据库。迁移的策略为:迁移开始--全备--传输--恢复--增量备份--传输--增量恢复--增量归档恢复--关闭数据库--拷贝redolog--完全恢复--迁移结束。 1、源库进行0级全量备份 [oracle@vbox66 ~]$ rman target / 恢复管理器: Release 11.2.0.4.0 - Production on 星期六 9月 15 15:54:15 2018 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 已连接到目标数据库: VBOX66DB (DBID=3269052407) RMAN> run { 2> allocate channel c1 device type disk; 3> allocate channel c2 device type disk; 4> allocate channel c3 device type disk; 5> backup incremental level 0 database format '/u01/backup/all_db_%U.bak'; 6> } 具体选择channel可以根据数据库表空间的大小和数量,此时查看下当前数据库的日志信息,以便之后拷贝增量日志。 2、通过中间介质传输到目标服务器进行恢复 ①这里我通过scp来代替中间介质传输 目标库 scp 192.168.3.66:/u01/backup/* ./ ②全备文件传输完成后首先还原参数文件 a、首先创建一个哑参,目标数据库启动到nomount状态,登录Rman恢复源库spfile cd $ORACLE_HOME cd dbs vi ceshi.ora db_name='aaa' sqlplus / as sysdba startup nomount pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/ceshi.ora' b、从全备文件中还原参数文件 RMAN> restore spfile to '/u01/app/oracle/product/11.2.0/db_1/dbs/spfilevbox66in.ora' from '/u01/backup/all_db_1rtd6bac_1_1.bak'; 启动 restore 于 2018-09-15 17:44:06 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=19 设备类型=DISK 通道 ORA_DISK_1: 正在从 AUTOBACKUP /u01/backup/all_db_1rtd6bac_1_1.bak 还原 spfile 通道 ORA_DISK_1: 从 AUTOBACKUP 还原 SPFILE 已完成 完成 restore 于 2018-09-15 17:44:08 RMAN> spfile在那个备份集中可以在源库Rman中执行list backup进行查看 ③、目标实例在还原完参数文件之后还原控制文件 a、在还原控制文件之间先将以ceshi.ora参数文件启动的实例关闭,以还原的参数文件启动到nomount进行还原控制文件 shutdown immediate; exit; sqlplus / as sysdba startup nomount; b、还原控制文件 RMAN> restore controlfile from '/u01/backup/all_db_1qtd6b8b_1_1.bak'; 启动 restore 于 2018-09-15 17:51:15 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=19 设备类型=DISK 通道 ORA_DISK_1: 正在还原控制文件 通道 ORA_DISK_1: 还原完成, 用时: 00:00:03 输出文件名=/u01/app/oracle/oradata/vbox66db/control01.ctl 输出文件名=/u01/app/oracle/oradata/vbox66db/control02.ctl 完成 restore 于 2018-09-15 17:51:19 RMAN> ④、控制文件还原完成之后开始还原全备数据文件 a、控制文件还原完成将数据库启动到mount状态 SYS@vbox66in>alter database mount; b、还原数据文件 先将备份集注册到控制文件中 RMAN> catalog start with '/u01/backup'; 使用目标数据库控制文件替代恢复目录 搜索与样式 /u01/backup 匹配的所有文件 数据库未知文件的列表 ===================================== 文件名: /u01/backup/all_db_1rtd6bac_1_1.bak 文件名: /u01/backup/all_db_1qtd6b8b_1_1.bak 文件名: /u01/backup/all_db_1otd6b7h_1_1.bak 文件名: /u01/backup/all_db_1ntd6b7g_1_1.bak 是否确实要将上述文件列入目录 (输入 YES 或 NO)? yes 正在编制文件目录... 目录编制完毕 已列入目录的文件的列表 ======================= 文件名: /u01/backup/all_db_1rtd6bac_1_1.bak 文件名: /u01/backup/all_db_1qtd6b8b_1_1.bak 文件名: /u01/backup/all_db_1otd6b7h_1_1.bak 文件名: /u01/backup/all_db_1ntd6b7g_1_1.bak 开始还原数据文件: RMAN> restore database; 启动 restore 于 2018-09-15 17:57:01 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=17 设备类型=DISK 通道 ORA_DISK_1: 正在开始还原数据文件备份集 通道 ORA_DISK_1: 正在指定从备份集还原的数据文件 通道 ORA_DISK_1: 将数据文件 00006 还原到 /u01/app/oracle/oradata/vbox66db/testdb01.dbf 通道 ORA_DISK_1: 将数据文件 00007 还原到 /u01/app/oracle/oradata/vbox66db/JRJCTEST.dbf 通道 ORA_DISK_1: 将数据文件 00008 还原到 /u01/app/oracle/oradata/vbox66db/oggtbs.dbf 通道 ORA_DISK_1: 正在读取备份片段 /u01/backup/all_db_1ptd6b7h_1_1.bak 通道 ORA_DISK_1: 段句柄 = /u01/backup/all_db_1ptd6b7h_1_1.bak 标记 = TAG20180915T155528 通道 ORA_DISK_1: 已还原备份片段 1 通道 ORA_DISK_1: 还原完成, 用时: 00:00:35 通道 ORA_DISK_1: 正在开始还原数据文件备份集 通道 ORA_DISK_1: 正在指定从备份集还原的数据文件 通道 ORA_DISK_1: 将数据文件 00001 还原到 /u01/app/oracle/oradata/vbox66db/system01.dbf 通道 ORA_DISK_1: 将数据文件 00004 还原到 /u01/app/oracle/oradata/vbox66db/users01.dbf 通道 ORA_DISK_1: 将数据文件 00009 还原到 /u01/app/oracle/oradata/vbox66db/migtbs.dbf 通道 ORA_DISK_1: 正在读取备份片段 /u01/backup/all_db_1otd6b7h_1_1.bak 通道 ORA_DISK_1: 段句柄 = /u01/backup/all_db_1otd6b7h_1_1.bak 标记 = TAG20180915T155528 通道 ORA_DISK_1: 已还原备份片段 1 通道 ORA_DISK_1: 还原完成, 用时: 00:01:15 通道 ORA_DISK_1: 正在开始还原数据文件备份集 通道 ORA_DISK_1: 正在指定从备份集还原的数据文件 通道 ORA_DISK_1: 将数据文件 00002 还原到 /u01/app/oracle/oradata/vbox66db/sysaux01.dbf 通道 ORA_DISK_1: 将数据文件 00003 还原到 /u01/app/oracle/oradata/vbox66db/undotbs01.dbf 通道 ORA_DISK_1: 将数据文件 00005 还原到 /u01/app/oracle/oradata/vbox66db/test01.dbf 通道 ORA_DISK_1: 正在读取备份片段 /u01/backup/all_db_1ntd6b7g_1_1.bak 通道 ORA_DISK_1: 段句柄 = /u01/backup/all_db_1ntd6b7g_1_1.bak 标记 = TAG20180915T155528 通道 ORA_DISK_1: 已还原备份片段 1 通道 ORA_DISK_1: 还原完成, 用时: 00:01:45 完成 restore 于 2018-09-15 18:00:37 RMAN> 3、对源库进行1级增量备份 ①此次为模拟,在全备之后在源库进行操作模拟正常数据库工作 SYS@vbox66in>create table scott.gaowen(id int,name varchar(30)); SYS@vbox66in>insert into scott.gaowen values(1,'aaa'); SYS@vbox66in>insert into scott.gaowen values(2,'bbb'); SYS@vbox66in>insert into scott.gaowen values(3,'ccc'); SYS@vbox66in>commit; SYS@vbox66in>alter system archive log current; 系统已更改。 SYS@vbox66in>alter system archive log current; 系统已更改。 SYS@vbox66in>alter system archive log current; 系统已更改。 SYS@vbox66in> ②进行1级增量备份 RMAN> backup incremental level 1 database format '/u01/backup/incr_db_%U.bak'; 启动 backup 于 15-9月 -18 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在启动增量级别 1 数据文件备份集 通道 ORA_DISK_1: 正在指定备份集内的数据文件 输入数据文件: 文件号=00002 名称=/u01/app/oracle/oradata/vbox66db/sysaux01.dbf 输入数据文件: 文件号=00001 名称=/u01/app/oracle/oradata/vbox66db/system01.dbf 输入数据文件: 文件号=00008 名称=/u01/app/oracle/oradata/vbox66db/oggtbs.dbf 输入数据文件: 文件号=00006 名称=/u01/app/oracle/oradata/vbox66db/testdb01.dbf 输入数据文件: 文件号=00007 名称=/u01/app/oracle/oradata/vbox66db/JRJCTEST.dbf 输入数据文件: 文件号=00009 名称=/u01/app/oracle/oradata/vbox66db/migtbs.dbf 输入数据文件: 文件号=00003 名称=/u01/app/oracle/oradata/vbox66db/undotbs01.dbf 输入数据文件: 文件号=00004 名称=/u01/app/oracle/oradata/vbox66db/users01.dbf 输入数据文件: 文件号=00005 名称=/u01/app/oracle/oradata/vbox66db/test01.dbf 通道 ORA_DISK_1: 正在启动段 1 于 15-9月 -18 通道 ORA_DISK_1: 已完成段 1 于 15-9月 -18 段句柄=/u01/backup/incr_db_1std6jag_1_1.bak 标记=TAG20180915T181335 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:35 通道 ORA_DISK_1: 正在启动增量级别 1 数据文件备份集 通道 ORA_DISK_1: 正在指定备份集内的数据文件 备份集内包括当前控制文件 备份集内包括当前的 SPFILE 通道 ORA_DISK_1: 正在启动段 1 于 15-9月 -18 通道 ORA_DISK_1: 已完成段 1 于 15-9月 -18 段句柄=/u01/backup/incr_db_1ttd6jdf_1_1.bak 标记=TAG20180915T181335 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01 完成 backup 于 15-9月 -18 RMAN> 4、通过中间介质将增量备份传输到目标实例进行恢复 ①这里通过scp来模拟代替中间介质传输 scp 192.168.3.66:/u01/backup/inc* ./ ②还原增量备份 a、先将备份集注册到控制文件中 RMAN> catalog start with '/u01/backup'; 搜索与样式 /u01/backup 匹配的所有文件 数据库未知文件的列表 ===================================== 文件名: /u01/backup/incr_db_1std6jag_1_1.bak 文件名: /u01/backup/incr_db_1ttd6jdf_1_1.bak 是否确实要将上述文件列入目录 (输入 YES 或 NO)? yes 正在编制文件目录... 目录编制完毕 已列入目录的文件的列表 ======================= 文件名: /u01/backup/incr_db_1std6jag_1_1.bak 文件名: /u01/backup/incr_db_1ttd6jdf_1_1.bak RMAN> b、恢复增量备份 RMAN> catalog start with '/u01/backup'; 搜索与样式 /u01/backup 匹配的所有文件 数据库未知文件的列表 ===================================== 文件名: /u01/backup/incr_db_1std6jag_1_1.bak 文件名: /u01/backup/incr_db_1ttd6jdf_1_1.bak 是否确实要将上述文件列入目录 (输入 YES 或 NO)? yes 正在编制文件目录... 目录编制完毕 已列入目录的文件的列表 ======================= 文件名: /u01/backup/incr_db_1std6jag_1_1.bak 文件名: /u01/backup/incr_db_1ttd6jdf_1_1.bak RMAN> recover database; 启动 recover 于 2018-09-15 18:22:01 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在开始还原增量数据文件备份集 通道 ORA_DISK_1: 正在指定从备份集还原的数据文件 数据文件 00001 的还原目标: /u01/app/oracle/oradata/vbox66db/system01.dbf 数据文件 00002 的还原目标: /u01/app/oracle/oradata/vbox66db/sysaux01.dbf 数据文件 00003 的还原目标: /u01/app/oracle/oradata/vbox66db/undotbs01.dbf 数据文件 00004 的还原目标: /u01/app/oracle/oradata/vbox66db/users01.dbf 数据文件 00005 的还原目标: /u01/app/oracle/oradata/vbox66db/test01.dbf 数据文件 00006 的还原目标: /u01/app/oracle/oradata/vbox66db/testdb01.dbf 数据文件 00007 的还原目标: /u01/app/oracle/oradata/vbox66db/JRJCTEST.dbf 数据文件 00008 的还原目标: /u01/app/oracle/oradata/vbox66db/oggtbs.dbf 数据文件 00009 的还原目标: /u01/app/oracle/oradata/vbox66db/migtbs.dbf 通道 ORA_DISK_1: 正在读取备份片段 /u01/backup/incr_db_1std6jag_1_1.bak 通道 ORA_DISK_1: 段句柄 = /u01/backup/incr_db_1std6jag_1_1.bak 标记 = TAG20180915T181335 通道 ORA_DISK_1: 已还原备份片段 1 通道 ORA_DISK_1: 还原完成, 用时: 00:00:15 正在开始介质的恢复 无法找到归档日志 归档日志线程=1 序列=56 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: recover 命令 (在 09/15/2018 18:22:19 上) 失败 RMAN-06054: 介质恢复正在请求未知的线程 1 序列 56 的归档日志以及起始 SCN 2027595 RMAN> 从恢复的信息中我们可以看到数据没有完全恢复,需要增量归档日志文件。接下来需要将全备之后生成的增量日志传输到目标实例 5、传输源库增量日志到目标实例进行数据恢复 ①从增量恢复信息中我们可以看到需要56号归档日志,那么就需要将56号之后的归档日志传输到目标实例,我这里通过scp代替中间介质 scp 192.168.3.66:/u01/app/oracle/oradata/arch/1_56_974146828.dbf ./ scp 192.168.3.66:/u01/app/oracle/oradata/arch/1_57_974146828.dbf ./ scp 192.168.3.66:/u01/app/oracle/oradata/arch/1_58_974146828.dbf ./ ②进行增量日志恢复 RMAN> recover database; 启动 recover 于 2018-09-15 18:33:38 使用通道 ORA_DISK_1 正在开始介质的恢复 归档日志文件名=/u01/app/oracle/oradata/arch/1_56_974146828.dbf 线程=1 序列=56 归档日志文件名=/u01/app/oracle/oradata/arch/1_57_974146828.dbf 线程=1 序列=57 归档日志文件名=/u01/app/oracle/oradata/arch/1_58_974146828.dbf 线程=1 序列=58 无法找到归档日志 归档日志线程=1 序列=59 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: recover 命令 (在 09/15/2018 18:33:39 上) 失败 RMAN-06054: 介质恢复正在请求未知的线程 1 序列 59 的归档日志以及起始 SCN 2040040 RMAN> 从增量日志恢复信息中可以看到还需要59号日志文件,如果此时59号文件就是当前redo log文件的话就关闭源实例数据库,将redo file文件拷贝到目标实例进行恢复,如果不是那就重复上诉步骤直到是redo file文件为止,这样就可以最小化停机时间。 ③由于这里是模拟,59号文件就是当前redo file,现在关闭远视力数据库进行拷贝redo file文件到目标实例 a、源实例关闭数据库 shutdown immediate; b、将当前redo file传输到目标实例 scp 192.168.3.66:/u01/app/oracle/oradata/vbox66db/redo* ./ 6、当redo file拷贝完成后进行最后的恢复数据库 ①进行恢复数据库 RMAN> recover database; 启动 recover 于 2018-09-15 18:42:00 使用通道 ORA_DISK_1 正在开始介质的恢复 线程 1 序列 59 的归档日志已作为文件 /u01/app/oracle/oradata/vbox66db/redo02.log 存在于磁盘上 归档日志文件名=/u01/app/oracle/oradata/vbox66db/redo02.log 线程=1 序列=59 介质恢复完成, 用时: 00:00:00 完成 recover 于 2018-09-15 18:42:01 RMAN> ②以resetlogs方式打开数据库 SYS@vbox66in>alter database open resetlogs; 数据库已更改。 SYS@vbox66in> ③查看之前创建的表数据 SYS@vbox66in>select * from scott.gaowen; ID NAME ---------- ------------------------------ 1 aaa 2 bbb 3 ccc SYS@vbox66in> 7、重建临时表空间 由于备份恢复时不备份临时表空间,所以还原之后临时表空间文件就没有,需要重建。 SYS@vbox66in>create temporary tablespace temp2 tempfile '/u01/app/oracle/oradata/vbox66db/temp02.dbf' size 10M autoextend on; SYS@vbox66in>alter database default temporary tablespace temp2; SYS@vbox66in>drop tablespace temp including contents and datafiles; SYS@vbox66in>create temporary tablespace temp tempfile '/u01/app/oracle/oradata/vbox66db/temp01.dbf' size 10M autoextend on; SYS@vbox66in>alter database default temporary tablespace temp; SYS@vbox66in>drop tablespace temp2 including contents and datafiles; 至此数据库迁移完毕!
在SQL查询数据时,对一个日期字段进行过滤,使用to_char函数可能会造成返回结果不准确的问题,下面将针对这个现象做出测试。 一、构建环境 1、连接数据库创建表 sqlplus scott/tiger create table test_riqi(id number,rq date); 2、插入数据 二、测试 1、日期显示格式为DD-MON-RR ①查询日期大于2018.09.04的信息 SCOTT@vbox66in>select * from test_riqi where to_char(rq,'DD-MON-RR') > '04-9月 -18'; ID RQ ---------- -------------- 1 10-8月 -18 2 15-8月 -18 3 18-8月 -18 4 18-8月 -19 5 05-8月 -18 6 10-8月 -18 7 20-8月 -18 8 25-8月 -18 9 25-9月 -18 11 15-9月 -18 已选择10行。 SCOTT@vbox66in> SCOTT@vbox66in>select * from test_riqi where rq > '04-9月 -18'; ID RQ ---------- -------------- 4 18-8月 -19 9 25-9月 -18 11 15-9月 -18 SCOTT@vbox66in> 从执行结果来看,发现比2018.09.04日期小的也显示出来了,正确的结果应该是下面的三条记录,那么造成这个的原因是什么呢? ②可以看到第一个SQL语句中过滤字段加了to_char函数,to_char将RQ字段转换为了字符类型,字符类型比较大小和日期类型是不一样的,看下字符类型是如何比较的: SCOTT@vbox66in>create table test_zf(id number,val varchar2(30)); 表已创建。 SCOTT@vbox66in>insert into test_zf values(1,'1'); 已创建 1 行。 SCOTT@vbox66in>insert into test_zf values(1,'2'); 已创建 1 行。 SCOTT@vbox66in>insert into test_zf values(1,'123'); 已创建 1 行。 SCOTT@vbox66in>insert into test_zf values(1,'6'); 已创建 1 行。 SCOTT@vbox66in>insert into test_zf values(1,'ABC'); 已创建 1 行。 SCOTT@vbox66in>insert into test_zf values(1,'C'); 已创建 1 行。 SCOTT@vbox66in>insert into test_zf values(1,'F'); SCOTT@vbox66in>select * from test_zf; ID VAL ---------- ------------------------------ 1 1 1 2 1 123 1 6 1 ABC 1 C 1 F 已选择7行。 SCOTT@vbox66in>select * from test_zf where val < '3'; ID VAL ---------- ------------------------------ 1 1 1 2 1 123 SCOTT@vbox66in>select * from test_zf where val < 'D'; ID VAL ---------- ------------------------------ 1 1 1 2 1 123 1 6 1 ABC 1 C 已选择6行。 SCOTT@vbox66in> SCOTT@vbox66in>insert into test_zf values(1,'AC'); 已创建 1 行。 SCOTT@vbox66in>insert into test_zf values(1,'ACF'); 已创建 1 行。 SCOTT@vbox66in>insert into test_zf values(1,'AE'); 已创建 1 行。 SCOTT@vbox66in>select * from test_zf where val < 'AD'; ID VAL ---------- ------------------------------ 1 1 1 2 1 123 1 6 1 ABC 1 AC 1 ACF 已选择7行。 SCOTT@vbox66in> 从上述测试可以看到,val字段过滤小于‘3’时,结果123也显示了出来,如果是数字来讲这显然是不正常的。字符类型的比较是将字符转换为ASCII码对应的数值之后进行比较,而且是从左往右进行比较,只要有一个字符符合条件之后就不在进行比较。现在就可以解释上述日期类型比较有差错的问题了,当查询日期大于‘04-9月 -18’的日期时,由于to_char将日期转换为字符,在进行比较时只要RQ这个字段值第一个字符大于0就可以显示出来。 2、日期显示格式为YYYY-MM-DD HH24:MI:SS 日期显示格式为YYYY-MM-DD HH24:MI:SS则不会出现上述的问题,因为是按照进制的形式增大,所以就是用to_char函数将日期转换为字符串也能查询出正常数据 3、在过滤的条件的字段上加函数会导致查询不走索引,如果有这样的需求可以在相应的字段加函数索引。
平时写SQL遇到多表关联的情况经常见到,这也是关系型数据库最大的优势之一。表连接类型可以分为Nested Loops join、hash join、Merge Sort Join三类。每一类都有各自的使用场景,sql语句在数据库中生成执行计划,数据库中优化器会根据代价去判断选择哪种方式。Merge Sort Join 的表访问次数和 Hash Join 是类似的。下面测试Nested Loop、Hash join这两种方式执行时对于表的访问次数。 1、构造测试环境 ①创建表test1、test2 SYS@vbox66in>create table test1 ( 2 id number not null, 3 num number, 4 val varchar2(100)); 表已创建。 SYS@vbox66in> SYS@vbox66in>create table test2 ( 2 id number not null, 3 t1_id number not null, 4 num number, 5 val varchar2(100)); 表已创建。 SYS@vbox66in> ②插入数据 SYS@vbox66in>exec dbms_random.seed(0); PL/SQL 过程已成功完成。 SYS@vbox66in>insert into test1 2 select rownum,rownum,dbms_random.string('a',50) from dual 3 connect by level <= 100 4 order by dbms_random.random; 已创建 100 行。 SYS@vbox66in> SYS@vbox66in>insert into test2 2 select rownum,rownum,rownum,dbms_random.string('a',50) from dual 3 connect by level <= 10000 4 order by dbms_random.random; 已创建 10000 行。 SYS@vbox66in>commit; 提交完成。 SYS@vbox66in> 2、表访问次数测试 ①Nested Loops join方式 Nested Looped join中,驱动表被访问0次或1次,被驱动表被访问0次或N次,N由驱动表返回的结果集条数来决定,下面通过4种情况来测试。 在测试之前设置一些内容,修改参数statistics_level=all的方式来查看sql语句的执行计划,查看sql语句执行计划方式有多种,这里不做详细介绍;执行set linesize 1000,set linesize 1000对dbms_xplan.display_cursor还是有影响的,如果没有设置,默认情况下输出将会少人多列,如BUFFERS等。 A、第一种情况,test2被访问100次(驱动表被访问1次,被驱动表被访问100次) SYS@vbox66in>select /*+ leading(test1) use_nl(test2) */ test1.*,test2.* 2 from test1,test2 3 where test1.id=test2.t1_id; ---查询结果省略 SYS@vbox66in>select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ SQL_ID 2ajdvtjv469rm, child number 0 ------------------------------------- select /*+ leading(test1) use_nl(test2) */ test1.*,test2.* from test1,test2 where test1.id=test2.t1_id Plan hash value: 2336902100 -------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 100 |00:00:00.12 | 9917 | PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | 1 | NESTED LOOPS | | 1 | 100 | 100 |00:00:00.12 | 9917 | | 2 | TABLE ACCESS FULL| TEST1 | 1 | 100 | 100 |00:00:00.01 | 10 | |* 3 | TABLE ACCESS FULL| TEST2 | 100 | 1 | 100 |00:00:00.12 | 9907 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter("TEST1"."ID"="TEST2"."T1_ID") Note PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - dynamic sampling used for this statement (level=2) 已选择25行。 SYS@vbox66in> /+ leading(test1) use_nl(test2) /这个表示以test1作为驱动表,连接方式为Nested Loops join。从执行计划可以看出(starts表示表被访问的次数),test1表被访问了1次,test2表被访问了100次。因为test1作为驱动表返回了100条数据,所以被驱动表被访问了100次。 B、第二种情况 SYS@vbox66in>select /*+ leading(test1) use_nl(test2) */ test1.*,test2.* 2 from test1,test2 3 where test1.id=test2.t1_id 4 and test1.id in (20,30); --查询结果省略 SYS@vbox66in>select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID c2y038hqtjqg6, child number 0 ------------------------------------- select /*+ leading(test1) use_nl(test2) */ test1.*,test2.* from test1,test2 where test1.id=test2.t1_id and test1.id in (:"SYS_B_0",:"SYS_B_1") Plan hash value: 2336902100 -------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | -------------------------------------------------------------------------------------- PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | | 2 |00:00:00.01 | 203 | | 1 | NESTED LOOPS | | 1 | 1 | 2 |00:00:00.01 | 203 | |* 2 | TABLE ACCESS FULL| TEST1 | 1 | 2 | 2 |00:00:00.01 | 4 | |* 3 | TABLE ACCESS FULL| TEST2 | 2 | 1 | 2 |00:00:00.01 | 199 | ------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(("TEST1"."ID"=:SYS_B_0 OR "TEST1"."ID"=:SYS_B_1)) 3 - filter((INTERNAL_FUNCTION("TEST2"."T1_ID") AND PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ "TEST1"."ID"="TEST2"."T1_ID")) Note ----- - dynamic sampling used for this statement (level=2) 已选择28行。 SYS@vbox66in> 从执行计划来看,test1作为驱动表被访问了1次返回了2行,被驱动表test2被访问了2次,结果和上次类似。 C、第三种情况 SYS@vbox66in>select /*+ leading(test1) use_nl(test2) */ test1.*,test2.* 2 from test1,test2 3 where test1.id=test2.t1_id 4 and test1.num = 789456123; 未选定行 SYS@vbox66in> SYS@vbox66in>select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ SQL_ID fh6zpk6pbmmp8, child number 0 ------------------------------------- select /*+ leading(test1) use_nl(test2) */ test1.*,test2.* from test1,test2 where test1.id=test2.t1_id and test1.num = :"SYS_B_0" Plan hash value: 2336902100 -------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.01 | 3 | PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | 1 | NESTED LOOPS | | 1 | 1 | 0 |00:00:00.01 | 3 | |* 2 | TABLE ACCESS FULL| TEST1 | 1 | 1 | 0 |00:00:00.01 | 3 | |* 3 | TABLE ACCESS FULL| TEST2 | 0 | 1 | 0 |00:00:00.01 | 0 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("TEST1"."NUM"=:SYS_B_0) 3 - filter("TEST1"."ID"="TEST2"."T1_ID") PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Note ----- - dynamic sampling used for this statement (level=2) 已选择26行。 SYS@vbox66in> sql语句where条件加了test1.num = 789456123,实际这条数据不存在。观察执行计划,test1作为驱动表被访问了1次,预测返回1条数据,结果返回0条(E-Rows表示预测返回的数据行,A-Rows表示实际返回的数据行),由于驱动表返回0行数据,所以被驱动表被访问0次。 D、第四种情况 SYS@vbox66in>select /*+ leading(test1) use_nl(test2) */ test1.*,test2.* 2 from test1,test2 3 where test1.id=test2.t1_id 4 and 1 = 2; 未选定行 SYS@vbox66in> SYS@vbox66in>select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ SQL_ID d9hvdrafbz5wt, child number 0 ------------------------------------- select /*+ leading(test1) use_nl(test2) */ test1.*,test2.* from test1,test2 where test1.id=test2.t1_id and :"SYS_B_0" = :"SYS_B_1" Plan hash value: 3924076509 ----------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.01 | PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |* 1 | FILTER | | 1 | | 0 |00:00:00.01 | | 2 | NESTED LOOPS | | 0 | 100 | 0 |00:00:00.01 | | 3 | TABLE ACCESS FULL| TEST1 | 0 | 100 | 0 |00:00:00.01 | |* 4 | TABLE ACCESS FULL| TEST2 | 0 | 1 | 0 |00:00:00.01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(:SYS_B_0=:SYS_B_1) 4 - filter("TEST1"."ID"="TEST2"."T1_ID") PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Note ----- - dynamic sampling used for this statement (level=2) 已选择27行。 SYS@vbox66in> sql语句种加了1 = 2这个条件,这个条件根本不成立,所以 t1 表根本无须访问,直接通过访问数据字典,获取到两表的结构就好了,观察执行计划也可以看到test1和test2均没有被访问。 ②Hash join方式 Hash join中,驱动表被访问0次或1次,被驱动表也是被访问0次或1次,绝大部分场景下是驱动表和被驱动表各被访问1次。 A、第一种情况 SYS@vbox66in>select /*+ leading(test1) use_hash(test2) */ test1.*,test2.* 2 from test1,test2 3 where test1.id=test2.id; ---查询结果省略 SYS@vbox66in>select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ SQL_ID 1t2sys8m18yj1, child number 0 ------------------------------------- select /*+ leading(test1) use_hash(test2) */ test1.*,test2.* from test1,test2 where test1.id=test2.id Plan hash value: 497311279 ----------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem | ----------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 100 |00:00:00.06 | 109 | | | | PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |* 1 | HASH JOIN | | 1 | 100 | 100 |00:00:00.06 | 109 | 964K| 964K| 1261K (0)| | 2 | TABLE ACCESS FULL| TEST1 | 1 | 100 | 100 |00:00:00.01 | 3 | | | | | 3 | TABLE ACCESS FULL| TEST2 | 1 | 9622 | 10000 |00:00:00.02 | 106 | | | | ----------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("TEST1"."ID"="TEST2"."ID") Note PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - dynamic sampling used for this statement (level=2) 已选择25行。 SYS@vbox66in> sql语句中添加了hint:/+ leading(test1) use_hash(test2) /。leading表示将test1作为驱动表,use_hash表示表连接方式为hash。从执行计划中可以查到,test1作为驱动表被执行了1次实际返回了100条数据,test2作为被驱动表也被执行了一次,放回了10000条数据。从这里看以看出hash join方式表访问的次数和Nested Loops join不同。 B、第二种情况 SYS@vbox66in>select /*+ leading(test1) use_hash(test2) */ test1.*,test2.* 2 from test1,test2 3 where test1.id=test2.id 4 and test1.num = 987654321; 未选定行 SYS@vbox66in> SYS@vbox66in>select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ SQL_ID 69x6y0z2nhr4a, child number 0 ------------------------------------- select /*+ leading(test1) use_hash(test2) */ test1.*,test2.* from test1,test2 where test1.id=test2.id and test1.num = :"SYS_B_0" Plan hash value: 497311279 ----------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem | ----------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.01 | 3 | | | | PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |* 1 | HASH JOIN | | 1 | 1 | 0 |00:00:00.01 | 3 | 876K| 876K| 183K (0)| |* 2 | TABLE ACCESS FULL| TEST1 | 1 | 1 | 0 |00:00:00.01 | 3 | | | | | 3 | TABLE ACCESS FULL| TEST2 | 0 | 9622 | 0 |00:00:00.01 | 0 | | | | ----------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("TEST1"."ID"="TEST2"."ID") 2 - filter("TEST1"."NUM"=:SYS_B_0) PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Note ----- - dynamic sampling used for this statement (level=2) 已选择26行。 SYS@vbox66in> sql与语句中添加了test1.num = 987654321条件,test1中没有这行数据,所以返回0行。查看执行计划,test1作为驱动表被访问一次,返回0行数据,被驱动表test2被访问0次。 C、第三种情况 SYS@vbox66in>select /*+ leading(test1) use_hash(test2) */ test1.*,test2.* 2 from test1,test2 3 where test1.id=test2.id 4 and 1 = 2; 未选定行 SYS@vbox66in> SYS@vbox66in>select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ SQL_ID fxbhu6tb8q5nk, child number 0 ------------------------------------- select /*+ leading(test1) use_hash(test2) */ test1.*,test2.* from test1,test2 where test1.id=test2.id and :"SYS_B_0" = :"SYS_B_1" Plan hash value: 4084539893 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | OMem | 1Mem | Used-Mem | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.01 | | | | PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |* 1 | FILTER | | 1 | | 0 |00:00:00.01 | | | | |* 2 | HASH JOIN | | 0 | 100 | 0 |00:00:00.01 | 876K| 876K| | | 3 | TABLE ACCESS FULL| TEST1 | 0 | 100 | 0 |00:00:00.01 | | | | | 4 | TABLE ACCESS FULL| TEST2 | 0 | 9622 | 0 |00:00:00.01 | | | | -------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(:SYS_B_0=:SYS_B_1) 2 - access("TEST1"."ID"="TEST2"."ID") PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Note ----- - dynamic sampling used for this statement (level=2) 已选择27行。 SYS@vbox66in> sql语句中加了1 = 2的条件,这种情况不可能成立,所以 test1 表根本无须访问。查看执行计划,驱动表test1被访问0次,被驱动表也被访问0次。
一、TSPITR介绍 TSPITR全称是Tablespace Point In Time Recover(表空间基于时间点的不完全恢复)。原理是通过辅助实例基于时间还原出误操作前的数据通过DataPump将数据导入到目标数据库。TSPITR的最大好处是不需要生产库停机。 二、适用场景 表空间时点恢复适用用以下场景: ①错误的批处理作业或数据操作语言DML ②恢复数据定义语言(DDL)后丢失的数据操作,改变表的结构。不能使用闪回表将表倒回结构更改点之前,例如截断表(truncate)操作。 ③恢复drop时使用了purge选项的表 ④恢复存在逻辑错误的表 ⑤恢复被删除的表空间,RMAN可以在被drop的表空间上面执行TSPITR ⑥与全库级别闪回相比,表空间时点恢复停留在表空间级别,影响较全库闪回较小。其次,数据库闪回功能需要承担维护闪回日志开启的相关性能开销。 三、TSPITR前提 1、有一套有效全库备份,因为TSPITR这个过程除了复制需要恢复的表空间外,也必须复制system,sysaux和undo表空间2、需要回复的表空间需要自包含,可以通过TS_PITR_CHECK视图查看自包含信息。表空间上存在约束关系(依赖)表的情形,依赖关系所在的表空间也需要一同做时点恢复(如外键参照,不在同一时点,则违反参照约束)3、对于索引与数据分离的表空间在时点恢复时,应先删除索引4、不能恢复数据库当前的缺省表空间5、不能恢复以下对象: ①存在依赖关系的物化视图,分区表等(如果要恢复,先解决依赖) ②undo表空间,undo段 ③sys模式下的对象(如PL/SQL,views, synonyms, users…) 四、测试过程 1、对全库做一个全备(之前做过全库备份并且有效这步可以忽略) RMAN> backup database format '/u01/rman_bak/all_db_%U.bak'; 启动 backup 于 2018-07-29 19:19:31 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集内的数据文件 输入数据文件: 文件号=00001 名称=/u01/app/oracle/oradata/vbox66db/system01.dbf 输入数据文件: 文件号=00002 名称=/u01/app/oracle/oradata/vbox66db/sysaux01.dbf 输入数据文件: 文件号=00003 名称=/u01/app/oracle/oradata/vbox66db/undotbs01.dbf 输入数据文件: 文件号=00004 名称=/u01/app/oracle/oradata/vbox66db/users01.dbf 输入数据文件: 文件号=00005 名称=/u01/app/oracle/oradata/vbox66db/test01.dbf 通道 ORA_DISK_1: 正在启动段 1 于 2018-07-29 19:19:31 通道 ORA_DISK_1: 已完成段 1 于 2018-07-29 19:21:37 段句柄=/u01/rman_bak/all_db_0kt98563_1_1.bak 标记=TAG20180729T191931 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:02:06 通道 ORA_DISK_1: 正在启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集内的数据文件 备份集内包括当前控制文件 备份集内包括当前的 SPFILE 通道 ORA_DISK_1: 正在启动段 1 于 2018-07-29 19:21:44 通道 ORA_DISK_1: 已完成段 1 于 2018-07-29 19:21:45 段句柄=/u01/rman_bak/all_db_0lt985a1_1_1.bak 标记=TAG20180729T191931 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01 完成 backup 于 2018-07-29 19:21:45 RMAN> 2、创建一个测试表空间 ①创建testdb表空间 SYS@vbox66in>create tablespace testdb datafile '/u01/app/oracle/oradata/vbox66db/testdb01.dbf' size 100M autoextend on; 表空间已创建。 SYS@vbox66in>select name from v$datafile; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/vbox66db/system01.dbf /u01/app/oracle/oradata/vbox66db/sysaux01.dbf /u01/app/oracle/oradata/vbox66db/undotbs01.dbf /u01/app/oracle/oradata/vbox66db/users01.dbf /u01/app/oracle/oradata/vbox66db/test01.dbf /u01/app/oracle/oradata/vbox66db/testdb01.dbf 已选择6行。 SYS@vbox66in> SYS@vbox66in>alter user scott default tablespace testdb; 用户已更改。 ②创建测试表 SCOTT@vbox66in>create table test01 tablespace testdb as select * from emp; 表已创建。 SCOTT@vbox66in>create table test02 tablespace testdb as select * from dept; 表已创建。 SCOTT@vbox66in>alter table test01 add primary key(empno); 表已更改。 SCOTT@vbox66in>alter table test02 add primary key(deptno); 表已更改。 SCOTT@vbox66in>alter table test01 add constraints test01_fk foreign key(deptno) references test02(deptno); 表已更改。 SCOTT@vbox66in> SCOTT@vbox66in>commit; 提交完成。 SCOTT@vbox66in> ③RMAN备份testdb表空间 RMAN> backup tablespace testdb format '/u01/rman_bak/testdb_%U.bak'; 启动 backup 于 2018-07-29 21:01:53 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集内的数据文件 输入数据文件: 文件号=00006 名称=/u01/app/oracle/oradata/vbox66db/testdb01.dbf 通道 ORA_DISK_1: 正在启动段 1 于 2018-07-29 21:01:53 通道 ORA_DISK_1: 已完成段 1 于 2018-07-29 21:01:54 段句柄=/u01/rman_bak/testdb_0mt98b61_1_1.bak 标记=TAG20180729T210153 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01 完成 backup 于 2018-07-29 21:01:54 RMAN> ④取当前时间,以便之后还原时用 SCOTT@vbox66in>select sysdate from dual; SYSDATE ------------------- 2018-07-29 21:03:31 SCOTT@vbox66in> ⑤误操作删除表test01、test02数据(这里是测试,) SCOTT@vbox66in>truncate table test02; 表被截断。 SCOTT@vbox66in>truncate table test01; 表被截断。 SCOTT@vbox66in>select * from test01; 未选定行 SCOTT@vbox66in>select * from test02; 未选定行 SCOTT@vbox66in> ⑥建立目录指定辅助库目标, [oracle@vbox66 ~]$ mkdir -p /tmp/auxdata [oracle@vbox66 ~]$ ll /tmp/auxdata/ 总计 0 [oracle@vbox66 ~]$ ll -d /tmp/auxdata/ drwxr-xr-x 2 oracle oinstall 4096 07-29 21:16 /tmp/auxdata/ ⑦做RMAN TSPITR 并指定辅助库目的地 RMAN> recover tablespace testdb until time '2018-07-29 22:11:35' auxiliary destination '/tmp/auxdata'; //这个时间和上面记录的有点出入,因为期间修改过一次,道理上一致 启动 recover 于 2018-07-29 22:15:28 使用通道 ORA_DISK_1 RMAN-05026: 警告: 假定以下表空间集适用于指定的时间点 表空间列表要求具有 UNDO 段 表空间 SYSTEM 表空间 UNDOTBS1 使用 SID='Fcny' 创建自动实例 供自动实例使用的初始化参数: db_name=VBOX66DB db_unique_name=Fcny_tspitr_VBOX66DB compatible=11.2.0.4.0 db_block_size=8192 db_files=200 sga_target=1G processes=80 db_create_file_dest=/tmp/auxdata log_archive_dest_1='location=/tmp/auxdata' #No auxiliary parameter file used 启动自动实例 VBOX66DB Oracle 实例已启动 系统全局区域总计 1068937216 字节 Fixed Size 2260088 字节 Variable Size 281019272 字节 Database Buffers 780140544 字节 Redo Buffers 5517312 字节 自动实例已创建 对恢复集表空间运行 TRANSPORT_SET_CHECK TRANSPORT_SET_CHECK 已成功完成 内存脚本的内容: { # set requested point in time set until time "2018-07-29 22:11:35"; # restore the controlfile restore clone controlfile; # mount the controlfile sql clone 'alter database mount clone database'; # archive current online log sql 'alter system archive log current'; # avoid unnecessary autobackups for structural changes during TSPITR sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;'; } 正在执行内存脚本 正在执行命令: SET until clause 启动 restore 于 2018-07-29 22:15:43 分配的通道: ORA_AUX_DISK_1 通道 ORA_AUX_DISK_1: SID=19 设备类型=DISK 通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集 通道 ORA_AUX_DISK_1: 正在还原控制文件 通道 ORA_AUX_DISK_1: 正在读取备份片段 /u01/rman_bak/full_db_0pt98f62_1_1.bak 通道 ORA_AUX_DISK_1: 段句柄 = /u01/rman_bak/full_db_0pt98f62_1_1.bak 标记 = TAG20180729T220804 通道 ORA_AUX_DISK_1: 已还原备份片段 1 通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:01 输出文件名=/tmp/auxdata/VBOX66DB/controlfile/o1_mf_fovm0jqt_.ctl 完成 restore 于 2018-07-29 22:15:45 sql 语句: alter database mount clone database sql 语句: alter system archive log current sql 语句: begin dbms_backup_restore.AutoBackupFlag(FALSE); end; 内存脚本的内容: { # set requested point in time set until time "2018-07-29 22:11:35"; plsql <<<-- tspitr_2 declare sqlstatement varchar2(512); offline_not_needed exception; pragma exception_init(offline_not_needed, -01539); begin sqlstatement := 'alter tablespace '|| 'TESTDB' ||' offline immediate'; krmicd.writeMsg(6162, sqlstatement); krmicd.execSql(sqlstatement); exception when offline_not_needed then null; end; >>>; # set destinations for recovery set and auxiliary set datafiles set newname for clone datafile 1 to new; set newname for clone datafile 3 to new; set newname for clone datafile 2 to new; set newname for clone tempfile 1 to new; set newname for datafile 6 to "/u01/app/oracle/oradata/vbox66db/testdb01.dbf"; # switch all tempfiles switch clone tempfile all; # restore the tablespaces in the recovery set and the auxiliary set restore clone datafile 1, 3, 2, 6; switch clone datafile all; } 正在执行内存脚本 正在执行命令: SET until clause sql 语句: alter tablespace TESTDB offline immediate 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 临时文件 1 在控制文件中已重命名为 /tmp/auxdata/VBOX66DB/datafile/o1_mf_temp_%u_.tmp 启动 restore 于 2018-07-29 22:15:56 使用通道 ORA_AUX_DISK_1 通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集 通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件 通道 ORA_AUX_DISK_1: 将数据文件 00001 还原到 /tmp/auxdata/VBOX66DB/datafile/o1_mf_system_%u_.dbf 通道 ORA_AUX_DISK_1: 将数据文件 00003 还原到 /tmp/auxdata/VBOX66DB/datafile/o1_mf_undotbs1_%u_.dbf 通道 ORA_AUX_DISK_1: 将数据文件 00002 还原到 /tmp/auxdata/VBOX66DB/datafile/o1_mf_sysaux_%u_.dbf 通道 ORA_AUX_DISK_1: 将数据文件 00006 还原到 /u01/app/oracle/oradata/vbox66db/testdb01.dbf 通道 ORA_AUX_DISK_1: 正在读取备份片段 /u01/rman_bak/full_db_0ot98f25_1_1.bak 通道 ORA_AUX_DISK_1: 段句柄 = /u01/rman_bak/full_db_0ot98f25_1_1.bak 标记 = TAG20180729T220804 通道 ORA_AUX_DISK_1: 已还原备份片段 1 通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:02:25 完成 restore 于 2018-07-29 22:18:21 数据文件 1 已转换成数据文件副本 输入数据文件副本 RECID=4 STAMP=982793902 文件名=/tmp/auxdata/VBOX66DB/datafile/o1_mf_system_fovm0ws4_.dbf 数据文件 3 已转换成数据文件副本 输入数据文件副本 RECID=5 STAMP=982793902 文件名=/tmp/auxdata/VBOX66DB/datafile/o1_mf_undotbs1_fovm0wsx_.dbf 数据文件 2 已转换成数据文件副本 输入数据文件副本 RECID=6 STAMP=982793902 文件名=/tmp/auxdata/VBOX66DB/datafile/o1_mf_sysaux_fovm0wsb_.dbf 内存脚本的内容: { # set requested point in time set until time "2018-07-29 22:11:35"; # online the datafiles restored or switched sql clone "alter database datafile 1 online"; sql clone "alter database datafile 3 online"; sql clone "alter database datafile 2 online"; sql clone "alter database datafile 6 online"; # recover and open resetlogs recover clone database tablespace "TESTDB", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog; alter clone database open resetlogs; } 正在执行内存脚本 正在执行命令: SET until clause sql 语句: alter database datafile 1 online sql 语句: alter database datafile 3 online sql 语句: alter database datafile 2 online sql 语句: alter database datafile 6 online 启动 recover 于 2018-07-29 22:18:22 使用通道 ORA_AUX_DISK_1 正在开始介质的恢复 线程 1 序列 22 的归档日志已作为文件 /u01/app/oracle/oradata/arch/1_22_974146828.dbf 存在于磁盘上 归档日志文件名=/u01/app/oracle/oradata/arch/1_22_974146828.dbf 线程=1 序列=22 介质恢复完成, 用时: 00:00:02 完成 recover 于 2018-07-29 22:18:25 数据库已打开 内存脚本的内容: { # make read only the tablespace that will be exported sql clone 'alter tablespace TESTDB read only'; # create directory for datapump import sql "create or replace directory TSPITR_DIROBJ_DPDIR as '' /tmp/auxdata''"; # create directory for datapump export sql clone "create or replace directory TSPITR_DIROBJ_DPDIR as '' /tmp/auxdata''"; } 正在执行内存脚本 sql 语句: alter tablespace TESTDB read only sql 语句: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp/auxdata'' sql 语句: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp/auxdata'' 正在执行元数据导出... EXPDP> 启动 "SYS"."TSPITR_EXP_Fcny": EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/TABLE EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/INDEX_STATISTICS EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/CONSTRAINT/REF_CONSTRAINT EXPDP> 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK EXPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_EXP_Fcny" EXPDP> ****************************************************************************** EXPDP> SYS.TSPITR_EXP_Fcny 的转储文件集为: EXPDP> /tmp/auxdata/tspitr_Fcny_42764.dmp EXPDP> ****************************************************************************** EXPDP> 可传输表空间 TESTDB 所需的数据文件: EXPDP> /u01/app/oracle/oradata/vbox66db/testdb01.dbf EXPDP> 作业 "SYS"."TSPITR_EXP_Fcny" 已于 星期日 7月 29 22:20:31 2018 elapsed 0 00:01:15 成功完成 导出完毕 内存脚本的内容: { # shutdown clone before import shutdown clone immediate # drop target tablespaces before importing them back sql 'drop tablespace TESTDB including contents keep datafiles cascade constraints'; } 正在执行内存脚本 数据库已关闭 数据库已卸装 Oracle 实例已关闭 sql 语句: drop tablespace TESTDB including contents keep datafiles cascade constraints 正在执行元数据导入... IMPDP> 已成功加载/卸载了主表 "SYS"."TSPITR_IMP_Fcny" IMPDP> 启动 "SYS"."TSPITR_IMP_Fcny": IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/TABLE IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/INDEX_STATISTICS IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/CONSTRAINT/REF_CONSTRAINT IMPDP> 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK IMPDP> 作业 "SYS"."TSPITR_IMP_Fcny" 已于 星期日 7月 29 22:21:27 2018 elapsed 0 00:00:10 成功完成 导入完毕 内存脚本的内容: { # make read write and offline the imported tablespaces sql 'alter tablespace TESTDB read write'; sql 'alter tablespace TESTDB offline'; # enable autobackups after TSPITR is finished sql 'begin dbms_backup_restore.AutoBackupFlag(TRUE); end;'; } 正在执行内存脚本 sql 语句: alter tablespace TESTDB read write sql 语句: alter tablespace TESTDB offline sql 语句: begin dbms_backup_restore.AutoBackupFlag(TRUE); end; 删除自动实例 自动实例已删除 已删除辅助实例文件 /tmp/auxdata/VBOX66DB/datafile/o1_mf_temp_fovm638r_.tmp 已删除辅助实例文件 /tmp/auxdata/VBOX66DB/onlinelog/o1_mf_3_fovm5vqb_.log 已删除辅助实例文件 /tmp/auxdata/VBOX66DB/onlinelog/o1_mf_2_fovm5p7q_.log 已删除辅助实例文件 /tmp/auxdata/VBOX66DB/onlinelog/o1_mf_1_fovm5krt_.log 已删除辅助实例文件 /tmp/auxdata/VBOX66DB/datafile/o1_mf_sysaux_fovm0wsb_.dbf 已删除辅助实例文件 /tmp/auxdata/VBOX66DB/datafile/o1_mf_undotbs1_fovm0wsx_.dbf 已删除辅助实例文件 /tmp/auxdata/VBOX66DB/datafile/o1_mf_system_fovm0ws4_.dbf 已删除辅助实例文件 /tmp/auxdata/VBOX66DB/controlfile/o1_mf_fovm0jqt_.ctl 完成 recover 于 2018-07-29 22:21:32 RMAN> ⑧查看表的数据 SYS@vbox66in>alter tablespace testdb online; 表空间已更改。 SYS@vbox66in>conn scott/tiger; 已连接。 SCOTT@vbox66in>select * from test01; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30 7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20 7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- 7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20 7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10 已选择14行。 SCOTT@vbox66in>select * from test02; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SCOTT@vbox66in> 此时发现数据已经全部恢复。
一、配置文件 Oracle Net配置文件都是文本形式的,可以通过netca或netmgr实用程序生成和修改,也可以使用文本编辑器生成和修改。 1) Oracle Net配置文件的路径 $ORACLE_HOME/network/admin/ 2) 三个Oracle Net配置文件 ①listener.ora在服务器端的配置文件②tnsnames.ora在客户端的配置文件③sqlnet.ora描述连接方式的配置文件 二、轻松连接方式(ezconnect) 优点:不需要网络配置文件的描述。缺点:登录不方便连接方法:只要服务器端启动默认的监听器listener,并数据库打开(动态注册)远程登录语法为:$Sqlplus 用户/密码@IP地址:端口号/服务名 示例:sqlplus scott/tiger@192.168.3.66:1521/vbox66in 三、动态注册 1)动态注册要点 ①实例启动后,pmon每分钟自动将服务名(service_name)注册到监听器中,也可以通过alter system register命令通知pmon立刻注册②系统有一个默认的监听器叫做LISTENER,端口号是1521,利用它可以不需要listener.ora配置文件③动态注册要求实例至少启动到mounted状态,listener监听器才能注册成功 2)如果不想使用默认的listener监听器,可以自定义一个动态监听器。需要下面完成两步操作: ①在listener.ora配置文件描述自定义监听器。如: (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.66)(PORT=1555)))) ②更改local_listener参数 SQL> alter system set local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.3.66)(PORT=1555))' 四、静态注册 1)静态注册要点 ①静态注册必须在listener.ora中描述②实例不必启动,静态监听器也能注册③服务器启动静态监听后,可以通过远程启动数据库④在一个listener.ora中可以配置多个静态监听,选择不同的端口 2)静态注册的描述分为两部分内容 ①网络三要素:①Protocal ②Host ③Port②服务名描述:GLOBAL_DBNAME:全局数据库名(静态注册特征) 3)listener.ora配置示例 LSN2 = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.88)(PORT = 1522)) ) ) SID_LIST_LSN2 = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME=prod ) (ORACLE_HOME = /u01/oracle) (SID_NAME =prod) ) ) #注意后面的括号不要顶格写 4)客户端配置文件tnsnames.ora ① 可以描述登录多个服务器② 示例 vbox8tds= (description= (address=(protocol=tcp)(host=192.168.3.66)(port=1521)) (connect_data= (server=dedicated) (service_name=prod) #SERVICE_NAME的值应和listener.ora中的GLOBAL_DBNAME一致 ) ) 五、客户端连接到数据库的连接方式 客户端可以在tnsnames.ora中配置连接服务器的信息,其中SERVER可以选择共享连接模式(share)或者专用连接模式(dedicated),下面介绍2种模式的作用。 1)专用连接模式(dedicated) 对于客户端的每个user process,服务器端都会出现一个server process,会话与专用服务器之间存在一对一的映射。专用连接的PGA的管理方式是私有的。Oracle缺省采用共享连接模式。 2)共享连接模式(shared) 多个user process共享一个server process。①,共享服务器实际上就是一种连接池机制(connection pooling),连接池可以重用已有的超时连接,服务于其它活动会话。但容易产生锁等待。②所有调度进程(dispatcher)共享一个公共的请求队列(resquest queue),但是每个调度进程都有与自己响应的队列(response queue)。③在共享服务器中会话的(UGA)存储信息是在SGA中的,而不像专用连接那样在PGA中存储信息,这时的PGA的存储结构为堆栈空间。
一、配置环境 在192.168.3.71的虚机上搭建一主两从复制环境。 1、mongdb基本信息 ①版本:3.2.8②端口:Primary:28010Secondary:28011、28012 2、目录信息 Primary Secondary Secondary DATA /data/mongodb1/data /data/mongodb2/data /data/mongodb3/data LOG /data/mongodb1/log /data/mongodb2/log /data/mongodb3/log KEY /data/mongodb1/key /data/mongodb2/key /data/mongodb3/key 二、测试 测试通过oplog指定时间点恢复和全量恢复,同时观察从库上数据的变化,下面记录了成功和失败的两次测试结果。 1、在主从初始化完成后,在主库上插入数据测试(未成功) ①插入数据 rs1:PRIMARY> use wr rs1:PRIMARY> db.createCollection('test1') rs1:PRIMARY> db.createCollection('test2') rs1:PRIMARY>for(i=0;i<=10000;i++)(db.test1.insert({id:i,name:'test',date:newDate()})) WriteResult({ "nInserted" : 1 }) rs1:PRIMARY>for(i=0;i<1000;i++)(db.test2.insert({id:i,name:'test2',date:newDate()})) WriteResult({ "nInserted" : 1 }) ②进行全备 mongodump -uroot -proot --port 28010 --oplog -o /data/backup/full ③再次插入数据,备份local下的oplog.rs a、再次插入数据 rs1:PRIMARY> for(i=1000;i<=2000;i++)(db.test2.insert({id:i,name:'test2',date:new Date()})) WriteResult({ "nInserted" : 1 }) b、备份oplog.rs 在用超级用户root备份时出错: mongodump --port 28010 -uroot -proot -d local -c oplog.rs -o /data/backup/ 2018-06-14T00:26:45.777+0800 Failed: error connecting to db server: server returned error on SASL authentication step: Authentication failed. 需要添加--authenticationDatabase admin [mongod@mgtest full]$ mongodump -h 192.168.3.71 --port 28010 -uroot -proot --authenticationDatabase admin -d local -c oplog.rs -o /data/backup/oplog 2018-06-14T02:21:11.382+0800 writing local.oplog.rs to 2018-06-14T02:21:11.455+0800 done dumping local.oplog.rs (11025 documents) ④在主库上进行还原 a、[mongod@mgtest full]$ mongorestore --port 28010 -uroot -proot --oplogReplay --drop /data/backup/full b、查看主库上数据变化 和第一次插入数据一致 c、查看从库上数据变化 和主库数据一致 ⑤在主库还原第二次备份得oplog文件 a、mongorestore --port 28010 -uroot -proot --oplogReplay /data/backup/oplog/local/ 在直接进行还原时报错 b、mv oplog.rs.bson oplog.bson c、mongorestore --port 28010 -uroot -proot --oplogReplay /data/backup/oplog/local/ d、还原后查看主库上数据发现并没有还原到第二次插入数据,查看从库上也没有新增数据(和主库保持一致) 主:从:通过观察数据发现并没有还原第二次插入的数据,测试没有成功 ⑥查看在mongorestore时的报错 在执行完mongorestore --port 28010 -uroot -proot --oplogReplay /data/backup/oplog/local/后,会输出大量信息,捕捉不到开始的报错信息,后重新测试还原少量数据,发现报Failed: restore error: error applying oplog: applyOps: not authorized on admin to execute command { applyOps... 解决方法(在admin数据库中执行): db.createRole({role:'sysadmin',roles:[], privileges:[ {resource:{anyResource:true},actions:['anyAction']}]}) db.grantRolesToUser( "root" , [ { role: "sysadmin", db: "admin" } ]) ##2、第二次测试 ①插入数据,进行全备 rs1:PRIMARY> for(i=0;i<10000;i++)(db.a.insert({id:i,name:'test'})) WriteResult({ "nInserted" : 1 }) 进行全备: mongodump --port 28010 -uroot -proot --oplog -o /data/backup/full ②修改数据,备份oplog 插入数据 rs1:PRIMARY> for(i=0;i<10000;i++)(db.b.insert({id:i,name:'test'})) WriteResult({ "nInserted" : 1 }) 查看当前时间戳: rs.status() 再次插入数据 rs1:PRIMARY> db.a.insert({id:20001,name:'wangrui'}) WriteResult({ "nInserted" : 1 }) ③备份oplog mongodump --port 28010 -uroot -proot --authenticationDatabase admin -d local -c oplog.rs -o /data/backup/oplog ④进行还原全备数据 mongorestore --port 28010 -uroot -proot --oplogReplay --drop /data/backup/full 查看数据,和第二次插入数据前一致 ⑤进行增量还原 cp oplog/local/oplog.rs.bson ./full/oplog.bson mongorestore --port 28010 -uroot -proot --oplogReplay --oplogLimit “1529577364:135” /data/backup/full 查看数据,在时间戳之后的数据没有还原,其他和修改后数据一致,主从数据一致。 ⑥不指定oplogLimit进行增量还原,看test库a中id为20001的数据是否存在 mongorestore --port 28010 -uroot -proot --oplogReplay /data/backup/full 查看数据,发现a中id为20001的数据已被还原
SQL Server2008主从复制(日志传输)配置 一、配置环境 1、主库: IP:192.168.3.31 数据库版本:SQL Server2008 R2 服务器名称:WR1-PC 2、从库 : IP:192.168.3.32 数据库版本:SQL Server2008 R2 服务器名称:WR2-PC 二、搭建主从 1、创建SQL Server数据库的管理员用户和共享文件夹权限,设置SQL Server服务和SQL Server代理的登录用户为sqladmin ①在主库和从库上分别新建用户sqladminwin+R,输入lusrmgr.msc②设置sqladmin的权限 为了服务器的安全起见,右击新建的用户sqladmin,点击“属性”,在“隶属于”选项卡中将“users”组删除,这样可以确保用户有最小的系统访问权限。 ③在主库和从库上分别创建用于存放主从备份日志文件的共享文件夹DB_Backpup在“高级共享”窗口中,勾选“共享此文件夹”选项,然后单机“权限”按钮对该共享文件夹的权限进行设置。需要让sqladmin用户具有完全控制该文件夹的权限,先将默认的“erverone”用户删除,然后添加sqladmin用户,并在“sqladmin”的权限中勾选“完全控制”,“更改”和“读取”项,然后单击两次“确定”按钮保存共享设置。在NTFS文件系统中,还需要设置用户对该目录的安全权限,如果安全权限不够,系统在写入备份文件的时候会报没有权限的错误。可以在“安全”选项卡,单机“编辑”按钮,在“DB_Backup的权限”界面,单击“按钮”,添加sqladmin用户,然后在“sqladmin的权限”中选择“完全控制”权限,单机“确定”按钮保存权限信息。④分别从主数据库服务器上和从数据库服务器上打开SQLServer配置管理器,将SQLServer服务和SQLServer代理服务的“登录身为”sqladmin用户且启动模式为:自动 2、配置SQLServer日志传送 ①、重启windows,在登陆时选择sqladmin用户登陆②、在主数据库服务器WR1-PC上配置在主数据库服务器上打开SQL Server Management Studio管理控制台,连接到本地的主数据库服务器上,此时应确保下面的“用户名”中的用户具有控制该SQL Server服务器的权限。单击“连接”按钮连接到本地SQL Server数据库示例中。③右击数据库服务器实例,选择“属性”选项,在弹出的“服务器属性 - WR1-PC”界面中,单机左侧的“安全性”,然后在右侧窗口中的“服务器身份验证”中选择“SQLServer和Windows身份验证模式”,并勾选“服务器代理账户”中的“启用服务器代理账户”选项。输入正确的“代理账号”和“密码”,单击“确定”按钮保存配置信息。④在主数据库服务器WR1-PC中配置要同步的数据库test_db1属性⑤设置完之后选择“事务日志传送”,勾选“将此数据库启用未日志传送配置中的主数据库”选项,单击“事务日志备份”中的“备份设置按钮”,打开“事务日志备份设置”界面。主库上备份文件夹的网路路径可以在备库上进行测试,看备库能否访问备库上进行操作:win+R,输入网络路径看能否访问\192.168.3.31DB_Backup⑥在“作业计划属性”界面,确认“计划类型”为重复执行,为测试效果明显,设置为15秒执行一次作业计划。最后确认“持续时间”,根据自己需要设置,如果一直备份的话,可以设置为“无结束日期”。设置完成,保存之后再次打开“事务日志备份设置”界面,则备份作业的作业名称后面变成“编辑作业”按钮,单击进去,将“所有者”修改为sqladmin。⑦单击数据库属性界面的“辅助数据库”中的“添加”按钮,打开“辅助数据库设置”窗口。在第一次连接时可能无法连接到辅助数据库,会报错:a、用户XXX登陆失败 解决方法:使用sa进入,新建查询,输入 CREATE LOGIN [WR1-PC\sqladmin] FROM WINDOWS b、用户XXX不在sysadmin固定的服务器角色中 解决方法:EXEC sp_addsrvrolemember 'WR1-PC\sqladmin','sysadmin' ⑧连接成功后对辅助数据库进行设置⑨设置完之后点击确定按钮,在数据库属性配置界面将配置好的脚本保存到本地,最后点击确定⑩到此数据库主从配置完成,可以在主库进行操作,在从库上查看对应的数据是否同步,如果没有同步成功,可以在从库上查看同步任务状态,查看失败原因。
ORACLE不完全恢复的几种情况 1、介绍 RMAN不完全恢复的三个标准模式:基于time、基于scn和基于sequence,与手工不完全恢复相比原理类似,语法稍有不同: 2、不完全恢复的几种情况 #### 1)不完全恢复用于最小化测试备份 ####①备份一部分数据文件 RMAN> backup datafile 1,2 format '/u01/rman_bak/%s.bak'; RMAN> backup datafile 1,2 format '/u01/rman_bak/%s.bak'; 启动 backup 于 2018-04-22 16:14:25使用通道 ORA_DISK_1通道 ORA_DISK_1: 正在启动全部数据文件备份集通道 ORA_DISK_1: 正在指定备份集内的数据文件输入数据文件: 文件号=00001 名称=/u01/app/oracle/oradata/vbox66db/system01.dbf输入数据文件: 文件号=00002 名称=/u01/app/oracle/oradata/vbox66db/sysaux01.dbf通道 ORA_DISK_1: 正在启动段 1 于 2018-04-22 16:14:25通道 ORA_DISK_1: 已完成段 1 于 2018-04-22 16:16:00段句柄=/u01/rman_bak/3.bak 标记=TAG20180422T161425 注释=NONE通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:35通道 ORA_DISK_1: 正在启动全部数据文件备份集通道 ORA_DISK_1: 正在指定备份集内的数据文件备份集内包括当前控制文件备份集内包括当前的 SPFILE通道 ORA_DISK_1: 正在启动段 1 于 2018-04-22 16:16:07通道 ORA_DISK_1: 已完成段 1 于 2018-04-22 16:16:11段句柄=/u01/rman_bak/4.bak 标记=TAG20180422T161425 注释=NONE通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:04完成 backup 于 2018-04-22 16:16:11 SQL> create table scott.emp1 as select * from scott.emp; ###②切换日志 alter system switch logfile; ③备份其余的数据文件 select FILE#,name from v$datafile; SYS@vbox66in>select FILE#,name from v$datafile; FILE# NAME1/u01/app/oracle/oradata/vbox66db/system01.dbf2/u01/app/oracle/oradata/vbox66db/sysaux01.dbf3/u01/app/oracle/oradata/vbox66db/undotbs01.dbf4/u01/app/oracle/oradata/vbox66db/users01.dbf backup datafile 3,4 format ‘/u01/rman_bak/%s.bak’; RMAN> backup datafile 3,4 format '/u01/rman_bak/%s.bak'; 启动 backup 于 2018-04-22 16:29:20使用通道 ORA_DISK_1通道 ORA_DISK_1: 正在启动全部数据文件备份集通道 ORA_DISK_1: 正在指定备份集内的数据文件输入数据文件: 文件号=00003 名称=/u01/app/oracle/oradata/vbox66db/undotbs01.dbf输入数据文件: 文件号=00004 名称=/u01/app/oracle/oradata/vbox66db/users01.dbf通道 ORA_DISK_1: 正在启动段 1 于 2018-04-22 16:29:22通道 ORA_DISK_1: 已完成段 1 于 2018-04-22 16:29:25段句柄=/u01/rman_bak/5.bak 标记=TAG20180422T162921 注释=NONE通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03完成 backup 于 2018-04-22 16:29:25 ④切换日志 alter system switch logfile; create table scott.emp2 as select * from scott.emp; ⑤干净的关闭数据库,删除所有数据文件 SYS@vbox66in>shutdown immediate; 发生完全检查点,更新控制文件和数据文件头的SCN [oracle@vbox66 vbox66db]$ rm -rf system01.dbf [oracle@vbox66 vbox66db]$ rm -rf sysaux01.dbf [oracle@vbox66 vbox66db]$ rm -rf undotbs01.dbf [oracle@vbox66 vbox66db]$ rm -rf users01.dbf ⑥RMAN按时间点做不完全恢复 SYS@vbox66in>startup mount; RMAN> restore database; RMAN> alter database open; RMAN> alter database open; RMAN-00571: >===========================================================RMAN-00569: =============== ERROR MESSAGE STACK >FOLLOWS ===============RMAN-00571: >===========================================================RMAN-03002: alter db 命令 (在 04/22/2018 16:50:09 上) 失败ORA-01113: 文件 1 需要介质恢复ORA-01110: 数据文件 1: >'/u01/app/oracle/oradata/vbox66db/system01.dbf' SYS@vbox66in>select file#,checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# 1 988104 2 988104 3 988104 4 988104 SYS@vbox66in>select file#,checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# 1 986289 最小化测试需要前滚到987513 2 986289 最小化测试需要前滚到987513 3 987513 4 987513 RMAN> recover database until scn 987513; 此scn是所有数据文件恢复后的最小打开数据库的scn RMAN> recover database until scn 987513; 启动 recover 于 2018-04-22 17:11:06使用通道 ORA_DISK_1正在开始介质的恢复介质恢复完成, 用时: 00:00:02完成 recover 于 2018-04-22 17:11:08 SYS@vbox66in>select file#,checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# 1 988104 2 988104 3 988104 4 988104 SYS@vbox66in>select file#,checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# 1 987513 2 987513 3 987513 4 987513 ⑥打开数据库 SYS@vbox66in>alter database open resetlogs; 数据库已更改。 SYS@vbox66in>select file#,checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# 1 987517 2 987517 3 987517 4 987517 SYS@vbox66in>select file#,checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# 1 987517 2 987517 3 987517 4 987517 ⑦验证 SYS@vbox66in>select * from scott.emp1; //有此文件 SYS@vbox66in>select * from scott.emp1; //无此文件 ###2) RMAN恢复误删除表空间 必须通过备份的控制文件(即含有删除的表空间结构的老控制文件)进行恢复。本例要做的是drop tablespace test,然后再通过不完全恢复,使数据库在drop表空间前的那一刻打开,从而恢复test表空间及t1表的内容。注: Oracle11gR2版可以支持数据库处于open方式下,以TSPITR方式恢复误删除的表空间。 ①创建表空间和表 create tablespace test datafile '/u01/app/oracle/oradata/vbox66db/test01.dbf' size 20M; create table test_table (id int,name varchar2(30)) tablespace test; insert into test_table values(1,'aaa'); insert into test_table values(2,'bbb'); ###②对数据库进行全备 RMAN> backup database format '/u01/rman_bak/all_%U.bak'; RMAN> backup database format '/u01/rman_bak/all_%U.bak'; 启动 backup 于 2018-04-22 19:40:43使用通道 ORA_DISK_1通道 ORA_DISK_1: 正在启动全部数据文件备份集通道 ORA_DISK_1: 正在指定备份集内的数据文件输入数据文件: 文件号=00001 名称>=/u01/app/oracle/oradata/vbox66db/system01.dbf输入数据文件: 文件号=00002 名称>=/u01/app/oracle/oradata/vbox66db/sysaux01.dbf输入数据文件: 文件号=00003 名称>=/u01/app/oracle/oradata/vbox66db/undotbs01.dbf输入数据文件: 文件号=00005 名称>=/u01/app/oracle/oradata/vbox66db/test01.dbf输入数据文件: 文件号=00004 名称>=/u01/app/oracle/oradata/vbox66db/users01.dbf通道 ORA_DISK_1: 正在启动段 1 于 2018-04-22 19:40:44通道 ORA_DISK_1: 已完成段 1 于 2018-04-22 19:42:19段句柄=/u01/rman_bak/all_0bt10gts_1_1.bak 标记>=TAG20180422T194043 注释=NONE通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:35通道 ORA_DISK_1: 正在启动全部数据文件备份集通道 ORA_DISK_1: 正在指定备份集内的数据文件备份集内包括当前控制文件备份集内包括当前的 SPFILE通道 ORA_DISK_1: 正在启动段 1 于 2018-04-22 19:42:22通道 ORA_DISK_1: 已完成段 1 于 2018-04-22 19:42:29段句柄=/u01/rman_bak/all_0ct10h0r_1_1.bak 标记>=TAG20180422T194043 注释=NONE通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:07完成 backup 于 2018-04-22 19:42:29 ③删除表空间及查看表空间删除时间 SYS@vbox66in>drop tablespace test including contents and datafiles; tail /u01/app/oracle/diag/rdbms/vbox66db/vbox66in/trace/alert_vbox66in.log [oracle@vbox66 trace]$ tail alert_vbox66in.log Sun Apr 22 17:22:36 2018SMCO started with pid=30, OS id=4136 Sun Apr 22 19:28:40 2018create tablespace test datafile >'/u01/app/oracle/oradata/vbox66db/test01.dbf' size 20MCompleted: create tablespace test datafile >'/u01/app/oracle/oradata/vbox66db/test01.dbf' size 20MSun Apr 22 19:45:53 2018drop tablespace test including contents and datafilesSun Apr 22 19:46:09 2018 //这是删除表空间的完成时间,后面取>时间要比它提前一点(考虑提前1分钟)Deleted file /u01/app/oracle/oradata/vbox66db/test01.dbfCompleted: drop tablespace test including contents and >datafiles ④删除所有控制文件和数据文件 SYS@vbox66in> select dbid from v$database; //rman恢复是用到 SYS@vbox66in>shutdown immediate [oracle@vbox66 vbox66db]$ mv system01.dbf system01.dbf.bak [oracle@vbox66 vbox66db]$ mv undotbs01.dbf undotbs01.dbf.bak [oracle@vbox66 vbox66db]$ mv sysaux01.dbf sysaux01.dbf.bak [oracle@vbox66 vbox66db]$ mv users01.dbf users01.dbf.bak [oracle@vbox66 vbox66db]$ mv temp01.dbf temp01.dbf.bak [oracle@vbox66 vbox66db]$ mv control01.ctl control01.ctl.bak [oracle@vbox66 vbox66db]$ mv control02.ctl control02.ctl.bak ⑤准备对drop tablespace test做不完全恢复 SYS@vbox66in>startup nomount; run { startup nomount; set dbid=3269052407; restore controlfile from '/u01/rman_bak/all_0ct10h0r_1_1.bak' until time '2018-04-22 19:45:09'; alter database mount; restore database; recover database until time '2018-04-22 19:45:09'; alter database open resetlogs; } RMAN> run {2> startup nomount; 3> set dbid=3269052407; 4> restore controlfile from >'/u01/rman_bak/all_0ct10h0r_1_1.bak' until time '2018-04-22 >19:45:09';5> alter database mount;6> restore database;7> recover database until time '2018-04-22 19:45:09';8> alter database open resetlogs;9> } Oracle 实例已启动 系统全局区域总计 839282688 字节 Fixed Size 2257880 字节Variable Size 545262632 字节Database Buffers 289406976 字节Redo Buffers 2355200 字节 正在执行命令: SET DBID 启动 restore 于 2018-04-22 20:18:29 使用目标数据库控制文件替代恢复目录分配的通道: ORA_DISK_1通道 ORA_DISK_1: SID=18 设备类型=DISK 通道 ORA_DISK_1: 正在还原控制文件通道 ORA_DISK_1: 还原完成, 用时: 00:00:03输出文件名=/u01/app/oracle/oradata/vbox66db/control01.ctl输出文件名=/u01/app/oracle/oradata/vbox66db/control02.ctl完成 restore 于 2018-04-22 20:18:32 数据库已装载 释放的通道: ORA_DISK_1 启动 restore 于 2018-04-22 20:18:38分配的通道: ORA_DISK_1通道 ORA_DISK_1: SID=18 设备类型=DISK 通道 ORA_DISK_1: 正在开始还原数据文件备份集通道 ORA_DISK_1: 正在指定从备份集还原的数据文件通道 ORA_DISK_1: 将数据文件 00001 还原到 >/u01/app/oracle/oradata/vbox66db/system01.dbf通道 ORA_DISK_1: 将数据文件 00002 还原到 >/u01/app/oracle/oradata/vbox66db/sysaux01.dbf通道 ORA_DISK_1: 将数据文件 00003 还原到 >/u01/app/oracle/oradata/vbox66db/undotbs01.dbf通道 ORA_DISK_1: 将数据文件 00004 还原到 >/u01/app/oracle/oradata/vbox66db/users01.dbf通道 ORA_DISK_1: 将数据文件 00005 还原到 >/u01/app/oracle/oradata/vbox66db/test01.dbf通道 ORA_DISK_1: 正在读取备份片段 >/u01/rman_bak/all_0bt10gts_1_1.bak通道 ORA_DISK_1: 段句柄 = >/u01/rman_bak/all_0bt10gts_1_1.bak >标记 = >TAG20180422T194043通道 ORA_DISK_1: 已还原备份片段 1通道 ORA_DISK_1: 还原完成, 用时: 00:01:45完成 restore 于 2018-04-22 20:20:25 启动 recover 于 2018-04-22 20:20:25使用通道 ORA_DISK_1 正在开始介质的恢复 线程 1 序列 1 的归档日志已作为文件 >/u01/app/oracle/oradata/vbox66db/redo01.log 存在于磁盘上归档日志文件名=/u01/app/oracle/oradata/vbox66db/redo01.log 线>程=1 序列=1介质恢复完成, 用时: 00:00:01完成 recover 于 2018-04-22 20:20:28 数据库已打开 ⑥验证 SYS@vbox66in>select * from test_table; ID NAME 1 aaa 2 bbb 注: ①不能使用当前的控制文件恢复误删除的表空间,因为当前控制文件已经没有该表空间的记录了。 ②DBID是RMAN识别数据库的身份证,保存在控制文件中,set dbid=对于控制文件自动恢复(from autobackup)是必要的;
一、上一篇配置了DML单向传输 上一篇介绍了OGG的安装步骤,接下来是OGG DML双向复制和DDL双向复制。 二、DML双向复制 双向复制就是再配置一组,将ogg2上的操作传递到ogg1上 1、在目的端配置补充日志、强制记录日志、表的补充日志。 这里在之前已经配置完成,如果没有配置,请执行如下命令: alter database add supplemental log data; GGSCI(source)>add trandata scott.emp1 GGSCI(source)>add trandata scott.dept1 GGSCI(source)>info trandata scott.* 2、目的端配置日志抽取进程: ①置日志抽取配置文件: GGSCI(target)>edit params eora_2 extract eora_2 userid ogg,password ogg tranlogoptions excludeuser ogg exttrail ./dirdat/bb table scott.dept1; table scott.emp1; 为方式循环复制,加入了"tranlogoptions excludeuser ogg"表示,由用户ogg提交的事务日志不被抽取 ②增加抽取组: GGSCI(target)>add extract eora_2,tranlog,begin now 定义本地trail文件: GGSCI(target)>add exttrail ./dirdat/bb,extract eora_2,megabytes 10 ③启动抽取进程: GGSCI(target)>start extract eora_2 ④使用info命令查看抽取进程是否工作正常,可以加detail参数查看详细信息: GGSCI(source)>info extract eora_2[,detail] 日志在dirrpt目录下。 操作系统下,查看bb000000文件已产生。 cd /u01/app/ogg/dirdat ls -l 3、目的端配置pump进程 ①配置pump配置文件: GGSCI(source)>edit params pora_2 extract pora_2 passthru rmthost ogg1,mgrport 7809 rmttrail ./dirdat/pb table scott.dept1; table scott.emp1; ②增加pump进程组: GGSCI(source)>add extract pora_2,exttrailsource ./dirdat/bb 增加远程trail文件 GGSCI(source)>add rmttrail ./dirdat/pb,extract pora_2,megabytes 10 ③启动传输进程 GGSCI(source)>start extract pora_2 ④使用info命令查看传输进程是否工作正常,可以加detail参数查看详细信息: GGSCI(source)>info extract pora_2[,detail] 其中的status应是RUNNING才对 日志在dirrpt目录下。 操作系统下,查看目的库,pb000000文件已产生。(源端查看) cd /u01/app/ogg/dirdat ls -l 4、修改源端的原来的日志抽取组配置文件,添加屏蔽ogg用户的任何事务日志 ①停止日志抽取: GGSCI(source)>stop extract eora_1 ②修改配置文件: GGSCI(source)>edit params eora_1 增加: tranlogoptions excludeuser ogg ③重新启动: GGSCI(source)>start extract eora_1 存盘退出后,使用info和view report名令查看 5、在源的端增加检查点表 ①配置文件,名字必须为GLOBAL,内容可以只有一行: GGSCI(source)>edit params ./GLOBALS checkpointtable ogg.ggschkpt ②连接数据库,建立检查点表: GGSCI(source)>dblogin userid ogg,password ogg GGSCI(source>add checkpointtable 6、启用目的端的复制 ①配置复制配置文件: GGSCI(source)>edit params rora_2 replicat rora_2 assumetargetdefs handlecollisions 表示自动处理冲突的情况 userid ogg,password ogg discardfile ./dirrpt/Riniaa.dsc,purge map scott.dept1,target scott.dept1; map scott.emp1,target scott.emp1; 存盘退出。 ②增加复制组: GGSCI(source)>add replicat rora_2,exttrail ./dirdat/pb ③启动复制: GGSCI(source)>start replicat rora_2 ④使用info命令和view report命令检查 现在DML双向复制配置完成,可以对表emp1和dept1操作验证配置结果! 三、DDL双向复制: DDL复制是基于触发器的捕获模式(这也是oracle11.2.0.4之前版本下唯一的方式),因此,需要先在模式下建立触发器及触发器所用的数据库对象。GG提供了一系列sql脚本来创建这些触发器及相关的数据库对象。 注意:DDL语句的数据量不能超过2MB。 GGS_MARKER // DDL marker表,用于存储DDL信息。 表中将只存有insert语句。 GGS_DDL_SEQ // marker表中用作序列。 GGS_DDL_HIST // DDL历史记录表,用于保存对象的原数据的历史数据。该表接受inserts, updates, 和deletes. GGS_DDL_HIST_ALT // 保存配置对象ID的表 GGS_DDL_TRIGGER_BEFORE // DDL触发器触发DDL操作。操作信息写到maker表和历史表。 DDL Schema // 包含DDL同步的对象。必须在安装时定义,存在于GLOBALS文件中。 GGS_GGSUSER_ROLE // 运行DDL操作所需的角色。 ddl_pin // 用于在内存共享池中保持DDL tracing, DDL package, 和DDL trigger。主要是为了提高性能。 ddl_cleartrace.sql // 删除DDL trace文件的脚本 ddl_status.sql // 校验脚本,用于校验DDL对象是是否安装好了。 marker_status.sql // 校验脚本,校验GGS_MAKER表是否安装好了。 ddl_tracelevel.sql // 设置DDL追踪级别的脚本。 使能DDL复制,要选择一个模式来包含上述的DDL对象。我们选择ogg。授予ogg执行utl_file包的权限: sql>grant execute on utl_file to ogg; 1、配置GLOBALS文件,将ogg加入其中(两端) GGSCI>edit params ./GLOBALS GGSCHEMA ogg 2、两端执行下列步骤,为ogg创建触发器及其相关的数据库对象 进入goldengate软件安装目录,以SYSDBA身份登录oracle执行以下脚本,执行脚本过程中,需要输入的用户全部是ogg,安装模式为INITIALSETUP,如果数据字典或者某些内部的包有错误,则需要运行catalog.sql和catproc.sql脚本。 如果某项脚本执行错误,需要重新执行时,先要执行清除的脚本:ddl_remove.sql和marker_remove.sql SQL>grant create table,create sequence to ogg;(SQL>@ddl_disable.sql) SQL>@marker_setup 会要求输入GG的schema名字,选择ogg 注意:10g及之前的版本,要求实例参数recyclebin置为off。 SQL>@ddl_setup 说明: ogg用户的缺省表空间若何其它用户共享,会报错。另外,11.1.1.2需要手动输入 ogg,INITIALSETUP,yes。 SQL>@role_setup 根据提示,执行授权名令: SQL>grant GGS_GGSUSER_ROLE to ogg; SQL>@ddl_enable SQL> @marker_status.sql 3、配置抽取进程组,缺省下,源端不支持DDL操作,而复制端(即目的端)支持DDL ①修改配置文件eora_1.prm,增加下一行: ddl include all //all表示包括三个范围:mapped(对抓取的表进行操作),nomapped(对其他表进行操作,比如create dept2)和other(create tablespace等等) ②目的端复制时报错处理 ERROR OGG-00519 Oracle GoldenGate Delivery for Oracle, rora_1.prm: Fatal error executing DDL replication: error [Error code [1921], ORA-01921: 角色名 'GGS_GGSUSER_ROLE' 与另一个用户名或角色名发生冲突 SQL /* GOLDENGATE_DDL_REPLICATION */ CREATE ROLE GGS_GGSUSER_ROLE /* GOLDENGATE_DDL_REPLICATION */], no error handler present. 解决办法是,复制组rora_1组的配置文件加入: ddlerror default ignore retryop 4、双向DDL复制时,也要解决循环复制问题。OGG的抽取组设置中缺省忽略复制产生的DDL语句,因此,缺省不会产生循环复制。 ①修改目的端的抽取组配置文件,加入 edit params eora_2 ddl include all ②所有的组随管理程序一起启动: 修改mgr配置文件,加入: autostar er *ora* 所有包含ora字符的组随管理程序启动。 执行DDL语句,验证配置的正确性! ③源端登陆oracle通过scott create table emp2 as select * from emp; 目标端查看emp2是否建立 ④在目标端删除表emp2,在源端查看表是删除
ogg实现方式 ①源端日志抽取进程抽取日志 ②源端推送进程pump ③目的端复制文件到目标库 一、配置 平台 linux x86_64 oracle 11.2.0.4 二、配置OGG 1、配置网络互通 2、安装ogg ①创建目录/u01/app/ogg ②解压缩软件 tar -xvf fbo_ggs_Linux_x64_ora11g_64bit.tar -C /u01/app/ogg 3、修改环境变量: vi .bash_profile export LD_LIBRARY_PATH=$ORACLE_HOME/lib 否则,运行ggsci时报如下错误: ./ggsci: error while loading shared libraries: libnnz11.so: cannot open shared object file: No such file or directory 4、创建子目录: oracle: cd /u01/app/ogg ./ggsci GGSCI>create subdirs 5、创建用户ogg并授权,收回unlimited tablespace权限 create user ogg identified by ogg; grant resource,connect to ogg; grant select any dictionary to ogg; (grant all on scott.emp1 to ogg; //在scott创建了表之后赋予权限 grant all on scott.dept1 to ogg;) revoke unlimited tablespace from ogg; alter user ogg quota unlimited on users; //让用户ogg在users表空间上有权限 6、scott用户创建emp1和dept1表,加上约束(目标库上只要结构,没有数据) 源端: create table emp1 as select * from emp; create table dept1 as select * from dept; alter table emp1 add constraints empno_pk primary key(empno); alter table dept1 add constraints deptno_pk primary key(deptno); alter table emp1 add constraints deptno_fk foreign key(deptno) references dept1(deptno); 目标端: create table emp1 as select * from emp where 1=2; create table dept1 as select * from dept where 1=2; alter table emp1 add constraints empno_pk primary key(empno); alter table dept1 add constraints deptno_pk primary key(deptno); alter table emp1 add constraints deptno_fk foreign key(deptno) references dept1(deptno); 7、启用补充日志并切换日志 alter database add supplemental log data; alter system switch logfile;(alter system archive log current) 8、源库启用强制日志,若单向复制,目的库可不启用强制日志。 使用gg的add trandata启用表的补充日志。这种情况是强制记录了表的主键日志: GGSCI(source)>dblogin userid ogg password ogg GGSCI(source)>add trandata scott.emp1 GGSCI(source)>add trandata scott.dept1 上述过程,也可以使用sql命令完成: SQL>alter table scott.emp1 add supplemental log group ggs_emp1_12345(empno) always; 查看可通过dba_log_groups视图。 但使用sql命令的方式,gg配置中缺失: GGSCI>info trandata scott.* 9、配置manager进程(源端和目标端都要做) ggsci edit params mgr port 7809 PURGEOLDEXTRACTS /u01/ogg/dirdat,USECHECKPOINTS //该行表明,使用检查点为检查手段,删除不再使用的trail文件。 启动管理进程: start mgr 使用info命令查看管理进程的启动状态: info mgr (detail) //detail是查看详细信息 使用view report查看管理进程报告: view report mgr ********************************配置源端日志抽取进程******************************** 10、源端配置日志抽取进程: ①配置日志抽取配置文件: edit params eora_1 extract eora_1 userid ogg,password ogg exttrail /u01/app/ogg/dirdat/aa (本地trail文件,aa是前缀,只能是2个字符) table scott.dept1; table scott.emp1; 保存退出。上述命令,配置的抽取进程组名为eora_1,taril文件的前缀为aa,GG自动加上6位数字,从000000开始,到 999999,之后再循环。table参数表示只处理定义的表,具体到本示例,只处理scott.emp1和scott.dept1,注意:分号 的使用 ②增加抽取的进程组 add extract eora_1,tranlog,begin now ③定义本地trail文件 add exttrail ./dirdat/aa,extract eora_1,megabytes 10 //exttrail文件缺省大小就是10M ④启动抽取进程: start extract eora_1 ⑤使用info命令查看抽取进程是否工作正常,可以加detail参数查看详细信息: info extract eora_1 (detail) //extract写不写都可以,名字唯一就可以不写extract 日志在dirrpt目录下 操作系统下,查看aa000000文件已产生。 cd /u01/app/ogg/dirdat ls -l ⑥使用view report查看产生的报告: GGSCI(source)>view report eora_1 -------------------------------------配置源端推送进程pump----------------------------- 11、配置源端推送进程pump ①源端配置pump配置文件: GGSCI(source)>edit params pora_1 extract pora_1 passthru rmthost ogg2,mgrport 7809 rmttrail /u01/app/ogg/dirdat/pa table scott.dept1; table scott.emp1; 存盘退出。pump是另一种类的抽取进程,该进程中不能定义SETENV NLS_LANG。passthru表示不在源和目的之间做任何的筛选或字段匹配。源和目的的数据结构完全相同。 ②增加pump进程组: GGSCI(source)>add extract pora_1,exttrailsource /u01/app/ogg/dirdat/aa 增加远程trail文件 GGSCI(source)>add rmttrail /u01/app/ogg/dirdat/pa,extract pora_1,megabytes 10 ③启动传输进程 GGSCI(source)>start extract pora_1 ④使用info命令查看传输进程是否工作正常,可以加detail参数查看详细信息: GGSCI(source)>info extract pora_1[,detail] 其中的status应是RUNNING才对 日志在dirrpt目录下。 操作系统下,查看目的库,pa000000文件已产生。 cd /u01/app/ogg/dirdat ls -l ⑤使用view report查看产生的报告: GGSCI(source)>view report pora_1 **************************************配置初始同步装载************************************** 12、配置初始装载数据: 初始装载不需要pump,直接载入目的数据库。注意:初始装载要在日志抽取之后做,目的是为了在装载的过程中,数据的变化也被记录下来。 ---------------------------------------配置源端---------------------------------------------- ①配置初始装载配置文件: GGSCI(source)>edit params eini_1 extract eini_1 userid ogg,password ogg rmthost wangrb,mgrport 7809 rmttask replicat,group rini_1 table scott.dept1; //按顺序写表时看清主外键约束,避免初始不成功 table scott.emp1; 存盘退出。 ②增加装载的组: GGSCI(source)>add extract eini_1,sourceistable ③使用info命令和view report命令查看装载配置,注意:装载尚未启用 info eini_1 view report eini_1 ---------------------------------------配置目的端-------------------------------------------------------- ④配置初始复制配置文件: GGSCI(target)>edit params rini_1 // 注意:和源端配置中的指定组名匹配 replicat rini_1 //目的端不是抽取(extract),而是复制(replicat) assumetargetdefs //使用它时,目的端和源端的数据结构相同 userid ogg,password ogg discardfile /u01/app/ogg/dirrpt/Riniaa.dsc,purge map scott.*,target scott.*; 存盘退出。 ⑤增加复制的组: GGSCI(target)>add replicat rini_1,specialrun specialrun表明是初始复制 ⑥使用info命令和view report命令查看复制配置,注意:复制尚未启用,事实上,目的端不需要启动 ---------------------------------------开始装载----------------------------------------------------- ⑦在源端启动初始装载: GGSCI(source)>start extract eini_1 ⑧使用info及view report查看结果状态。 注意:由于emp1表和dept1表之间存在主外键约束,会报错, 找不到父项关键字。可以修改源端的配置文件,将dept1表放在前,也可以使用sql命令先禁用此约束。事实上ogg也可使约束无效。 ⑨到目标端查看emp1表和dept1表,这时可以看到有数据存在 ****************************************目的端配置复制************************************************** 13、在目的端增加检查点表: ①配置文件,名字必须为GLOBAL,内容可以只有一行: GGSCI(target)>edit params /u01/app/ogg/GLOBALS checkpointtable ogg.ggschkpt 这就在ogg的安装目录下,创建了GLOBALS文件。GLOBALS文件是全局文件,对所有的组都有效 ②连接数据库,建立检查点表: exit(退出去重新登陆) GGSCI(target)>dblogin userid ogg,password ogg GGSCI(target)>add checkpointtable 14、启用目的端的复制: ①配置复制配置文件: GGSCI(target)>edit params rora_1 replicat rora_1 assumetargetdefs handlecollisions //表示自动处理冲突的情况 userid ogg,password ogg discardfile /u01/app/ogg/dirrpt/Riniaa.dsc,purge map scott.dept1,target scott.dept1; map scott.emp1,target scott.emp1; 存盘退出。 ②增加复制组: GGSCI(target)>add replicat rora_1,exttrail u01/app/ogg/dirdat/pa ③启动复制: GGSCI(target)>start replicat rora_1 ④使用info命令和view report命令检查
一、数据泵介绍 1、数据泵优点: ①改进性能(较传统的exp/imp速度提高1-2个数量级) ②重启作业能力 ③并行执行能力 ④关联运行作业能力 ⑤估算空间需求能力 ⑥操作网络方式 2、数据泵组成部分: ①数据泵核心部分程序包:DBMS_DATAPUMP ②提供元数据的程序包:DBMS_MATADATA ③命令行客户机(实用程序):EXPDP,IMPDP 3、数据泵文件: ①转储文件:此文件包含对象数据 ②日志文件:记录操作信息和结果 ③SQL文件:将导入作业中的DDL语句写入SQLFILE指定的参数文件中 4、数据泵的目录及文件位置 以sys或system用户完成数据泵的导入导出时,可以使用缺省的目录 DATA_PUMP_DIR通过dba_directories表可以查看;DATA_PUMP_DIR缺省目录位置是:$ORACLE_HOME/admin/database_name/dpdump 二、数据泵导入导出 数据泵的对象可以是表、表空间和用户 1、数据泵导出 1)按表导出 ①全表导出 ②按查询条件导出表 2)按表空间导出 3)按用户导出 4)导出全库 2、数据泵导入 1)导入表 ①导入表,不改变schema ②导入表,改变schema 2)导入表空间 3)导入到具体用户 ①导入用户,不改变schema ②导入用户,改变schema 4)导入全库 三、数据泵测试 源端 环境: Oracle 11.2.0.1 源数据库: vbox88 目标数据库:vbox99 查看数据泵目录: 1)select * from dba_directories; DATA_PUMP_DIR是默认的,也可以自己创建一个新的目录 2)创建一个目录 create directory data_pump as '/u01/data_pump'; 其中/u01/data_pump这个目录要在linux系统中存在,没有的话先创建这个目录。 (删除目录为:drop directory DATA_PUMP;) 3)将目录DATA_PUMP的读写权限赋予scott用户 grant read,write on directory DATA_PUMP to scott; 1、按表导出 导出表时应查看下表的大小 1)全表导出 expdp scott/tiger directory=DATA_PUMP dumpfile=emp1.dmp tables=emp1,dept1; 2)按查询条件导出表 将emp1表deptno为10的数据导出 expdp scott/tiger directory=DATA_PUMP dumpfile=condition.dmp logfile=condition.log tables=emp1 query=\' WHERE deptno\=\10\' 2、按表空间导出 导出前查看下表空间对应数据文件的大小 1)expdp \' / as sysdba \' directory=DATA_PUMP dumpfile=soe_tbs.dmp tablespaces=soe; 3、按用户导出 在导出用户时应查看用户所在的表空间以及表空间的大小 1)expdp \' / as sysdba \' directory=DATA_PUMP dumpfile=scott.dmp schemas=scott; 4、全库导出 导整个数据库 expdp system/manager@orcl directory=dump_dir dumpfile=full.dmp full=y; 目标端 1)将源端的数据拷贝到目标端的目录下 ①select * from dba_directories; ② scp 192.168.3.88:/u01/data_pump/* /u01/oracle/dir 1、按表导入 ①导入表,不改变schema impdp scott/tiger directory=DIR pumpfile=emp1.dmp ②导入表,改变schema impdp \'/ as sysdba \' directory=DIR dumpfile=emp1.dmp remap_schema=scott:wr 2、按表空间导入 在源端查看有哪些表在使用soe表空间以及其所属用户,如果表所在的用户在目标端没有则应创建相应用户,否则在导入的时候会报错。 1)impdp \' / as sysdba \' directory=DIR dumpfile=soe_tbs.dmp tablespaces=soe 3、按用户导入 ①导入用户,不改变schema impdp \' / as sysdba \' directory=DIR dumpfile=scott.dmp ②导入用户,改变schema impdp \' / as sysdba \' directory=DIR dumpfile=scott.dmp remap_schema=scott:wr 四、目标库远程连接源库导入 ①create directory data_pump as '/u01/data_pump'; ②grant read,write on directory DATA_PUMP to zyz; ③配置tnsnames ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = xxbora)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) ④创建dblink create public database link orcl18 connect to zyz identified by zyz using 'ORCL18'; select count(*) from zyz.userinfo@orcl18; ⑤导入数据 impdp zyz/zyz directory=data_pump network_link=orcl18 schemas=zyz logfile=zyz.log remap_tablespace=JCTABLESPACE:ZYZTABLESPACE exclude=statistics ⑥收集统计数据 exec dbms_stats.gather_schema_stats(ownname=>'ZYZ',estimate_percent=>10,degree=>8,cascade=>true,granularity=>'ALL');
行链接和行迁移 1)什么是行链接和行迁移 ①行链接:指一行存储在多个块中的情况,即行链接是跨越多块的行。 ②行迁移:指一个数据行由于update语句导致当前块被重新定位到另一个块(那里有充足的空间)中,但在原始块中会保留一个指针。原始块中的指针是必需的,因 为索引的ROWID项仍然指向原始位置。 行迁移是update语句当pctfree空间不足时引起的,它与insert和delete语句无关。 2)如何知道发生了行链接或行迁移 查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列。当CHAIN_CNT有值时,看AVG_ROW_LEN,它表示行的平均长度(byte),如果AVG_ROW_LEN<块大小,发生的是行迁 移,否则可能有行链接。 测试: (一)行迁移 1、构建环境 2、先分析一下test表,确定无行迁移 analyze table test compute statistics; 可以观察到表test使用了5个块,行平均大小为3。 3、v$bh视图可以显示出t1表一共分配了8个块,具体是那些块。 4、填充这些空列,再分析test,有了行迁移 说明1000行中有865行发生了行迁移,使用的块也增加了,从之前的5个增加到了13个。 5、怎样确定那些行发生了行迁移 SQL> @/u01/oracle/rdbms/admin/utlchain.sql SQL> analyze table scott.t1 LIST CHAINED ROWS; SQL> select count(*) from chained_rows; 通过chained_rows表可以看到发生行迁移的列。 SQL> select table_name, HEAD_ROWID from chained_rows where rownum<=3; Select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fn,dbms_rowid.rowid_block_number(rowid) bn, rowid,c1 from test where rowid='AAASRpAAEAAAAE+AGl'; 6、解决行迁移的多方法 ①移动表 alter table test move; ②删除发生行迁移的行重新插入 SQL>create table test1 as select * from test where rowid in (select HEAD_ROWID from chained_rows); SQL>delete test where rowid in (select HEAD_ROWID from chained_rows); SQL>insert into test select * from test1; SQL>drop table test1; (二)行链接 1、创建环境 SQL>create table t1 (c1 varchar2(3000),c2 varchar2(3000),c3 varchar2(3000)); SQL>insert into t1 values(lpad('a',3000,'*'),lpad('b',3000,'*'),lpad('c',3000,'*')); SQL>commit; SQL>analyze table t1 compute statistics; SQL>select table_name, AVG_ROW_LEN,CHAIN_CNT from user_tables where table_name='T1'; 2、解决方法 SQL>create tablespace ttt datafile '/u01/oradata/vbox8db/ttt01.dbf' size 10m blocksize 16k; SQL>alter table t1 move tablespace ttt; SQL>analyze table t1 compute statistics; SQL>select table_name, AVG_ROW_LEN,CHAIN_CNT from user_tables where table_name='T1';
一、从文件系统迁移到ASM上 1、添加一个磁盘,fdisk分区,创建raw,start_udev 配置相应的参数以及环境 root: groupadd asmadmin groupadd asmdba groupadd asmoper useradd -g oinstall -G asmadmin,asmdba,asmoper,dba grid passwd grid usermod -g oinstall -G asmdba,dba,oper oracle mkdir -p /u02/grid chown -R grid:oinstall /u02 chmod -R 775 /u02 2、su - grid (创建grid目录时不要放在安装oracle的ORACLE_BASE目录下) vi .bash_profile ORACLE_BASE=/u02 ORACLE_HOME=/u02/grid ORACLE_SID=+ASM PATH=$ORACLE_HOME/bin:$PATH export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH #export NLS_LANG="simplified chinese"_china.al32utf8 #alias sqlplus='rlwrap sqlplus' #alias asmcmd='rlwrap asmcmd' 3、安装grid软件(grid版本必须高于或等于oracle版本) ①挂在光驱 mount /dev/cdrom /media ②xshell: /media/database/runInstall 选择仅安装grid软件 ③安装grid执行: root 用户: /Grid_home/perl/bin/perl -I Grid_home/perl/lib -I Grid_home/crs/install Grid_home/crs/install/roothas.pl 用实际的grid软件安装目录代替Grid_home(/u02/grid) grid用户: 转换到Grid_home/oui/bin 目录下 cd /Grid_home/oui/bin 用实际的grid软件安装目录代替Grid_home 运行: ./runInstaller -updateNodeList -silent -local CRS=true ORACLE_HOME=/u02/grid 用实际目录代替11.2_Home su - grid crsctl start res ora.cssd ④配置asm实例 xshell:(如果报错,在admin下创建一个+ASM目录,grid:oinstall) asmca 配置完 asmcmd cd data mkdir arch mkdir log mkdir dbf mkdir ctl ⑤sqlplus / as sysdba shutdown immediate cd /u01/oracle/dbs vi initwangrain.ora spfile='+data/spfilewangrain.ora' su - grid asmcmd cd data cp /u01/oracle/dbs/spfilewangrain.ora ./ cd ctl cp /u01/oradata/wangradb/control01.ctl ./ cp /u01/oradata/wangradb/control02.ctl ./ cd ../dbf cp /u01/oradata/wangradb/system01.dbf ./ cp /u01/oradata/wangradb/sysaux01.dbf ./ cp /u01/oradata/wangradb/undotbs01.dbf ./ cp /u01/oradata/wangradb/users01.dbf ./ su - oracle sqlplus / as sysdba startup nomount alter system set control_files='+data/ctl/control01.ctl','+data/ctl/control02.ctl' scope=spfile; alter system set log_archive_dest_1='location=+data/arch' shutdown immediate startup mount alter database rename file '/u01/oradata/wangradb/system01.dbf' to '+data/dbf/system01.dbf' 等等 alter database rename file '/u01/oradata/wangradb/redo01.log' to '+data/log/redo01.log' 等等 alter database clear logfile group 1; 2 ,3 alter database open; 二、从一台机器上迁移到另一台机器上 1、rman做数据库全备(在mount下,否则还的拷贝redo.log) 2、将备份片考到另一个机器做还原 3、可以新建一个用户管理这个数据库,权限和oracle一致 但是要看: cd /u01/oracle/bin ls -l oracle -rwsr-s--x 1 oracle oinstall 173515991 09-02 12:17 oracle(注意s权限) 4、机器上有3个实例,2个数据库
注释: 前段时间出现过一种情况,localhost本地登录mysql数据库提示不能连接mysql.sock,第三方工具sqlyog可以登录,具体原因如下。 mysql.sock的作用 mysql有两种连接方式: 1、TCP/IP 2、socket mysql.sock的作用是server和client在同一台服务器,并且使用localhost进行链接的时候,就会使用socket来进行连接——仅此而 已,也就是:为主机名为localhost建立的MySQL连接,该连接过程通过一个套接字文件mysql.socket实现的。所以该文件被删后, 用localhost用户是连接不到MySQL服务器的。 必须建立一条tcp/ip连接,即使用127.0.0.1而不是localhost作为-h的参数去连接MySQL服务器,如:mysqladmin -h 127.0.0.1 -u root -p shutdown,强制地建立一条tcp/ip连接;关闭MySQL服务器,再重新以localhost为主机名启动MySQL服务器,它就会重 新创建一个套接字文件。 对上文加以测试深入了解; 查看mysql.sock具体路径: [root@Wonhigh-Test16 ~]# ps -ef | grep mysql.sock|grep -v "grep" mysql 31108 30650 0 Sep10 ? 00:03:17 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/Wonhigh-Test16.err --pid-file=/var/lib/mysql/Wonhigh-Test16.pid --socket=/var/lib/mysql/mysql.sock --port=3306 [root@Wonhigh-Test16 ~]# 转移套接字文件 mysql.sock [root@Wonhigh-Test16 ~]# mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql1.sock 确认本地登录情况 [root@Wonhigh-Test16 ~]# mysql -uroot -p123456 Warning: Using a password on the command line interface can be insecure. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) [root@Wonhigh-Test16 ~]# 尝试127.0.0.1 tcp/ip连接(第三方工具远程连接都可以‘连接属性会显示为TCP/IP ’) [root@Wonhigh-Test16 ~]# mysql -uroot -p123456 -h127.0.0.1 Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 127 Server version: 5.6.19-log Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 恢复本地连接 [root@Wonhigh-Test16 ~]# mv /var/lib/mysql/mysql1.sock /var/lib/mysql/mysql.sock [root@Wonhigh-Test16 ~]# mysql -uroot -p123456 Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 121 Server version: 5.6.19-log MySQL Community Server (GPL) Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> exit Bye [root@Wonhigh-Test16 ~]#
如何查看二进制日志ROW模式下最原始的SQL语句 MySQL的binlog的ROW模式解析 在mysql5.6以后,对主从数据一致性要求变高了,statement格式逐渐不太适合业务的需求了,所以生产环境大家都采用了row模 式,row模式是传输最底层的数据变化的insert的模块来进行主从数据的传输,那么在binlog里面就和普通的statement模式有何差 别?能否看到最原始的sql语句呢? 1、准备录入数据 ①create table test1(id int,name varchar(20),sex enum('man','woman'),address varchar(20),grade tinyint(2)); ②INSERT INTO test1 VALUES (0001,'tim','man','hebei','03'); INSERT INTO test1 VALUES (0002,'scott','man','beijing','03'); 2、Row模式binlog是乱码 Row模式下面,binlog里面的ddl语句是正常显示的,但是dml是乱码 /usr/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000005 3、通过--base64-output=decode-rows -v来查看dml语句 /usr/bin/mysqlbinlog --base64-output=decode-rows -v /var/lib/mysql/mysql-bin.000005 可以看到如下效果,不过都是最原始的dml块sql语句 PS:这时可以看到dml的insert语句,但是只看到了最终的insert块,而看不到原始的过来的insert语句,很多时候排查问题 需要原始的insert语句而不是底层的insert块。 4、通过binlog_rows_query_log_events参数来查看最原始的insert sql ①先在线设置全局的binlog_rows_query_log_events参数,刷新日志: set binlog_rows_query_log_events=1; ②然后刷新日志录入新的数据记录 flush logs; INSERT INTO test1 VALUES(0003,'tiger','man','beijing','03'); ③解析binlog,没有看到原始的insert语句 ④通过mysql的命令行查看最原始的insert sql语句 show binlog events in 'mysql-bin.000007'; 5、试验总结 基于以上的试验,可以得出在row模式下,可以通过mysqlbinlog --base64-output=decode-rows –v查看最底层的insert数据 模块,也可以通过命令行show binlog events in 'mysql-bin.000216';来实时查看最原始的insertsql记录。 我们可以在搭建数据库的时候,在启动参数文件my.cnf里面事先设置好,如下所示: # vim my.cnf [mysqld] binlog_format=row # binlog 日志格式 binlog_rows_query_log_events = 1 # 将原始的操作sql记录写入事件中
MySQL数据类型介绍 一、数据类型 MySQL支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。 数值数据类型 整数类型: TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 浮点数类型:FLOAT、DOUBLE 定点小数: DECIMAL 日期/时间类型 YEAR、TIME、DATE、DATETIME、TIMESTAMP 字符串类型,其中字符串又可以分为文本字符串和二进制字符串 文本字符串: CHAR、VARCHAR、TEXT、ENUM、SET等 二进制字符串 BIT、BINARY、VARBINARY、BLOB 1、整数类型 数值型数据类型主要用来存储数字,MySQL提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值的范围越大,其 所需要的存储空间也会越大。整数类型的属性字段可以添加AUTO_INCREMENT自增约束条件。 MySQL中整型数据类型 从表中可以看出,不同类型整数存储所需要的字节数是不一样的,占用字节数越多的的类型所能表示的数值范围越大。根据占用字节数可以求出每一种数据类型的取值范围,如:TINYINT需要1个字节(8bits)来存储,那么TINYINT无符号数的最大值为2的8次方减1,也就是255 ,TINYINT有符号数的最大值为2的7次方减1,也就是127。其他类型的整数取值范围计算方法相同。 不同整数类型的取值范围 创建表的语句: 这个例子中TINYINT(4)、INT(11) 括号中的数字表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数。这里要注意: 显示宽度和数据类型的取值范围是无关的,显示宽度只是指明MySQL最大可能显示的数字个数,注意是可能。通俗点讲就是,比如INT字段,显示宽度为4,但是如果你插入的数据大于4,达到了8,6666 6666,那也没关系,只要插入的数值的位数不超过该类型整数的取值范围,就行,如果插入的数值长度是2,或者3,数值的位数小于指定的宽度,后面的位数就会由空格填空,5555插入INT字段,存的就是"555 "后面用空格补齐。还有一点,这个显示宽度没限制,你写100度没问题,但是插入数据时,实际起控制作用的还是数据类型的取值范围。如果不写显示宽度,就会用系统默认的,比如,INT的默认显示宽度是11,看上面表,最高也就能表示 10位大小的数值,但是要注意,有符号的,也就是负数时,符号位也占一位。 2、浮点数类型和定点数类型 MySQL中使用浮点数和定点数来表示小数。浮点类型有两种:单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。定点类型只有一种:DECIMAL。浮点类型和顶点类型都可以用(M,N)来表示,其中M成为精度,表示总共的位数;N称为标度,是表示小数的位数。 MySQL中的小数类型 1、M,N表达的含义 M:数值的总位数。 通俗点讲,就是看有多少个数字,比如,5.6789,M就是5 D:小数点后面能保留几位。 比如上面的5.6789 ,D就是4。 这只是举一个例子,来说明M,D是什么,实际是先有M,D的,然后在来控制 数值,而不是更具数值来确定M,D。 不单单就MECIMAL有M,D这两个参数,FLOAT 和 DOUBLE 也有,比如: 分析:a1的M为3,D为1,那么小数点上必须是占了一位数字,就算没有值,也会用0来填充,所以说,整数位上最多就只能是2位,这里 要切记要先根据D的值,来算整数位能最多有多少位。通过分析a1,a2和a3也就简单了,a2字段上的值,整数部分最多是2位,小数点后的位 数最多是3位,也就是说小数点后超过了3位,就会四舍五入。a3字段上的值,整数部分最多只能是一位,小数点后的位数最多是2位,如果 不足2位,也会用0补充。比如插入1.5,在数据库中存的就是1.50, 比如插入10.23,这个就会报错,因为整数部分只能是一位,小数点后的 位数已经占了2位了。 2、FLOAT、DOUBLE、DECIMAL三者的区别。 都是用来表示我们所说的小数的也就是浮点数,但是三种的精度不一样,也就是后面显示的位数不一样, ①区别一: FLOAT显示后面的小数点位大概在40多位; DOUBLE能显示的就是300多位了,不是一个层次上的; DECIMAL这个小数点后面能显示的位数跟DOUBLE差不多。 ②区别二: FLOAT和DOUBLE在不指定精度时,也就是不用(M,D),默认会按照实际的精度,也就是你写多少就是多少,而DECIMAL如不指定 精度默认为(10,0),也就是如果不指定精度,插入数值56.89,在数据库中存储的就是57。所以一般使用DECIMAL时就会指定精度,而 使用FLOAT和DOUBLE就不用。 ③区别三: 浮点数相对与定点数(DECIMAL)的优点就是在长度一定的情况下,浮点数能够表示更大的数据范围,但是缺点是会引起精度问题。 3、什么时候使用FLOAT、DOUBLE、DECIMAL 对精度要求比较高的时候,比如货币、科学数据等,使用DECIMAL的类型比较好。其他的时候,看你要存放的数据的大小而定了,一 般使用DOUBLE。并且在使用浮点数时需要注意,尽量避免做浮点数的比较,比如加、减,谁大谁小,这样的操作,会引起精度缺失。 3、日期与时间类型 MySQL中也有许多表示日期的数据类型,主要有:DATATIME、DATE、TIMESTAMP、TIME、和YEAR。 4、文本字符串类型 字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据。MySQL支持两类字符型数据:文本字符串和二进制字符串。 文本字符串数据类型 二进制字符串类型 二、如何选择数据类型 1、整数和浮点数 如果不需要小数部分,则使用整数来保存数据,并且根据整数的大小,来选择合适的整数类型,如果需要小数部分,则使用浮点数类型, 浮点数类型中,有float和double,如果需要精度高一点,则选择double。根据自己的需求来决定选什么。 2、浮点数和定点数 浮点数FLOAT、DOUBLE相对应定点数DECIMAL的优势在于:在长度一定的情况下,浮点数能表示更大的数据范围,但是浮点数容易产 生误差,因此在精度比较高时,建议使用DECIMAL,比如货币这一类东西,就用DECIMAL比较合理,注意浮点数在进行加减运算时也容 易出现问题。如果进行数值比较,也建议用DECIMAL 3、日期与时间类型 可以看上面详解时的图,根据各种格式,选择自己所需要的数据类型,注意TIMESTAMP和DATETIME的区别,一个是跟时区有关,一个 无关,其他没什么大的区别。 4、CHAR与VARCHAR之间的特点与选择 区别: CHAR是固定长度字符、VARCHAR是可变长度字符。CHAR会自动删除插入数据的尾部空格,VARCHAR不会。 CHAR是固定长度,处理速度比VARCHAR更快,缺点很明显,浪费存储空间,所以对存储不大,但在速度上有要求的可以使用CHAR类 型,反之用VARCHAR。 5、ENUM和SET ENUM只能取单值,也就是从枚举类型中选取其中一个值,但是SET可以取多值,ENUM最多能存放65535个成员,SET只能65个空字符 串也能在SET中存储,要存储一个人的喜爱时,最好使用SET类型,其实最重要的是看具体的情况在选取最为合适的把 6、BLOB和TEXT BLOB是二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息,BLOB主要存储图片、音频信息,而TEXT只能存储纯文 本文件。分清楚两者的用途 7、BINARY和VARBINARY 这两个的区别和CHAR与VARCHAR的区别差不多,BINARY是固定长度、VARBINARY是可变程度,这两个的作用就是为了区分大小写 的,注意这两个是字节字符串。
RAC静默安装与DG搭建 一、主机配置 1、节点1: ① 内存:15.57GB ② SWAP交换空间大小:2GB ③ 根目录挂载磁盘:48GB ④ HOSTNAME:vmrac-01 ⑤ 网卡:eth0 172.16.40.162、eth1 172.16.2.165 2、节点2: ① 内存:15.57GB ② SWAP交换空间大小:2GB ③ 根目录挂载磁盘:97GB ④ HOSTNAME:vmrac-02 ⑤ 网卡:eth0 172.16.40.163、eth1 172.16.2.166 二、检查服务和缺失的RPM包 1、查看防火墙和SELINUX ① 防火墙: service iptables status // 查看防火墙的状态 service iptables stop // 关闭防火墙 chkconfig --list iptables // 查看下次开机是否自动打开服务 chkconfig iptables off // 关闭下次开机自动打开服务 ② SELINUX: vi /etc/selinux/config SELINUX=disable 2、取消系统的ntp设置,采用 oracle 自带的时间同步服务 禁用ntp: service ntpd stop chkconfig ntpd off rm -rf /var/run/ntpd.pid mv /etc/ntp.conf /etc/ntp.conf.org 3、配置yum,检查oracle所需的包:(参见联机文档《Grid Infrastructure Installation Guide for Linux》2.8.2) rpm -qa | grep binutils (x86_64) rpm -qa | grep glibc (x86_64 & i686) rpm -qa | grep glibc-headers (x86_64) rpm -qa | grep glibc-common rpm -qa | grep glibc-devel (x86_64 & i686) *rpm -qa | grep pdksh (i686) *rpm -qa | grep ksh rpm -qa | grep libaio (x86_64 & i686) *rpm -qa | grep libaio-devel (x86_64 & i686) rpm -qa | grep libgcc (x86_64 & i686) rpm -qa | grep libstdc++ (x86_64 & i686) *rpm -qa | grep libstdc++-devel (x86_64 & i686) *rpm -qa | grep compat-libstdc++-33 (x86_64 & i686) rpm -qa | grep make (x86_64) rpm -qa | grep gcc (x86_64) *rpm -qa | grep gcc-c++ (x86_64) rpm -qa | grep sysstat (x86_64) *rpm -qa | grep compat-libcap1 (x86_64) *rpm -qa | grep numactl-devel (x86_64) *rpm -qa | grep libXp (x86_64) *rpm -qa | grep unixODBC *rpm -qa | grep unixODBC-devel rpm -qa | grep elfutils-libelf (x86_64) *rpm -qa | grep elfutils-libelf-devel (x86_64) rpm -qa | grep tigervnc-server 注:其中带*的为此次安装需要安装的包 4、 安装rlwrap 安装rlwrap是为了sqlplus、rman、asmcmd方便编辑命令。使用源码包或则RPM包装,在源码包安装的时候可能需要安装以下包: yum install readline yum install readline-devel 三、修改linux核心参数和资源限制 1、修改核心参数 vi /etc/sysctl.conf fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 8388608 //共享内存总量,以页为单位。推荐设置为物理内存大小除以分页大小,Linux 共享内存页大小为4KB kernel.shmmax = 16725073919 //Linux进程可以分配的单独共享内存段的最大值,shmmax最大为内存大小减1,要大于一半的内存量 kernel.shmmni = 4096 //共享内存段的最大数量,shmmni 缺省值 4096 ,一般肯定是够用了 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048586 sysctl -p 生效 2、修改oracle和grid用户资源限制: ① vi /etc/security/limits.conf oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 grid soft nproc 2047 grid hard nproc 16384 grid soft nofile 1024 grid hard nofile 65536 grid soft stack 10240 修改后 ulimit -a 查看 ② shell资源 资源名 软限制 硬限制 打开文件描述符 nofile 最小1024 最小65536 单个用户可用进程数 nproc 最小2047 最小16384 进程堆栈段的大小 stack 最小10240 KB 最小10240KB,通常32768KB ③ 查看用户的上述资源限制: oracle用户: ulimit -Sn nofile 软限制 ulimit -Hn nofile 硬限制 ulimit -Su nproc 软限制 ulimit -Hu nproc 硬限制 ulimit -Ss stack 软限制 ulimit -Hs stack 硬限制 grid用户略 四、创建用户及相应目录并修改权限 1、创建组和用户 groupadd -g 500 oinstall groupadd -g 501 asmadmin groupadd -g 502 asmdba groupadd -g 503 asmoper groupadd -g 504 dba groupadd -g 505 oper useradd -g oinstall -G asmadmin,asmdba,asmoper,dba -u 500 grid useradd -g oinstall -G asmdba,dba,oper -u 501 oracle passwd Dtoracle123# passwd Dtoracle123# 2、创建grid 和oracle的安装目录,并修改属性 mkdir -p /u01/app/oracle/product/11.2.0/db_1 mkdir -p /u01/app/grid_base mkdir -p /u01/app/grid_home chmod -R 775 /u01 chown -R oracle:oinstall /u01 chown -R grid:oinstall /u01/app/grid_base chown -R grid:oinstall /u01/app/grid_home 3、修改oracle 、grid的环境变量 ① grid: umask 022 ORACLE_BASE=/u01/app/grid_base ORACLE_HOME=/u01/app/grid_home ORACLE_SID=+ASM1 PATH=$ORACLE_HOME/bin:$PATH export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH #export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' #export NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SSXFF' #alias sqlplus='rlwrap sqlplus' #alias asmcmd='rlwrap asmcmd' ② oracle umask 022 ORACLE_BASE=/u01/app/oracle ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1 ORACLE_SID=rac1 PATH=$ORACLE_HOME/bin:$PATH export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH #export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/usr/lib #export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms /jlib #export TNS_ADMIN=$ORACLE_HOME/network/admin #export NLS_LANG="simplified chinese"_china.al32utf8 #export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' #export NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SSXFF' #export NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SSXFF TZR' #alias sqlplus='rlwrap sqlplus' #alias rman='rlwrap rman' 五、修改/etc/hosts文件 vi /etc/hosts 192.168.3.88 vmrac-01 略 六、配置共享磁盘,采用UDEV方式 ① ll /dev/sd*: brw-rw---- 1 root disk 8, 0 12月 12 10:58 /dev/sda brw-rw---- 1 root disk 8, 16 12月 12 10:58 /dev/sdb brw-rw---- 1 root disk 8, 32 12月 12 10:58 /dev/sdc ② [root@vmrac-01 rules.d]# scsi_id --whitelisted --replace-whitespace --device=/dev/sda 368886030000010f9fa16eb9563779565 [root@vmrac-01 rules.d]# scsi_id --whitelisted --replace-whitespace --device=/dev/sdb 36888603000002210fa16eb9563779565 [root@vmrac-01 rules.d]# scsi_id --whitelisted --replace-whitespace --device=/dev/sdc 36888603000002211fa16eb9563779565 [root@vmrac-01 ~]# scsi_id --whitelisted --replace-whitespace --device=/dev/sdd 3688860300000195cfa16eb9563779565 [root@vmrac-01 ~]# scsi_id --whitelisted --replace-whitespace --device=/dev/sde 368886030000019a4fa16eb9563779565 [root@vmrac-01 ~]# scsi_id --whitelisted --replace-whitespace --device=/dev/sdf 36888603000001959fa16eb9563779565 [root@vmrac-01 ~]# scsi_id --whitelisted --replace-whitespace --device=/dev/sdg 36888603000001f01fa16eb9563779565 ③ vi 90-oracle-asmdevices.rules KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id i --whitelisted --device=/dev/$name", RESULT=="3688860300000195cfa16e b9563779565", NAME="asmdisk1", ACTION=="add|change", OWNER="grid",GROUP="asmadmin", MODE="0660" KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id i --whitelisted --device=/dev/$name", RESULT=="36888603000002210fa16e b9563779565", NAME="asmdisk2", ACTION=="add|change", OWNER="grid",GROUP="asmadmin", MODE="0660" KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id i --whitelisted --device=/dev/$name", RESULT=="36888603000002211fa16e b9563779565", NAME="asmdisk3", ACTION=="add|change", OWNER="grid",GROUP="asmadmin", MODE="0660" KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id i --whitelisted --device=/dev/$name", RESULT=="368886030000010f9fa16e b9563779565", NAME="asmdisk4", ACTION=="add|change", OWNER="grid",GROUP="asmadmin", MODE="0660" KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id i --whitelisted --device=/dev/$name", RESULT=="368886030000010f9fa16e b9563779565", NAME="asmdisk5", ACTION=="add|change", OWNER="grid",GROUP="asmadmin", MODE="0660" KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id i --whitelisted --device=/dev/$name", RESULT=="368886030000010f9fa16e b9563779565", NAME="asmdisk6", ACTION=="add|change", OWNER="grid",GROUP="asmadmin", MODE="0660" KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id i --whitelisted --device=/dev/$name", RESULT=="368886030000010f9fa16e b9563779565", NAME="asmdisk7", ACTION=="add|change", OWNER="grid",GROUP="asmadmin", MODE="0660" start_udev ll /dev/asmdisk* 注:sda、sdb、sdc用于创建OCR磁盘,sdd、sde用于DATA磁盘,sdf、sdg用于FRA磁盘 七、检查时间 vmrac-01和vmrac-02时间必须一致(用date看) 八、建立主机间的信任关系 1、 执行脚本 ./sshUserSetup.sh -user grid -hosts "vmrac-01 vmrac-02" - noPromptPassphrase -confirm -advanced 2、 手工建立 su - grid mkdir .ssh ssh-keygen -t rsa ssh-keygen -t dsa cat /home/grid/.ssh/id_rsa.pub >> /home/grid/.ssh/authorized_keys cat /home/grid/.ssh/id_dsa.pub >> /home/grid/.ssh/authorized_keys scp 114.116.150.85:/home/grid/.ssh/id_dsa.pub /home/grid scp 114.116.150.85:/home/grid/.ssh/id_rsa.pub /home/grid cat /home/grid/id_rsa.pub >> /home/grid/.ssh/authorized_keys cat /home/grid/id_dsa.pub >> /home/grid/.ssh/authorized_keys scp /home/grid/.ssh/authorized_keys 114.116.150.85:/home/grid/.ssh/ su - oracle mkdir .ssh ssh-keygen -t rsa ssh-keygen -t dsa cat /home/oracle/.ssh/id_rsa.pub >> /home/oracle/.ssh/authorized_keys cat /home/oracle/.ssh/id_dsa.pub >> /home/oracle/.ssh/authorized_keys scp 114.116.150.85:/home/oracle/.ssh/id_dsa.pub /home/oracle scp 114.116.150.85:/home/oracle/.ssh/id_rsa.pub /home/oracle cat /home/oracle/id_rsa.pub >> /home/oracle/.ssh/authorized_keys cat /home/oracle/id_dsa.pub >> /home/oracle/.ssh/authorized_keys scp /home/oracle/.ssh/authorized_keys 114.116.150.85:/home/oracle/.ssh/ 九、安装软件 1、RAC层次架构 ① 存储层 RAC是一个多实例、单数据库的系统。数据文件、联机日志、控制文件、甚至归档日志等文件在一个集群中只有一份。所有节点都平等地使用这些文件。共享数据一般都是采用EMC等存储阵列,每个服务器通过HBA卡和光纤线连接到存储。 ② 网络层 在整个RAC环境中,实际上有3个网络存在: 1)由Public网卡接入的网络,用于对外提供数据查询等服务 2)由Private网卡组成的私有网络;提供心跳和缓存融合 3)存储设备、光纤适配器提供,提供SCSI存储数据 ③ 集群件层 单实例环境下,Oracle是运行在OS kernel之上。RAC环境下,存储设备是共享的。如果还依赖OS Kernal的服务,就无法保证多个主机间的协调工作,这时就需要引入额外的控制机制,这个机制就是位于Oracle和OS Kernel之间的CRS,它会在OS Kernel之前截获请求,然后和其他节点上的CRS协商,最终完成上层的请求。 ④ 应用层 集群环境之所以能够提供高可用性,是因为CRS对运行于其上的应用进行监视,并在发生异常进行重启、切换等干预手段。这些被CRS监控的对象就叫做CRS Resource。 CRS Resource 有两类: 1)、Nodeapp包括 GSD(Global Service Daemon)、ONS(Oracle Notification Service Daemon)、VIP、Listener 2)、database -related resource包括 Database、Instance和Service ⑤、两节点RAC软件结构 2、安装grid软件 ① su - grid 解压安装介质、 ② 使用runcluvfy.sh 来执行安装前的预检查,来避免由于环境配置引发的安装失败问题。 su - grid cd /u01/software/grid /u01/software/grid/runcluvfy.sh stage -pre crsinst -n vmrac-01,vmrac-02 -verbose 检查完成后 cd /u01/software/grid/respone cat grid_install.rsp | grep -v ^# | grep -v ^$ >> grid.rsp vi grid.rsp oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v11_2_0 // 标注响应文件版本 ORACLE_HOSTNAME=vmrac-01 //主机名 INVENTORY_LOCATION=/u01/app/oraInventory //指定产品清单oracle inventory目录的路径 SELECTED_LANGUAGES=en //指定语言 oracle.install.option=CRS_CONFIG ORACLE_BASE=/u01/app/grid_base //grid的BASE和HOME目录 ORACLE_HOME=/u01/app/grid_home oracle.install.asm.OSDBA=asmdba //添加所需要的组 oracle.install.asm.OSOPER=asmoper oracle.install.asm.OSASM=asmadmin oracle.install.crs.config.gpnp.scanName=vmrac-scan //scan 名,要与hosts对应 oracle.install.crs.config.gpnp.scanPort=1521 //listener对外服务端口 oracle.install.crs.config.clusterName=hwy-cluster //cluster 名称 oracle.install.crs.config.gpnp.configureGNS=false oracle.install.crs.config.gpnp.gnsSubDomain= oracle.install.crs.config.gpnp.gnsVIPAddress= oracle.install.crs.config.autoConfigureClusterNodeVIP=false oracle.install.crs.config.clusterNodes=vmrac-01:vmrac-01-vip,vmrac-02:vmrac-02-vip // 配置网络信息,格式为:node1:node1-vip,node2:node2-vip oracle.install.crs.config.networkInterfaceList=eth0:172.15.22.0:1,eth1:172.15.1.0:2 // 格式为: eth0:141.88.24.0:1,eth1:10.2.1.0:2,eth2:141.88.52.0:3 oracle.install.crs.config.storageOption=ASM_STORAGE //配置存储形式 oracle.install.crs.config.sharedFileSystemStorage.diskDriveMapping= oracle.install.crs.config.sharedFileSystemStorage.votingDiskLocations= oracle.install.crs.config.sharedFileSystemStorage.votingDiskRedundancy= oracle.install.crs.config.sharedFileSystemStorage.ocrLocations= oracle.install.crs.config.sharedFileSystemStorage.ocrRedundancy= oracle.install.crs.config.useIPMI=false //配置 IPMI oracle.install.crs.config.ipmi.bmcUsername= oracle.install.crs.config.ipmi.bmcPassword= oracle.install.asm.SYSASMPassword= //配置ASM oracle.install.asm.diskGroup.name=CRS // 磁盘的名字 oracle.install.asm.diskGroup.redundancy=NORMAL //选择冗余方式 oracle.install.asm.diskGroup.AUSize=4 //设置AU为4M oracle.install.asm.diskGroup.disks=/dev/asmdisk1,/dev/asmdisk2,/dev/asmdisk3 //选择要添加的磁盘 oracle.install.asm.diskGroup.diskDiscoveryString=/dev/asmdisk* oracle.install.asm.monitorPassword= //密码 oracle.install.crs.upgrade.clusterNodes= oracle.install.asm.upgradeASM=false oracle.installer.autoupdates.option=SKIP_UPDATES oracle.installer.autoupdates.downloadUpdatesLoc= AUTOUPDATES_MYORACLESUPPORT_USERNAME= AUTOUPDATES_MYORACLESUPPORT_PASSWORD= PROXY_HOST= PROXY_PORT=0 PROXY_USER= PROXY_PWD= PROXY_REALM= ③ 执行脚本 ./runInstaller -responseFile /u01/software/grid/response/grid.rsp -silent -ignorePrereq -ignoreSysPrereqs -showProgress 在两个节点分别执行脚本 vmrac-01:/u01/app/oraInventory/orainstRoot.sh vmrac-02:/u01/app/oraInventory/orainstRoot.sh vmrac-01:/u01/app/grid_home/root.sh (可以通过tail -f /u01/app/grid_home/install/root_vmrac-01_2017-12-13_10-06-24.log 查看安装进度) vmrac-02:/u01/app/grid_home/root.sh (可以通过tail -f /u01/app/grid_home/install/root_vmrac-02_2017-12-13_11-31-26.log 查看安装进度) 如果在安装过程中报错运行/u01/app/grid_home/crs/install/roothas.pl -deconfig -force -verbose)修改后再次执行脚本。 ④ Grid安装完成后的检查工作 crsctl check crs crsctl stat res -t olsnodes -n srvctl status asm -a ocrcheck crsctl query css votedisk 3、安装oracle软件 ① 解压安装包 ② 配置oracle信任关系 ./sshUserSetup.sh -user oracle -hosts "vmrac-01 vmrac-02" - noPromptPassphrase -confirm -advanced (如果在之前配置了就不用重新配置) ③ 执行脚本 ./runInstaller -silent -debug -force -ignoreSysPrereqs -ignorePrereq \ FROM_LOCATION=/u01/software/database/stage/products.xml \ oracle.install.option=INSTALL_DB_SWONLY \ UNIX_GROUP_NAME=oinstall \ INVENTORY_LOCATION=/u01/app/oraInventory \ ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1 \ ORACLE_BASE=/u01/app/oracle \ oracle.install.db.InstallEdition=EE \ oracle.install.db.isCustomInstall=false \ oracle.install.db.DBA_GROUP=dba \ oracle.install.db.OPER_GROUP=oinstall \ oracle.install.db.CLUSTER_NODES=vmrac-01,vmrac-02 \ DECLINE_SECURITY_UPDATES=true 如果在执行过程中报 Before you can install Oracle RAC, you must install Oracle Grid Infrastructure on all servers (Oracle Clusterware and Oracle ASM) to create a cluster. 修改/u01/app/oraInventory/ContentsXML/inventory.xml <HOME NAME="Ora11g_gridinfrahome1" LOC="/u01/app/grid_home" TYPE="O" IDX="1" CRS="true"> 将CRS改为true 4、配置监听 grid用户执行 netca -silent -responsefile /u01/app/grid_home/assistants/netca/netca.rsp 5、创建DATA和FRA磁盘组 ①asmca -silent -createDiskGroup -sysAsmPassword 123123 -diskString '/dev/' -diskGroupName DATA -diskList '/dev/asmdisk4,/dev/asmdisk5,/dev/asmdisk6' -redundancy EXTERNAL -compatible.asm 11.2 -compatible.rdbms 11.2 ②asmca -silent -createDiskGroup -sysAsmPassword 123123 -diskString '/dev/' -diskGroupName FRA -diskList '/dev/asmdisk7' -au_size 4 -redundancy EXTERNAL -compatible.asm 11.2 -compatible.rdbms 11.2 十、搭建DG 1、主备机信息 ① rac-01: rac-02: 192.168.3.88 vmrac-01 192.168.3.88 vmrac-01 略 ② vmrac-01: vmrac02: 192.168.3.88 vmrac-01 192.168.3.88 vmrac-01 略 ③ db_name ins_name hostname db_uniq_name service_dbname tnsnames rac-01 orcl orcl1 rac-01 orcl orcl orcltds rac-02 orcl orcl2 rac-02 orcl orcl orcltds vmrac-01 vmorcl orcle1 vmrac-01 vmorcl vmorcl vmorcltds vmrac-02 vmorcl orcl2 vmrac-02 vmorcl vmorcl vmorcltds 2、修改控制文件参数 主机: ①alter database force logging; ②alter system set log_archive_config='DG_CONFIG=(orcl,vmorcl)'; ③alter system set log_archive_dest_1='location=+FRA valid_for=(all_logfiles,all_roles) db_unique_name=orcl'; ④alter system set log_archive_dest_2='service=vmorcltds LGWR ASYNC valid_for=(online_logfiles,primary_role) db_unique_name=vmorcl'; ⑤LOG_ARCHIVE_DEST_STATE_1=ENABLE,LOG_ARCHIVE_DEST_STATE_2=ENABLE (默认是enable) ⑥alter system set fal_server=vmorcltds; ⑦alter system set standby_file_management='AUTO'; 备机: ①alter database force logging; ②alter system set log_archive_config='DG_CONFIG=(orcl,vmorcl)'; ③alter system set log_archive_dest_1='location=+FRA valid_for=(all_logfiles,all_roles) db_unique_name=vmorcl'; ④alter system set log_archive_dest_2='service=vmorcltds LGWR ASYNC valid_for=(online_logfiles,primary_role) db_unique_name=orcl'; ⑤LOG_ARCHIVE_DEST_STATE_1=ENABLE,LOG_ARCHIVE_DEST_STATE_2=ENABLE (默认是enable) ⑥alter system set fal_server=orcltds; ⑦alter system set standby_file_management='AUTO'; ⑧alter system set REMOTE_LISTENER='vmrac-scan:1521' 3、创建审计目录 mkdir -p /u01/app/oracle/admin/orcl/adump 4、生成数据库全备,传到备机 主机: ①rman target / ②backup current controlfile for standby format '/u01/software/backup/std.con' ③ backup database format '/u01/software/backup/db_%U.bak' 备机: scp 172.16.35.153:/u01/software/backup/db_1msm1f6t_1_1.bak ./ scp 172.16.35.153:/u01/software/backup/std.con ./ scp 172.16.35.153:/u01/app/oracle/product/11.2.0/db_1/dbs/orapworcl1 /u01/app/oracle/product/11.2.0/db_1/dbs/orapwvmorcl1 (分别拷贝到各自节点上,SID要对应) 新建一个哑参,对应主机在备机asm上创建相应目录 ①rman target / ②restore spfile to '+DATA/racdb/spfile' from '/u01/software/backup/db_%U.bak'; ③shutdown immediate之后以asm中的spfile启动,在启动之前要设置sga和pga的,备机内存要比主机小(主机128G,备机16G) ④vi /u01/app/oracle/product/11.2.0/db_1/dbs/initorcl1.ora SPFILE='+DATA/orcl/spfileorcl.ora' (节点2也相应创建) ⑤startup nomount restore standby controlfile from '/u01/software/backup/std.con' ⑥备机修改参数,参照修改控制文件中备机 ⑦alte database mount rman target / catalog start with '/u01/software/backup' lsit backup restore database; ⑧节点1启动不了数据库,修改参数 alter system set cluster_interconnects = '172.16.2.166' scope=spfile sid='orcl1' ; alter system set cluster_interconnects = '172.16.2.167' scope=spfile sid='orcl2' ; ⑨添加standby日志组,clear logfile alter database add standby logfile thread 1 ('+DATA/vmorcl/onlinelog/std_redo01_1.log','+DATA/vmorcl/onlinelog/std_redo01_2.log') size 512M; ....... alter database add standby logfile thread 1 ('+DATA/vmorcl/onlinelog/std_redo06_1.log','+DATA/vmorcl/onlinelog/std_redo06_2.log') size 512M; alter database add standby logfile thread 2 ('+DATA/vmorcl/onlinelog/std_redo07_1.log','+DATA/vmorcl/onlinelog/std_redo07_2.log') size 512M; ...... alter database add standby logfile thread 2 ('+DATA/vmorcl/onlinelog/std_redo12_1.log','+DATA/vmorcl/onlinelog/std_redo12_2.log') size 512M; alter database clear logfile group 1; ...... 5、配置监听 vi /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora orcltds = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.40.155)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.40.156)(PORT = 1521)) (LOAD_BALANCE = yes) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) vmorcltds = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.40.163)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.40.164)(PORT = 1521)) (LOAD_BALANCE = yes) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = vmorcl) ) ) 分别在主备节点上远程连接测试 6、查看归档日志是否传到备机 select name from v$archived_log; 查看DG的几个进程RFS,LNS,MRP,LSP的状态 select process,sid,status from v$managed_standby; 备机应用日志: recover managed standby database using current logfile disconnect from session; DG搭建完成!
一、上传压缩包并解压 1、上传 通过xftp、samba或其他工具上传 2、解压 unzip swingbench261046.zip 3、修改属组 chown -R oracle:oinstall ./swingbench 二、检查java版本 1、检查java的版本,需要java1.8 java -version 2、安装java a、rpm包安装方式 ① mkdir /usr/java //创建目录 ② cp jdk-8u131-linux-x64.rpm /usr/java/ //把下载的rpm文件copy过去 ③ chmod +x jdk-8u101-linux-x64.rpm //添加可执行权限 ④ rpm -ivh jdk-8u101-linux-x64.rpm //安装rpm软件包 ⑤ java -version //查看java的版本信息 b、源码包安装方式 ① mkdir /usr/java/jdk1.8 //创建目录 ② cp jdk-8u131-linux-x64.tar.gz /usr/java/jdk1.8 //把下载的rpm文件copy过去 ③ tar -zxvf jdk-8u131-linux-x64.tar.gz //解压jdk到当前目录 ④ 使用 vim /etc/profile 编辑profile文件,在/etc/profile底部加入如下内容(需根据个人JDK实际安装位置进行配置): # Sun JDK profile export JAVA_HOME=/usr/local/jdk1.8/jdk1.8.0_131 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/li export PATH=${JAVA_HOME}/bin:$PATH ⑤ 保存,退出(esc进入一般模式,:wq保存退出) ⑥ 运行 source /etc/profile,使/etc/profile文件生效 ⑦ 命令测试 使用 java -version 和 javac -version 命令查看jdk版本及其相关信息,不会出现command not found错误,且显示的版本信息与前面安装的一致。 echo $JAVA_HOME, echo $CLASSPATH, echo $PATH,看看自己的配置是否都正确。 ⑧ 如果每次重启的时候,会发现jdk版本不正确,或者使用 java -version 显示不是所需版本,使用javac -version 会出现command not found错误,解决方法是再次运行source /etc/profile,使/etc/profile文件生效。显然每次这么操作很麻烦。因此我们编辑 vim ~/.bashrc,最后加一句 source /etc/profile 三、安装SwingBench 1、xstart以oracle用户连接 cd /software/swingbench/bin ./oewizard 之后会出现图形界面,在CRT执行的是有又可能有报错,可以输出DISPLAY,例如 export DISPLAY=192.168.3.101:0.0,之后再执行就可以出现图形化界面,用xstart工具不会出现这个错误。 2ã安装截图 ① 执行脚本第一个界面 ② 点击下一步,选择版本2.0 ③ 点击下一步 ④ 选择默认选项,点击下一步,connect string格式://ip:端口/服务名,Administrator Username:Sys as sysdba(默认),Administrator Password:sys密码,在下一步之前 将监听打开,否则远程连接不上,lsnrctl start。 ⑤ 点击下一步,远程连接到数据库,创建用户,表空间,选择数据文件的位置。 ⑥ 点击下一步,tablespace type选normal tablespace其他选默认。 ⑦ 点击下一步,选择要插入数据量的大小,也可以自己设置大小。要保证操作系统空间足够,tempfile满足要求,如果临时表空间不够,修改临时表空间的大小以满足要求。 ⑧ 点击下一步,选择并行度,如果系统性能高的话可以适量增加。 ⑨ 点击finish开始执行,执行时间较长,等待执行完成后点击OK,保存生成的文件,关闭程序。
2020年09月
2019年11月