达梦数据库DM8备份、还原、恢复介绍

备份:将数据库中的数据进行拷贝。
还原:将备份导入数据库中,把数据库还原到备份时的样子。
恢复:经过还原的数据库,魔数可能有变,需要更新后才可启动。


【联机配置归档】
跟手动同理,参数都是动态的,因此无需重启,重启后也可生效。
--修改数据库状态为mount
alter database mount;
--添加归档
alter database add archivelog 'dest=/dmarch, TYPE=local, FILE_SIZE=1024, SPACE_LIMIT=102400';
ALTER DATABASE ADD ARCHIVELOG 'DEST = DSC1, TYPE = REMOTE, FILE_SIZE = 1024, SPACE_LIMIT = 2048, ARCH_FLUSH_BUF_SIZE=16, INCOMING_PATH =/dmdata/dameng/arch_dsc1';
--开启归档模式(修改数据库状态为archivelog,若要关闭则写NOARCHIVELOG)
alter database archivelog;
--再修改数据库状态为OPEN状态
alter database open;

DEST=归档目标(远程的时候就写另一个集群的名字,例如DSC1。本地就写目录即可,末尾不加/)
TPYE=归档类型(local本地归档/remote远程归档)
FILE_SIZE=文件大小
SPACE_LIMIT=空间大小限制
ARCH_FLUSH_BUF_SIZE = 归档合并刷盘缓存大小
ARCH_HANG_FLAG=本地归档写入失败时系统是否挂起,取值0不挂起,1挂起,不写默认为1,第一路归档必须是1,写0无效
INCOMING_PATH=归档存放路径,仅对remote类型有效,对应远程节点的归档存放路径(ARCH_INCOMING_PATH)

使用远程归档时必须先配置本地归档

【多路归档】
多路归档,指配置多个本地归档。配置的第一个归档,称为第一路归档,后面依次是第二路、第三路......

【手动配置归档】
先编辑dmarch.ini,没有创建
[ARCHIVE_LOCAL1]
        ARCH_TYPE            = LOCAL  #归档类型,LOCAL为本地归档,REMOTE远程归档
        ARCH_DEST            = /dmarch  #归档日志存放目录
        ARCH_FILE_SIZE       = 1024  #归档日志文件大小
        ARCH_SPACE_LIMIT     = 102400  #归档空间大小限制
        ARCH_FLUSH_BUF_SIZE  = 0  #归档合并刷盘缓存大小
        ARCH_HANG_FLAG       = 1  #本地归档写入失败时是否挂起系统

保存后,修改dm.ini里的ARCH_INI=1即可,并重启数据库服务。


【数据库备份、还原、恢复】
备份之后,进行还原,还原好的数据库不一定能直接使用,一般需要进行恢复(类似修复的一种操作)


【基备份、差异增量备份、累积增量备份】
基备份集:就是增量备份需要的东西,就是完全备份之后的产物。增量备份靠此物知道从哪开始继续备。
差异增量备份:基备份集可以是增量备份集,也可以是完全备份集。但如果是增量备份集,其基备份也必须是完全备份集。说白了最终结果都必须是完全备份集。
累积增量备份:基备份集必须是完全备份集。


【联机方式(热备)】是指数据库服务器正常运行过程中进行的备份和还原
联机备份时,可能存在一些处于活动状态的事务正在执行,为确保备份数据的一致性,需要将备份期间产生的 REDO 日志一起备份。因此,只能在配置本地归档、并开启本地归档的数据库上执行联机备份。
一般使用disql、dexp/dimp工具进行,图形化是manager

【联机备份——disql】
使用disql联机备份,需要配置归档后才可。

--最简单的完全备份
SQL> BACKUP DATABASE FULL BACKUPSET '/dmbak/db_full_bak_01';

其中FULL可以省略不写,执行后在默认路径生成“db_bak_01”的备份集目录,默认路径在dm.ini的BACK_PATH处写有。若没配置,使用SYSTEM_PATH的目录。可以备份时指定位置。

