Oracle 全局分区索引

全局分区索引实质上意味着该索引与数据表有不同的分区方案,且是基于不同于数据表的一个或一组分区列进行分区的。这主要是为了提高数据库中数据查询的性能。基于用户对给定表的查询,为提高查询性能,可以在给定的查询列上创建全局分区的索引。

可以创建以下几种类型的全局分区索引:
.范围
.哈希

为了说明基于范围的全局分区索引,假定你发现有很多的查询要访问employees表中的manager_id列,那么就可以在manager_id列上创建分区索引,它的分区完全独立于表。查看如下范围分区索引的例子:

SQL> create table employees_jy as select * from employees;

Table created.

SQL> create index employees_gi1
  2  on employees_jy(manager_id)
  3  global
  4  partition by range(manager_id)
  5  (
  6  partition manager_100 values less than(100),
  7  partition manager_200 values less than(200),
  8  partition manager_300 values less than(300),
  9  partition manager_400 values less than(400),
 10  partition manager_500 values less than(500),
 11  partition manager_600 values less than(600),
 12  partition manager_700 values less than(700),
 13  partition manager_800 values less than(800),
 14  partition manager_900 values less than(900),
 15  partition manager_max values less than(maxvalue)
 16  );

Index created.

你可以在分区表或非分区表上创建全局分区索引。换句话说,创建全局分区索引并不需要对表进行分区。正如本章后面所讨论的,因为分区表的全局分区索引维护起来不太方便,全局分区索引并不常用,所以通常很少甚至不用它来提高查询性能,特别是在非分区表中。

基于范围的全局分区索引,必须始终为索引指定一个最大值,即用maxvalue作为最大值。这保证了新插入到相应表的任何数据将在分局分区索引中有地方保存。换句话说,对于全局分区索引,它永远不会有“越界”的情况。如果不在全局分区索引中指定上限分区,Oracle将不允许创建索引,若执行下列语句,就会出现以下错误提示信息:

SQL> create index employees_gi2
  2  on employees_jy(manager_id)
  3  global
  4  partition by range(manager_id)
  5  (
  6  partition manager_100 values less than(100),
  7  partition manager_200 values less than(200),
  8  partition manager_300 values less than(300),
  9  partition manager_400 values less than(400),
 10  partition manager_500 values less than(500),
 11  partition manager_600 values less than(600),
 12  partition manager_700 values less than(700),
 13  partition manager_800 values less than(800),
 14  partition manager_900 values less than(900)
 15  );
)
*
ERROR at line 15:
ORA-14021: MAXVALUE must be specified for all columns

由于每个全局分区索引吕必须包含一个上限分区,因此把分区添加到全局分区索引的唯一方式就是,使用alter index … split分区命令。例如:

SQL> alter index employees_gi1 split partition manager_max at(1000) into (partition manager_max,partition manager_1000);

Index altered.


SQL> select partition_name,status from user_ind_partitions where index_name='EMPLOYEES_GI1';

PARTITION_NAME                                                                                                                   STATUS
-------------------------------------------------------------------------------------------------------------------------------- --------
MANAGER_100                                                                                                                      USABLE
MANAGER_1000                                                                                                                     USABLE
MANAGER_200                                                                                                                      USABLE
MANAGER_300                                                                                                                      USABLE
MANAGER_400                                                                                                                      USABLE
MANAGER_500                                                                                                                      USABLE
MANAGER_600                                                                                                                      USABLE
MANAGER_700                                                                                                                      USABLE
MANAGER_800                                                                                                                      USABLE
MANAGER_900                                                                                                                      USABLE
MANAGER_MAX                                                                                                                      USABLE

11 rows selected.

SQL>

还可以删除全局分区索引的部分分区。然而,这样做时,如果被删除的分区包含索引条目,上限比它高的相邻分区就被标记为不可用。在下面的代码中,查询了删除分区manager_200前该索引各分区的状态:

SQL> select partition_name,status from user_ind_partitions where index_name='EMPLOYEES_GI1';

PARTITION_NAME                                                                                                                   STATUS
-------------------------------------------------------------------------------------------------------------------------------- --------
MANAGER_100                                                                                                                      USABLE
MANAGER_1000                                                                                                                     USABLE
MANAGER_200                                                                                                                      USABLE
MANAGER_300                                                                                                                      USABLE
MANAGER_400                                                                                                                      USABLE
MANAGER_500                                                                                                                      USABLE
MANAGER_600                                                                                                                      USABLE
MANAGER_700                                                                                                                      USABLE
MANAGER_800                                                                                                                      USABLE
MANAGER_900                                                                                                                      USABLE
MANAGER_MAX                                                                                                                      USABLE

11 rows selected.

然后删除分区manager_200

SQL> alter index employees_gi1 drop partition manager_200;

Index altered.

当再次查询user_ind_partitions时,你可以看到数据库把上限更高的相邻分区标记为unusable状态。

SQL> select partition_name,status from user_ind_partitions where index_name='EMPLOYEES_GI1';

PARTITION_NAME                                                                                                                   STATUS
-------------------------------------------------------------------------------------------------------------------------------- --------
MANAGER_100                                                                                                                      USABLE
MANAGER_1000                                                                                                                     USABLE
MANAGER_300                                                                                                                      UNUSABLE
MANAGER_400                                                                                                                      USABLE
MANAGER_500                                                                                                                      USABLE
MANAGER_600                                                                                                                      USABLE
MANAGER_700                                                                                                                      USABLE
MANAGER_800                                                                                                                      USABLE
MANAGER_900                                                                                                                      USABLE
MANAGER_MAX                                                                                                                      USABLE

10 rows selected.

一旦删除了全局索引分区,就必须执行alter index命令重建由于drop partition操作而被标记为unusable的分区。

SQL> alter index employees_gi1 rebuild partition manager_300;

Index altered.

SQL> select partition_name,status from user_ind_partitions where index_name='EMPLOYEES_GI1';

PARTITION_NAME                                                                                                                   STATUS
-------------------------------------------------------------------------------------------------------------------------------- --------
MANAGER_100                                                                                                                      USABLE
MANAGER_1000                                                                                                                     USABLE
MANAGER_300                                                                                                                      USABLE
MANAGER_400                                                                                                                      USABLE
MANAGER_500                                                                                                                      USABLE
MANAGER_600                                                                                                                      USABLE
MANAGER_700                                                                                                                      USABLE
MANAGER_800                                                                                                                      USABLE
MANAGER_900                                                                                                                      USABLE
MANAGER_MAX                                                                                                                      USABLE

10 rows selected.

因为必须在全局分区索引上用maxvalue指定的一个分区,所以永远无法删除上限最高的分区。例如:

SQL> alter index employees_gi1 drop partition manager_1000;
alter index employees_gi1 drop partition manager_1000
                                         *
ERROR at line 1:
ORA-14078: you may not drop the highest partition of a GLOBAL index

全局分区索引可以是唯一索引,也可以是非唯一索引。本章到目前为止,只创建了非唯一索引。下面列出的是在表上创建全局唯一索引分区的语句:

SQL> create unique index employees_uk1 on employees_jy(manager_id,employee_id)
  2  global
  3  partition by range(manager_id)
  4  (
  5  partition manager_100 values less than(100),
  6  partition manager_200 values less than(200),
  7  partition manager_300 values less than(300),
  8  partition manager_400 values less than(400),
  9  partition manager_500 values less than(500),
 10  partition manager_600 values less than(600),
 11  partition manager_700 values less than(700),
 12  partition manager_800 values less than(800),
 13  partition manager_900 values less than(900),
 14  partition manager_max values less than(maxvalue)
 15  );

Index created.

本地分区索引可以定义为前缀或非前缀索引,而全局分区索引必须创建为前缀索引,也就是说,分区列必须在该索引的前导端。如果你试图创建全局分区的非前缀索引,就会收到以下错误 提示信息:

SQL> create unique index employees_uk1 on employees_jy(employee_id)
  2  global
  3  partition by range(manager_id)
  4  (
  5  partition manager_100 values less than(100),
  6  partition manager_200 values less than(200),
  7  partition manager_300 values less than(300),
  8  partition manager_400 values less than(400),
  9  partition manager_500 values less than(500),
 10  partition manager_600 values less than(600),
 11  partition manager_700 values less than(700),
 12  partition manager_800 values less than(800),
 13  partition manager_900 values less than(900),
 14  partition manager_max values less than(maxvalue)
 15  );
partition by range(manager_id)
                             *
ERROR at line 3:
ORA-14038: GLOBAL partitioned index must be prefixed

另一种全局分区索引类型是哈希分区索引。使用哈希分区索引通常是出于性能原因,因为这使用索引在分区之间更均匀地分布。请看下面创建基于哈希的全局分区索引的例子:

SQL> create index employees_jy_ih1 on employees_jy(department_id) global partition by hash(department_id) partitions 4;

Index created.

注意:全局分区索引必须在堆组织表上创建。而且,不能创建全局分区位图索引。

Oracle管理分区表的主键和唯一索引

管理分区表的主键和唯一索引
当需要在表上定义主键约束时,首先使用主键约束的列创建唯一索引,然后再添加约束,这通常被视为一种良好的做法。例如:

SQL> create unique index employees_part_pk on employees_part(employee_id,hire_date) local;

Index created.

SQL> alter table employees_part add constraint employees_part_pk primary key(employee_id,hire_date);

Table altered.

这样做的好处是,它允许你在必要时禁用和重新启用约束,而不必删除底层索引。当必须在一个大表上执行约束管理时,这可以节省大量的时间。在数据仓库环境中,经常有大量数据要批量加载到表中,禁用约束然后重新启用约束是很常见的操作,因为在这种情况下,在加载之前禁用约束并在加载后重新启用约束,可以节省大量的整体数据处理时间。

如果你首先创建了唯一索引,然后启用主键约束,如果禁用这个主键约束,那么你的约束和索引在数据库中仍然存在。如下面的例子所示:

SQL> alter table employees_part disable constraint employees_part_pk;

Table altered.

SQL> select i.index_name,c.constraint_type,i.partitioned from user_indexes i left join user_constraints c
  2  on (i.index_name=c.constraint_name) where i.index_name='EMPLOYEES_PART_PK';

INDEX_NAME                     CONSTRAINT_TYPE                PARTITIONED
------------------------------ ------------------------------ ----------------------------------------
EMPLOYEES_PART_PK              P                              YES

如果你用create tabel语句或单个alter table语句内联地创建主键,将同时创建底层的唯一索引。在这种情况下,如果禁用这个主键约束,你可以看到它删除了底层索引。

SQL> alter table employees_part disable constraint employees_part_pk;

Table altered.

SQL> select i.index_name,c.constraint_type,i.partitioned from user_indexes i left join user_constraints c
  2  on (i.index_name=c.constraint_name) where i.index_name='EMPLOYEES_PART_PK';
no rows selected

当对表的分区一级执行操作(如在表上执行分区拆分)时,会使用一个分区的索引变得不可用(unusable),这种情况下,本地分区索引就变得非常有用。至于主键,你可以简单地禁用主键约束(在这种情况下,底层索引保持不变),执行分区操作,再重建该分区索引,然后重新启用主键约束。这样,索引唯一需要重建的是受上述操作影响的分区。

在唯一索引最终要成为主键时,唯一索引必须包含分区列这一限制会导致另一个常见的问题,即,有时用户提出需求,不要把分区列放到表的主键列中去。如下面的例子所示,通过使用先前创建的唯一索引,就可以简单地改变员工表来创建主键约束:

SQL> alter table employees_part add constraint employees_part_pk_1 primary key(employee_id);

Table altered.

如果你的客户需求中规定,分区列(在本列是hire_date)不得作为主键的一部分,那么也可以使用相同的语法简单地创建主键约束,这同时也创建了未分区的底层索引。下面的查询显示了这个结果:

SQL> select i.index_name,c.constraint_type,i.partitioned from user_indexes i,user_constraints c
  2  where i.index_name=c.constraint_name and i.index_name='EMPLOYEES_PART_PK_1';

INDEX_NAME                     CONSTRAINT_TYPE                PARTITIONED
------------------------------ ------------------------------ ----------------------------------------
EMPLOYEES_PART_PK_1            P                              NO

你的表上确实建立了索引,但它不是分区的。这样做的好处是,解除了唯一索引必须包含分区列的限制,可以在单个employee_id列上创建“自然”的主键约束了。缺点是,现在分区表employees上有一个非分区索引。如果现在需要在该表上执行任何分区级操作,如截断分区,移动分区,或拆分分区,等等,那么整个底层非分区索引将被标记为unusable,而且必须在执行任何分区级操作后重建它。

Oracle本地分区索引

