1.Dataguard环境设计的三个重要概念

1.1 Primary数据库

在Data Guard的环境中与Standby数据库对应的数据库即是Primary数据库,也就是Primary数据库正在运行的生产数据库,大多数的应用要访问该数据库,因为它在Data Guard环境中处于Primary的角色,所以称为Primary数据库。

 1.2 物理Standby数据库

物理Standby数据库是Standby数据库的一种,物理Standby数据库在本质上是通过Redo传输服务实施Redo应用,将Primary数据库的Redo数据拷贝到Standby数据库,实现Primary数据库与Standby数据库的同步。

Standby数据库其实就是Primary数据库的物理拷贝,二者的数据库结构相同。

1.3 逻辑Standby数据库

逻辑Standby数据库与Primary数据库在物理文件组织以及数据结构方面可以不同,这点是与物理Standby数据库的一个区别,并且逻辑Standby数据库是通过SQL应用实现与Primary数据库的数据同步,SQL应用的本质是将从Primary数据库获得的Redo数据转化成SQL语句,然后使用SQL语句实现Redo数据的操作。所以逻辑数据库中有自己的Standby本地日志文件。

逻辑Standby数据库可以向应用提供服务,如数据查询、报表服务等,同时不用停机就可以在逻辑Standby数据实现数据库软件升级以及补丁操作。

备注:在11g当中出现快照Standby数据库,此处以10g为例子。

2. Data Guard 服务本质

2.1 Apply服务

在Data Guard环境下,我们有一个提供主要服务的生产数据库----Primary数据库,同时在另一个物理主机(也可以同一台主机)创建了一个数据库拷贝,我们成为Standby数据库。通过网络将用户的数据操作结果传输到Standby数据库,此时传输的数据库就是保存在生产数据库的重做日志文件中的用户操作记录数据,其实与单实例数据库保持数据一致性相同,只不过Data Guard通过网络来传输Redo数据,将Redo数据归档或者直接将Redo数据写入Standby数据库。这要依赖于用户在配置数据库时选择的Redo传输服务参数。

传输Redo数据的服务成为"Apply服务",该服务实现了Standby数据库与Primary数据库之间的数据同步,并在第一环境下允许对这两个数据库的同时访问,这依赖于Standby数据库的类型。

在Oracle Data Guard中,将Standby数据库分为物理Standby数据库和逻辑Standby数据库。根据Standby数据库的类型,Redo数据的”Apply”服务有两种实现方式,即Redo应用和SQL应用。

 2.2 Redo应用

Apply服务根据创建的Standby数据库的不同而有差异,从本质上讲,就是实现Redo数据写操作的级别不同。Redo应用服务于物理Standby数据库,复制Redo中的二进制数据。

在物理Standby数据库中使用Redo应用保持与Primary数据库的数据同步,Redo应用的本质上使用介质恢复的方式来保持与Primary数据库的同步。即传输到Standby数据库的Redo数据块,会通过Redo应用直接保存在Standby数据库中,如果2-1所示。

图2-1 物理Standby的Redo应用

在图2-1中,Primary数据库的Redo数据使用Redo传输服务,通过网络传输到Standby数据库,在Standby数据库上相应的进程接受Redo数据,并使用Redo应用将数据块写入数据库。此时Standby数据库只能用于只读访问。

2.3 SQL应用

SQL应用服务于逻辑Standby数据库,它将Redo数据中的数据转化成SQL语句,再执行Redo操作。所以SQL应用是一个SQL语句传输和重建的过程。逻辑Standby数据库能够以读/写模式打开,但是它维护的数据表只能以只读模式打开,用于报表查询等服务,如图2-2所示。

图2-2 逻辑Standby的SQL应用

在创建逻辑Standby数据库时,系统会使用SQL应用来保存从Primary数据传输过来的Redo数据。SQL语句在应用过程中,此时的Standby数据库也可以提供报表服务。