--最简单的增量备份
SQL>BACKUP DATABASE INCREMENT WITH BACKUPDIR '/dmbak' BACKUPSET '/dmbak/db_increment_bak_02';

其中INCREMENT必须写,默认为差异增备,若要累积增备需要写CUMULATIVE,然后WITH BACKUPDIR是基备份集的搜索目录,若基备份集不在默认备份目录或当前备份目录则必须写。
BACKUPSET是增量备份保存目录。

BASE ON BACKUPSET是增量备份中,用于指定基备份集路径的。它跟WITH BACKUPDIR的关系是,前者直接指定路径,后者只是给个搜索的目录而已,让系统自己去搜。两者写一个即可。【联机备份示例——disql中各级别】

--库级别,完全备份
BACKUP DATABASE FULL BACKUPSET '/dmbak/db_full_bak_01';
--库级别,增量备份
BACKUP DATABASE INCREMENT WITH BACKUPDIR '/dmbak' BACKUPSET '/dmbak/db_increment_bak_02';

--表空间级,完备和增备
BACKUP TABLESPACE <表空间名> BACKUPSET 'ts_full_bak_01';
BACKUP TABLESPACE <表空间名> INCREMENT BASE ON BACKUPSET'ts_full_bak_01' BACKUPSET 'ts_increment_bak_02';

--表级别,完备和增备
BACKUP TABLE <表名> BACKUPSET '/home/dm_bak/tab_bak_01';

--归档备份
BACKUP ARCHIVE LOG ALL BACKUPSET 'arch_bak_01';
ALL:备份所有的归档。若不指定,则默认为 ALL。
FROM LSN:指定备份的起始 lsn。
UNTIL LSN:指定备份的截止 lsn。
--确定LSN值
select ARCH_LSN, CLSN, PATH from V$ARCH_FILE;
--然后备份归档
BACKUP ARCHIVELOG LSN BETWEEN 50414 AND 50478 BACKUPSET '/home/dm_bak/arch_bak_time_14-78';

BETWEEN ... AND ...:指定备份的区间。指定区间后,只会备份指定区间内的归档文件。 

【管理备份】

--添加备份集目录(备份目录集也就是备份的路径,不是备份集。系统有记录备份目录,备份时不指定路径就会使用此目录)
SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK','/home/dm_bak');

--删除备份集目录
SELECT SF_BAKSET_BACKUP_DIR_REMOVE('DISK','/home/dm_bak');

--删除所有备份集目录
SELECT SF_BAKSET_BACKUP_DIR_REMOVE_ALL();

--校验备份集目录是否存在
BACKUP DATABASE FULL BACKUPSET '/home/dm_bak/db_bak_for_check';
SELECT SF_BAKSET_CHECK('DISK','/home/dm_bak/db_bak_for_check');

--删除指定备份集目录 的 备份集
SELECT SF_BAKSET_REMOVE('DISK','/home/dm_bak/db_bak_for_remove');

--批量删除满足指定条件的备份集
SELECT SF_BAKSET_REMOVE_BATCH ('DISK', now(), NULL, NULL);

device_type设备类型,这里写'DISK',end_time删除备份集生成的结束时间,仅删除 end_time 之前的备份集,必须指定。这里写now()就是现在。range指定删除备份的级别,1 代表库级,2 代表表空间级,3 代表表级,4 代表归档备份。这里写NULL,表示忽略级别,全干。obj_name待删除备份集中备份对象的名称,仅表空间级和表级有效。删表时要指定模式名.表名。这里写NULL,全干。

--批量删除指定时间之前的备份集
CALL SP_DB_BAKSET_REMOVE_BATCH('DISK', NOW());
--这里end_time写NOW()就是直到现在的全删。

--批量删除指定表空间对象及指定时间之前的表空间备份集
CALL SP_TS_BAKSET_REMOVE_BATCH('DISK',NOW(),'MAIN');
--这里'MAIN'是表空间名,不写则认为删除所有满足条件的表空间备份集

