在之前的博客我们了解了DM 物理备份的相关概念,如下:
DM7 达梦数据库 物理备份 相关概念说明
https://www.cndba.cn/dave/article/3594
本篇我们看物理联机备份的操作。
DM 联机执行 SQL 语句方式支持数据库、 用户表空间、用户表和归档的备份,用户表空间、用户表的还原。在进行联机库级备份、归档备份表空间备份和表空间还原时,必须保证系统处于归档模式,否则联机备份还原不能进行。
1启动归档模式
联机备份是一种不一致的备份,在恢复时依赖与归档日志来保证事物的一致性,关于归档的配置和归档模式的启用参考之前的博客,这里不在重复描述:
DM7 达梦数据库 重做日志管理 及 归档模式切换
https://www.cndba.cn/dave/article/3575
SQL> select arch_mode from v$database;
LINEID ARCH_MODE
---------- ---------
1 Y
used time: 3.003(ms). Execute id is 1485.
SQL> select name,value from v$parameter where name like 'ARCH%';
LINEID NAME VALUE
---------- -------- -----
1 ARCH_INI 1
SQL> select arch_name,arch_type,arch_dest,arch_file_size from v$dm_arch_ini;
LINEID ARCH_NAME ARCH_TYPE ARCH_DEST ARCH_FILE_SIZE
---------- -------------- --------- ----------- --------------
1 ARCHIVE_LOCAL2 LOCAL /dm/dmarch2 128
2 ARCHIVE_LOCAL3 LOCAL /dm/dmarch 128
used time: 1.824(ms). Execute id is 1592.
2数据库备份与还原
2.1 语法说明
语句执行完后会在默认的备份路径下生成备份集目录,默认的备份路径为 dm.ini 中 BAK_PATH 配置的路径,若未配置,则使用 SYSTEM_PATH 下的 bak目录。
备份语法如下:
BACKUP DATABASE [[[FULL] [DDL_CLONE]]| INCREMENT [CUMULATIVE][WITH BACKUPDIR ‘<
基备份搜索目录>’{,’<基备份搜索目录>’} |[BASE ON']][TO <备份 名> ]BACKUPSET [‘<备份集路径>’]
[DEVICE TYPE <介质类型> [PARMS ‘<介质参数>’]]
[BACKUPINFO ‘<备份描述>’] [MAXPIECESIZE <备份片限制大小>]
[IDENTIFIED BY <密码>[WITH ENCRYPTION][ENCRYPT WITH <加密算法>]] 备份>
[COMPRESSED [LEVEL <压缩级别>]] [WITHOUT LOG]
[TRACE FILE ‘< TRACE 文件名>’] [TRACE LEVEL < TRACE 日志级别>]
[TASK THREAD <线程数>][PARALLEL [<并行数>]];
参数说明:
1)FULL:备份类型。FULL 表示完全备份,可不指定,服务器会默认为完全备份。
2)DDLCLONE:数据库克隆。该参数只能用于完全备份中,表示仅拷贝所有的元数据不拷贝数据。如对于数据库中的表来说,只备份表的定义不备份表中数据。表空间和表备份不支持该参数。
3)INCREMENT:备份类型。INCREMENT 表示增量备份,若要执行增量备份必须指定该参数。
4)CUMULATIVE:用于增量备份中,指明为累积增量备份类型,若不指定则缺省为差异增量备份类型。
5)WITH BACKUPDIR:用于增量备份中,指定基备份的搜索目录,最大长度为 256 个字节。若不指定,服务器自动在默认备份目录下搜索基备份。如果基备份不在默认的备份目录下,增量备份必须指定该参数。
6)BASE ON:用于增量备份中,指定基备份集目录。
7)TO:指定生成备份名称。若未指定,系统随机生成,默认备份名格式为:DB备份类型数据库名备份时间。其中,备份时间为开始备份时的系统时间。
8)BACKUPSET:指定当前备份集生成路径。若指定为相对路径,则在默认备份路径中生成备份集。若不指定,则在默认备份路径中按约定规则,生成默认备份集目录。库级备份默认备份集目录名生成规则: DB 库名备份类型时间,如DB_DAMENG_FULL_20160518_143057_123456。表明该备份集为 2016 年 5 月 18 日14时30分57秒123456毫秒时生成的库名为DAMENG的数据库完全备份集。若库名超长,使上述完整名称长度大于 128 个字节,则去掉库名字段,调整为 DB备份类型时间。
9)DEVICE TYPE:指存储备份集的介质类型,支持 DISK 和 TAPE,默认 DISK。DISK表示存储备份集到磁盘,TAPE 表示存储到磁带。
10)PARMS:只对介质类型为 TAPE 时有效。
11)BACKUPINFO:备份的描述信息。最大不超过 256 个字节。
12)MAXPIECESIZE:最大备份片文件大小上限,以 M 为单位,最小 128M,32 位系统最大 2G,64 位系统最大 128G。
13)IDENTIFIED BY:指定备份时的加密密码。密码应用双引号括起来,这样避免一些特殊字符通不过语法检测。密码的设置规则遵行 ini 参数 pwd_policy 指定的口令策略。
14)WITH ENCRYPTION:指定加密类型,0 表示不加密,不对备份文件进行加密处理;1表示简单加密,对备份文件设置口令,但文件内容仍以明文存;2 表示完全数据加密,对备份文件进行完全的加密,备份文件以密文方式存储。
15)ENCRYPT WITH:加密算法。缺省情况下,算法为 AES256_CFB。
16)COMPRESSED:取值范围 0~9。0 表示不压缩,1 表示 1 级压缩,9 表示 9 级压缩。压缩级别越高,压缩越慢,但压缩比越高。若未指定,但指定 COMPRESSED,则默认 1;否则,默认 0。
17)WITHOUT LOG:联机数据库备份是否备份日志。如果使用,则表示不备份,否则表示备份。如果使用了 WITHOUT LOG 参数,则使用 DMRMAN 工具还原时,必须指定 WITH ARCHIVEDIR 参数。
18)TRACE FILE:指定生成的 TRACE 文件。启用 TRACE,但不指定 TRACE FILE 时, 默认在 DM 数据库系统的 log 目录下生成 DM_SBTTRACE年月.log 文件;若使用相对路径,则生成在执行码同级目录下。若用户指定,则指定的文件不能为已经存在的文件,否则报错;也不可以为 ASM 文件。
19)TRACE LEVEL:有效值 1、2,默认为 1表示不启用TRACE,此时若指定了TRACE FILE, 会生成 TRACE 文件,但不写入 TRACE 信息;为 2 启用 TRACE 并写入 TRACE 相关内容。
20)TASK THREAD:备份过程中数据处理过程线程的个数,取值范围 0~64,默认为 4。若指定为 0,则调整为 1;若指定超过当前系统主机核数,则调整为主机核数。线程数(TASK THREAD)并行数(PARALLEL)不得超过 512。
21)PARALLEL:指定并行备份的并行数,取值范围 0~128。若不指定,则默认为 4,指定0 或者 1 均认为为非并行备份。若未指定关键 PARALLEL,则认为非并行备份。并行备份不支持存在介质为 TAPE 的备份。线程数(TASK THREAD)并行数(PARALLEL)不得超过 512。
22)COMPRESSED:取值范围 0~9。0 表示不压缩,1 表示 1 级压缩,9 表示 9 级压缩。压缩级别越高,压缩越慢,但压缩比越高。若未指定,但指定 COMPRESSED,则默认 1;否则,默认 0。
23)WITHOUT LOG:联机数据库备份是否备份日志。如果使用,则表示不备份,否则表示备份。如果使用了 WITHOUT LOG 参数,则使用 DMRMAN 工具还原时,必须指定 WITH ARCHIVEDIR 参数。
24)TRACE FILE:指定生成的 TRACE 文件。启用 TRACE,但不指定 TRACE FILE 时,默认在 DM 数据库系统的 log 目录下生成 DMSBTTRACE年月.log 文件;若使用相对路径,则生成在执行码同级目录下。若用户指定,则指定的文件不能为已经存在的文件,否则报错;也不可以为 ASM 文件。
25)TRACE LEVEL:有效值 1、2,默认为 1表示不启用TRACE,此时若指定了TRACE FILE,会生成 TRACE 文件,但不写入 TRACE 信息;为 2 启用 TRACE 并写入 TRACE 相关内容。
2.2 操作示例
#创建完全备份集,备份名设置为“WEEKLY_FULL_BAK”。
#备份语句中的参数 FULL 参数可以省略,不指定备份类型服务器会默认指定备份类型为完全备份。
#这个备份目录必须是不存在的目录,如果存在就会报如下错误:
SQL> backup database to weekly_full_bak backupset '/dm/dmbackup' backupinfo 'dave full backup';
backup database to weekly_full_bak backupset '/dm/dmbackup' backupinfo 'dave full backup';
[-8055]:Backup directory exists.
used time: 6.138(ms). Execute id is 0.
#备份生成的文件名同目录名,所以备份集命名需要保证有意义一些:
SQL> backup database to weekly_full_bak backupset '/dm/dmbak' backupinfo 'dave full backup';
executed successfully
used time: 00:00:01.335. Execute id is 1489.
/dm/dmbak
[dmdba@dm1 dmbak]$ ll -lh
总用量 45M
-rw-r--r-- 1 dmdba dinstall 5.0K 9月 2 08:31 dmbak_1.bak
-rw-r--r-- 1 dmdba dinstall 45M 9月 2 08:31 dmbak.bak
-rw-r--r-- 1 dmdba dinstall 89K 9月 2 08:31 dmbak.meta
[dmdba@dm1 dmbak]$
#增量备份
SQL> backup database increment with backupdir '/dm/dmbackup' backupset '/dm/dmbackup/inc_back';
executed successfully
used time: 00:00:01.146. Execute id is 1492.
SQL>
[dmdba@dm1 inc_back]$ pwd
/dm/dmbackup/inc_back
[dmdba@dm1 inc_back]$ ll -lh
总用量 1.3M
-rw-r--r-- 1 dmdba dinstall 1.2M 9月 2 08:33 inc_back.bak
-rw-r--r-- 1 dmdba dinstall 81K 9月 2 08:33 inc_back.meta
[dmdba@dm1 inc_back]$
SQL> backup database to weekly_full_bak2 backupset '/dm/dmbak/fullback' backupinfo 'dave full backup2';
executed successfully
used time: 00:00:01.359. Execute id is 1582.
SQL>
#尝试联机恢复报错,因为联机不支持数据库级别的恢复:
SQL> restore database from backupset '/dm/dmbak/fullback';
restore database from backupset '/dm/dmbak/fullback';
[-8242]:Error in line: 1
try to restore online database.
used time: 1.619(ms). Execute id is 0.
SQL>
3表空间备份与还原
3.1 语法说明
DIsql 工具中使用 BACKUP 语句也可以备份单个表空间。同备份数据库一样,执行表空间备份服务器也必须运行在归档模式下。
备份语法:
BACKUP TABLESPACE <表空间名> [FULL | INCREMENT [CUMULATIVE][WITH BACKUPDIR ‘<基备份搜索目录>’{,’<基备份搜索目录>’}]| [BASE ON BACKUPSET ‘<基备份集目录>’]][TO <备份
名>] BACKUPSET [‘<备份集路径>’]
[DEVICE TYPE <介质类型> [PARMS ‘<介质参数>’]]
[BACKUPINFO ‘<备份集描述>’] [MAXPIECESIZE <备份片限制大小>]
[IDENTIFIED BY < 加密密码 >[WITH ENCRYPTION][ENCRYPT WITH < 加密算法 >]]
[COMPRESSED [LEVEL <压缩级别>]]
[TRACE FILE ‘‘] [TRACE LEVEL ]
[TASK THREAD <线程数>][PARALLEL [<并行数>]];
几点不同的参数如下,其他参数同DB备份命令:
TO:指定生成备份名称。若未指定,系统随机生成,默认备份名格式为:DB备份类型表空间名备份时间。其中,备份时间为开始备份的系统时间。
BACKUPSET:指定当前备份集生成路径。若指定为相对路径,则在默认备份路径中生成备份集。若不指定,则在默认备份路径下以约定规则生成默认的表空间备份集目录。表空间级备份默认备份集目录名生成规则:TS表空间名备份类型时间,如TSMAIN_INCREMENT_20160518_143057_123456。表明该备份集为 2016 年 5 月 18日 14 时 30 分 57 秒 123456 毫秒时生成的表空间名为 MAIN 的表空间增量备份集。若表空间名称超长,使上述完整名称长度大于 128 个字节,则去掉表空间名字段,调整为 TS备份类型_时间。
还原语法:
RESTORE TABLESPACE <表空间名> [DATAFILE<<文件编号> {,<文件编号>} | ‘<文件路径>’ {,’<文件路径>’}>]
FROM BACKUPSET ‘<备份集路径>’ [DEVICE TYPE <介质类型> [PARMS ‘<介质参数>’]]
[IDENTIFIED BY <加密密码>] [ENCRYPT WITH <加密算法>]
[WITH BACKUPDIR ‘<备份目录>’ {,’<备份目录>’}]
[WITH ARCHIVEDIR ‘归档目录’{,’归档目录’}]
[MAPPED FILE ‘<映射文件>’]
[TRACE FILE ‘‘] [TRACE LEVEL ][TASK THREAD <线程数>][NOT PARALLEL]
[UNTIL TIME ‘<时间串>’] [UNTIL LSN];
3.2 操作示例
3.2.1使用表空间完全备份还原表空间
表空间的还原、恢复操作是一次性完成,因此还原后不需要执行恢复操作。使用表空间完全备份还原表空间的完整步骤如下:
1) 配置归档。
2) 保证数据库处于 OPEN 或 MOUNT 状态。
3) 备份表空间。
SQL> BACKUP TABLESPACE MAIN BACKUPSET '/dm/dm_bak/ts_full_bak_01';
executed successfully
used time: 00:00:01.109. Execute id is 1552.
SQL>
4) 校验表空间备份。此步骤为可选,如果确定备份文件合法可不进行备份校验。
SQL> SELECT SF_BAKSET_CHECK('DISK','/dm/dm_bak/ts_full_bak_01');
LINEID SF_BAKSET_CHECK('DISK','/dm/dm_bak/ts_full_bak_01')
---------- ---------------------------------------------------
1 1
used time: 12.186(ms). Execute id is 1553.
SQL>
5) 修改表空间为脱机。
SQL> ALTER TABLESPACE MAIN OFFLINE;
executed successfully
used time: 108.222(ms). Execute id is 1554.
6) 还原表空间。
SQL> RESTORE TABLESPACE MAIN FROM BACKUPSET '/dm/dm_bak/ts_full_bak_01';
executed successfully
used time: 460.284(ms). Execute id is 1555.
7) 修改表空间为联机。
SQL> ALTER TABLESPACE MAIN ONLINE;
executed successfully
used time: 14.690(ms). Execute id is 1556.
SQL>
3.2.2使用表空间增量备份还原表空间
在增量备份与基备份同目录情况下,使用增量备份还原表空间步骤与完全备份一致。
当增量备份与基备份不在同一个目录下时需要使用 RESTORE TABLESPACE…WITH BACKUPDIR语句还原。这里以后面一种情况为例说明使用增量备份还原表空间。步骤如下:
1) 配置归档。
2) 保证数据库处于 OPEN 或 MOUNT 状态。
3) 完全备份表空间。
SQL> BACKUP TABLESPACE MAIN BACKUPSET '/dm/dm_bak/ts_full_bak_02';
executed successfully
used time: 00:00:01.128. Execute id is 1557.
4)多次增量备份表空间。
SQL> BACKUP TABLESPACE MAIN INCREMENT WITH BACKUPDIR '/dm/dm_bak' BACKUPSET '/dm/dm_bak2/ts_incre_bak_02_01';
BACKUP TABLESPACE MAIN INCREMENT WITH BACKUPDIR '/dm/dm_bak' BACKUPSET '/dm/dm_bak2/ts_incre_bak_02_01';
[-8088]:No data updates or logs are generated, no need to back up.
used time: 00:00:02.096. Execute id is 0.
#创建对象:
[dmdba@dm1 dm_bak]$ disql dexp/"www.cndba.cn"
Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 9.676(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT
Connected to: DM 7.1.6.95
SQL> create table inc_bak as select * from sysobjects;
executed successfully
used time: 15.214(ms). Execute id is 1559.
SQL>
SQL> BACKUP TABLESPACE MAIN INCREMENT WITH BACKUPDIR '/dm/dm_bak' BACKUPSET '/dm/dm_bak2/ts_incre_bak_02_01';
executed successfully
used time: 00:00:01.100. Execute id is 1560.
SQL> create table inc_bak2 as select * from sysobjects;
executed successfully
used time: 15.109(ms). Execute id is 1561.
#注意这里报错:begin LSN [145846] <= base end LSN[145969], cancel.
SQL> BACKUP TABLESPACE MAIN INCREMENT WITH BACKUPDIR '/dm/dm_bak', '/dm/dm_bak2' BACKUPSET '/dm/dm_bak3/ts_incre_bak_02_02';
BACKUP TABLESPACE MAIN INCREMENT WITH BACKUPDIR '/dm/dm_bak', '/dm/dm_bak2' BACKUPSET '/dm/dm_bak3/ts_incre_bak_02_02';
[-8084]:begin LSN [145846] <= base end LSN[145969], cancel.
used time: 00:00:02.047. Execute id is 0.
#切换下日志在备份就好了:
SQL> alter system switch logfile;
executed successfully
used time: 38.074(ms). Execute id is 0.
SQL> BACKUP TABLESPACE MAIN INCREMENT WITH BACKUPDIR '/dm/dm_bak', '/dm/dm_bak2' BACKUPSET '/dm/dm_bak3/ts_incre_bak_02_02';
executed successfully
used time: 00:00:01.116. Execute id is 1569.
SQL>
5) 校验表空间备份。此步骤为可选,如果确定备份文件合法可不进行备份校验。
SQL> SELECT SF_BAKSET_CHECK('DISK','/dm/dm_bak3/ts_incre_bak_02_02');
LINEID SF_BAKSET_CHECK('DISK','/dm/dm_bak3/ts_incre_bak_02_02')
---------- --------------------------------------------------------
1 1
used time: 8.659(ms). Execute id is 1570.
6) 修改表空间为脱机:
SQL> ALTER TABLESPACE MAIN OFFLINE;
executed successfully
used time: 161.507(ms). Execute id is 1571.
7) 使用增量备份 ts_incre_bak_02_02 还原表空间。
SQL> RESTORE TABLESPACE MAIN FROM BACKUPSET '/dm/dm_bak3/ts_incre_bak_02_02' WITH BACKUPDIR '/dm/dm_bak2','/dm/dm_bak';
executed successfully
used time: 407.225(ms). Execute id is 1572.
8) 修改表空间为联机。
SQL> ALTER TABLESPACE MAIN ONLINE;
executed successfully
used time: 13.063(ms). Execute id is 1573.
SQL>
3.2.3使用数据库备份还原表空间
使用数据库备份还原表空间可以快速还原一个或多个表空间,而不影响数据库中其他的表空间和对象。在数据库中仅有特定的表空间损坏且没有表空间备份的情况下,可以选择使用此种方式还原。
具体步骤如下:
1) 配置归档。
2) 保证数据库处于 OPEN 或 MOUNT 状态。
3) 创建数据库完全备份,备份集存放目录为“/dm/dm_bak”。
SQL> BACKUP DATABASE BACKUPSET '/dm/dm_bak/db_full_bak_for_ts';
executed successfully
used time: 00:00:01.413. Execute id is 1574.
4) 校验表空间备份。此步骤为可选,如果确定备份文件合法可不进行备份校验。
SQL> SELECT SF_BAKSET_CHECK('DISK','/dm/dm_bak/db_full_bak_for_ts ');
LINEID SF_BAKSET_CHECK('DISK','/dm/dm_bak/db_full_bak_for_ts')
---------- -------------------------------------------------------
1 1
used time: 11.955(ms). Execute id is 1575.
5) 修改表空间为脱机。
SQL> ALTER TABLESPACE MAIN OFFLINE;
executed successfully
used time: 110.527(ms). Execute id is 1576.
6) 还原表空间。
SQL> RESTORE TABLESPACE MAIN FROM BACKUPSET '/dm/dm_bak/db_full_bak_for_ts';
executed successfully
used time: 422.803(ms). Execute id is 1577.
7) 修改表空间为联机。
SQL> ALTER TABLESPACE MAIN ONLINE;
executed successfully
used time: 13.168(ms). Execute id is 1578.
SQL>
3.2.4指定归档目录还原
由于磁盘空间的影响,服务器归档可能出现分布在多个目录的情况。出现这种情况时就需要指定归档目录还原。还原时指定多个归档目录的操作步骤如下:
1) 备份用户表空间 MAIN。
SQL> BACKUP TABLESPACE MAIN BACKUPSET '/dm/dm_bak/ts_bak_for_arch';
executed successfully
used time: 00:00:01.122. Execute id is 1593.
2) 校验备份。此步骤可选。
SQL>SELECT SF_RMAN_BAKSET_CHECK('DISK','/dm/dm_bak/ts_bak_for_arch');
3) 还原用户表空间 MAIN。假设归档日志分布在目录为/dm/dm_arch1 和/dm/dm_arch2 两个目录下。
SQL> ALTER TABLESPACE MAIN OFFLINE;
executed successfully
used time: 348.301(ms). Execute id is 1594.
SQL> RESTORE TABLESPACE MAIN FROM BACKUPSET '/dm/dm_bak/ts_bak_for_arch' WITH ARCHIVEDIR'/dm/dmarch2', '/dm/dmarch';
executed successfully
used time: 388.097(ms). Execute id is 1595.
SQL> ALTER TABLESPACE MAIN ONLINE;
executed successfully
used time: 14.014(ms). Execute id is 1596.
SQL>
3.2.5还原表空间中指定的数据文件
DM7 不仅支持从数据库备份和表空间备份中还原表空间,还支持还原表空间中特定的数据文件。若表空间已经被破坏,则不允许执行特定数据文件的还原。使用数据库备份还原表空间或表空间中的数据文件与使用表空间备份操作类似,区别在于 RESTORE 语句中指定的备份集为数据库备份集。因此,本节仅以使用表空间备份为例说明还原数据文件的操作步骤。
1)创建待备份的表空间 AnQing, 并在库目录下创建 3 个数据文件。
SQL> SELECT ID, PATH FROM V$DATAFILE;
LINEID ID PATH
---------- ----------- ----------------------------------
1 0 /dm/dmdbms/data/cndba/SYSTEM.DBF
2 0 /dm/dmdbms/data/cndba/ROLL.DBF
3 0 /dm/dmdbms/data/cndba/TEMP.DBF
4 0 /dm/dmdbms/data/cndba/MAIN.DBF
5 0 /dm/dmdbms/data/cndba/BOOKSHOP.DBF
6 0 /dm/dmdbms/data/cndba/DMHR.DBF
7 0 /dm/dmdbms/data/cndba/DAVE01.DBF
8 1 /dm/dmdbms/data/DAVE02.DBF
8 rows got
used time: 3.482(ms). Execute id is 1597.
SQL> CREATE TABLESPACE AnQing DATAFILE 'AnQing01.dbf' SIZE 128;
executed successfully
used time: 45.376(ms). Execute id is 1598.
SQL> ALTER TABLESPACE AnQing ADD DATAFILE 'AnQing02.dbf' SIZE 128;
executed successfully
used time: 19.353(ms). Execute id is 1599.
SQL> ALTER TABLESPACE AnQing ADD DATAFILE 'AnQing03.dbf' SIZE 128;
executed successfully
used time: 20.790(ms). Execute id is 1600.
2) 备份表空间。
SQL> BACKUP TABLESPACE ANQING BACKUPSET '/dm/dm_bak/ts_bak_for_dbf';
executed successfully
used time: 00:00:01.092. Execute id is 1603.
3)查询数据文件的文件编号或路径。还原指定的数据文件需知道数据文件对应的文件编号或路径,相关信息可通过查询动态视图 V$DATAFILE 获取。
SQL> SELECT ID, PATH FROM V$DATAFILE;
LINEID ID PATH
---------- ----------- ----------------------------------
1 0 /dm/dmdbms/data/cndba/SYSTEM.DBF
2 0 /dm/dmdbms/data/cndba/ROLL.DBF
3 0 /dm/dmdbms/data/cndba/TEMP.DBF
4 0 /dm/dmdbms/data/cndba/MAIN.DBF
5 0 /dm/dmdbms/data/cndba/BOOKSHOP.DBF
6 0 /dm/dmdbms/data/cndba/DMHR.DBF
7 0 /dm/dmdbms/data/cndba/DAVE01.DBF
8 1 /dm/dmdbms/data/DAVE02.DBF
9 0 /dm/dmdbms/data/cndba/AnQing01.dbf
10 1 /dm/dmdbms/data/cndba/AnQing02.dbf
11 2 /dm/dmdbms/data/cndba/AnQing03.dbf
11 rows got
used time: 1.191(ms). Execute id is 1602.
4) 校验备份。此步骤为可选。
SQL> SELECT SF_BAKSET_CHECK('DISK','/dm/dm_bak/ts_bak_for_dbf');
LINEID SF_BAKSET_CHECK('DISK','/dm/dm_bak/ts_bak_for_dbf')
---------- ---------------------------------------------------
1 1
used time: 10.494(ms). Execute id is 1605.
5) 通过文件编号 还原表空间ANQING中的数据文件AnQing02.dbf 和AnQing03.dbf。
SQL> ALTER TABLESPACE ANQING OFFLINE;
executed successfully
used time: 108.058(ms). Execute id is 1606.
SQL> RESTORE TABLESPACE ANQING DATAFILE 1, 2 FROM BACKUPSET '/dm/dm_bak/ts_bak_for_dbf';
executed successfully
used time: 276.723(ms). Execute id is 1607.
SQL> ALTER TABLESPACE ANQING ONLINE;
executed successfully
used time: 22.790(ms). Execute id is 1608.
SQL>
如果不想使用文件编号还原,使用指定数据文件路径还原数据文件的语句如下:
SQL>RESTORE TABLESPACE ANQING DATAFILE '/dm/dmdbms/data/cndba/AnQing02.dbf', '/dm/dmdbms/data/cndba/AnQing03.dbf' FROM BACKUPSET '/dm/dm_bak/ts_bak_for_dbf';
4表备份与还原
4.1 语法说明
与备份数据库与表空间不同,备份表不需要服务器配置归档,DIsql 中输入以下即可备份用户表:
SQL>BACKUP TABLE TAB_01 BACKUPSET ‘tab_bak_01’;
备份集“tab_bak_01”会生成到默认的备份路径下。如要设置其他备份选项需参考下文的备份表语法。
备份语法如下:
BACKUP TABLE <表名>
[TO <备份名>]
BACKUPSET [‘<备份集路径>’] [DEVICE TYPE <介质类型> [PARMS ‘<介质参数>’]]
[BACKUPINFO ‘<备份集描述>’]
[MAXPIECESIZE <备份片限制大小>]
[IDENTIFIED BY <加密密码>[WITH ENCRYPTION][ENCRYPT WITH <加密算法>]]
[COMPRESSED [LEVEL <压缩级别>]]
[TRACE FILE ‘‘] [TRACE LEVEL ]
还原语法如下:
RESTORE TABLE [<表名>][STRUCT]
[WITH INDEX | WITHOUT INDEX] [WITH CONSTRAINT|WITHOUT CONSTRAINT]
FROM BACKUPSET’<备份集路径>’ [DEVICE TYPE <介质类型> [PARMS ‘<介质参数>’]]
[IDENTIFIED BY <密码>] [ENCRYPT WITH <加密算法>]
[TRACE FILE ‘‘] [TRACE LEVEL ];
4.2 操作示例
4.2.1备份
表备份拷贝指定表所使用的所有数据页到备份集中,并记录各个数据页之间的逻辑关系用来恢复表数据结构。表备份均为联机完全备份,不需要备份归档日志,不存在增量备份之说。当数据库中某张表比较重要而又没必要备份整个数据库或表空间时就可以选择表备份。
#备份表语句:
SQL> select user();
LINEID USER()
---------- ------
1 SYSDBA
used time: 2.947(ms). Execute id is 1497.
SQL> backup table dexp backupset '/dm/dm_bak/tab_dexp_01';
backup table dexp backupset '/dm/dm_bak/tab_dexp_01';
[-2106]:Error in line: 1
Invalid table or view name [DEXP].
used time: 1.603(ms). Execute id is 0.
#表备份要以表的用户来进行备份,或者加模式名:
SQL> backup table dexp.dexp backupset '/dm/dm_bak/tab_dexp_02';
executed successfully
used time: 00:00:01.242. Execute id is 1502.
SQL>
SQL> conn DEXP/"www.cndba.cn"
Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 10.679(ms)
SQL> backup table dexp backupset '/dm/dm_bak/tab_dexp_01';
executed successfully
used time: 00:00:01.253. Execute id is 1499.
SQL> host ls -lrt /dm/dm_bak/tab_dexp_01
总用量 304
-rw-r--r-- 1 dmdba dinstall 242176 9月 2 09:06 tab_dexp_01.bak
-rw-r--r-- 1 dmdba dinstall 56832 9月 2 09:06 tab_dexp_01.meta
SQL>
4.2.2还原
执行表还原,数据库必须处于 OPEN 状态,MOUNT 和 SUSPEND 状态下不允许执行表还原。与表空间还原不同,表还原不需要配置归档。表还原是联机完全备份还原,不需要借助本地归档日志,所以还原后不需要恢复。
表还原实质是表内数据的还原,以及索引和约束等的重建。如果表上没有索引和约束的信息,可以直接进行恢复,步骤如下:
#创建测试表:
SQL> CREATE TABLE TAB_FOR_RES_01(C1 INT);
executed successfully
used time: 7.465(ms). Execute id is 1503.
#备份表:
SQL> BACKUP TABLE TAB_FOR_RES_01 BACKUPSET '/dm/dm_bak/tab_bak_for_res_01';
executed successfully
used time: 00:00:01.223. Execute id is 1504.
#还原校验:可选:
SQL> SELECT SF_BAKSET_CHECK('DISK','/dm/dm_bak/tab_bak_for_res_01');
LINEID SF_BAKSET_CHECK('DISK','/dm/dm_bak/tab_bak_for_res_01')
---------- -------------------------------------------------------
1 1
used time: 11.949(ms). Execute id is 1505.
#还原表:
SQL> RESTORE TABLE TAB_FOR_RES_01 FROM BACKUPSET '/dm/dm_bak/tab_bak_for_res_01';
executed successfully
used time: 82.205(ms). Execute id is 1506.
SQL>
但如果表上有索引和约束,则会有所区别,示例如下:
#创建待备份的表。
SQL> CREATE TABLE TAB_FOR_RES_02(C1 INT);
executed successfully
used time: 6.526(ms). Execute id is 1507.
#创建索引。
SQL> CREATE INDEX I_TAB_FOR_RES_02 ON TAB_FOR_RES_02(C1);
executed successfully
used time: 12.657(ms). Execute id is 1508.
#备份表。
SQL> BACKUP TABLE TAB_FOR_RES_02 BACKUPSET '/dm/dm_bak/tab_bak_for_res_02';
executed successfully
used time: 00:00:01.244. Execute id is 1509.
#校验备份。此步骤为可选:
SQL> SELECT SF_BAKSET_CHECK('DISK','/dm/dm_bak/tab_bak_for_res_02');
LINEID SF_BAKSET_CHECK('DISK','/dm/dm_bak/tab_bak_for_res_02')
---------- -------------------------------------------------------
1 1
used time: 10.578(ms). Execute id is 1510.
#因为表上有索引,直接还原数据会报错:
SQL> RESTORE TABLE TAB_FOR_RES_02 FROM BACKUPSET '/dm/dm_bak/tab_bak_for_res_02';
RESTORE TABLE TAB_FOR_RES_02 FROM BACKUPSET '/dm/dm_bak/tab_bak_for_res_02';
[-8327]:the table to be restored has secondary indexes or extra constraints.
used time: 28.359(ms). Execute id is 0.
#执行表结构还原。表备份和表中都包含索引,如果直接执行表数据还原会报错:还原表中存在二级索引或冗余约束。
SQL> RESTORE TABLE TAB_FOR_RES_02 STRUCT FROM BACKUPSET '/dm/dm_bak/tab_bak_for_res_02';
executed successfully
used time: 41.682(ms). Execute id is 1512.
#执行表数据还原。
SQL> RESTORE TABLE TAB_FOR_RES_02 FROM BACKUPSET '/dm/dm_bak/tab_bak_for_res_02';
executed successfully
used time: 84.397(ms). Execute id is 1513.
SQL>
当然,也可以选择在还原时不重建索引或者不还原约束:
#按照官网的手册,这里是不需要表重构的,但实际测试必须重构,不然报错:
SQL> restore table tab_for_res_02 without index from backupset '/dm/dm_bak/tab_bak_for_res_02';
restore table tab_for_res_02 without index from backupset '/dm/dm_bak/tab_bak_for_res_02';
[-8327]:the table to be restored has secondary indexes or extra constraints.
used time: 35.045(ms). Execute id is 0.
SQL> RESTORE TABLE TAB_FOR_RES_02 STRUCT FROM BACKUPSET '/dm/dm_bak/tab_bak_for_res_02';
executed successfully
used time: 45.707(ms). Execute id is 1547.
#还原表数据,但不重建索引。
SQL> restore table tab_for_res_02 without index from backupset '/dm/dm_bak/tab_bak_for_res_02';
executed successfully
used time: 71.846(ms). Execute id is 1548.
SQL>
#还原表数据,但不还原约束。
SQL>RESTORE TABLE TAB_FOR_RES_02 WITHOUT CONSTRAINT FROM BACKUPSET '/dm/dm_bak/tab_bak_for_res_02';
5备份信息管理
5.1 备份集搜索目录
备份集搜索目录记录在内存中,当执行动态视图或批量删除备份集时,均会从这些指定目录中先搜索所有备
份集信息。
备份目录主要涉及以下3个操作:
1)SF_BAKSET_BACKUP_DIR_ADD函数:添加备份目录。若添加目录已经存在或者为库默认备份路径,则认为已经存在,不添加,但也不报错。
2)SF_BAKSET_BACKUP_DIR_REMOVE函数:删除备份目录。若删除目录为库默认备份路径,不进行删除,认为删除失败。若指定目录存在于记录的合法目录中,则删除;不存在或者为空则跳过,正常返回。1:目录删除成功、目录不存在或者目录为空;0:目录为库默认备份路径;其他情况报错。
3)SF_BAKSET_BACKUP_DIR_REMOVE_ALL函数:清理全部备份目录,默认备份目录除外。
SQL> SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK','/dm/dm_bak');
LINEID SF_BAKSET_BACKUP_DIR_ADD('DISK','/dm/dm_bak')
---------- ---------------------------------------------
1 1
used time: 2.283(ms). Execute id is 1610.
SQL> SELECT SF_BAKSET_BACKUP_DIR_REMOVE('DISK','/dm/dm_bak');
LINEID SF_BAKSET_BACKUP_DIR_REMOVE('DISK','/dm/dm_bak')
---------- ------------------------------------------------
1 1
used time: 1.709(ms). Execute id is 1611.
SQL> SELECT SF_BAKSET_BACKUP_DIR_REMOVE_ALL() ;
LINEID SF_BAKSET_BACKUP_DIR_REMOVE_ALL()
---------- ---------------------------------
1 1
used time: 1.834(ms). Execute id is 1612.
SQL>
5.2 备份集校验与删除
在单个备份集删除时并行备份中的子备份集不允许单独删除;在给定备份集搜集目录中发现存在引用删除备份集作为基备份的需要执行级联删除,默认报错。批量删除备份集时,跳过收集到的单独的子备份集。
相关的函数如下:
SF_BAKSET_CHECK
SF_BAKSET_REMOVE
SF_BAKSET_REMOVE_BATCH
SP_DB_BAKSET_REMOVE_BATCH
SP_TS_BAKSET_REMOVE_BATCH
SP_TAB_BAKSET_REMOVE_BATCH
SP_ARCH_BAKSET_REMOVE_BATCH
SF_BAKSET_CHECK 函数:对备份集进行校验。
SQL> SELECT SF_BAKSET_CHECK('DISK','/dm/dm_bak/ts_bak_for_dbf');
LINEID SF_BAKSET_CHECK('DISK','/dm/dm_bak/ts_bak_for_dbf')
---------- ---------------------------------------------------
1 1
used time: 10.494(ms). Execute id is 1605.
SF_BAKSET_REMOVE 函数:删除指定设备类型和指定备份集目录的备份集。一次只检查一个合法.meta 文件,然
后删除对应备份集;若存在非法或非正常备份的.meta 文件,则报错或直接返回,不会接着检查下一个.meta 文件;若同一个备份集下还存在其它备份文件或备份集,则只删除备份文件,不会删除整个备份集。
SQL> BACKUP DATABASE FULL BACKUPSET '/dm/dm_bak/db_bak_for_remove';
executed successfully
used time: 00:00:01.263. Execute id is 1613.
SQL> SELECT SF_BAKSET_REMOVE('DISK','/dm/dm_bak/db_bak_for_remove');
LINEID SF_BAKSET_REMOVE('DISK','/dm/dm_bak/db_bak_for_remove')
---------- -------------------------------------------------------
1 1
used time: 56.013(ms). Execute id is 1615.
SF_BAKSET_REMOVE_BATCH 函数: 批量删除满足指定条件的所有备份集。
SQL> SELECT SF_BAKSET_REMOVE_BATCH ('DISK', now(), NULL, NULL);
LINEID SF_BAKSET_REMOVE_BATCH('DISK',NOW(),NULL,NULL)
---------- ----------------------------------------------
1 1
used time: 27.335(ms). Execute id is 1616.
SQL>
SP_DB_BAKSET_REMOVE_BATCH 过程:批量删除指定时间之前的数据库备份集。使用该方法前,需要先使用
SF_BAKSET_BACKUP_DIR_ADD 添加将要删除的备份集目录,否则只删除默认备份路径下的备份集。
SQL> BACKUP DATABASE FULL BACKUPSET '/dm/dm_bak/db_bak_for_batch_del';
executed successfully
used time: 00:00:01.237. Execute id is 1617.
SQL> SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK','/dm/dm_bak');
LINEID SF_BAKSET_BACKUP_DIR_ADD('DISK','/dm/dm_bak')
---------- ---------------------------------------------
1 1
used time: 1.493(ms). Execute id is 1618.
SQL> CALL SP_DB_BAKSET_REMOVE_BATCH('DISK', NOW());
DMSQL executed successfully
used time: 38.745(ms). Execute id is 1619.
SQL>
SP_TS_BAKSET_REMOVE_BATCH 过程: 批量删除指定表空间对象及指定时间之前的表空间备份集。使用该方法前,需要先使用SF_BAKSET_BACKUP_DIR_ADD 添加将要删除的备份集目录,否则只删除默认备份路径下的备份集。
SQL>BACKUP TABLESPACE MAIN BACKUPSET '/dm/dm_bak/ts_bak_for_batch_del';
SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK','/dm/dm_bak');
SQL>CALL SP_TS_BAKSET_REMOVE_BATCH('DISK',NOW(),'MAIN');
SP_TAB_BAKSET_REMOVE_BATCH 过程:批量删除指定表对象及指定时间之前的表备份集。使用该方法前,需要先使用SF_BAKSET_BACKUP_DIR_ADD 添加将要删除的备份集目录,否则只删除默认备份路径下的备份集。
SQL>CREATE TABLE TAB_FOR_BATCH_DEL(C1 INT);
SQL>BACKUP TABLE TAB_FOR_BATCH_DEL BACKUPSET'/home/dm_bak/tab_bak_for_batch_del';
SQL> SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK','/home/dm_bak');
SQL> CALL SP_TAB_BAKSET_REMOVE_BATCH('DISK',NOW(),'SYSDBA','TAB_FOR_BATCH_DEL');
SP_ARCH_BAKSET_REMOVE_BATCH 过程:批量删除指定时间之前的归档备份集。使用该方法前,需要先使用SF_BAKSET_BACKUP_DIR_ADD 添加将要删除的备份集目录,否则只删除默认备份路径下的备份集。
SQL>BACKUP ARCHIVELOG BACKUPSET '/dm/dm_bak/arch_bak_for_batch_del';
SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK','/dm/dm_bak');
SQL>CALL SP_ARCH_BAKSET_REMOVE_BATCH('DISK', NOW());
5.3 查看备份信息
DM7 提供了一系列动态视图供用户查看备份集相关信息,在查看之前应先使用SF_BAKSET_BACKUP_DIR_ADD 添加备份集目录,否则只显示默认备份路径下的备份集信息,使用方法如下例所示:
SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD(‘DISK’, ‘/dm/dm_bak’);
下面逐个介绍 DM7 提供的备份相关动态视图。
V$BACKUPSET: V$BACKUPSET 显示备份集基本信息。
SQL>BACKUP DATABASE FULL BACKUPSET '/home/dm_bak/db_bak_for_info';
SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK', '/home/dm_bak');
SQL>SELECT DEVICE_TYPE,BACKUP_PATH, TYPE, RANGE# FROM V$BACKUPSET;
V$BACKUPSET_DBINFO: V$BACKUPSET_DBINFO 显示备份集的数据库相关信息。
SQL>BACKUP TABLETAB_01 BACKUPSET '/home/dm_bak/tab_bak_01';
SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK', '/home/dm_bak');
SQL>SELECT BACKUP_PATH, PAGE_SIZE, EXTENT_SIZE, CASE_SENSITIVE FROM
V$BACKUPSET_DBINFO WHERE BACKUP_PATH='/home/dm_bak/tab_bak_01';
V$BACKUPSET_DBF:显示备份集中数据文件的相关信息,表备份时无效。
SQL>CREATE TABLESPACE TS_FOR_DBF DATAFILE'TS_FOR_DBF_01.DBF' SIZE 128;
SQL>ALTER TABLESPACE TS_FOR_DBF ADD DATAFILE'TS_FOR_DBF_02.DBF' SIZE 128;
SQL>BACKUP TABLESPACE TS_FOR_DBF BACKUPSET '/home/dm_bak/ts_bak_for_dbf';
SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK', '/home/dm_bak');
SQL>SELECT FILE_SEQ, TS_ID, FILE_ID, TS_NAME, FILE_NAME FROM V$BACKUPSET_DBF WHERE BACKUPPATH ='/home/dm_bak/ts_bak_for_dbf';
V$BACKUPSET_ARCH:显示备份集中归档文件的信息,且仅归档备份才会有数据。
SQL>BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_for_arch';
SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK', '/home/dm_bak');
SQL>SELECT BACKUPPATH, FILE_SEQ, BEGIN_LSN, END_LSN FROM V$BACKUPSET_ARCH WHERE BACKUPPATH='/home/dm_bak/db_bak_for_arch';
V$BACKUPSET_BKP:显示备份集的备份片信息。
```dave
SQL>BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_for_bkp';
SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK', '/home/dm_bak');
SQL>SELECT BACKUPPATH, BKP_NTH, FILE_NAME, BKP_LEN FROM V$BACKUPSET_BKP WHERE BACKUPPATH='/home/dm_bak/db_bak_for_bkp';
V$BACKUPSET_SEARCH_DIRS:显示备份集搜索目录。
SQL>SELECT SF_BAKSET_BACKUP_DIR_REMOVE_ALL();
SQL>SELECT * FROM V$BACKUPSET_SEARCH_DIRS;
V$BACKUPSET_TABLE:显示表备份集中备份表信息,仅表备份有效。
SQL>CREATE TABLE TAB_FOR_INFO(C1 INT);
SQL>BACKUP TABLE TAB_FOR_INFO TO TAB_BAK_FOR_INFO BACKUPSET '/home/dm_bak/tab_bak_for_info';
SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK', '/home/dm_bak');
SQL>SELECT BACKUPNAME, TABLENAME FROM V$BACKUPSET_TABLE WHERE BACKUPPATH='/home/dm_bak/tab_bak_for_info';
V$BACKUPSET_SUBS:显示并行备份中生成的子备份集信息。
SQL>BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_for_subs' PARALLEL 3;
SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK', '/home/dm_bak');
SQL>SELECT BACKUPPATH, BKP_NUM, DBF_NUM FROM V$BACKUPSET_SUBS;
版权声明:本文为博主原创文章,未经博主允许不得转载。



