武汉达梦数据库
Oracle系
一、体验环境
# 1、DM8数据库服务器用户信息
ssh dmdba@172.25.128.108  221
密码:sys12345
# 2、启停数据库
systemctl status DmServiceDMSERVER.service
systemctl start DmServiceDMSERVER.service
systemctl status DmServiceDMSERVER.service
# 3、连接DM8数据库
disql SYSDBA/sys123456
二、简单使用
-- 1、创建表空间
create tablespace tbs_data datafile '/data/dm8/data/dameng/tbs_data01.dbf' size 1024 autoextend on maxsize 32768 cache = normal;
create tablespace tbs_idx datafile '/data/dm8/data/dameng/tbs_idx01.dbf' size 1024 autoextend on maxsize 32768 cache = normal;
-- 2、创建用户及赋权
create user "dm8admin" identified by "admin12345" password_policy 0
default tablespace "tbs_data"
default index tablespace "tbs_idx";
grant "dba","public","resource","soi","vti" to "dm8admin";
-- 3、创建表
create table employee
(
  employee_id integer,
  employee_name varchar2(20) not null,
  hire_date date,
  salary integer,
  department_id integer not null
);
create table department
(
  department_id integer primary key,
  department_name varchar(30) not null
);
-- 4、添加表约束
-- 非空约束
alter table employee modify( hire_date not null);
-- 主键约束
alter table employee add constraint pk_empid primary key(employee_id);
-- 外键约束
alter table employee add constraint fk_dept foreign key(department_id) references department (department_id);
-- 5、插入数据 更新数据 删除数据
insert into department values(666, '数据库产品中心');
insert into employee values(9999, '王达梦','2008-05-30 00:00:00', 30000, 666);
commit;
update employee set salary='35000' where employee_id=9999;
commit;
delete from employee;
delete from department where department_id=666;
commit;
-- 6、批量插入及选择排序
create table t1 as
     select rownum as id,
       trunc(dbms_random.value(0, 100)) as random_id,
       dbms_random.string('x', 20) as random_string
     from dual
     connect by level <= 100000;
     
select * from t1 where rownum<5 order by id desc;
-- 7、分组查询
-- 准备数据
insert into department (department_id, department_name) select department_id, department_name from dmhr.department;
insert into employee
     (employee_id, employee_name, hire_date, salary, department_id)
     select employee_id, employee_name, hire_date, salary,
     department_id from dmhr.employee;
-- 分组查询
select dept.department_name as 部门, count(*) as 人数
     from employee emp, department dept
     where emp.department_id=dept.department_id
     group by dept.department_name
     having count(*) > 20;
     
-- 8、创建视图
create or replace view v1 as
     select dept.department_name, emp.employee_name,
     emp.salary,emp.hire_date
     from employee emp, department dept
     where salary > 10000
     and hire_date >= '2013-08-01'
     and emp.department_id = dept.department_id;
select * from v1 where hire_date > '2014-09-01';
-- 9、创建删除索引
-- 创建普通索引
create index ind_emp_salary on employee(salary);
-- 查看创建的索引
select table_name, index_name, index_type from user_indexes where index_name='ind_emp_salary';
-- 删除索引
drop index ind_emp_salary;
-- 10、事务特性
insert into employee values(999, '罗小刚', '2020-05-30 00:00:00', 50000, 101);
savepoint my_insert;
update employee set department_id=102 where employee_id=999;
select employee_id, department_id from employee where employee_id=999;
     
rollback to my_insert;
select employee_id, department_id from employee where employee_id=999;
     
-- 11、序列
create sequence seq1 start with 1 increment by 1 maxvalue 10000 cache 5 nocycle;
select seq1.nextval() from dual;
select seq1.currval() from dual;
-- 12、创建物化视图
create materialized view mv1 build immediate refresh complete on commit as select department_id as 部门号, count(*) as 人数 from employee group by department_id;
select * from mv1 where 部门号='101';
insert into employee values(8888, '苏林','2020-05-31 00:00:00', 60000, 101);
commit;
select * from mv1 where 部门号='101';
-- 13、创建函数
-- 创建生成随机数函数
create or replace function random_password
    (pass_len in number) return varchar2 as
    l_pw varchar2(128);
    begin l_pw = dbms_random.string('x', pass_len);
    return l_pw;
    end;