--批量删除指定表对象及指定事件之前的表备份集
CALL SP_TAB_BAKSET_REMOVE_BATCH('DISK',NOW(),'SYSDBA','TAB_FOR_BATCH_DEL');
--这里'SYSDBA'是模式名,'TAB_FOR_BATCH_DEL'是表名。这俩写其中一个就会认为匹配目标,但是都写NULL则认为删除所有满足条件的表空间备份集

--批量删除指定时间之前的归档备份集
CALL SP_ARCH_BAKSET_REMOVE_BATCH('DISK', NOW());

--备份信息查看,通过查看动态视图V$BACKUPSET实现,内容过多不展示。
SELECT DEVICE_TYPE,BACKUP_PATH, TYPE, RANGE# FROM V$BACKUPSET;
       介质类型,  备份路径,   备份类型,备份主要内容
--备份类型:0:基备份,1:增量备份,2:表备份,3:归档备份
--备份主要内容:1:库备份,2:表空间备份,3:表级备份,4:归档备份

其他备份的视图还有以下:
V$BACKUPSET_DBINFO 显示备份集的数据库相关信息。
V$BACKUPSET_DBF 显示备份集中数据文件的相关信息,表备份时无效。
V$BACKUPSET_ARCH 显示备份集中归档文件的信息,且仅归档备份才会有数据。
V$BACKUPSET_BKP 显示备份集的备份片信息。
V$BACKUPSET_TABLE 显示表备份集中备份表信息,仅表备份有效。
V$BACKUPSET_SUBS 显示并行备份中生成的子备份集信息。

【监视备份】

SELECT TOTAL_SIZE, PCNT, CUR_READ, CUR_WRITE FROM V$BACKUP_MONITOR;
       待备份数据文件大小,备份完成百分比,当前读取速度M/s,当前写入速度M/s
--查询多次,可知情况

其他视图:
V$BACKUP_MONITOR 显示当前备份任务实时监控信息。
V$BACKUP_FILES 显示当前备份任务待备份数据文件列表。
V$BACKUP_HISTORY 显示最近 100 条备份监控信息。【联机还原——disql】仅支持表的联机还原,数据库、表空间和归档日志的还原必须通过脱机工具DMRMAN执行。

--表还原
RESTORE TABLE TAB_01 FROM BACKUPSET 'tab_bak_01';

--还原表但不还原索引
RESTORE TABLE TAB_FOR_RES WITHOUT INDEX FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_01';
--备份时默认备份表中索引,还原时也会默认还原,可指定参数使其不还原索引。

--还原表但不还原约束(情况同索引)
RESTORE TABLE TAB_FOR_RES WITHOUT CONSTRAINT FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_01';

【脱机方式(冷备)】是指数据库服务器关闭时进行的备份和还原
一般使用dmrman,语法同联机的disql一样。同时许多功能dmrman也都有,语法都跟disql的一样。图形化是console

【脱机备份】使用DMRMAN(dmrman)
dmap是辅助插件服务,一般启动数据库时会自动启动
手动启动(bin目录下):./DmAPService start
关闭数据库后,去bin目录执行:./dmrman
执行bakup全库:backup database '<数据库目录>/dm.ini' backupset '<备份存放目录>/<备份目录名>';
例:backup database '/dm/data/DMDB3/dm.ini' backupset '/home/dmdba/bakfull';【脱机还原】
拷贝主库的备份,到备库,看情况做:scp -r <备份存放目录>/<备份目录名> <ip>:/home/dmdba
关闭数据库后,去bin目录执行:./dmrman
执行restore还原:restore database '<数据库目录>/dm.ini' from backupset '<备份存放目录>/<备份目录名>';
例:restore database '/dm/data/DMDB3/dm.ini' from backupset '/home/dmdba/bakfull';
执行recover恢复:recover database '<数据库目录>/dm.ini' from backupset '<备份存放目录>/<备份目录名>';
执行recover update db_magic:recover database '<数据库目录>/dm.ini' update db_magic;
【脱机的其他备份还原方式】
语法同联机的disql一样。