2.4 角色转换服务

在Data Guard配置中与数据库功能对应的两种角色,即Primary角色和Standby角色。在一个Data Guard配置中可以有多个Primary数据库和多个Standby数据库,但是角色就两种,要么是Primary角色,要么是Standby角色。我们使用数据字典v$database来查询当前数据库的角色。

3. 基础知识准备

3.1 Oracle中数据库和实例

这是Oracle中最基本的2个概念。

先说数据库(database)。Oracle中的数据库,是存储数据的一种媒介。常用一般为2种形式,即文件和磁盘阵列。文件比较很好理解,就是在磁盘创建一批文件,然后在文件中存储数据信息。而磁盘阵列呢?所谓磁盘阵列,就是数据不是存放在某个文件中的,而是把一个或多个磁盘格式化为oracle的一种格式,等于整个磁盘只能存放oracle数据库,不能作为其它用途。以我们最常用的文件格式来说,数据库就是那些所有数据文件、控制文件、REDO文件等等一系列文件的集合。即:

数据库=重做文件+控制文件+数据文件+临时文件

实例(instance)是操作系统中一系列的进程以及为这些进程所分配的内存块。即:

ORACLE实例=进程+进程所使用的内存(SGA)

由上可见,对数据库的应用,实例和数据库缺一不可。仅有数据库,那么只表示数据存储在文件中,但是我们无法对它直接进行操作。仅有instance,表示我们可以进行操作,但是没有操作对象(不知道目标数据),也是没有什么意义的。

Database是永久的,instance是临时性的。当我们结束oracle的实例进程,它所占内存释放,那么instance也就不存在了。但是,各种数据库相关文件还是存在的,所以database仍然存在的。

因此,也就不难理解了,oracle数据库服务器启动一般包含的3个步骤:1.创建并启动实例;2.装载数据库;3.打开数据库。每到一个阶段,都有相应的操作可以进行。例如,同一个SID,但是如果以不同的参数文件启动,那么我们可以装载和打开不同的数据库。同样的,一个数据库,也可以被不同的instance加载和打开。

一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库。

3.2 Oracle中的name,id

db_name:数据库名。物理数据库的名字标识。数据库创建完成后,参数db_name被写入参数文件,格式如下:

db_name=orcl

数据库名虽说可以修改,但是修改步骤比较麻烦。建议最好不要修改db_name。

在不同的服务器上创建数据库,可以使用同样的db_name。

在DG环境中,主备服务器中的数据库有同样的db_name。

可以利用下列sql查询db_name:

1 select name from v$database;

db_domain:数据库域名。这个域同网络的域没有什么联系。

global_name:全部数据库名。利用Database Configuration Assistant创建数据库时,要求输入就是全局数据库名。通常,它的名字是由db_name.db_domain构成。

SID:实例标识。利用Database Configuration Assistant创建数据库时,要求输入SID。

SID和instance_name的值是一致的。它是oracle的实例标识。

Instance_name用于对外部连接。在操作系统中要取得与数据库的联系,必须使用数据库实例名。

可以通过下列sql查询instance_name:

1 select instance_name from v$instance;

db_unique_name:在Data Guard里,主从服务器中的数据库,都有一个样的DB_NAME。然而它们和RAC环境下不一样,不代表同一个库(主备机中均有自己的数据库文件,不像RAC环境中通过多个实例通过磁盘阵列共享一个库)。但是它们的db_unique_name是不一样的,用以标识不同的数据库。

service_name:服务名。Service_name是连接数据库的时候使用的别名。

需要注意的是,service_name主要用于数据库网络连接时,可以有多个,可以随意命名,可以通过系统初始化参数service_name设置。

一般情况下,service_name的缺省值为db_name.db_domian,同global_name相同。

Net service name:网络服务名,即连接描述符。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明特性。