1 分区索引
分区索引与非分区索引相比,具有许多好处。使用分区索引的关键好处如下:
.性能方面的优势
.通过DML操作载入数据。
.通过DDL操作载入数据。
.用select语句查询数据。

.维护方面的好处
.重建索引。
.在分区一级把索引设置为不可用或不可见。

可以创建本地分区或全局分区的分区索引。本地分区索引只能存在于分区表,而全局分区的索引既可以在分区表创建,也可以在非分区表上创建。还可以在分区表上创建非分区索引。分区索引最常见的配置是在分区表上创建本地分区索引,只是因为这种配置的整体优势一般大于分区表上的全局分区索引和非分区索引。

注意:创建分区表上的非分区索引与创建非分区表上的非分区索引是相同的。

2 创建本地分区索引
最常见的分区索引类型是本地分区索引。本地分区索引只能在分区表上创建。顾名思义,“本地”是指索引条目和相应的数据之间有直接的关系。数据分区和索引分区之间存在一对一的关系。如果有某个按日期范围分区的表,今年每个月都有一个分区,那么对于2012年1月分区的所有数据,创建的每个索引在2012年1月分区都有相应的索引项。

2.1 最简单的形式
除LOCAL关键字外,最基本的创建本地分区索引的形式与创建非分区索引相同。

create table employees_part
(
EMPLOYEE_ID   NUMBER(6),
FIRST_NAME    VARCHAR2(20),
LAST_NAME     VARCHAR2(25),
EMAIL         VARCHAR2(25),
PHONE_NUMBER  VARCHAR2(20),
HIRE_DATE     DATE,
JOB_ID        VARCHAR2(10),
SALARY        NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
MANAGER_ID     NUMBER(6),
DEPARTMENT_ID  NUMBER(4)
)
partition by range(hire_date)
(
   partition p01 values less than(to_date('2002-01-01','yyyy-mm-dd')),
   partition p02 values less than(to_date('2003-01-01','yyyy-mm-dd')),
   partition p03 values less than(to_date('2004-01-01','yyyy-mm-dd')),
   partition p04 values less than(to_date('2005-01-01','yyyy-mm-dd')),
   partition p05 values less than(to_date('2006-01-01','yyyy-mm-dd')),
   partition p06 values less than(to_date('2007-01-01','yyyy-mm-dd')),
   partition p07 values less than(to_date('2008-01-01','yyyy-mm-dd')),
   partition p08 values less than(to_date('2009-01-01','yyyy-mm-dd')),
   partition p09 values less than(to_date('2010-01-01','yyyy-mm-dd')),
   partition p10 values less than(to_date('2011-01-01','yyyy-mm-dd')),
   partition p11 values less than(to_date('2012-01-01','yyyy-mm-dd')),
   partition p12 values less than(to_date('2013-01-01','yyyy-mm-dd'))
);
/




SQL> create table employees_part
  2  (
  3  EMPLOYEE_ID   NUMBER(6),
  4  FIRST_NAME    VARCHAR2(20),
  5  LAST_NAME     VARCHAR2(25),
  6  EMAIL         VARCHAR2(25),
  7  PHONE_NUMBER  VARCHAR2(20),
  8  HIRE_DATE     DATE,
  9  JOB_ID        VARCHAR2(10),
 10  SALARY        NUMBER(8,2),
 11  COMMISSION_PCT NUMBER(2,2),
 12  MANAGER_ID     NUMBER(6),
 13  DEPARTMENT_ID  NUMBER(4)
 14  )
 15  partition by range(hire_date)
 16  (
 17     partition p01 values less than(to_date('2002-01-01','yyyy-mm-dd')),
 18     partition p02 values less than(to_date('2003-01-01','yyyy-mm-dd')),
 19     partition p03 values less than(to_date('2004-01-01','yyyy-mm-dd')),
 20     partition p04 values less than(to_date('2005-01-01','yyyy-mm-dd')),
 21     partition p05 values less than(to_date('2006-01-01','yyyy-mm-dd')),
 22     partition p06 values less than(to_date('2007-01-01','yyyy-mm-dd')),
 23     partition p07 values less than(to_date('2008-01-01','yyyy-mm-dd')),
 24     partition p08 values less than(to_date('2009-01-01','yyyy-mm-dd')),
 25     partition p09 values less than(to_date('2010-01-01','yyyy-mm-dd')),
 26     partition p10 values less than(to_date('2011-01-01','yyyy-mm-dd')),
 27     partition p11 values less than(to_date('2012-01-01','yyyy-mm-dd')),
 28     partition p12 values less than(to_date('2013-01-01','yyyy-mm-dd'))
 29  );
/
Table created.


SQL> insert into employees_part select * from employees;

107 rows created.

SQL> commit;

Commit complete.


SQL> create index employees_part_i1 on employees_part(hire_date) local;

Index created.

对于这个例子,Oracle创建的分区名称将与数据分区的名称相同。此外,所有分区都将在USERS表空间内创建。

根据应用程序的需求,可能需要指定各个分区的具体信息,比如下列内容:
.分区名称
.表空间名称
.存储参数

2.2 分区级的需求
如果有特定的分区级的需求,就需要在create index ddl内指定每个分区的信息。例如:

SQL> create index employees_part_i2 on employees_part(hire_date) local
  2  (
  3  partition pi01,
  4  partition pi02,
  5  partition pi03,
  6  partition pi04,
  7  partition pi05,
  8  partition pi06,
  9  partition pi07,
 10  partition pi08,
 11  partition pi09,
 12  partition pi10,
 13  partition pi11,
 14  partition pi12
 15  );

Index created.

在这个例子中,对分区名称进行了修改,在表分区名中间插入一个i来表示索引分区。为了让索引具有与表不同的分区名称,必须在create indexddl中指定每个分区的名称。还可以为每个分区指定不同的表空间,因为它代表了一年的数据。把每年的数据放在自己的表空间内,就可以把往年数据的表空间设置为只读。这有助于提高查询速度和备份速度,因为你不需要在数据库的每个备份中都备份只读表空间。

再次强调,要创建本地分区索引,必须是在分区表上创建。否则,就会出现以下错误提示信息:

SQL> create index employees_i1 on employees(hire_date) tablespace users local;
create index employees_i1 on employees(hire_date) tablespace users local
                             *
ERROR at line 1:
ORA-14016: underlying table of a LOCAL partitioned index must be partitioned

2.3 前缀和非前缀选项
可以把本地分区索引创建为前缀或非前缀的。在创建本地分区的前缀索引时,这意味着表的分区列在索引的前导端。如果分区列不在索引的前导端,就被当作非前缘索引。在Oracle的早期版本中,本地前缀索引与非前缀索引相比,在性能上有一些优势。在Oracle后来的版本中,包括版本11gR2,建立本地前缀索引的优势已经减弱。不过,如果你的数据库环境是OLTP系统,本地前缀索引比非前缀索引更有利于提高查询性能,因为为了检索某个查询所需的数据,优化器需要扫描的索引分区可能会较少。

在创建本地分区的唯一索引时,索引必须包括分区列,否则就会出现以下错误提示信息:

SQL> create unique index employees_part_pk on employees_part(employee_id) local;
create unique index employees_part_pk on employees_part(employee_id) local
                                         *
ERROR at line 1:
ORA-14039: partitioning columns must form a subset of key columns of a UNIQUE index

在唯一索引的定义中添加分区列(在本例中是hire_date)后,就可以在employees_part表上创建唯一索引了。

SQL> create unique index employees_part_pk on employees_part(employee_id,hire_date) local;

Index created.

Oracle应用程序域索引

应用程序域索引是最不为人所知且大多数开发人员和DBA也是最少使用的一种。应用域索引支持创建自己的索引结构,以实现目前Oracle数据库中不存在的新的索引类型。Oracle数据库本身实现的全文索引,就是应用程序域索引的一个很好的例子,全文索引常用来促进在大的文本项中的搜索。为了创建全文索引,需要在create index语句中包含indextype子句,如下所示:

SQL> create table test_tab(dsc clob);

Table created.

SQL> insert into test_tab values('hi,this is xiaoming');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test_tab;

DSC
--------------------------------------------------------------------------------
hi,this is xiaoming

SQL> create index test_idx on test_tab(dsc) indextype is ctxsys.context;

Index created.

SQL>
SQL> select * from test_tab where contains(dsc,'this is')>0;

no rows selected

就像收集普通索引的统计信息一样,可以调用dbms_stats.gather_index_stats存储过程来收集全文索引的统计信息。虽然我们这里只是简单地讨论了应用程序域索引,在大多数情况下,这些索引对第三方解决方案供应商有更多的用处,因为他们需要使用创新的索引解决方案来访问各类非传统的数据,如文本和图像。例如,在使用某些类型的数据,如视频剪辑时,Oracle提供的数据类型可能不太适用。此外,这些特殊类型的数据,可能需要特殊类型的操作,例如,图像中的颜色等级。你可以使用能把图像中的颜色分级的比较运算符,来定义这些特殊类型的操作。

DM7使用dmrestore执行指定时间点或LSN还原

使用dmrestore执行指定时间点或LSN还原
达梦系统使用归档日志将数据库还原到最新的状态,这一节讨论与归档日志相关的另一个功能:还原到指定的时间点。根据用户需求,可以将数据库还原到指定的时间点。还原到时间点的功能依赖于归档日志,在备份完成时,系统会记录一个备份时间,因此要还原的时间点一定在备份完成时间之后,否则系统会提示报错信息。借助备份文件完成还原后,开始重做归档日志,区别于完全还原将所有可用的归档日志全部重做,若指定还原到时间点,则只重做早于时间点的日志,从而达到将数据库还原到指定时间的状态的目的。需要注意的是,由于表空间只是数据库的一部分,为保证还原后,数据库中的所有数据处于最新状态,还原表空间会重做该表空间所有可用的归档日志,因此还原表空间不支持还原到时间点功能。

比如用户在2020-7-21 19:40:20时对数据库jydm做了一个备份,在2020-7-21 20:34:20想将数据库jydm还原到时间点2020-07-21 20:00:03,若用户保证从备份完成的时间点到指定时间点这段时间的归档日志都完好,则通过如下还原命令就能达到预期效果。

下面举例说明
1.在2020-7-21 19:40:20时对数据库jydm进行备份

SQL> backup database full to full_bak_for_arch_restor bakfile '/dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak';
executed successfully
used time: 00:00:07.697. Execute id is 43.

SQL> select * from t1;

LINEID     C1          C2
---------- ----------- -----------
1          1           1
2          2           2
3          3           3
4          4           4
5          5           5
6          6           6

6 rows got

used time: 0.454(ms). Execute id is 97.
SQL> select sysdate from dual;

LINEID     SYSDATE
---------- ---------------------------
1          2020-07-21 20:00:03.165365

used time: 0.994(ms). Execute id is 337.

使用select file_lsn from v$rlog命令查询此时的LSN为:30043605
SQL> select file_lsn from v$rlog;

LINEID     FILE_LSN
---------- --------------------
1          30043605

used time: 1.344(ms). Execute id is 654.

2.删除表t1中的数据

SQL> delete from t1;
affect rows 6

used time: 1.309(ms). Execute id is 681.
SQL> commit;
executed successfully
used time: 33.649(ms). Execute id is 682.
SQL> select * from t1;
no rows

used time: 18.944(ms). Execute id is 696.

3.将数据库还原到指定时间2020-07-21 20:00:03.165365

[root@shard1 oracle]# service DmServicejydm stop
Redirecting to /bin/systemctl stop  DmServicejydm.service

[dmdba@shard1 backup]$ dmrestore ini_path=/dm_home/dmdba/dmdbms/data/jydm/dm.ini file=/dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak archive_dir=/dm_home/dmdba/dmdbms/data/arch time="2020-07-21 20:00:03.165365";
restore V7.1.6.46-Build(2018.02.08-89107)ENT
file dm.key not found, use default license!


backup sig:            BA
backup tool version:   12595
backup db name:        jydm
backup db magic:       1371967312
backup pemnt magic:    1250320462
backup name:           FULL_BAK_FOR_ARCH_RESTOR
backup type:           full
backup level:          online
backup range:          database
backup description:
compressed level:      0
encrypt_type:          0
encrypt_id:            2052
rac node:              0
page check:            0
rlog encrypt:          0
external cipher id:    0
external hash id:      0
length in char:        0
use new hash:          1
backup time:           2020-07-21 19:52:09
page size:             8 KB
extent size:           16
case sensitive:        1
log page size:         512 B
charset:               0
data version:          0x7000A
sys version:           V7.1.6.46-Build(2018.02.08-89107)ENT
enable policy:         0
mpp_timestamp:         1595332328
crc_check:             TRUE
parallel type:         0
parallel info len:     0
backup db fil num:     9
archive flag:          1
backup with log:       Yes
before backup LSN:     30040400
after backup LSN:      30040406