--删除备份集
REMOVE BACKUPSET '/home/dm_bak/db_bak_for_remove_01';
--备份集在默认路径时
REMOVE BACKUPSET 'db_bak_for_remove_01' DATABASE '/opt/dmdbms/data/DAMENG/dm.ini';
--查看单个备份集信息
show backupset '/home/dm_bak/DB_FULL_DAMENG_20190522_133248_000770'
--校验备份
CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';

--表空间还原
RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/home/dm_bak/ts_full_bak_for_restore';

--归档还原,指定还原的目标归档日志目录
RESTORE ARCHIVE LOG FROM BACKUPSET '/home/dm_bak/arch_all_for_restore' TO ARCHIVEDIR'/opt/dmdbms/data/DAMENG_FOR_RESTORE/arch_dest' OVERWRITE 2;
--归档还原,指定还原目标库的 dm.ini 文件路径
RESTORE ARCHIVE LOG FROM BACKUPSET '/home/dm_bak/arch_all_for_restore' TO DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' OVERWRITE 2;

【数据库恢复】是脱机的(不死干嘛要恢复,所以库服务肯定是死的),因此使用dmrman
使用 RECOVER 命令完成数据库恢复工作,可以是基于备份集的恢复工作,也可以是使用本地归档日志的恢复工作。
如果还原后,数据已经处于一致性状态了,则可以使用更新 DB_MAGIC 方式恢复,前提是不需要重做日志。(DB_MAGIC数据库魔数)

--校验备份,并还原数据库后,执行以下恢复数据库
RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';

--数据库更新,指更新数据库的DB_MAGIC,使其调整为可正常工作状态
RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' UPDATE DB_MAGIC;

--表空间恢复
RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RECOVER/dm.ini' TABLESPACE MAIN;

--归档恢复
REPAIR ARCHIVELOG DATABASE '/opt/dmdbms/data/dm.ini';

####以下是恢复数据到指定时间点或LSN的案例####
1)准备数据
CREATE TABLE TEST01 (T1 INT);
INSERT INTO TEST01 VALUES(1);
COMMIT;

2)备份
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_full_bak_for_time_lsn';

3)再次操作,产生归档
CREATE TABLE TEST02 (T2 INT);
INSERT INTO TEST02 VALUES(2);
COMMIT;

--此时查看时间,查看此时的LSN
SELECT SYSDATE;
SELECT FILE_LSN FROM V$RLOG;
--记录时间2022-01-14 11:21:46,记录LSN值28073

4)误操作
DELETE FROM TEST01;
COMMIT;

5)还原数据库,还原到3)的状态
关闭数据库服务,dmrman脱机还原
RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_time_lsn';

6)恢复
--指定时间点
RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' WITH ARCHIVEDIR '/home/dm_arch/arch' UNTIL TIME '2022-01-14 11:21:46';
--指定LSN
RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' WITH ARCHIVEDIR'/home/dm_arch/arch' UNTIL LSN 28073;

【数据备份等级】
数据库级(FULL):导出或导入整个数据库中的所有对象。
用户级(OWNER):导出或导入一个或多个用户所拥有的所有对象。
模式级(SCHEMAS):导出或导入一个或多个模式下的所有对象。
表级(TABLES):导出或导入一个或多个指定的表或表分区。

上述4种互斥,只能出现一种

【逻辑备份】联机的,使用dexp和dimp
【dexp】逻辑导出
(1)dexp工具可以将本地或远程的数据库进行数据库级、用户级、模式级、表级的逻辑备份,都是在联机方式下完成。
(2)两种写法,dexp和dexpdp,区别是dexp必须存放在客户端,dexpdp必须存放在服务器端。
语法:./dexp PARAMETER=<value> {PARAMETER=<value>}
需要从命令行启动,即cmd