-- 调用函数生成随机数
select random_password(12) from dual;
-- 创建计和函数
create function dm8admin.fun_1 ( a int, b int ) return int as s int;
begin
                s := a + b;
        return s;
end;
-- 调用函数
select dm8admin.fun_1(4,5);
-- 14、存储过程
select employee_id, employee_name, salary from dm.employee where department_id=102 and hire_date >= to_date('2012-03-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss');
create or replace procedure proc
     (dept_in dm.employee.department_id%type, hire_in varchar2(24))
     as cursor by_dept_cur is
     select * from dm.employee where department_id=dept_in;
     begin for rec in by_dept_cur
     loop
     if rec.hire_date > to_date(hire_in, 'yyyy-mm-dd hh24:mi:ss')
     then
     update dm.employee set salary=salary+salary*0.15
     where employee_id=rec.employee_id;
     end if;
     end loop;
     commit;
     end;
begin
     proc(102, '2012-03-01 00:00:00');
     end;
select employee_id, employee_name, salary from dm.employee where department_id=102 and hire_date >= to_date('2012-03-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss');
create or replace procedure dm8admin.proc_1 ( a in out int ) as b int := 10;
begin
                a := a + b;
        print 'dm8admin.proc_1调用结果:' || a;
end;
call dm8admin.proc_1(3);
-- 15、触发器
create table trg(name_old varchar, name_new varchar);
create or replace trigger trg1
     before
     update of employee_name on employee
     for each row
     declare
     begin
     insert into trg values(:old.employee_name,
     :new.employee_name);
     end;
/
update employee set employee_name='达梦' where employee_id=1001;
commit;
-- 建立BEFORE触发器
create table dm8admin.tab_before(id int, name varchar(20));
insert into dm8admin.tab_before values(1,'aaa');
insert into dm8admin.tab_before values(2,'bbb');
insert into dm8admin.tab_before values(3,'bbb');
create table dm8admin.tab_before_result (type varchar(20),num int);
create or replace trigger dm8admin.trigger_before
before insert on dm8admin.tab_before
begin
insert into dm8admin.tab_before_result select 'before',count(*) from dm8admin.tab_before;
end;
/
insert into dm8admin.tab_before values(4,'bbb');
select * from dm8admin.tab_before_result;
select * from dm8admin.tab_before;
-- 建立AFTER触发器
create table dm8admin.tab_after(id int, name varchar(20));
insert into dm8admin.tab_after values(1,'aaa');
insert into dm8admin.tab_after values(2,'bbb');
insert into dm8admin.tab_after values(3,'bbb');
create table dm8admin.tab_after_result (type varchar(20),num int);
create or replace trigger dm8admin.trigger_after
after insert on dm8admin.tab_after
begin
insert into dm8admin.tab_after_result select 'after',count(*) from dm8admin.tab_after;
end;
/
insert into dm8admin.tab_after values(4,'bbb');
select * from dm8admin.tab_after_result;
select * from dm8admin.tab_after;
-- 16、分区表
create table emp_part
(
employee_id int primary key,
employee_name varchar(20),
identity_card varchar(18),
email varchar(50) not null,
phone_num varchar(20),
hire_date date not null,
job_id varchar(10) not null,
salary int,
commission_pct int,
manager_id int,
department_id int
)
partition by range(hire_date)
interval (numtoyminterval(1,'year'))
(
  partition p_before_2007 values less than (to_date('2007-01-01','yyyy-mm-dd'))
)
storage
(
  fillfactor 85,
  branch(32,32)
);
insert into emp_part select * from dmhr.employee;
commit;
-- 查看分区信息
select table_name,partition_name, high_value from user_tab_partitions where table_name='emp_part' order by high_value;
-- 检索某个分区
select * from emp_part partition(p_before_2007);
-- 插入数据自动生成新分区表
insert into emp_part(employee_id,employee_name,identity_card,email,phone_num,hire_date,job_id,salary,commission_pct,manager_id,department_id) values(9990,'武达梦','340102196202303999','wudm@dameng.com','15312348566','2020-05-30','11',50000.00,0,1001,101);
commit;
-- 查询新增数据分区
select table_name,partition_name, high_value from user_tab_partitions where table_name='emp_part' order by high_value;
-- 17、with 子句
-- 定义 with function 子句
with function getsalary(emp_id int) return int as
     declare
     sal int;
     begin
     select salary into sal from dmhr.employee where employee_id=emp_id;
     return sal;
     end;
     select getsalary(2001) from dual;