$bak_seq |$file_path                                        |$size(K)       |$used(K)
        1|/dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak|      393216.00|      362036.00


$file_seq |$type|$ts_name       |$state    |$size(K)  |$seq_in_bak    |$off_in_bak(B) |$len_in_bak(B) |$file_path                                        |$mirror_path
         1|DBF  |SYSTEM         |ONLINE    |     23552|              1|          43008|        6766592|/dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF        |
         2|DBF  |ROLL           |ONLINE    |    229376|              1|        6809600|       10887168|/dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF          |
         3|DBF  |MAIN           |ONLINE    |    276480|              1|       17696768|      240287744|/dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF          |
         4|DBF  |BOOKSHOP       |ONLINE    |    153600|              1|      257984512|         933888|/dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF      |
         5|DBF  |DMHR           |ONLINE    |    131072|              1|      258918400|         425984|/dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF          |
         6|DBF  |USERS          |ONLINE    |     51200|              1|      259344384|        1105920|/dm_home/dmdba/dmdbms/data/jydm/users01.dbf       |
         7|DBF  |SYSAUX         |ONLINE    |    179200|              1|      260450304|      110256128|/dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF        |
         8|DBF  |FG_PERSON      |ONLINE    |    131072|              1|      370706432|          16384|/dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF     |
         9|LOG  |ARCHLOG        |ONLINE    |         0|              1|      370722816|           2048|                                                  |

Continue?[Y/N]:Y
can't find useable archive file when search assigned archive directory
restore bak_file: /dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak ...
start restore database...
start restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF(SYSTEM), pages: 826
end restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF(SYSTEM)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF(ROLL), pages: 1329
end restore file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF(ROLL)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF(MAIN), pages: 29332
end restore file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF(MAIN)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF(BOOKSHOP), pages: 114
end restore file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF(BOOKSHOP)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF(DMHR), pages: 52
end restore file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF(DMHR)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf(USERS), pages: 135
end restore file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf(USERS)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF(SYSAUX), pages: 13459
end restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF(SYSAUX)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF(FG_PERSON), pages: 2
end restore file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF(FG_PERSON)
redo tmp arch file: /dm_home/dmdba/dmdbms/backup/RES_TMP_ARCH_20200721200858135_0.log, rpages: 16

end restore database data files.

Apply archive log LSN from 30040407 to 30040406, time used:0.000s.
restore finished, code = 0!

restore successfully!
restore time used: 7652.178(ms)

4.检查表t1的数据是否已经恢复回来了

[root@shard1 oracle]# service DmServicejydm start
Redirecting to /bin/systemctl start  DmServicejydm.service

SQL> select * from t1;

LINEID     C1          C2
---------- ----------- -----------
1          1           1
2          2           2
3          3           3
4          4           4
5          5           5
6          6           6

6 rows got

used time: 0.440(ms). Execute id is 86.

达梦系统使用归档还原,还可以指定还原特定的END_LSN,备份文件中会记录一个备份结束的LSN,如果指定END_LSN,则必须保证该END_LSN大于备份文件中的记录的最后一个LSN,否则会无视该END_LSN,而还原到最新状态,如果同时指定了TIME则会以最早的为标准。

5.上面还原数据库jydm时除了可以指定时间外也可以指定LSN:30043605

[root@shard1 oracle]# service DmServicejydm stop
Redirecting to /bin/systemctl stop  DmServicejydm.service

[dmdba@shard1 backup]$ dmrestore ini_path=/dm_home/dmdba/dmdbms/data/jydm/dm.ini file=/dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak archive_dir=/dm_home/dmdba/dmdbms/data/arch end_lsn=30043605
restore V7.1.6.46-Build(2018.02.08-89107)ENT
file dm.key not found, use default license!


backup sig:            BA
backup tool version:   12595
backup db name:        jydm
backup db magic:       1371967312
backup pemnt magic:    1250320462
backup name:           FULL_BAK_FOR_ARCH_RESTOR
backup type:           full
backup level:          online
backup range:          database
backup description:
compressed level:      0
encrypt_type:          0
encrypt_id:            2052
rac node:              0
page check:            0
rlog encrypt:          0
external cipher id:    0
external hash id:      0
length in char:        0
use new hash:          1
backup time:           2020-07-21 19:52:09
page size:             8 KB
extent size:           16
case sensitive:        1
log page size:         512 B
charset:               0
data version:          0x7000A
sys version:           V7.1.6.46-Build(2018.02.08-89107)ENT
enable policy:         0
mpp_timestamp:         1595332328
crc_check:             TRUE
parallel type:         0
parallel info len:     0
backup db fil num:     9
archive flag:          1
backup with log:       Yes
before backup LSN:     30040400
after backup LSN:      30040406


$bak_seq |$file_path                                        |$size(K)       |$used(K)
        1|/dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak|      393216.00|      362036.00


$file_seq |$type|$ts_name       |$state    |$size(K)  |$seq_in_bak    |$off_in_bak(B) |$len_in_bak(B) |$file_path                                        |$mirror_path
         1|DBF  |SYSTEM         |ONLINE    |     23552|              1|          43008|        6766592|/dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF        |
         2|DBF  |ROLL           |ONLINE    |    229376|              1|        6809600|       10887168|/dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF          |
         3|DBF  |MAIN           |ONLINE    |    276480|              1|       17696768|      240287744|/dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF          |
         4|DBF  |BOOKSHOP       |ONLINE    |    153600|              1|      257984512|         933888|/dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF      |
         5|DBF  |DMHR           |ONLINE    |    131072|              1|      258918400|         425984|/dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF          |
         6|DBF  |USERS          |ONLINE    |     51200|              1|      259344384|        1105920|/dm_home/dmdba/dmdbms/data/jydm/users01.dbf       |
         7|DBF  |SYSAUX         |ONLINE    |    179200|              1|      260450304|      110256128|/dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF        |
         8|DBF  |FG_PERSON      |ONLINE    |    131072|              1|      370706432|          16384|/dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF     |
         9|LOG  |ARCHLOG        |ONLINE    |         0|              1|      370722816|           2048|                                                  |

Continue?[Y/N]:Y
can't find useable archive file when search assigned archive directory
restore bak_file: /dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak ...
start restore database...
start restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF(SYSTEM), pages: 826
end restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF(SYSTEM)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF(ROLL), pages: 1329
end restore file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF(ROLL)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF(MAIN), pages: 29332
end restore file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF(MAIN)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF(BOOKSHOP), pages: 114
end restore file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF(BOOKSHOP)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF(DMHR), pages: 52
end restore file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF(DMHR)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf(USERS), pages: 135
end restore file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf(USERS)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF(SYSAUX), pages: 13459
end restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF(SYSAUX)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF(FG_PERSON), pages: 2
end restore file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF(FG_PERSON)
redo tmp arch file: /dm_home/dmdba/dmdbms/backup/RES_TMP_ARCH_20200721201304925_0.log, rpages: 16

end restore database data files.

Apply archive log LSN from 30040407 to 30040406, time used:0.000s.
restore finished, code = 0!

restore successfully!
restore time used: 7764.389(ms)

6.检查表t1的数据是否已经恢复回来了

[root@shard1 oracle]# service DmServicejydm start
Redirecting to /bin/systemctl start  DmServicejydm.service

SQL> select * from t1;

LINEID     C1          C2
---------- ----------- -----------
1          1           1
2          2           2
3          3           3
4          4           4
5          5           5
6          6           6

6 rows got

used time: 0.445(ms). Execute id is 47.

可以看到指定时间或LSN可以达到同样的效果。

DM7使用dmrestore工具利用归档日志还原

使用dmrestore工具利用归档日志还原
利用备份文件,DM可以将数据库、表空间和表还原到备份时的状态。但用户可能更希望将数据还原到最新的状态。这点不用担心,事实上系统足够智能,在利用备份完成还原后,会去归档目录搜索归档日志,并分析归档日志是否与还原的数据库匹配,若存在匹配的归档日志,则系统会重做这部分日志,将数据库还原到最新的状态;若没有可用的归档日志,则只能还原到备份时的状态。

利用指定归档目录下归档日志还原数据库jydm

1.对数据库jydm执行完全备份

SQL> backup database full to full_bak_for_arch_restor bakfile '/dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak';
executed successfully
used time: 00:00:25.113. Execute id is 977781.

SQL> select * from t1;

LINEID     C1          C2
---------- ----------- -----------
1          1           1
2          2           2
3          3           3
4          4           4
5          5           5

used time: 0.744(ms). Execute id is 977816.
SQL> insert into t1 values(6,6);
affect rows 1

used time: 49.901(ms). Execute id is 977842.
SQL> commit;
executed successfully
used time: 21.340(ms). Execute id is 977845.
SQL> select * from t1;

LINEID     C1          C2
---------- ----------- -----------
1          1           1
2          2           2
3          3           3
4          4           4
5          5           5
6          6           6

6 rows got

used time: 25.205(ms). Execute id is 977846.

2.异常终止数据库实例

[root@shard1 oracle]# ps -ef | grep dmserver
dmdba     3129     1  4 19:51 ?        00:00:02 /dm_home/dmdba/dmdbms/bin/dmserver /dm_home/dmdba/dmdbms/data/jydm/dm.ini -noconsole
root      3371 32007  0 19:52 pts/9    00:00:00 grep --color=auto dmserver
[root@shard1 oracle]# kill -9 3129
[root@shard1 oracle]# ps -ef | grep dmserver
root      3532 32007  0 19:53 pts/9    00:00:00 grep --color=auto dmserver

3.执行还原

[dmdba@shard1 backup]$ dmrestore ini_path=/dm_home/dmdba/dmdbms/data/jydm/dm.ini file=/dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak archive_dir=/dm_home/dmdba/dmdbms/data/arch
restore V7.1.6.46-Build(2018.02.08-89107)ENT
file dm.key not found, use default license!


backup sig:            BA
backup tool version:   12595
backup db name:        jydm
backup db magic:       1371967312
backup pemnt magic:    1250320462
backup name:           FULL_BAK_FOR_ARCH_RESTOR
backup type:           full
backup level:          online
backup range:          database
backup description:
compressed level:      0
encrypt_type:          0
encrypt_id:            2052
rac node:              0
page check:            0
rlog encrypt:          0
external cipher id:    0
external hash id:      0
length in char:        0
use new hash:          1
backup time:           2020-07-21 19:52:09
page size:             8 KB
extent size:           16
case sensitive:        1
log page size:         512 B
charset:               0
data version:          0x7000A
sys version:           V7.1.6.46-Build(2018.02.08-89107)ENT
enable policy:         0
mpp_timestamp:         1595332328
crc_check:             TRUE
parallel type:         0
parallel info len:     0
backup db fil num:     9
archive flag:          1
backup with log:       Yes
before backup LSN:     30040400
after backup LSN:      30040406


$bak_seq |$file_path                                        |$size(K)       |$used(K)
        1|/dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak|      393216.00|      362036.00


$file_seq |$type|$ts_name       |$state    |$size(K)  |$seq_in_bak    |$off_in_bak(B) |$len_in_bak(B) |$file_path                                        |$mirror_path
         1|DBF  |SYSTEM         |ONLINE    |     23552|              1|          43008|        6766592|/dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF        |
         2|DBF  |ROLL           |ONLINE    |    229376|              1|        6809600|       10887168|/dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF          |
         3|DBF  |MAIN           |ONLINE    |    276480|              1|       17696768|      240287744|/dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF          |
         4|DBF  |BOOKSHOP       |ONLINE    |    153600|              1|      257984512|         933888|/dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF      |
         5|DBF  |DMHR           |ONLINE    |    131072|              1|      258918400|         425984|/dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF          |
         6|DBF  |USERS          |ONLINE    |     51200|              1|      259344384|        1105920|/dm_home/dmdba/dmdbms/data/jydm/users01.dbf       |
         7|DBF  |SYSAUX         |ONLINE    |    179200|              1|      260450304|      110256128|/dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF        |
         8|DBF  |FG_PERSON      |ONLINE    |    131072|              1|      370706432|          16384|/dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF     |
         9|LOG  |ARCHLOG        |ONLINE    |         0|              1|      370722816|           2048|                                                  |

