达梦8备份补充说明
今天本来打算写过存储过程,用来做表备份,可以指定表名称和备份集名称,结果发现一个奇怪的问题。
一、问题
backup table "DMHR"."CITY" backupset 'TAB_DMHR_CITY_2021_08_19_14_33_30';
执行上面这条语句做备份,在manager管理工具中查看效果如下:

显示的名称和我指定的备份集名称不同。
二、查看备份目录

备份目录中的名称是我指定的备份集名称。
三、查看 v$backupset
select * from v$backupset;

因为我没有指定备份的名称,所以会自动生成备份的名称,'TAB_DMHR_CITY_2021_08_19_14_33_30'是备份集的名称,其实在做备份还原的时候,只会用到备份集的名称,所以我之前都没注意过备份的名称,也从来没指定备份的名称。
四、指定备份名称和备份集名称
backup table "DMHR"."CITY" to "TAB_DMHR_CITY_A" backupset 'TAB_DMHR_CITY_A';



五、存储过程实现自定义备份表和备份集名称
--备份的(模式+表)名称 、备份集名称
CREATE OR REPLACE PROCEDURE back_by_name(table_name VARCHAR(50),backupset_name VARCHAR(500)) AS
DECLARE
str_sql varchar := 'backup table '||table_name||' backupset ''' || backupset_name ||'''';
BEGIN
print str_sql;
EXECUTE IMMEDIATE str_sql ;
END;
/
call back_by_name('DMHR.CITY','TAB_DMHR_CITY_2021_08_19_13_38_06');
to 备份名称这种很少用,做备份还原指定备份集即可。
六、既可以表备份也可以库备份
--备份的(模式+表)名称 、备份集名称
CREATE OR REPLACE PROCEDURE back_by_name(type varchar(50),table_name VARCHAR(50),backupset_name VARCHAR(500)) AS
DECLARE
str_sql varchar := 'backup '||type||' '||table_name||' backupset ''' || backupset_name ||'''';
BEGIN
print str_sql;
EXECUTE IMMEDIATE str_sql ;
END;
/
call back_by_name('table','DMHR.CITY','TAB_DMHR_CITY_2021_08_19_13_38_06');--表备份
call back_by_name('database','','TAB_DMHR_CITY_2021_08_19_13_38_06');--全库备份
七、用存储块根据日期备份
declare
backupset_name varchar;
begin
select 'backupset_'||to_char(sysdate,'YYYY-MM-dd-HH24-MI-SS') into dataset_name from dual ;
execute immediate 'backup database backupset ''' || backupset_name ||'''';
end;
declare
begin
execute immediate 'backup database backupset ''dataset_'||to_char(sysdate,'YYYY-MM-dd-HH24-MI-SS')||'''';
end;
execute immediate
简单来说就是你在存储过程中创建了一个表 table_a ,然后要用insert into将其他的数据插入到这个table_a当中,但是因为你在创建过程的时候 table_a还不存在,过程就会显示有编译错误,因为table_a不存在必然导致过程无法执行,所以无法编译成功,而把insert into语句加如到 execute immediate之后 则oracle不会再去理会这个对象是否存在,因此可以成功编译和执行。
更多资讯请上达梦技术社区了解: https://eco.dameng.com

浙公网安备 33010602011771号