Dataguard Content的更多相关文章

  1. requests的content与text导致lxml的解析问题

    title: requests的content与text导致lxml的解析问题 date: 2015-04-29 22:49:31 categories: 经验 tags: [Python,lxml, ...

  2. Content Security Policy 入门教程

    阮一峰文章:Content Security Policy 入门教程

  3. android 使用Tabhost 发生could not create tab content because could not find view with id 错误

    使用Tabhost的时候经常报:could not create tab content because could not find view with id 错误. 总结一下发生错误的原因,一般的 ...

  4. 【解决方案】cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One of '{"http://java.sun.com/xml/ns/javaee":run-as, "http://java.sun.com/xml/ns/javaee":security-role-r

    [JAVA错误] cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One o ...

  5. Oracle 11.2.0.4 DataGuard 环境打PSU,OJVM PSU补丁快速参考

    环境:RHEL6.5 + Oracle 11.2.0.4 DataGuard physical standby 主库和备库都是单节点. 需求:主备库同时应用160719的PSU和OJVM PSU补丁. ...

  6. 注意 AppResLib.dll.*.mui 的生成操作应该为 Content

    为 Windows Phone 8 App 添加本地化的时候,发现修改 AppResLib.dll.*.mui 后不仅没有其变化,还发现修改它导致它失效.通过对比代码发现,问题原因是 AppResLi ...

  7. android Content Provider介绍

    ContentProvider(内容提供者)是Android中的四大组件之一.主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过Conte ...

  8. Jsoup问题---获取http协议请求失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.

    Jsoup问题---获取http协议请求失败 1.问题:用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不 ...

  9. css content之counter-reset、content-increment

    万万没想到,写了快三年前端,有不会用的css,居然还有完全没听过.见过的css属性,而且还是CSS2的内容! 关于counter-reset.content-increment两个属性的详解可以参看张 ...

随机推荐

  1. oracle linux了解基本命令行

    1.      Linux的版本:核心(kernel)版本和发行(distribution)版本 2.      复制.删除和移动文件的命令 cp [选项] 源文件或目录  目标文件或目录 -R,-r ...

  2. PHP 对数组数值进行排序,使用另一个容器

    <?php /* 排序方式::事实上只需要将要循环的数组进行N次循环,然后每次取最大的一个值*/ $array = array(100,25,10,258,33,48,10,5,13,58,33 ...

  3. 【BZOJ 2242】[SDOI2011]计算器

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

  4. 微软职位内部推荐-Data Scientist

    微软近期Open的职位: Job Description:Extracting accurate, insightful and actionable information from data is ...

  5. sql之独立子查询和相关子查询总结

    1.独立子查询:顾名思义:就是子查询和外层查询不存在任何联系,是独立于外层查询的: 下面就看一个例子: 有一张订单表 Sales.Order 和一张 客户表 Sales.Customer 下面的sql ...

  6. python学习笔记12(函数三): 参数类型、递归、lambda函数

    一.函数参数的类型 之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求.而在Python中还有一种是通过参 ...

  7. Angular.js入门的样例

    感觉这下子,前端的路也宽多了,从容不迫了. 因为可控制的节点又推前了, 有空了好好学一下. 然后结合EXPRESS或METEOR,是不是有点爽? 参考URL: https://toddmotto.co ...

  8. What is the innovator’s solution——什么才是创新的解决方案2

    前略:http://www.cnblogs.com/Kassadin/p/4233497.html 案例1 从书上的一个案例开始: 让我们来看看AT&T公司(美国电话电报公司)的案例吧.198 ...

  9. hdu 1760 A New Tetris Game 博弈论

    找sg值,可以选择暴力,也可以利用sg值的特点简化. 暴力就跟取石子一样,没什么差别,DFS搞定.把矩阵看成一个字符串,字符串就是一个状态. 其实我们也可以不暴力求sg值,因为只要当前状态能到达一个s ...

  10. 李洪强iOS开发之拓展篇—UIDynamic(简单介绍)

      iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能 ...