Continue?[Y/N]:Y
can't find useable archive file when search assigned archive directory
restore bak_file: /dm_home/dmdba/dmdbms/backup/full_bak_for_arch_restor.bak ...
start restore database...
start restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF(SYSTEM), pages: 826
end restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF(SYSTEM)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF(ROLL), pages: 1329
end restore file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF(ROLL)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF(MAIN), pages: 29332
end restore file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF(MAIN)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF(BOOKSHOP), pages: 114
end restore file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF(BOOKSHOP)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF(DMHR), pages: 52
end restore file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF(DMHR)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf(USERS), pages: 135
end restore file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf(USERS)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF(SYSAUX), pages: 13459
end restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF(SYSAUX)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF(FG_PERSON), pages: 2
end restore file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF(FG_PERSON)
redo tmp arch file: /dm_home/dmdba/dmdbms/backup/RES_TMP_ARCH_20200721195311007_0.log, rpages: 16

end restore database data files.

Apply archive log LSN from 30040407 to 30040406, time used:0.000s.
restore finished, code = 0!

restore successfully!
restore time used: 8601.260(ms)

4.验证数据

SQL> select * from t1;

LINEID     C1          C2
---------- ----------- -----------
1          1           1
2          2           2
3          3           3
4          4           4
5          5           5
6          6           6

6 rows got

used time: 0.454(ms). Execute id is 97.

DM7使用dmrestore工具还原数据库

使用dmrestore工具还原数据库
1. 概述
DM支持利用还原工具对数据库进行还原。根据不同备份类型,包括联机备份、脱机备份、完全备份以及增量备份,还原工具选择不同的还原策略实现恢复用户数据的目的。首先讨论联机备份与脱机备份,脱机备份仅包含数据页文件的内容,而联机备份文件除了包含数据页文件内容以外,可能还包括备份过程中产生的日志文件内容。因此在利用联机备份还原时,除了拷贝数据页至数据库文件以外,可能还需要重做备份的日志文件内容,达到还原数据库的目的。在还原联机库备份且不带日志的备份时,需要用户指定归档目录,由用户保证备份期间的归档日志存在且完好,在还原库时,需要重做该日志。如果日志不存在,则备份文件就无效,报错归档日志错误。

接下来讨论完全备份与增量备份,对于增量备份,还原工具会根据用户提供备份的信息搜集它的基础备份,若基础备份仍然为增量备份,则工具会继续搜集,直至搜集到一个类型为完全备份的基础备份为止。因此在这个过程中,工具会构造一个基础备份链表,备份链表基于备份间的依赖关系组织。比如,备份A是备份B的增量备份,则可以说A依赖于B。若用户首先进行了一次完全备份A,然后在A的基础上做了增量备份B,随后基于增量备份B又做了增量备份C,最后基于增量备份C做了增量备份D。那么此时利用增量备份D还原数据库时,系统搜集到得备份链表如30.1所示,执行还原时,首先利用完全备份恢复A进行还原,然后依次利用增量备份B,C和D还原,最终完成整个还原过程。需要说明的是,若备份类型为B树备份的数据库备份是不存在增量备份的。

脱机库还原支持无备份文件的还原,原理就是利用归档文件,在目标库上执行REDO操作,把库还原到指定的时间点或者LSN。限制条件是,
1)目标库和归档必须是源自同一个库;2)必须保证源库的归档是完整,否则会出现不可预知的错误,即要保证备份之后产生的归档是完整的。要利用归档还原,需要利用备份文件还原一个目标库,修改目标库db_magic和源库中归档文件的db_magic一致。然后就可以执行还原操作了。库db_magic的修改可以使用dmmdf工具。
dmmdf工具的用法如下:

dmmdf KEYWORD=value

在Windows“命令提示符”窗口中输入带参数的dmmdf命令启动该工具,参数说明见

[dmdba@shard1 dmdbms]$ dmmdf help
Format:  ./dmmdf KEYWORD=value

Example: ./dmmdf TYPE=1 FILE=/opt/data/DAMENG/SYSTEM.DBF

Keyword            Explanation
--------------------------------------------------------------------------------
TYPE                type
                    1: for dbf
                    2: for rlog
                    3: for original bak
                    4: for bakset meta
                    5: for bakset bkp
                    6: for bakset
                    7: batch modify db_magic for arch file
                    8: for database degrades
                    9:batch modify crc_check for DB specified by dm.ini.
                    10:batch modify crc_check for archive log in archive directory.
FILE                file path
DCR_INI             dmdcr.ini path
DB_MAGIC_SRC        db_magic_src,for TYPE=7 and 10
DB_MAGIC_DST        db_magic_dst,for TYPE=7
CRC_CHECK           crc_check,for TYPE=9 and 10
HELP                show this help info

--------------------------------------------------
Example: ./dmmdf TYPE=1 FILE=/opt/data/DAMENG/SYSTEM.dbf
         ./dmmdf TYPE=2 FILE=/opt/data/DAMENG/DAMENG01.log
         ./dmmdf TYPE=3 FILE=/opt/data/DAMENG/bak/dmdb.bak
         ./dmmdf TYPE=4 FILE=/opt/data/DAMENG/bak/bset/nbak.meta
         ./dmmdf TYPE=5 FILE=/opt/data/DAMENG/bak/bset/nbak.bak
         ./dmmdf TYPE=6 FILE=/opt/data/DAMENG/bak/bset
         ./dmmdf TYPE=7 FILE=/opt/data/DAMENG/arch DB_MAGIC_SRC=4734373 DB_MAGIC_DST=4734366
         ./dmmdf TYPE=8 FILE=/opt/data/DAMENG/dm.ctl
         ./dmmdf TYPE=9 FILE=/opt/data/DAMENG/dm.ini,CRC_CHECK=1
         ./dmmdf TYPE=10 FILE=/opt/data/DAMENG/arch,CRC_CHECK=0,DB_MAGIC_SRC=4734373

使用说明:
dmmdf工具可以修改TYPE中指定的文件中的信息,例如db_magic。
DMRESTORE还原工具的用法如下:

DMRESTORE KEYWORD=value 或KEYWORD=(value1,value2,...,valueN)

确认DM数据库服务器已停止后,在Windows“命令提示符”窗口中输入带参数的DMRESTORE命令启动该工具。

[dmdba@shard1 dmdbms]$ dmrestore help
Format: DMRESTORE  KEYWORD=value or KEYWORD=(value1,value2,...,valueN)

Eg: DMRESTORE  INI_PATH=/opt/dm7data/dameng/dm.ini FILE=/opt/dm7data/backup/test.bak

Imperative Argument: FILE

Keyword             explain(default value)
--------------------------------------------------------------------------------
INI_PATH            the path of the dmserver's dm.ini file
FILE                backup file
MAPPED_FIL              the path of mapped file, when res_type assign 4.
TIME                the timestamp of be going to recover
ARCHIVE_DIR         the directory at backup, Format (dir1,dir2,dir3,...)
BACKUP_DIR          the stored path of backup file, be used to search backup file, Format (dir1,dir2,dir3,...)
DATAFIL_PATH        the file path at the recovery, Format (id1,path1,id2,path2,id3,path3,...)
MIRROR_PATH         the mirror file path at the recovery, Format (id1,path1,id2,path2,id3,path3,...)
PARALLEL_DIR        the full path of parallel mapping file
RES_TYPE            restore type(0,1,2,3,4), 0: bakfil restore, 1: bakfil show, 2: archfil restore, 3: step increment restore, 4:output mapped file default(0)
END_LSN             restore to end_lsn
LOG                 restore output log file
DUMMY               quiet mode, {(Y)es,(N)o} default:No
PASSWORD            restore with password
ENCRYPT_NAME        restore decrypt with encrypt name
HELP                output help info

INI_PATH:配置文件路径,最大长度为256字节,可选参数

FILE:用于还原的备份文件完整路径,必选参数

MAPPED_FIL:当指定res_type为4时,输出备份文件的映射信息到该文件;如果指定res_type为0或3时,则还原时,会采用MAPPED_FIL文件中的data_path和mirror_path路径为准(如果用户希望使用相对路径策略还原,请删除相关的组,同时修改要修改的data_path和mirror_path)。此外,如果指定MAPPED_FIL参数,则本工具中datafil_path和mirror_path参数会失效;反之,则生效,可选参数

TIME:指定还原的时间点和指定还原的LSN,需要配合ARCHIVE_DIR使用,若指定了ARCHIVE_DIR,既没有指定TIME和END_LSN则会重做所有的归档;如果指定了某一个则会还原到指定的TIME或者LSN;如果都指定了,则会还原到早的一个时间点(或者LSN);如果指定END_LSN为1,则表示还原到备份的时候,不会redo归档,可选参数

END_LSN:指定还原的时间点和指定还原的LSN,需要配合ARCHIVE_DIR使用,若指定了ARCHIVE_DIR,既没有指定TIME和END_LSN则会重做所有的归档;如果指定了某一个则会还原到指定的TIME或者LSN;如果都指定了,则会还原到早的一个时间点(或者LSN);如果指定END_LSN为1,则表示还原到备份的时候,不会redo归档,可选参数。

BACKUP_DIR:备份文件存放路径,用于搜索备份文件(默认会搜索备份文件所在的目录,以及库的默认备份目录),可选参数

ARCHIVE_DIR:归档日志存放的目录,可以指定1~8个。在还原联机库备份且不带日志(WITHOUT LOG)的备份文件时,ARCHIVE_DIR为必选参数,可选参数。

DATAFIL_PATH:指定还原后的新文件路径([编号,路径],……,[编号,路径])。编号与路径成对出现,最多可以指定16个。编号为大于0的整数。MAPPED_FIL优先,可选参数。

PARALLEL_DIR:并行映射文件存放路径,用于搜索映射文件,可选参数

SHOW_BAK_INFO:可选值(0,1,2)0:表示利用备份还原;1:仅显示备份信息,不进行还原;2:表示使用归档日志进行还原;默认值为0。该参数已被RES_TYPE取代,为兼容之前版本,暂时保留。如果同时指定RES_TYPE和SHOW_BAK_INFO,则RES_TYPE有效,SHOW_BAK_INFO无效,可选参数。

RES_TYPE:可选值(0,1,2,3,4)0:表示利用备份还原;1:仅显示备份信息,不进行还原;2:表示使用归档日志进行还原;3:仅还原单个完全备份或者增量备份;4:仅仅输出备份文件映射信息到文件。默认值为0,可选参数。

MIRROR_PATH:指定备份库中的镜像文件路径在还原时的映射路径。([编号,路径],……,[编号,路径])。编号与路径成对出现,最多可以指定16个。编号为大于0的整数,映射路径绝对路径。MAPPED_FIL优先,可选参数。

LOG:指定一个文件,还原时日志会写入该文件,可选参数。

DUMMY:静默模式,可以指定{(Y)es,(N)o}。默认No。交互信息处理: 打印(P)。Y:打印所有交互信息。N:不打印交互信息。可选参数。

PASSWORD:还原时,指定备份时的加密密码

ENCRYPT_NAME:还原时用来解密的算法名。缺省算法为AES256_CFB

HELP:打印帮助信息

若设置SHOW_BAK_INFO参数为1,则不需要利用备份进行还原操作,可以不指定INI_PATH;指定了BACKUP_DIR参数时,则会收集备份目录下的所有的备份,并分组输出;如果指定了FILE,且该备份文件是增量备份,则会收集增量备份相关的所有备份输出。

数据库还原时,如果需要重做的日志量较大,将INI参数BUFFER适当设大,可以提高还原的性能。

2. 使用备份文件还原
例如,利用备份文件/dm_home/dmdba/dmdbms/data/jydm/bak/DB_jydm_20200711192046000434.bak还原数据库

[dmdba@shard1 backup]$ dmrestore ini_path=/dm_home/dmdba/dmdbms/data/jydm/dm.ini file=/dm_home/dmdba/dmdbms/data/jydm/bak/DB_jydm_20200711192046000434.bak
restore V7.1.6.46-Build(2018.02.08-89107)ENT
file dm.key not found, use default license!


backup sig:            BA
backup tool version:   12595
backup db name:        jydm
backup db magic:       -82313077
backup pemnt magic:    1250320462
backup name:           jydm
backup type:           full
backup level:          offline
backup range:          database
backup description:
compressed level:      0
encrypt_type:          0
encrypt_id:            2052
rac node:              0
page check:            0
rlog encrypt:          0
external cipher id:    0
external hash id:      0
length in char:        0
use new hash:          1
backup time:           2020-07-11 19:20:46
page size:             8 KB
extent size:           16
case sensitive:        1
log page size:         512 B
charset:               0
data version:          0x7000A
sys version:           V7.1.6.46-Build(2018.02.08-89107)ENT
enable policy:         0
mpp_timestamp:         0
crc_check:             TRUE
parallel type:         0
parallel info len:     0
backup db fil num:     8
archive flag:          1
after backup LSN:      27830642