-- 定义 with as 子句
with t as (
     select max(hire_date) max_hd, min(hire_date) min_hd from dmhr.employee)
     select employee_name, employee_id, hire_date from dmhr.employee
     where hire_date in
     (
      select t.max_hd from t
      union all
      select t.min_hd from t
     );
三、DBA维护DM8
1、部署配置DM8
# 1、创建安装目录,dmdata,dmarch,dmbak建议单独挂盘最好是SSD
mkdir /data/dm8/{dmdbms,dmdata,dmarch,dmbak} -p
# 2、创建用户和组
groupadd dinstall
useradd  -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
echo "dmdba"|passwd --stdin dmdba
# 3、配置用户环境变量
cat >> /home/dmdba/.bash_profile <<"EOF"
export DM_HOME=/data/dm8/dmdbms
export PATH=$PATH:$DM_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME/bin
alias sas='rlwrap disql'
EOF
# 4、用户资源限制
cat >> /etc/security/limit.conf <<"EOF"
dmdba soft core unlimited
dmdba hard core unlimited
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft nproc  65536
dmdba hard nproc  65536
dmdba soft stack  65536
dmdba hard stack  65536
EOF
# 5、挂载数据库软件
mount -o loop dm8_20200930_x86_rh6_64_ent_8.1.1.134.iso /mnt
# 6、安装数据库软件
su - dmdba
cd /mnt
./DMInstall.bin -i
1.选择安装程序的语言 c/C 为中文,e/E 为英文。
2.提示是否安装 key 文件,输入 N 跳过。
3.选择时区,21 即东 8 区。
4.选择安装类型,默认典型安装(包含所有内容)。
5.选择软件安装目录,为之前规划的目录 /data/dm8/dmdbms。
6.确认安装目录。
7.确认安装概要。
8.开始安装。
9.安装完成后,按照系统提示使用 root 用户执行脚本。
/data/dm8/dmdbms/script/root/root_installer.sh
# 7、使用 dminit 工具初始化实例
# 查询 v$dm_ini 视图,para_type='READ ONLY' 表示参数无法修改。
cd /data/dm8/dmdbms/bin
./dminit path=/data/dm8/dmdata page_size=32
# 8、启动实例+关闭实例+查看实例状态
su - root
cd /data/dm8/dmdbms/script/root/
# -t 指服务类型是 dmserver;-p 为服务名的后缀;-dm_ini 为实例的 dm.ini 文件的绝对路径。
./dm_service_installer.sh -t dmserver -p dmserver -dm_ini /data/dm8/dmdata/DAMENG/dm.ini
systemctl start DmServicedmserver
systemctl stop DmServicedmserver
systemctl status DmServicedmserver
# 9、连接数据库# 默认创建的实例,用户SYSDBA的密码为SYSDBA,端口为5236,字符集为GB18030,大小写敏感。
su - dmdba
cd /data/dm8/dmdbms/bin
./disql SYSDBA/SYSDBA@localhost:5236
# 10、参数优化
# 安装完成需要调整 dm.ini 文件参数。
参数名称:参数含义—参数默认值—参数建议
BUFFER:系统缓冲区大小,以MB为单位—100—系统物理内存的60%~80%
HJ_BUF_GLOBAL_SIZEHASH:连接操作符的数据总缓存大小,以MB为单位—500—5000
HJ_BUF_SIZE:单个HASH连接操作符的数据总缓存大小,以MB为单位—50—500
DICT_BUF_SIZE:字典缓冲区大小,以MB为单位—5—100
TASK_THREADS:任务线程个数—4—CPU核数
IO_THR_GROUPS:非Windows下有效,表示IO线程组个数—2—CPU核数/2
MAX_SESSIONS:系统允许同时连接的最大数—100—1000
MAX_SESSION_STATEMENT:单个会话上允许同时打开的语句句柄最大数—100—20000
CACHE_POOL_SIZESQL:缓冲池大小,以MB为单位—20—200
# 可通过脚本调整,重启数据库生效
SP_SET_PARA_VALUE (2,'HJ_BUF_GLOBAL_SIZE',5000);
SP_SET_PARA_VALUE (2,'HJ_BUF_SIZE',500);
SP_SET_PARA_VALUE (2,'MAX_SESSIONS',1000);
SP_SET_PARA_VALUE (2,'MAX_SESSION_STATEMENT',20000);
SP_SET_PARA_VALUE (2,'CACHE_POOL_SIZE',200);
SP_SET_PARA_VALUE (2,'DICT_BUF_SIZE',100);
declare
v_mem_mb int;
v_cpus int;
BUFFER int;
BUFFER_POOLS INT;
begin
    SELECT TOP 1 N_CPU,TOTAL_PHY_SIZE/1024/1024 INTO v_cpus,v_mem_mb FROM V$SYSTEMINFO;
    v_mem_mb=round(v_mem_mb,-3);
    SP_SET_PARA_VALUE(2,'TASK_THREADS',v_cpus);
    SP_SET_PARA_VALUE(2,'IO_THR_GROUPS',v_cpus/2);
    IF v_mem_mb >= 64000  THEN 
         BUFFER_POOLS :=101;
      ELSE
         BUFFER_POOLS :=53;
    END IF;
    BUFFER := round(cast(v_mem_mb * 0.8 as int),-3);
    SP_SET_PARA_VALUE(2,'BUFFER',  BUFFER);
    SP_SET_PARA_VALUE(2,'BUFFER_POOLS', BUFFER_POOLS);