cd F:\dmdbms\bin
./dexp USERID=TEST/123456789@192.168.238.137:5237#/user/data FILE=db_str.dmp DIRECTORY=F:\dmdbms\doc LOG=db_str.log FULL=Y

说明:
/user/data为数字证书路径,可不写
DIRECTORY是导出文件存放的目录,包括导出文件、日志等
FILE是导出文件名,若写路径那会替代DIRECTORY
LOG是日志名,写这个的话就会打印出日志,不写不打印,若写路径那会替代DIRECTORY
COMPRESS=Y/N,是压缩文件,Y是压缩,N或不写是不压缩。

(3)一般情况下,OWNER 与 SCHEMAS 导入导出是相同的。但是用户可以包含多个模式,在这种情况下SCHEMAS的导入导出是OWNER导入导出的一个子集。
(4)书写规定:若是小写的用户、模式名、表名,dexp/dimp工具会转换为大写。若不想转换,需使用双引号""括起。例如:"tab1"。但因为系统要求传入的名称需要用双引号括起,所以要转义,例如:"\"tab1\""。若名称中有特殊字符,要求将有特殊字符的名称,双引号""括起,同时用一个双引号"转义里面的特殊字符,例如转义带双引号的表名tab1",写为:"tab1""",同时应系统要求再次转义,"\"tab1\"\"\""。windows可以用"和\,linux用\。

【dimp】逻辑导出
(1)dimp逻辑导入工具利用dexp工具生成的备份文件对本地或远程的数据库进行联机逻辑还原。dimp导入是dexp导出的相反过程。
(2)两种写法,dimp和dimpdp,区别是dimp必须存放在客户端,dimpdp必须存放在服务器端。
语法:./dimp PARAMETER=<value> { PARAMETER=value }
其他同dexp

./dimp USERID=TEST/123456789@192.168.238.137:5237 FILE=db_str.dmp DIRECTORY=E:\dmdbms\doc LOG=db_str.log FULL=Y

IGNORE=Y/N,指定忽略创建数据库对象(表、类、java 类、domain、sequence、comment、view、synonym、trigger、package、dblink、user、存储过程/函数、role 对象创建、权限授权语句、索引、约束等)错误。可选参数。不写就为 N,不忽略。
TABLE_EXISTS_ACTION,用于要导入的表已经存在时的处理方式。
TABLE_EXISTS_ACTION=[SKIP | APPEND | TRUNCATE | REPLACE]
SKIP:跳过此表。
APPEND:直接向现有表中导入数据。
TRUNCATE:先删除现有表中的数据,再向表中导入数据。
REPLACE:先删除现有表,再导数据。

【dexp和dimp加盐】V8.1.2.69版本后,创建用户时,对用户口令(密码)进行了加盐,因此从加盐的版本导出的dmp,无法导入进未加盐的库中。此时需要用alter将加盐口令修改为未加盐即可。
<加盐选项>包含SALT和NO SALT,不写默认为NO SALT。

【数据备份&归档日志备份】
数据备份:主要针对数据文件内容,包括库备份、表空间备份和表备份。
归档日志备份:是专门针对归档日志文件进行操作,不涉及任何数据文件内容。扫描归档目录收集归档日志文件,并将归档日志写入到备份集中。可联机可脱机。

【一致性备份和非一致性备份】
一致性备份:备份集包含完整的数据文件内容和归档日志信息,利用一个单独的备份集可以将数据库恢复到备份时状态。
非一致性备份:备份集只包含数据文件相关内容。
不指定 WITHOUT LOG 选项的联机备份,就是一致性备份
脱机备份一定是一致性备份。当数据库异常关闭时会强制拷贝检查点之后的redo日志。当数据库正常关闭时却不会,不包含任何redo日志。
非一致性备份还原的数据库无法直接启动,必须借助归档日志来恢复。
表空间备份、指定 WITHOUT LOG选项的联机备份生成的备份集都是非一致性备份集。

社区地址:https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值