$bak_seq |$file_path                                        |$size(K)       |$used(K)
        1|/dm_home/dmdba/dmdbms/data/jydm/bak/DB_jydm_20200711192046000434.bak|      294912.00|      284866.00


$file_seq |$type|$ts_name       |$state    |$size(K)  |$seq_in_bak    |$off_in_bak(B) |$len_in_bak(B) |$file_path                                        |$mirror_path
         1|DBF  |SYSTEM         |ONLINE    |     23552|              1|          43008|        6766592|/dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF        |
         2|DBF  |ROLL           |ONLINE    |    229376|              1|        6809600|         401408|/dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF          |
         3|DBF  |MAIN           |ONLINE    |    210944|              1|        7211008|      171753472|/dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF          |
         4|DBF  |BOOKSHOP       |ONLINE    |    153600|              1|      178964480|         933888|/dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF      |
         5|DBF  |DMHR           |ONLINE    |    131072|              1|      179898368|         425984|/dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF          |
         6|DBF  |USERS          |ONLINE    |     51200|              1|      180324352|        1105920|/dm_home/dmdba/dmdbms/data/jydm/users01.dbf       |
         7|DBF  |SYSAUX         |ONLINE    |    179200|              1|      181430272|      110256128|/dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF        |
         8|DBF  |FG_PERSON      |ONLINE    |    131072|              1|      291686400|          16384|/dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF     |

Continue?[Y/N]:Y
restore bak_file: /dm_home/dmdba/dmdbms/data/jydm/bak/DB_jydm_20200711192046000434.bak ...
start restore database...
start restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF(SYSTEM), pages: 826
end restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF(SYSTEM)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF(ROLL), pages: 49
end restore file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF(ROLL)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF(MAIN), pages: 20966
end restore file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF(MAIN)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF(BOOKSHOP), pages: 114
end restore file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF(BOOKSHOP)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF(DMHR), pages: 52
end restore file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF(DMHR)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf(USERS), pages: 135
end restore file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf(USERS)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF(SYSAUX), pages: 13459
end restore file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF(SYSAUX)
start restore file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF(FG_PERSON), pages: 2
end restore file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF(FG_PERSON)
end restore database data files.

Apply archive log LSN from 27830643 to 27830642, time used:0.000s.
restore finished, code = 0!

restore successfully!
restore time used: 7144.214(ms)



例如,利用归档文件/dm_home/dmdbms/backup/arch还原数据库,这里将使用备份文件还原新的目标库
1.先将原备份库的备份文件和归档文件复制到新还原库的主机上

[dmdba@shard1 backup]$ scp  -r /dm_home/dmdba/dmdbms/data/jydm/bak/DB_jydm_20200711192046000434.bak  dmdba@10.138.130.187:/dm_home/dmdbms/backup/
dmdba@10.138.130.187's password:
DB_jydm_20200711192046000434.bak                                                                                                                                                                          100%  288MB  96.0MB/s   00:03
[dmdba@shard1 backup]$ scp  -r /dm_home/dmdba/dmdbms/data/arch  dmdba@10.138.130.187:/dm_home/dmdbms/backup/
dmdba@10.138.130.187's password:
ARCHIVE_LOCAL1_20200603195207512_0.log                                                                                                                                                                    100%   84MB  21.0MB/s   00:04
ARCHIVE_LOCAL1_20200606020009584_0.log                                                                                                                                                                    100% 6588KB   6.4MB/s   00:00
ARCHIVE_LOCAL1_20200606061513930_0.log                                                                                                                                                                    100%   24KB  24.0KB/s   00:00
ARCHIVE_LOCAL1_20200606062617837_0.log                                                                                                                                                                    100% 7168     7.0KB/s   00:00
ARCHIVE_LOCAL1_20200606062943852_0.log                                                                                                                                                                    100%  300MB 100.0MB/s   00:03
ARCHIVE_LOCAL1_20200606142842948_0.log                                                                                                                                                                    100%  300MB 100.0MB/s   00:03
ARCHIVE_LOCAL1_20200606142846352_0.log                                                                                                                                                                    100%  300MB 100.0MB/s   00:03
ARCHIVE_LOCAL1_20200606142902741_0.log                                                                                                                                                                    100%  300MB  33.3MB/s   00:09
ARCHIVE_LOCAL1_20200606142909259_0.log                                                                                                                                                                    100%  300MB 150.0MB/s   00:02
ARCHIVE_LOCAL1_20200606220653158_0.log                                                                                                                                                                    100%  300MB  50.0MB/s   00:06
ARCHIVE_LOCAL1_20200613210000757_0.log                                                                                                                                                                    100%  300MB  14.3MB/s   00:21
ARCHIVE_LOCAL1_20200617093523748_0.log                                                                                                                                                                    100%   32MB   7.9MB/s   00:04
ARCHIVE_LOCAL1_20200617161801000_0.log                                                                                                                                                                    100% 3926KB   3.8MB/s   00:00
ARCHIVE_LOCAL1_20200617170101954_0.log                                                                                                                                                                    100% 1464KB   1.4MB/s   00:00
ARCHIVE_LOCAL1_20200617173005734_0.log                                                                                                                                                                    100% 8583KB   8.4MB/s   00:01
ARCHIVE_LOCAL1_20200617190859140_0.log                                                                                                                                                                    100%   20MB  20.1MB/s   00:01
ARCHIVE_LOCAL1_20200622160035411_0.log                                                                                                                                                                    100%  220KB 220.0KB/s   00:00
ARCHIVE_LOCAL1_20200623172303743_0.log                                                                                                                                                                    100%  300MB  11.1MB/s   00:27
ARCHIVE_LOCAL1_20200624180051432_0.log                                                                                                                                                                    100%  300MB  10.7MB/s   00:28
ARCHIVE_LOCAL1_20200626193023317_0.log                                                                                                                                                                    100%  300MB  10.7MB/s   00:28
ARCHIVE_LOCAL1_20200630024319628_0.log                                                                                                                                                                    100%   47MB   9.5MB/s   00:05
ARCHIVE_LOCAL1_20200630173436447_0.log                                                                                                                                                                    100%   39MB   9.6MB/s   00:04
ARCHIVE_LOCAL1_20200706091427214_0.log                                                                                                                                                                    100%  300MB   9.7MB/s   00:31
ARCHIVE_LOCAL1_20200710110030273_0.log                                                                                                                                                                    100%  113MB   8.7MB/s   00:13
ARCHIVE_LOCAL1_20200606062454805_0.log                                                                                                                                                                    100% 7680     7.5KB/s   00:00
ARCHIVE_LOCAL1_20200606062942967_0.log                                                                                                                                                                    100% 7680     7.5KB/s   00:00
ARCHIVE_LOCAL1_20200606064235117_0.log                                                                                                                                                                    100%   16KB  15.5KB/s   00:00
ARCHIVE_LOCAL1_20200606142853068_0.log                                                                                                                                                                    100%  300MB  10.0MB/s   00:30
ARCHIVE_LOCAL1_20200606142906087_0.log                                                                                                                                                                    100%  300MB  23.1MB/s   00:13
ARCHIVE_LOCAL1_20200606142912805_0.log                                                                                                                                                                    100% 5120     5.0KB/s   00:00
ARCHIVE_LOCAL1_20200617193955110_0.log                                                                                                                                                                    100%   83MB  10.4MB/s   00:08
ARCHIVE_LOCAL1_20200622160200765_0.log                                                                                                                                                                    100%  234KB 234.0KB/s   00:00
ARCHIVE_LOCAL1_20200711193829081_0.log                                                                                                                                                                    100%  300MB  13.6MB/s   00:22
[dmdba@shard1 backup]$

[dmdba@dmks backup]$ ls -lrt

drwxr-xr-x. 2 dmdba dinstall      4096 7月  11 19:47 arch
-rw-r--r--. 1 dmdba dinstall  33554432 7月  11 19:50 DB_dmks_FULL_2020_07_11_19_50_30.bak

2.使用原备份库还原新库

[dmdba@dmks backup]$ dmrestore ini_path=/dm_home/dmdbms/data/dameng_for_recover/dm.ini file=/dm_home/dmdbms/backup/DB_jydm_20200711192046000434.bak
restore V7.1.6.46-Build(2018.02.08-89107)ENT
file dm.key not found, use default license!


backup sig:            BA
backup tool version:   12595
backup db name:        jydm
backup db magic:       -82313077
backup pemnt magic:    1250320462
backup name:           jydm
backup type:           full
backup level:          offline
backup range:          database
backup description:
compressed level:      0
encrypt_type:          0
encrypt_id:            2052
rac node:              0
page check:            0
rlog encrypt:          0
external cipher id:    0
external hash id:      0
length in char:        0
use new hash:          1
backup time:           2020-07-11 19:20:46
page size:             8 KB
extent size:           16
case sensitive:        1
log page size:         512 B
charset:               0
data version:          0x7000A
sys version:           V7.1.6.46-Build(2018.02.08-89107)ENT
enable policy:         0
mpp_timestamp:         0
crc_check:             TRUE
parallel type:         0
parallel info len:     0
backup db fil num:     8
archive flag:          1
after backup LSN:      27830642


$bak_seq |$file_path                                        |$size(K)       |$used(K)
        1|/dm_home/dmdbms/backup/DB_jydm_20200711192046000434.bak|      294912.00|      284866.00


$file_seq |$type|$ts_name       |$state    |$size(K)  |$seq_in_bak    |$off_in_bak(B) |$len_in_bak(B) |$file_path                                        |$mirror_path
         1|DBF  |SYSTEM         |ONLINE    |     23552|              1|          43008|        6766592|/dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF        |
         2|DBF  |ROLL           |ONLINE    |    229376|              1|        6809600|         401408|/dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF          |
         3|DBF  |MAIN           |ONLINE    |    210944|              1|        7211008|      171753472|/dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF          |
         4|DBF  |BOOKSHOP       |ONLINE    |    153600|              1|      178964480|         933888|/dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF      |
         5|DBF  |DMHR           |ONLINE    |    131072|              1|      179898368|         425984|/dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF          |
         6|DBF  |USERS          |ONLINE    |     51200|              1|      180324352|        1105920|/dm_home/dmdba/dmdbms/data/jydm/users01.dbf       |
         7|DBF  |SYSAUX         |ONLINE    |    179200|              1|      181430272|      110256128|/dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF        |
         8|DBF  |FG_PERSON      |ONLINE    |    131072|              1|      291686400|          16384|/dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF     |

Continue?[Y/N]:Y
Warning: Backup file may has been modified !

Continue?[Y/N]:Y
restore bak_file: /dm_home/dmdbms/backup/DB_jydm_20200711192046000434.bak ...
start restore database...
start restore file: /dm_home/dmdbms/data/dameng_for_recover/SYSTEM.DBF(SYSTEM), pages: 826
end restore file: /dm_home/dmdbms/data/dameng_for_recover/SYSTEM.DBF(SYSTEM)
start restore file: /dm_home/dmdbms/data/dameng_for_recover/ROLL.DBF(ROLL), pages: 49
end restore file: /dm_home/dmdbms/data/dameng_for_recover/ROLL.DBF(ROLL)
start restore file: /dm_home/dmdbms/data/dameng_for_recover/MAIN.DBF(MAIN), pages: 20966
end restore file: /dm_home/dmdbms/data/dameng_for_recover/MAIN.DBF(MAIN)
start restore file: /dm_home/dmdbms/data/dameng_for_recover/BOOKSHOP.DBF(BOOKSHOP), pages: 114
end restore file: /dm_home/dmdbms/data/dameng_for_recover/BOOKSHOP.DBF(BOOKSHOP)
start restore file: /dm_home/dmdbms/data/dameng_for_recover/DMHR.DBF(DMHR), pages: 52
end restore file: /dm_home/dmdbms/data/dameng_for_recover/DMHR.DBF(DMHR)
start restore file: /dm_home/dmdbms/data/dameng_for_recover/users01.dbf(USERS), pages: 135
end restore file: /dm_home/dmdbms/data/dameng_for_recover/users01.dbf(USERS)
start restore file: /dm_home/dmdbms/data/dameng_for_recover/SYSAWR.DBF(SYSAUX), pages: 13459
end restore file: /dm_home/dmdbms/data/dameng_for_recover/SYSAWR.DBF(SYSAUX)
start restore file: /dm_home/dmdbms/data/dameng_for_recover/FG_PERSON.DBF(FG_PERSON), pages: 2
end restore file: /dm_home/dmdbms/data/dameng_for_recover/FG_PERSON.DBF(FG_PERSON)
end restore database data files.

Apply archive log LSN from 27830643 to 27830642, time used:0.000s.
restore finished, code = 0!

restore successfully!
restore time used: 44867.245(ms)