end;
2、常用SQL
-- 1、查看数据库状态
SELECT status$ as 状态 FROM v$instance;
-- 2、查看数据库版本
SELECT banner as 版本信息 FROM v$version;
-- 3、查看数据库用户信息
SELECT du.username,du.account_status,du.TEMPORARY_TABLESPACE,du.CREATED FROM dba_users du WHERE du.account_status='OPEN';
-- 4、查看主外键约束
SELECT table_name, constraint_name, constraint_type FROM dba_constraints WHERE owner='DM' AND table_name='EMPLOYEE';
-- 5、查看索引
SELECT table_name, index_name, index_type from user_indexes WHERE index_name='IND_EMP_SALARY';
-- 6、查看分区信息
SELECT table_name,partition_name, high_value FROM user_tab_partitions WHERE table_name='EMP_PART' ORDER BY high_value;
-- 7、查看对象空间使用情况
-- 查看用户占用的空间,函数参数为用户名,返回值为占用的页的数目。
SELECT USER_USED_SPACE('TEST_USER');
-- 看表占用的空间,函数参数为模式名和表名,返回值为占用的页的数目。
SELECT TABLE_USED_SPACE('SYSDBA','TEST');
-- 查看索引占用的空间,函数参数为索引 ID,返回值为占用的页的数目。
SELECT INDEX_USED_SPACE(33555463);
-- 8、实例中查询活动会话
SELECT count(*) FROM v$sessions WHERE state='ACTIVE';
--获取完整sql
SELECT SYSDATE,
       SF_GET_SESSION_SQL (SESS_ID),
       sess_id,
       sess_seq,
       sql_text,
       state,
       seq_no,
       user_name,
       trx_id,
       create_time,
       clnt_ip
  FROM v$sessions
 WHERE state = 'ACTIVE';
 
 -- 9、实例中锁查询
 SELECT o.name, l.*
  FROM v$lock l, sysobjects o
 WHERE l.table_id = o.id AND blocked = 1;
WITH locks
     AS (SELECT o.name,
                l.*,
                s.sess_id,
                s.sql_text,
                s.clnt_ip,
                s.last_send_time
           FROM v$lock l, sysobjects o, v$sessions s
          WHERE l.table_id = o.id AND l.trx_id = s.trx_id),
     lock_tr
     AS (SELECT trx_id wt_trxid, tid blk_trxid
           FROM locks
          WHERE blocked = 1),
     res
     AS (SELECT SYSDATE stattime,
                t1.name,
                t1.sess_id wt_sessid,
                s.wt_trxid,
                t2.sess_id blk_sessid,
                s.blk_trxid,
                t2.clnt_ip,
                SF_GET_SESSION_SQL (t1.sess_id) fulsql,
                datediff (ss, t1.last_send_time, SYSDATE) ss,
                t1.sql_text wt_sql
           FROM lock_tr s, locks t1, locks t2
          WHERE     t1.ltype = 'OBJECT'
                AND t1.table_id <> 0
                AND t2.ltype = 'OBJECT'
                AND t2.table_id <> 0
                AND s.wt_trxid = t1.trx_id
                AND s.blk_trxid = t2.trx_id)
--select distinct clnt_ip from res;
SELECT DISTINCT wt_sql, clnt_ip, ss
  FROM res;
  
-- 10、实例中已执行未提交的 SQL 查询
SELECT t1.sql_text, t1.state, t1.trx_id
  FROM v$sessions t1, v$trx t2
 WHERE t1.trx_id = t2.id AND t1.state = 'IDLE' AND t2.status = 'ACTIVE';
 
 -- 11、有事务未提交的表查询
 SELECT b.object_name, c.sess_id, a.*
  FROM v$lock a, dba_objects b, v$sessions c
 WHERE a.table_id = b.object_id AND ltype = 'OBJECT' AND a.trx_id = c.trx_id;
 
 -- 12、长时间的 SQL 查询
 SELECT t1.sql_text, t1.state, t1.trx_id
  FROM v$sessions t1, v$trx t2
 WHERE t1.trx_id = t2.id AND t1.state = 'IDLE' AND t2.status = 'ACTIVE';
 
 -- 13、找出已执行超过 2 秒的活动 SQL
 SELECT *
  FROM (SELECT sess_id,
               sql_text,
               datediff (ss, last_recv_time, SYSDATE) Y_EXETIME,
               SF_GET_SESSION_SQL (SESS_ID) fullsql,
               clnt_ip
          FROM V$SESSIONS
         WHERE STATE = 'ACTIVE')
 WHERE Y_EXETIME >= 2;
 
 -- 14、查看表空间使用情况
 SELECT
        a.tablespace_name "表空间名称",
        total / ( 1024 * 1024 ) "表空间大小(M)",
        free / ( 1024 * 1024 ) "表空间剩余大小(M)",
        ( total - free ) / ( 1024 * 1024 ) "表空间使用大小(M)",
        total / ( 1024 * 1024 * 1024 ) "表空间大小(G)",
        free / ( 1024 * 1024 * 1024 ) "表空间剩余大小(G)",
        ( total - free ) / ( 1024 * 1024 * 1024 ) "表空间使用大小(G)",
        round(( total - free ) / total, 4 ) * 100 "使用率 %" 
FROM
        ( SELECT tablespace_name, SUM( bytes ) free FROM dba_free_space GROUP BY tablespace_name ) a,
        ( SELECT tablespace_name, SUM( bytes ) total FROM dba_data_files GROUP BY tablespace_name ) b 
WHERE
        a.tablespace_name = b.tablespace_name;