使用备份文件还原数据库归档日志LSN为27830643
3.使用dmmdbf工具查看原备份库中的db_magic为1371967312

[dmdba@shard1 backup]$ dmmdf type=1 file=/dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF
dmmdf V7.1.6.46-Build(2018.02.08-89107)ENT
**********************************************************
1 db_magic=1371967312
2 next_trxid=3377415
3 pemnt_magic=1250320462
**********************************************************
Please input which parameter you want to change(1-3), q to quit: q

4.使用dmmdf工具查看目标库的system.dbf的db_magic并进行修改1371967312

[dmdba@dmks dameng_for_recover]$ dmmdf type=1 file=/dm_home/dmdbms/data/dameng_for_recover/SYSTEM.DBF
dmmdf V7.1.6.46-Build(2018.02.08-89107)ENT
**********************************************************
1 db_magic=-82313077
2 next_trxid=3377415
3 pemnt_magic=1250320462
**********************************************************
Please input which parameter you want to change(1-3), q to quit: 1
Please input new value: 1371967312
**********************************************************
1 db_magic=1371967312
2 next_trxid=3377415
3 pemnt_magic=1250320462
**********************************************************
Do you want to save the change to file (y/n): y
Save to file success!

5.使用dmmdf工具查看目标库的dameng_for_recover01.log和dameng_for_recover02.log的db_magic并进行修改-82313077

[dmdba@dmks dameng_for_recover]$ dmmdf type=2 file=/dm_home/dmdbms/data/dameng_for_recover/dameng_for_recover01.log
dmmdf V7.1.6.46-Build(2018.02.08-89107)ENT
**********************************************************
1 sig = DMRLOG
2 ver = 7004
3 chksum = 0
4 dbversion = 0x7000a
5 sta = 0
6 n_magic = 35
7 db_magic = -82313077
8 clsn_fil = 0
10 next_seq = 304
11 arch_seq = 0
12 len = 268435456
13 free = 4096
14 clsn = 27830642
15 clsn_off = 4096
16 arch_lsn = 0
17 pemnt_magic = 1250320462
18 fil_id = 0
19 crc_check = 1
**********************************************************
You can only reset sta(5) or db_magic (7) or clsn (14) or pemnt_magic(17) or fil_id(18).
Please input the num which one you want to change, q to quit: 7
Input the new value: 1371967312
**********************************************************
1 sig = DMRLOG
2 ver = 7004
3 chksum = 0
4 dbversion = 0x7000a
5 sta = 0
6 n_magic = 35
7 db_magic = 1371967312
8 clsn_fil = 0
10 next_seq = 304
11 arch_seq = 0
12 len = 268435456
13 free = 4096
14 clsn = 27830642
15 clsn_off = 4096
16 arch_lsn = 0
17 pemnt_magic = 1250320462
18 fil_id = 0
19 crc_check = 1
**********************************************************
Do you want to quit and save the change to file (y/n): y
Save to file success!
[dmdba@dmks dameng_for_recover]$ dmmdf type=2 file=/dm_home/dmdbms/data/dameng_for_recover/dameng_for_recover02.log
dmmdf V7.1.6.46-Build(2018.02.08-89107)ENT
**********************************************************
1 sig = DMRLOG
2 ver = 7004
3 chksum = 0
4 dbversion = 0x7000a
5 sta = 0
6 n_magic = 35
7 db_magic = -82313077
8 clsn_fil = 0
10 next_seq = 0
11 arch_seq = 0
12 len = 268435456
13 free = 4096
14 clsn = 0
15 clsn_off = 0
16 arch_lsn = 0
17 pemnt_magic = 1250320462
18 fil_id = 1
19 crc_check = 1
**********************************************************
You can only reset sta(5) or db_magic (7) or clsn (14) or pemnt_magic(17) or fil_id(18).
Please input the num which one you want to change, q to quit: 7
Input the new value: 1371967312
**********************************************************
1 sig = DMRLOG
2 ver = 7004
3 chksum = 0
4 dbversion = 0x7000a
5 sta = 0
6 n_magic = 35
7 db_magic = 1371967312
8 clsn_fil = 0
10 next_seq = 0
11 arch_seq = 0
12 len = 268435456
13 free = 4096
14 clsn = 0
15 clsn_off = 0
16 arch_lsn = 0
17 pemnt_magic = 1250320462
18 fil_id = 1
19 crc_check = 1
**********************************************************
Do you want to quit and save the change to file (y/n): y
Save to file success!

6.使用归档文件还原数据库

[dmdba@dmks backup]$ dmrestore ini_path=/dm_home/dmdbms/data/dameng_for_recover/dm.ini archive_dir=(/dm_home/dmdbms/backup/arch) show_bak_info=2
-bash: syntax error near unexpected token `('

[dmdba@dmks backup]$ dmrestore ini_path=/dm_home/dmdbms/data/dameng_for_recover/dm.ini archive_dir=\(/dm_home/dmdbms/backup/arch\) show_bak_info=2
restore V7.1.6.46-Build(2018.02.08-89107)ENT
file dm.key not found, use default license!

Continue?[Y/N]:Y
try to apply archive log from LSN: 27830642 to LSN: 9223372036854775807.

Apply archive log LSN from 27830643 to 27832982, time used:2.811s.

restore successfully!
restore time used: 3840.401(ms)
[dmdba@dmks backup]$

使用归档文件还原数据库归档日志LSN从27830643(因为使用数据库备份文件还原数据库时LSN27830643)为应用到了27832982。

7.启动恢复目标库

[root@dmks init.d]# service DmServicedmrc start
Starting DmServicedmrc: [ OK ]

[dmdba@dmks dameng_for_recover]$ cat dm.ini | grep PORT_NUM
                PORT_NUM                        =  5336                 #Port number on which the database server will listen
                DCP_PORT_NUM                    =  5237                 #Port number on which DCP will listen
[dmdba@dmks dameng_for_recover]$ disql sysdba/xxzx7817600@localhost:5336

Server[localhost:5336]:mode is normal, state is open
login used time: 19.135(ms)
disql V7.1.6.46-Build(2018.02.08-89107)ENT
Connected to: DM 7.1.6.46
SQL> select * from t1;

LINEID     C1          C2
---------- ----------- -----------
1          1           1
2          2           2
3          3           3
4          4           4
5          5           5

used time: 1.767(ms). Execute id is 4.
SQL> select * from t1;

LINEID     C1          C2
---------- ----------- -----------
1          1           1
2          2           2
3          3           3
4          4           4
5          5           5

used time: 16.368(ms). Execute id is 4733.

原库

SQL> select * from t1;

LINEID     C1          C2
---------- ----------- -----------
1          1           1
2          2           2
3          3           3
4          4           4
5          5           5

used time: 16.368(ms). Execute id is 4733.

DM7使用脱机工具dmbackup进行数据库备份

使用脱机工具dmbackup进行数据库备份,语法如下:

DMBACKUP KEYWORD=value

确认DM数据库服务器已停止后,在Windows“命令提示符”窗口中输入带参数的DMBACKUP命令启动该工具,参数说明见下表。

[dmdba@shard1 dmdbms]$ dmbackup help
Format:  ./dmbackup  KEYWORD=value

Example: ./dmbackup  INI_PATH=/opt/dm7data/dameng/dm.ini NAME=test.bak

Imperative Argument: INI_PATH NAME

Keyword             explain(default value)
--------------------------------------------------------------------------------
INI_PATH            the path of dmserver's dm.ini file
BASE_BAK_DIR        the path with increment backup Format (dir1,dir2,dir3,...)
NAME                backup name
TYPE                backup type (FULL, INCREMENT), Default(FULL)
BAKFILE_PATH        the file path of backup file
DESCRIBE            the description of backup
MAXSIZE             the max value capability of the single backup file Default(33MB~2048MB, default(2048))
ENCRYPT             encrypt type (0, 1, 2), Default(0)
PASSWORD            encrypt key
ENCRYPT_NAME        encrypt algorithm name
COMPRESS            compress level(0-9), 0:no compress, 9:high compress, Default(1)
PARALLEL            parallel mapping the file path
SHOW_BAK_INFO       the directory of backup Format (dir1,dir2,dir3,...)
HELP                output help info

INI_PATH:配置文件路径,最大长度为256字节,若未设置SHOW_BAK_INFO参数,则为必选参数
NAME:备份名,最大长度为128字节,若未设置SHOW_BAK_INFO参数,则为必选参数
BAKFILE_PATH:备份文件路径,可选参数
TYPE:备份类型,默认为完全备份,FULL 表示完全备份,INCREMENT表示增量备份,可选参数
BASE_BAK_DIR:增量备份时的指定基备份目录,可选参数,仅对增量备份有效
DESCRIBE:备份文件描述,即备注信息,注意:描述如果含有空格,需要用双引号括起来,否则会报错,可选参数
MAXSIZE:备份文件最大大小,取值范围为:33-2048,单位为M(兆),默认为2048,可选参数
ENCRYPT:加密类型,0表示不加密,1表示简单加密,2表示复杂加密,可选参数
PASSWORD:加密密码,长度最大为128字节,如果选择不加密,此处不必指定,可选参数
ENCRYPT_NAME:加密算法,可通过查看动态视图v$CIPHERS获取加密算法信息。不支持xxx_cbc和xxx_ecb算法。可选参数
COMPRESS:指定备份为压缩,如果不选择,则表示不压缩,可选参数
PARALLEL:指定并行备份映射文件完整路径,如: E:\bak.parallel。可选参数
SHOW_BAK_INFO:指定备份存放的目录,可以指定1~16个,可选参数
HELP:打印帮助信息
例1,对名为jydm数据库执行一个完全备份。

[dmdba@shard1 backup]$ dmbackup type=full ini_path=/dm_home/dmdba/dmdbms/data/jydm/dm.ini name=jydm
backup V7.1.6.46-Build(2018.02.08-89107)ENT
file dm.key not found, use default license!
start backup tablespace: SYSTEM.
start backup file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF, pages: 2944
end backup file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF
end backup tablespace: SYSTEM.

start backup tablespace: ROLL.
start backup file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF, pages: 0
end backup file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF
end backup tablespace: ROLL.

start backup tablespace: MAIN.
start backup file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF, pages: 0
end backup file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF
end backup tablespace: MAIN.

start backup tablespace: BOOKSHOP.
start backup file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF, pages: 0
end backup file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF
end backup tablespace: BOOKSHOP.

start backup tablespace: DMHR.
start backup file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF, pages: 0
end backup file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF
end backup tablespace: DMHR.

start backup tablespace: USERS.
start backup file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf, pages: 0
end backup file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf
end backup tablespace: USERS.

start backup tablespace: SYSAUX.
start backup file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF, pages: 0
end backup file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF
end backup tablespace: SYSAUX.

start backup tablespace: FG_PERSON.
start backup file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF, pages: 0
end backup file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF
end backup tablespace: FG_PERSON.

backup fun end time used: 13128.406(ms)
backup successfully!
backup time used: 19512.280(ms)

在没有指定bakfile_path参数指定备份文件目录时,会在默认的备份目录中生成备份文件。

[dmdba@shard1 bak]$ pwd
/dm_home/dmdba/dmdbms/data/jydm/bak
[dmdba@shard1 bak]$ ls -lrt
-rw-r--r-- 1 dmdba dinstall 301989888 7月  11 19:20 DB_jydm_20200711192046000434.bak

DM7使用联机执行SQL语句进行备份还原

使用联机执行SQL语句进行备份还原
1. 数据备份
1.1 备份数据库
系统提供联机SQL命令执行数据库备份。语法如下:

BACKUP DATABASE [FULL |INCREMENT WITH BACKUPDIR ‘< 备份目录>’{,‘< 备份目录>’}] TO < 备份名> [BAKFILE ‘< 备份路径>’]
[BACKUPINFO ‘< 备份描述>’] [MAXSIZE < 限制大小>] [IDENTIFIED BY < 密钥>[WITH ENCRYPTION][ENCRYPT WITH < 加密算法>]]
[COMPRESSED [LEVEL < 压缩级别>]][WITHOUT LOG][PARALLEL ‘< 并行映射文件路径>’];
FULL|INCREMENT:备份类型,FULL表示完全备份,INCREMENT表示增量备份。
< 备份目录>:基础备份所在的目录,最大长度为256个字节。
< 备份名>:备份的名称,在DMDBMS中以此标识不同的备份。
< 备份路径>:备份文件存放的完整路径。
< 备份描述>:备份的描述信息。
< 限制大小>:最大备份文件大小,以M为单位,取值范围33M~2G。
< 密钥>:备份加密通过使用IDENTIFIED BY来指定密码。

WITH ENCRYPTION :用来指定加密类型,0表示不加密,1表示简单加密,2表示复杂加密。
COMPRESSED:用来指定是否压缩级别,取值范围1~9。如果使用0,表示不压缩,1表示压缩快、但是压缩比低,9表示压缩慢、但是压缩比高。
WITHOUT LOG:联机数据库备份是否备份日志。如果使用,则表示不备份,否则表示备份。
PARALLEL:用来指定并行映射文件的完整路径。
PARALLEL:用来指定并行映射文件的完整路径。
< 并行映射文件路径>:并行映射文件的完整路径,最大长度为256个字节,如: E:\bak.parallel;并行映射文件的书写请参考4.2.3.2。
< 加密算法>:加密算法具体见《DM7_SQL语言使用手册》相关章节,但是不支持xxx_cbc和xxx_ecb算法加密。缺省情况下,算法为AES256_CFB。

备份成功后会在备份默认目录下生成备份文件,若没有指定备份文件名,则系统自动生成以“数据库名_日期.bak”格式的备份文件,通过该备份文件可以进行数据库还原。例如,执行数据库备份,备份类型为完全备份,备份文件名为/dm_home/dmdba/dmdbms/backup/database_full_bak.bak。

SQL> backup database full to full_bak bakfile '/dm_home/dmdba/dmdbms/backup/database_full_bak.bak';
executed successfully
used time: 00:00:09.508. Execute id is 86138.

1.2 备份用户表空间
系统提供联机SQL命令执行表空间备份,不支持对系统表空间、日志表空间、回滚表空间、临时表空间执行备份操作。语法如下:

BACKUP TABLESPACE < 表空间名> [FULL| INCREMENT WITH BACKUPDIR '< 备份目录>'{,'< 备份目录>'}] TO < 备份名>
[BAKFILE '< 备份路径>'] [BACKUPINFO '< 备份描述>'] [MAXSIZE < 限制大小>] [IDENTIFIED BY < 密钥>[WITH ENCRYPTION ]]
[COMPRESSED[LEVEL < 压缩级别>]];

例如,备份名为t1的表空间,备份类型为FULL,备份文件名为’/dm_home/dmdba/dmdbms/backup/tablespace_users.bak’。

SQL> backup tablespace users full to users_bak bakfile '/dm_home/dmdba/dmdbms/backup/tablespace_users.bak';
executed successfully
used time: 00:00:01.376. Execute id is 87164.

2. 数据还原
备份文件和待还原数据库的建库参数USE_NEW_HASH应保持一致,若取值不一致,则还原时会报错。

2.1 还原表空间
使用SQL命令对表空间进行还原。与数据库还原类似,表空间备份分为完全备份和增量备份,但表空间备份没有联机备份和脱机备份之分,表空间备份只支持联机备份。表空间还原根据不同的表空间备份类型选择不同的还原策略对表空间进行还原。与库级还原和表级还原不同,表空间还原依赖于归档日志,利用备份文件还原表空间只能还原到备份时所在数据库中,并且还原后,表空间处于最新状态。由于待还原表空间的文件名和文件数目可能与备份时的不一致,因此还原后需要更新文件系统。另外,由于从备份表空间到还原表空间的时间间隔中,系统可能累积了很多归档日志,为了保证跨表空间的对象数据同步,需要重做该表空间的所有归档日志。

系统提供联机SQL命令执行表空间还原,还原前需要将表空间置为脱机状态,不支持对系统表空间、日志表空间、回滚表空间、临时表空间执行还原操作。

RESTORE TABLESPACE < 表空间名> FROM ‘< 备份路径>’ | BACKUP < 备份文件名> [ INDENTIFIED BY < 密码>] [ WITH BACKUPDIR ‘< 备份
目录>’{,‘< 备份目录>’}][WITH ARCHIVEDIR ‘归档目录’{,’归档目录’}][DBFILE < 文件ID> TO ‘< 文件路径>’ {,DBFILE < 文件ID>
 TO ‘< 文件路径>’}] [MIRROR < 文件ID> TO‘< 文件路径>’{,MIRROR < 文件ID> TO ‘< 文件路径>’}];

< 表空间名>:需要还原的表空间名称。
< 备份路径>:备份文件存放的完整路径。
< 备份文件名>:备份的名称,在DMDBMS中以此标识不同的备份。
< 密码>:加密备份表空间时,用户设置的密码。
< 备份目录>:搜集备份文件的目录。
< 归档目录>:还原时,搜集归档文件的目录。
< 文件ID>:需要重新设置文件路径文件对应的文件号。
< 文件路径>:设置还原后,数据文件的路径。
MIRROR:要使用数据文件镜像,必须在建库时开启页校验的参数page_check。
例如,利用备份文件/dm_home/dmdba/dmdbms/backup/tablespace_users.bak还原表空间users。

SQL> alter tablespace users offline;
executed successfully
used time: 00:00:07.751. Execute id is 89303.
SQL> restore tablespace users from '/dm_home/dmdba/dmdbms/backup/tablespace_users.bak';
executed successfully
used time: 00:00:01.641. Execute id is 89348.
SQL> alter tablespace users online;
executed successfully
used time: 76.018(ms). Execute id is 89360.

对于表空间联机还原,还原前需要将表空间置为脱机状态;还原后,为了使用表空间,需要重新将表空间置为联机状态。

在表空间还原的时候,如果出现异常(如掉电),还原表空间的操作异常终止,那么表空间可能已经被损坏。这种情况下,只有再次还原才能够修复。

3. 设置备份属性
3.1 加密与压缩
备份文件中包含了数据库中的原始数据,为提高备份数据的安全性,无论是普通备份还是B树备份,DM都提供了对备份数据进行加密的功能。系统中支持简单加密和复杂加密。简单加密和复杂加密实现原理都是在备份过程中利用经典的加密算法对数据页面加密,然后将密文写入备份文件,区别在于复杂加密方式对写入备份文件的每一页数据都进行加密,而简单加密方式只是选择性地对某些页面进行加密。显然,简单加密的效率相对于复杂加密效率要高,但同时,简单加密的备份数据不如复杂加密安全。

此外,DM还支持备份数据压缩功能。压缩功能的实现能有效缩短备份文件的大小,减少所占的磁盘空间。

不论是加密还是压缩,都是在正常执行备份数据时的额外操作,与此同时,压缩和加密的备份文件用于还原时,还需要执行解压缩和解密操作,因此会对备份、还原性能造成一定的影响。系统管理员应根据实际情况,在磁盘空间利用率、备份、还原性能,以及备份数据安全性之间做权衡,确定在执行备份操作时是否需要设置压缩,加密参数。

举例说明:
(1) 联机备份数据库,并对备份数据压缩,备份文件存放路径为/dm_home/dmdba/dmdbms/backup/database_cpr.bak。

SQL> backup database full to cpr_bak bakfile '/dm_home/dmdba/dmdbms/backup/database_cpr.bak' compressed;
executed successfully
used time: 00:00:09.535. Execute id is 90807.

(2) 联机备份名为t1的表空间,备份类型为FULL,对备份数据进行简单加密,加密密码为ABCDEF123,备份文件存放路径为/dm_home/dmdba/dmdbms/backup/tablespace_users_cpr.bak。

SQL> backup tablespace users full to ts_users_cpr_bak bakfile '/dm_home/dmdba/dmdbms/backup/tablespace_users_cpr.bak' identified by ABCDEF123 with encryption 1;
executed successfully
used time: 00:00:01.386. Execute id is 91101.

(3)联机备份SYSDBA模式下的test表,对备份数据进行复杂加密,加密密码为ABCDEF123,并且对备份数据压缩。备份文件存放路径为/dm_home/dmdba/dmdbms/backup/table_t1_bak.bak。

SQL> backup table sysdba.t1 to table_t1_bak bakfile '/dm_home/dmdba/dmdbms/backup/table_t1_bak.bak' identified by ABCDEF123 with encryption 2 compressed;
executed successfully
used time: 00:00:01.121. Execute id is 91267.

3.2 并行映射文件
为了提高数据库备份性能,针对物理备份,系统提供了并行备份的功能。并行备份的核心思想是将对数据库的备份拆分为对多个表空间的备份。系统在执行备份前,将物理存储位置临近的表空间作为基本备份单位,随后同时备份不同的备份单位,从而使得系统在执行备份时,充分利用了CPU资源和磁盘组资源,达到提升备份性能的目的。利用并行备份功能,需要系统管理员配置并行映射文件,映射文件格式如下所示。映射文件配置内容与系统并行备份的性能直接相关,因此,系统管理员应在充分了解数据库中各个表空间所在磁盘的物理位置,合理设置配置文件。此外,每个备份单位设置的备份目录应尽量在不同的磁盘组,这样能保证读写文件都能充分利用磁盘IO,使备份性能最优化。

格式如下:
[表空间名,表空间名,……]=备份目录1
[表空间名,表空间名,……]=备份目录2
[表空间名,表空间名,……]=备份目录3
……
[default]=备份目录N
说明:
1. 备份目录必需是本地物理磁盘上已经存在的目录。
2. 设置表空间名必需存在,若不存在则报错。
3. 每一行只能有一个“[表空间名,表空间名……]=备份目录”项。
4. 自动忽略同一备份目录下对应的多个同名表空间名,只取其中一个。
5. 一个表空间名不能对应多个备份目录,否则报错。
6. 对于相同的备份目录,DM7自动将它们作为一个备份单位。
7. default:没有显示设置的表空间,备份数据都存放在default对应的目录下。
8. [default]行必需存在,DM7认为[default]为最后一行,不统计[default]后续行的设置。
9. 映射文件的扩展名为parallel。
10.不允许显示设置系统表空间的磁盘目录。
11.对于含有特殊字符的表空间名,比如逗号、空格、中括号、等号,系统不保证解析映射文件的正确性。举例说明:
(1)假设数据库数据分布在三个磁盘组DISK1,DISK2和DISK3中。SYSTEM,MAIN,ROLL表空间在磁盘组DISK1;TS1,TS2表空间在磁盘组DISK2;TS3表空间在DISK3,配置映射文件bak.parallel如下:

[dmdba@shard1 dmdbms]$ vi bak.parallel
[DMHR,USERS]=/dm_home/dmdba/dmdbms/backup1
[FG_PERSON]=/dm_home/dmdba/dmdbms/backup2
[default]=/dm_home/dmdba/dmdbms/backup3

从上述配置内容可知,TS1,TS2作为一个备份单位,备份数据存储在D:\DAMENG_1中;TS3作为一个备份单位,备份数据存储在C:\DAMENG_2中;系统表空间作为一个备份单位,备份数据存储在E:\DAMENG目录中。

(2) 利用配置映射文件/dm_home/dmdba/dmdbms/bak.parallel执行联机并行备份操作,主备份文件为/dm_home/dmdba/dmdbms/parallel.bak,各个子备份分别在/dm_home/dmdba/dmdbms/backup1,/dm_home/dmdba/dmdbms/backup2和/dm_home/dmdba/dmdbms/backup3目录中。

SQL> backup database full to para_bak bakfile '/dm_home/dmdba/dmdbms/parallel.bak' parallel '/dm_home/dmdba/dmdbms/bak.parallel';
executed successfully
used time: 00:00:08.585. Execute id is 93997.

[dmdba@shard1 dmdbms]$ ls -lrt parallel*
-rw-r--r-- 1 dmdba dinstall 33554432 7月   1 17:30 parallel.bak
[dmdba@shard1 dmdbms]$ ls -lrt backup1/
总用量 1512
-rw-r--r-- 1 dmdba dinstall 33554432 7月   1 17:30 DB_jydm_20200701173032000519_1.bak
[dmdba@shard1 dmdbms]$ ls -lrt backup2/
总用量 28
-rw-r--r-- 1 dmdba dinstall 33554432 7月   1 17:30 DB_jydm_20200701173032000519_1.bak
[dmdba@shard1 dmdbms]$ ls -lrt backup3/
总用量 306072
-rw-r--r-- 1 dmdba dinstall 335544320 7月   1 17:30 DB_jydm_20200701173032000519_1.bak

(3)利用配置映射文件/dm_home/dmdba/dmdbms/bak.parallel执行脱机并行全量备份操作,主备份文件为/dm_home/dmdba/dmdbms/parallel02.bak,各个子备份分别在各个子备份分别在/dm_home/dmdba/dmdbms/backup1,
/dm_home/dmdba/dmdbms/backup2和/dm_home/dmdba/dmdbms/backup3目录中。

[dmdba@shard1 dmdbms]$ dmbackup type=full ini_path=/dm_home/dmdba/dmdbms/data/jydm/dm.ini name=test parallel=/dm_home/dmdba/dmdbms/bak.parallel
backup V7.1.6.46-Build(2018.02.08-89107)ENT
file dm.key not found, use default license!
[channel<5912>]start backup tablespaces group to directory /dm_home/dmdba/dmdbms/backup2.
[channel<5912>]start backup tablespace: FG_PERSON.
[channel<5912>]start backup file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF, pages: 0
[channel<5911>]start backup tablespaces group to directory /dm_home/dmdba/dmdbms/backup1.
[channel<5911>]start backup tablespace: DMHR.
[channel<5911>]start backup file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF, pages: 0
[channel<5912>]end backup file: /dm_home/dmdba/dmdbms/data/jydm/FG_PERSON.DBF
[channel<5912>]end backup tablespace: FG_PERSON.

[channel<5912>]end backup tablespaces group.

[channel<5913>]start backup tablespaces group to directory /dm_home/dmdba/dmdbms/backup3.
[channel<5913>]start backup tablespace: SYSTEM.
[channel<5913>]start backup file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF, pages: 2944
[channel<5911>]end backup file: /dm_home/dmdba/dmdbms/data/jydm/DMHR.DBF
[channel<5911>]end backup tablespace: DMHR.

[channel<5911>]start backup tablespace: USERS.
[channel<5911>]start backup file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf, pages: 0
[channel<5911>]end backup file: /dm_home/dmdba/dmdbms/data/jydm/users01.dbf
[channel<5911>]end backup tablespace: USERS.

[channel<5911>]end backup tablespaces group.

[channel<5913>]end backup file: /dm_home/dmdba/dmdbms/data/jydm/SYSTEM.DBF
[channel<5913>]end backup tablespace: SYSTEM.

[channel<5913>]start backup tablespace: ROLL.
[channel<5913>]start backup file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF, pages: 0
[channel<5913>]end backup file: /dm_home/dmdba/dmdbms/data/jydm/ROLL.DBF
[channel<5913>]end backup tablespace: ROLL.

[channel<5913>]start backup tablespace: MAIN.
[channel<5913>]start backup file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF, pages: 0
[channel<5913>]end backup file: /dm_home/dmdba/dmdbms/data/jydm/MAIN.DBF
[channel<5913>]end backup tablespace: MAIN.

[channel<5913>]start backup tablespace: BOOKSHOP.
[channel<5913>]start backup file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF, pages: 0
[channel<5913>]end backup file: /dm_home/dmdba/dmdbms/data/jydm/BOOKSHOP.DBF
[channel<5913>]end backup tablespace: BOOKSHOP.

[channel<5913>]start backup tablespace: SYSAUX.
[channel<5913>]start backup file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF, pages: 0
[channel<5913>]end backup file: /dm_home/dmdba/dmdbms/data/jydm/SYSAWR.DBF
[channel<5913>]end backup tablespace: SYSAUX.

[channel<5913>]end backup tablespaces group.

backup fun end time used: 6701.450(ms)
backup successfully!
backup time used: 13028.166(ms)

[dmdba@shard1 dmdbms]$ ls -lrt backup3/
总用量 529716
-rw-r--r-- 1 dmdba dinstall 335544320 7月   1 17:30 DB_jydm_20200701173032000519_1.bak
-rw-r--r-- 1 dmdba dinstall 234881024 7月   1 17:35 DB_jydm_20200701173535000023_1.bak
[dmdba@shard1 dmdbms]$ ls -lrt backup2/
总用量 56
-rw-r--r-- 1 dmdba dinstall 33554432 7月   1 17:30 DB_jydm_20200701173032000519_1.bak
-rw-r--r-- 1 dmdba dinstall 33554432 7月   1 17:35 DB_jydm_20200701173535000023_1.bak
[dmdba@shard1 dmdbms]$ ls -lrt backup1/
总用量 3024
-rw-r--r-- 1 dmdba dinstall 33554432 7月   1 17:30 DB_jydm_20200701173032000519_1.bak
-rw-r--r-- 1 dmdba dinstall 33554432 7月   1 17:35 DB_jydm_20200701173535000023_1.bak

DM7使用DMRMAN执行表空间还原

使用DMRMAN执行表空间还原
介绍表空间的脱机还原。表空间的脱机还原除了支持联机还原的所有功能外,也放开了SYSTEM和ROLL表空间还原操作。与联机表空间还原不同的是,脱机表空间还原不需要事先置目标表空间为OFFLINE状态。语法如下:

RESTORE DATABASE '' TABLESPACE < 表空间名>
[DATAFILE< <文件编号> {,< 文件编号>} | '< 文件路径>' {,'< 文件路径>'}>]
FROM BACKUPSET '< 备份集目录>'
[DEVICE TYPE DISK|TAPE[PARMS '< 介质参数>']]
[IDENTIFIED BY < 密码> [ENCRYPT WITH < 加密算法>]]
[WITH BACKUPDIR '< 基备份集搜索目录>'{,'< 基备份集搜索目录>'}]
[]
[MAPPED FILE '< 映射文件>'][TASK THREAD < 任务线程数>] [NOT PARALLEL]
[UNTIL TIME '< 时间串>'] [UNTIL LSN ];
 ::=
WITH ARCHIVEDIR '< 归档日志目录>'{,'< 归档日志目录>'}

DATABASE:指定还原库目标的dm.ini文件路径。
TABLESPACE:指定还原的表空间,可以是用户表空间,也可以是SYSTEM系统表空间和ROLL回滚表空间。
DATAFILE:还原指定的数据文件。可以指定数据文件编号或数据文件路径。文件编号,对应动态视图V$DATAFILE中ID列的值;文件路径,对应动态视图V$DATAFILE中PATH或者MIRROR_PATH列的值,也可以仅指定数据文件名称(相对路径),与表空间中数据文件匹配时,会使用SYSTEM目录补齐。
BACKUPSET:指定用于还原目标数据库的备份集目录。若指定为相对路径,会在默认备份目录下搜索备份集。
DEVICE TYPE:指存储备份集的介质类型,支持DISK和TAPE,默认为DISK。DISK表示备份集存储介质为磁盘,TAPE表示存储介质为磁带。
PARMS:介质参数,供第三方存储介质(TAPE类型)管理使用。
IDENTIFIED BY:指定备份时使用的加密密码,供还原过程解密使用。
ENCRYPT WITH:指定备份时使用的加密算法,供还原过程解密使用,若未指定,则使用默认算法。
WITH BACKUPDIR:指定备份集搜索目录。
MAPPED FILE:指定存放还原目标路径的文件,参见3.3.5.2.1 数据库还原。当< 备份集目录>和< 映射文件>指定的路径不一致时,以< 映射文件>指定的路径为主
TASK THREAD:指定还原过程中用于处理解压缩和解密任务的线程个数。若未指定,则默认为4;若指定为0,调整为1;若指定超过当前系统主机核数,则调整为当前核数。
NOT PARALLEL:指定并行备份集使用非并行方式还原。对于非并行备份集,不论是否指定该关键字,均采用非并行还原。
WITH ARCHIVEDIR:本地归档日志搜索目录,若未指定,则仅使用目标库配置的第一个本地归档。
UNTIL TIME:恢复数据库到指定的时间点。
UNTIL LSN:恢复数据库到指定的LSN。

使用说明:
1. 表空间还原不能是TEMP表空间,指定文件还原也不能为TEMP表空间中文件。
2. 表空间还原要求还原目标库与备份库为同一个库,且若还原目标库中SYSTEM表空间没有故障且还原目标表空间不是SYSTEM表空间的话,则要求目标库校验通过,比如加密校验和日志校验等;否则将使用备份集中信息与当前的进行校验。
3. 还原目标库不能为已经执行过restore,但是未指定过recover的库。
4. SYSTEM表空间和ROLL表空间不允许指定UNTIL LSN或者UNTIL TIME还原;其他用户表空间可以。若未指定UNTIL TIME或者UNTIL LSN,则均还原到最新状态。使用UNTIL TIME(或者UNTIL LSN)的同时不能指定DATAFILE还原,否则报语法错误。
5. 处于RES_OFFLINE或CORRUPT状态的表空间不允许指定表空间中数据文件还原。
6. 整个还原过程中不会修改数据库本身状态或者调整CKPT_LSN。
7. 不管是RAC环境,还是单机环境,若异常退出,需手动指定各节点归档修复后,使用各节点完整的归档日志执行还原恢复;否则,将可能无法恢复到最新。
8. 异常退出库指定UNTIL TIME或者UNTIL LSN还原失效,因为库故障重启时会执行故障修复,UNTIL失效,表空间仍会恢复到最新状态。
9. 若目标库中SYSTEM表空间故障,则必须优先还原SYSTEM表空间。在DMRAC环境中进行表空间还原,需要先确保所有节点实例都已退出,此时在任一节点上使用该节点的备份集均可进行表空间还原操作,且只要在一个节点上执行目标表空间还原即可。对于两节点RAC01、RAC02,表空间的还原操作如下:

RMAN>backup database '/home/DMDBMS/rac/dm01.ini' backupset '/home/DMDBMS/bak/rman_dm01_01';
RMAN>restore database'/home/DMDBMS/rac/dm01.ini' tablespace main from backupset '/home/DMDBMS/bak/rman_dm01_01'
 with archivedir'/home/DMDBMS/rac/arch_dest1';

10. 如果SYSTEM表空间处于ONLINE/OFFLINE状态且文件丢失,则必须要通过库还原修复,不支持对其执行表空间还原。

下面的例子将对RAC环境中的TS_FOR_DBF表空间执行还原
1.对数据库执行备份

SQL> backup database full backupset '/dm7/backup/db_bak_for_tbs';
executed successfully
used time: 00:00:01.217. Execute id is 11.

2.在DMRAC环境中进行表空间还原,需要先确保所有节点实例都已退出,此时在任一节点上使用该节点的备份集均可进行表空间还原操作,且只要在一个节点上执行目标表空间还原即可。对于两节点RAC01、RAC02,表空间的还原操作如下:

[root@dmrac1 backup]# service DmServicerac1 stop
Stopping DmServicerac1: [ OK ]

[root@dmrac2 rac1_config]# service DmServicerac2 stop
Stopping DmServicerac2: [ OK ]



RMAN> restore database 'dm7/data/rac0_config/dm.ini' tablespace ts_for_dbf from backupset '/dm7/backup/db_bak_for_tbs' with archivedir '/dm7/data/rac0_arch','/dm7/data/rac1_arch' until;
restore database '/dm7/data/rac0_config/dm.ini' tablespace ts_for_dbf from backupset '/dm7/backup/db_bak_for_tbs' with archivedir '/dm7/data/rac0_arch' , '/dm7/data/rac1_arch' ;
file dm.key not found, use default license!
checking if the RAC database under system path [+DMDATA/data/rac] is running....
EP [0] is checking....
EP [1] is checking....
RESTORE TABLESPACE[ts_for_dbf] IN DB[/dm7/data/rac0_config/dm.ini] CHECK......
EP[0] max_lsn: 92312
RESTORE TABLESPACE[ts_for_dbf] IN DB[/dm7/data/rac0_config/dm.ini], dbf collect......
RESTORE TABLESPACE[ts_for_dbf] IN DB[/dm7/data/rac0_config/dm.ini], ts status and dbf refresh ......
RESTORE BACKUPSET [/dm7/backup/db_bak_for_tbs] START......
total 2 packages processed...
RESTORE TABLESPACE[ts_for_dbf] IN DB[/dm7/data/rac0_config/dm.ini], UPDATE ctl file......
EP 0's ckpt_lsn = 90803
min_ckpt_lsn = 90803
The RAC redo archive log 1 ptx
The RAC redo archive log 2 ptx
The RAC redo archive log 3 ptx
The RAC redo archive log 4 ptx
The RAC redo archive log 5 ptx
The RAC redo archive log 6 ptx
The RAC redo archive log 7 ptx
The RAC redo archive log 8 ptx
The RAC redo archive log 9 ptx
The RAC redo archive log 10 ptx
The RAC redo archive log 11 ptx
The RAC redo archive log 12 ptx
The RAC redo archive log 13 ptx
The RAC redo archive log 14 ptx
The RAC redo archive log 15 ptx
The RAC redo archive log 16 ptx
The RAC redo archive log 17 ptx
The RAC redo archive log 18 ptx
The RAC recover total redo 18 ptx
EP[0] Recover LSN from 90803 to 92307.
EP[1] Recover LSN from 92310 to 92309.
Recover from archive log finished, time used:0.004s.
total 6 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 4423.437(ms)

3.启动RAC实例

[root@dmrac1 data]# service DmServicerac1 start
Starting DmServicerac1: [ OK ]

[root@dmrac2 rac1_config]# service DmServicerac2 start
Starting DmServicerac2: [ OK ]