-- 15、临时表空间使用情况及回收
SELECT
        a.tablespace_name "表空间名称",
        total / ( 1024 * 1024 ) "表空间大小(M)",
        free / ( 1024 * 1024 ) "表空间剩余大小(M)",
        ( total - free ) / ( 1024 * 1024 ) "表空间使用大小(M)",
        total / ( 1024 * 1024 * 1024 ) "表空间大小(G)",
        free / ( 1024 * 1024 * 1024 ) "表空间剩余大小(G)",
        ( total - free ) / ( 1024 * 1024 * 1024 ) "表空间使用大小(G)",
        round(( total - free ) / total, 4 ) * 100 "使用率 %" 
FROM
        ( SELECT tablespace_name, SUM( bytes ) free FROM dba_free_space GROUP BY tablespace_name ) a,
        ( SELECT tablespace_name, SUM( bytes ) total FROM dba_data_files GROUP BY tablespace_name ) b 
WHERE
        a.tablespace_name = b.tablespace_name 
        AND a.tablespace_name = 'TEMP';
-- 回收临时表空间
Select * from v$datafile;
Ts_id:对应 GROUP_ID。
File_id:对应 ID。
CALL SP_TRUNC_TS_FILE (3 ,0, 32) 表示将临时表空间文件号为 0 的文件截断缩小到 32 MB 大小。
CALL SP_TRUNC_TS_FILE (ts_id ,file_id, to_size);
三、备份恢复
1、备份
物理备份,逻辑备份,定时备份
1.1、物理备份
备份集备份还原实现策略以DMAP辅助进程方式操作,可支持第三方备份(指定 DEVICE TYPE 为 TAPE)。DMAP 插件执行,改造了备份还原任务子系统,允许指定并行度,大幅提升了备份还原的效率,特别是加密、压缩的处理效率。如果选择使用 DMAP 辅助进程,执行备份还原之前就必须启动 DMAP 服务。安装 DM 数据库以后,DMAP 服务会自动启动。
1.1.1、联机归档配置
# 生产环境必须开启归档日志,且必须限制归档日志保留量,限制方法:# 设置归档空间大小限制即指定 SPACE_LIMIT 参数(单位是 MB)。# 定期删除归档日志(设置定时作业)。
alter database mount;
alter database add archivelog 'dest=/data/dm8/dmarch,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=102400';
alter database archivelog;
alter database open;
1.1.2、备份数据库
# 备份命令集
BACKUP DATABASE [[[FULL] [DDL_CLONE]]|
INCREMENT [CUMULATIVE][WITH BACKUPDIR '<基备份搜索目录>'{,'<基备份搜索目录>'} |
[BASE ON <BACKUPSET '<基备份目录>']][TO <备份名>][BACKUPSET '<备份集路径>']
[DEVICE TYPE <介质类型> [PARMS '<介质参数>']]
[BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份片限制大小>]
[IDENTIFIED BY <密码>[WITH ENCRYPTION<TYPE>]
[ENCRYPT WITH <加密算法>]][COMPRESSED [LEVEL <压缩级别>]]
[WITHOUT LOG][TRACE FILE '< TRACE 文件名>']
[TRACE LEVEL < TRACE 日志级别>][TASK THREAD <线程数>]
[PARALLEL [<并行数>] [READ SIZE <拆分块大小>]];
# 1、使用 BACKUP 语句可以备份整个数据库,执行以下命令:
BACKUP DATABASE FULL BACKUPSET '/data/dm8/dmbak/fullbak';
# 2、指定备份集路径为 /data/dm8/dmbak/fullbak/dbbak_6_22,执行以下命令:
BACKUP DATABASE BACKUPSET '/data/dm8/dmbak/fullbak/dbbak_6_22';
# 3、创建备份集,备份名设置为 WEEKLY_FULL_BAK,执行以下命令:
BACKUP DATABASE TO WEEKLY_FULL_BAK BACKUPSET '/data/dm8/dmbak/fullbak/dbbak_6_22_01';
# 4、创建备份为备份集添加描述信息为完全备份,执行以下命令:
BACKUP DATABASE BACKUPSET '/data/dm8/dmbak/fullbak/dbbak_6_22_02' BACKUPINFO '完全备份';
# 5、创建备份限制备份片大小为 300 MB,执行以下命令:
BACKUP DATABASE BACKUPSET '/data/dm8/dmbak/fullbak/dbbak_6_22_03' MAXPIECESIZE 300;
# 6、执行备份压缩,压缩级别设置为 5,执行以下命令:
BACKUP DATABASE BACKUPSET '/data/dm8/dmbak/fullbak/dbbak_6_22_04' COMPRESSED LEVEL 5;
# 7、创建并行备份,指定并行数为 8,执行以下命令:
BACKUP DATABASE BACKUPSET '/data/dm8/dmbak/fullbak/dbbak_6_22_05' PARALLEL 8;
# 8、基于/data/dm8/dmbak/fullbak/dbbak_6_22_01全量备份的增量备份,执行以下命令:1.1.3、表空间备份
# 备份命令集
BACKUP TABLESPACE <表空间名> [FULL | INCREMENT [CUMULATIVE]
[WITH BACKUPDIR '<基备份搜索目录>'{,'<基备份搜索目录>'}]
| [BASE ON BACKUPSET '<基备份集目录>']][TO <备份名>]
BACKUPSET ['<备份集路径>'][DEVICE TYPE <介质类型>
[PARMS '<介质参数>']][BACKUPINFO '<备份集描述>']
[MAXPIECESIZE <备份片限制大小>][IDENTIFIED BY < 加 密 密 码 >
[WITH ENCRYPTION<TYPE>][ENCRYPT WITH < 加 密 算 法 >]]
[COMPRESSED[LEVEL <压缩级别>]][TRACE FILE '<TRACE 文件名>']
[TRACE LEVEL <TRACE 日志级别>][TASK THREAD <线程数>]
[PARALLEL [<并行数>][READ SIZE <拆分块大小>]];
当备份数据超过限制大小时,会生成新的备份文件,新的备份文件名是初始文件名后加文件编号。
系统处于归档模式下时,才允许进行表空间备份。
Mount 状态下,不允许进行表空间备份。
MPP 环境不允许进行表空间备份。
完全备份单个表空间,执行以下命令:
BACKUP TABLESPACE MAIN FULL BACKUPSET '/data/dm8/dmbak/fullbak/ts_full_bak_01';
增量备份指定备份目录,以备份MAIN表空间为例,指定BASE_ON参数执行增量备份,执行以下命令:
BACKUP TABLESPACE MAIN INCREMENT WITH BACKUPDIR '/data/dm8/dmbak/fullbak/ts_full_bak_01' BACKUPSET '/data/dm8/dmbak/incrbak/ts_increment_bak_02';
上面的备份语句中指定的 INCREMENT 参数表示执行的备份类型为增量备份,不可省略。
若要创建累积增量备份,还需要指定 CUMULATIVE 参数,否则缺省为差异增量备份。
若基备份不在默认备份目录,WITH BACKUPDIR 参数必须指定,用于搜索基备份集。
1.1.4、表备份
# 备份命令集
BACKUP TABLE <表名>
[TO <备份名>]
BACKUPSET ['<备份集路径>'] [DEVICE TYPE <介质类型> [PARMS '<介质参数>']]
[BACKUPINFO '<备份集描述>']
[MAXPIECESIZE <备份片限制大小>]
[IDENTIFIED BY <加密密码>[WITH ENCRYPTION<TYPE>][ENCRYPT WITH <加密算法>]]
[COMPRESSED [LEVEL <压缩级别>]]
[TRACE FILE '<trace 文件名>'] [TRACE LEVEL <trace 日志级别>]
表备份均为联机完全备份
不需配置归档日志
没有增量备份
以备份CITY为例,执行以下命令:1.1.5、备份目录管理
SF_BAKSET_BACKUP_DIR_ADD
添加备份目录。若添加目录已经存在或者为库默认备份路径,则认为已经存在,不添加,但也不报错。执行以下命令:
INT SF_BAKSET_BACKUP_DIR_ADD(device_type varchar,backup_dir varchar(256))
参数说明
device_type:待添加的备份目录对应存储介质类型,DISK 或者 TAPE。目前,无论指定介质类型为 DISK 或者 TAPE,都会同时搜索两种类型的备份集。
backup_dir:待添加的备份目录。
mkdir /data/dm8/dmbak/testbak -p
select SF_BAKSET_BACKUP_DIR_ADD('DISK','/data/dm8/dmbak/testbak');
返回值
1:目录添加成功;其它情况下报错。
SF_BAKSET_BACKUP_DIR_REMOVE
删除备份目录。若删除目录为库默认备份路径,不进行删除,认为删除失败。若指定目录存在于记录的合法目录中,则删除;不存在或者为空则跳过,正常返回。执行以下命令:
INT SF_BAKSET_BACKUP_DIR_REMOVE (
device_type varchar,
backup_dir varchar(256)
)
参数说明
device_type:待删除的备份目录对应存储介质类型。待删除的备份目录对应存储介质类型,DISK 或者 TAPE。
backup_dir:待删除的备份目录。
select SF_BAKSET_BACKUP_DIR_REMOVE('DISK','/data/dm8/dmbak/testbak');
返回值
1:目录删除成功、目录不存在或者目录为空;0:目录为库默认备份路径;其他情况报错。
SF_BAKSET_BACKUP_DIR_REMOVE_ALL
清理全部备份目录,默认备份目录除外,执行以下命令:
INT SF_BAKSET_BACKUP_DIR_REMOVE_ALL ()
select SF_BAKSET_BACKUP_DIR_REMOVE_ALL();
返回值
1:目录全部清理成功;其它情况下报错。
1.1.6、备份集校验与删除
select SF_BAKSET_CHECK('DISK','/data/dm8/dmbak/tab_city_bak_01');
1.2、逻辑备份
1.3、定时备份
# 定制备份策略
备份类型_备份周期_备份时间
全量备份_每周_每周五23点
增量备份_每天_除周五外每天23点
删除备份_每天_每天23点30
+全备(或者全备后的增备)时间点到当前的全部归档日志。删除备份前尽量将备份文件拷贝到单独的备份服务器上。
1.创建作业系统表
SP_INIT_JOB_SYS(1);
2.全量备份(每周五23点全备)
call SP_CREATE_JOB('bakfull',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('bakfull');
call SP_ADD_JOB_STEP('bakfull', 'bak01', 6, '01000000/dmbak', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakfull', 'bak01', 1, 2, 1, 32, 0, '23:00:00', NULL, '2020-11-02 14:42:15', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakfull');
3.增量备份(每周除周五外每天23点增量备份)
call SP_CREATE_JOB('bakincr',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('bakincr');
call SP_ADD_JOB_STEP('bakincr', 'bak02', 6, '11000000/dmbak', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakincr', 'bak2', 1, 2, 1, 95, 0, '23:00:00', NULL, '2020-11-02 14:44:30', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakincr');
4.备份定期删除(每天23:30删除14天前备份)
call SP_CREATE_JOB('delbak',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('delbak');
call SP_ADD_JOB_STEP('delbak', 'bak1', 0, 'SF_BAKSET_BACKUP_DIR_ADD(''DISK'',''/dmbak'');call sp_db_bakset_remove_batch(''DISK'',now()-14);', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('delbak', 'del01', 1, 1, 1, 0, 0, '23:30:00', NULL, '2020-11-02 14:48:41', NULL, '');
call SP_JOB_CONFIG_COMMIT('delbak');
5.查看作业运行状态
select * from sysjob.sysjobs;
select * from sysjob.sysjobhistories;
select * from sysjob.sysjobschedules;
select * from sysjob.sysjobsteps;
本文来自博客园,作者:up~up,转载请注明原文链接:https://www.cnblogs.com/soft-engineer/articles/16599102.html
                
            
        
浙公网安备 33010602011771号