达梦DCA-达梦DCP-达梦DCM
依次从初级-中级-高级(类似Oracle的OCA-OCP-OCM),个人感觉达梦的认证等级要比Oracle的实在,考过Oracle的朋友都知道,OCA-OCP只需要被英文考题就行了,运气好的背几百道,不好的背1千多道。而达梦的无论初级DCA还是中级DCP都是需要上机实操。
达梦DCP考试流程大概如下:
上午10:00-12:00(笔试2小时)
下午13:00-17:00 (机试4小时)
笔试:200题,满分100分:单选、多选、判断
机试: 12题,满分100分:实操
笔试考试,只需要登录老师提供的外网地址,输入用户密码即可参加考试,考试内容只能说培训期间认真听讲,课后安心看达梦手册了解达梦数据库的体系结构,兼容情况等, 基本都是可以过得,就说下第一次考DCP的过程吧,前面时间还是感觉很紧张的,到最后搭建完毕集群后,还有约一小时顿时放松多了,开始进行部分环节的检查。
机试考试前一天老师会邮件发送考试流程,DCP考试每个同学分配三台虚拟机,大家考试前一天QQ群里会给大家测试的跳板机进行连接测试。考试的时候前30分钟会分配同学们实际每人对应的跳板机器,大家登录各自的跳板机,通过跳板机的浏览器登录达梦虚拟机云平台,打开考试分配的三台虚拟机服务器:主机、备机、监视器。跳板机给大家提供了MobaXterm软件用于远程ssh连接虚拟机使用也可以使用VNC远程登录三台机器,这样可以使用图形界面进行操作啦。服务器的用户密码也会在考试流程的邮件里提供。
废话不多说,给同学们分享下,考试前我的练习内容吧。
创建范围分区:
create table “DM”.“TABLE_1”
(
id INT,
name VARCHAR2(50)
)
PARTITION BY RANGE (id)
(
PARTITION p1 VALUES LESS THAN (100) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”),
PARTITION p2 VALUES LESS THAN (200) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”),
PARTITION p3 VALUES LESS THAN (300) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”),
PARTITION p4 VALUES LESS THAN (400) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”),
PARTITION p5 VALUES LESS THAN (500) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”)
)
storage(initial 1, next 1, minextents 1, fillfactor 0)
–插入模拟数据
insert into “DM”.“TABLE_1” select level,level+1 ||‘aaa’ from dual connect by level <500;commit;
–增加分区
alter table “DM”.“TABLE_1” add partition p6 VALUES LESS THAN (600) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”);
–插入数据
insert into “DM”.“TABLE_1” values (500,‘test’);commit;
–创建堆表范围分区:
create table “DM”.“TABLE_2”
(
“ID” INT,
“NAME” VARCHAR2(50)
)
PARTITION BY RANGE (“ID”)
(
PARTITION P1 VALUES LESS THAN (100) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”),
PARTITION P2 VALUES LESS THAN (200) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”),
PARTITION P3 VALUES LESS THAN (300) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”),
PARTITION P4 VALUES LESS THAN (400) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”),
PARTITION P5 VALUES LESS THAN (500) STORAGE( initial 1, next 1, minextents 1, fillfactor 0, on “DM”)
)
storage(initial 1, next 1, minextents 1, fillfactor 0,nobranch);
–插入数据
begin
for i in 1…499 loop
insert into dm.“TABLE_2” values (i,‘EEE||i’);
end loop;
commit;
end;
/
–创建列表分区:
create table dm.table_3(id int,city varchar(20),saledate date)
partition by list(city)
(partition p1 values(‘北京’),
partition p2 values(‘上海’),
partition p3 values(‘杭州’))
STORAGE(on DM);
–插入数据
insert into dm.table_3 values(001,‘杭州’,‘2022-01-01’);
insert into dm.table_3 values(002,‘上海’,‘2023-04-01’);
insert into dm.table_3 values(003,‘北京’,‘2021-05-01’);
–增加分区
alter table dm.table_3 add partition pn values(default);
insert into dm.table_3 values(004,‘杭州’,‘2022-01-01’);
commit;
–合并分区:
alter table dm.table_3 merge partitions p2,p3 into partition p2_3;
–拆分分区:
alter table dm.table_3 split partition p2_3 values (‘上海’) into (partition p2,partition p3);
–交换分区:
alter table dm.table_3 exchange partition pn with table dm.pn;
–创建哈希分区:
create table dm.table_4(id int,name varchar2(20))
partition by hash(id)
(partition p1,
partition p2,
partition p3,
partition p4)
STORAGE(on DM);
–插入数据
insert into dm.table_4 select level,level+1||‘hello’ from dual connect by level <2000;
commit;
–新增HASH分区
create table dm.table_5(id int,name varchar(20)) partition by hash(id) partitions 5;
–创建组合分区
组合分区:
create table “DM”.“TABLE_6”
(
“id” INT,
“name” VARCHAR2(50),
“sal_date” DATE
)
PARTITION BY LIST (“name”)
SUBPARTITION BY RANGE (“id”) SUBPARTITION TEMPLATE
(
SUBPARTITION “PART_11” VALUES LESS THAN (100),
SUBPARTITION “PART_12” VALUES LESS THAN (200),
SUBPARTITION “PART_13” VALUES LESS THAN (300)
)
(
PARTITION “PART_1” VALUES (“北京”)
(
SUBPARTITION “PART_1” VALUES LESS THAN (100),
SUBPARTITION “PART_2” VALUES LESS THAN (200),
SUBPARTITION “PART_3” VALUES LESS THAN (300)
),
PARTITION “PART_2” VALUES (“上海”),
PARTITION “PART_3” VALUES (“广州”)
)
storage(initial 1, next 1, minextents 1, fillfactor 0, on “DM”);
–插入模拟数据
insert into dm.table_6 values (1,‘北京’,‘2020-01-20’);
insert into dm.table_6 values (121,‘北京’,‘2022-05-20’);
insert into dm.table_6 values (211,‘北京’,‘2021-08-20’);
insert into dm.table_6 values (233,‘上海’,‘2020-01-20’);
–创建间隔分区
间隔分区:
create table “DM”.“TABLE_7”
(
“id” INT,
“name” VARCHAR2(50),
“ct_date” DATE
)
PARTITION BY RANGE (“ct_date”)
interval(numtoyminterval(1,‘YEAR’))
(
PARTITION “PART_1” VALUES LESS THAN (to_date(‘2020-01-01’,‘YYYY-MM-DD’)),
PARTITION “PART_2” VALUES LESS THAN (to_date(‘2021-01-01’,‘YYYY-MM-DD’))
)
storage(initial 1, next 1, minextents 1, fillfactor 0, on “DM”)
;
–插入模拟数据
insert into dm.table_7 values(1,‘北京’,‘1997-03-10’);
insert into dm.table_7 values(2,‘上海’,‘2007-04-10’);
insert into dm.table_7 values(3,‘深圳’,‘2022-06-11’);
–非分区表转换分区表:
创建非分区表:
create table t20(id int);
–模拟插入数据
begin
for i in 1…10000 loop
insert into t20 values(i);
end loop;
commit;
end;
/
–重命名表t21
alter table t20 rename to t21;
–创建分区表:
create table dm.t20
(
id INT
)
PARTITION BY RANGE (id)
(
PARTITION p1 VALUES LESS THAN (1000),
PARTITION p2 VALUES LESS THAN (2000),
PARTITION p3 VALUES LESS THAN (3000),
PARTITION p4 VALUES LESS THAN (4000),
PARTITION p5 VALUES LESS THAN (5000),
PARTITION p6 VALUES LESS THAN (6000),
PARTITION p7 VALUES LESS THAN (7000),
PARTITION p8 VALUES LESS THAN (maxvalue)
)
storage(initial 1, next 1, minextents 1, fillfactor 0);
–插入数据到T20
insert into t20 select * from t21;commit;
创建外部表控制文件1:
vi a.txt
1,北京,2021-12-01
2,上海,1998-02-02
3,杭州,2022-01-29
4,深圳,2003-01-10
5,广州,1998-01-30
6,成都,2008-09-23
vi a.ctl
OPTIONS(
CHARACTER_CODE = ‘utf-8’
)
LOAD DATA
INFILE ‘/home/dmdba/a.txt’
into table dm_ext
fields ‘,’
–disql登录创建
create external table dm_ext(id int,city varchar(20),for_date date) from ‘/home/dmdba/a.ctl’;
创建外部表控制文件2:
vi c.txt
1||aaa||1989-01-02
2||bbb||2020-02-01||02
3||ccc||1999-09-21||45
4||dd||1990-01-23||21
5||eeee
–disql登录创建
create external table dm.ext2(a1 int,a2 varchar(20),a3 date) from datafile ‘/home/dmdba/c.txt’ parms(fields delimited by ‘||’);
vi t2.txt
a1 a2 a3 a4
1,1990-01-23,AA,111111111
2,2003-02-02,BB,222222222
3,1998-02-03,CC,333333333
4,2008-03-04,DD,444444444
5,2012-04-04,EE,555555555
vi t2.ctl
options
(
skip=0
)
load data
infile ‘/home/dmdba/t2.txt’
into table t2
fields ‘,’
$DM_HOME/bin/dmfldr dm/Dameng123456 CONTROL=\‘/home/dmdba/t2.ctl\’
大字段导出:
创建表: create table dm.bigt(c1 int,c2 blob,c3 clob);
插入数据:
insert into dm.bigt values(1,0XAB1211032DE,‘this is test1’);
insert into dm.bigt values(2,0XAB1211032DE,‘test is ccccfdsfsfsf’);;
insert into dm.bigt values(3,0XAB1211032DE,‘testdmdmdliss ccccfdsfsfsf’);
commit;
vi big.ctl
load data
infile ‘/home/dmdba/big.txt’
into table dm.bigt
fields ‘|’
$DM_HOME/bin/dmfldr dm/Dameng123456 CONTROL=\‘/home/dmdba/big.ctl’ LOG=\‘/home/dmdba/big.log\’ lob_directory=\‘/home/dmdba/fldr\’ mode=\‘out\’
–大字段导入:
创建表:create table bigt1 (c1 int,c2 blob,c3 clob);
vi bigt1.ctl
load data
infile ‘/home/dmdba/big.txt’
into table dm.bigt1
fields ‘|’
(c1,c2,c3)
$DM_HOME/bin/dmfldr dm/Dameng123456 CONTROL=‘/home/dmdba/bigt1.ctl’ LOG=‘/home/dmdba/bigt1.log’ lob_directory=\‘/home/dmdba/fldr\’ mode=\‘in\’
事务级别临时表:on commit delete rows
create global temporary table dm.tmp01(id int,name varchar(20)) on commit delete rows;
insert into dm.tmp01 values(1,‘aaa’);
insert into dm.tmp01 values(2,‘bbb’);
insert into dm.tmp01 values(3,‘ccc’);
select * from dm.tmp01;
commit;
select * from dm.tmp01;
会话级临时表:on commit preserve rows
create global temporary table dm.tmp02(id int,name varchar(20)) on commit preserve rows;
insert into dm.tmp02 values(1,‘aaa’);
insert into dm.tmp02 values(2,‘bbb’);
insert into dm.tmp02 values(3,‘ccc’);
select * from dm.tmp02;
commit;
select * from dm.tmp02;
查看临时表空间数据文件大小:
select tablespace_name,file_name,bytes/1024/1024 mb from dba_data_files where tablespace_name=‘TEMP’;
临时表空间信息查询:
select para_name,para_value from v$dm_ini where para_name like ‘TEMP%’;
select group_id, path ,CLIENT_PATH from v$datafile;
临时表空间扩容:重启数据库生效
SP_SET_PARA_VALUE(2,‘TEMP_SIZE’,200);
缩小临时表空间:50MB
sp_trunc_ts_file(3,0,50);
–创建序列:
CREATE SEQUENCE “DM”.“s1” INCREMENT BY 1 START WITH 1 MAXVALUE 100 MINVALUE 1 CACHE 50 ORDER;
ALTER SEQUENCE “DM”.“s1” MAXVALUE 1000 CACHE 1000;
–插入序列:
insert into ts1 values( “DM”.“s1”.NEXTVAL,‘aa’);
–创建同义词:
CREATE SYNONYM “DM”.“tab1” FOR “DM”.“T1”;
–创建一个手动更新的物化视图:
create materialized view mv2 as select test1.* from test1 left join test2 on test1.id=test2.id;
–插入基本数据后,手工更新物化视图:
refresh materialized view mv2;
–创建一个自动更新的物化视图
创建物化视图日志:
create materialized view log on “DM”.“T1” storage(initial 1, next 1, minextents 1, fillfactor 0, on “DM”) ;
物化视图:
create materialized view “DM”.“MV1”
storage(initial 1, next 1, minextents 1, fillfactor 0)
refresh on commit with primary key fast
as
select * from t1 where c1=2;
–创建索引表空间
create tablespace “INDEX” datafile ‘INDEX01.DBF’ size 500;
–唯一索引:
CREATE UNIQUE INDEX “t1_c1_idx” ON “DM”.“T1”(“C1” ASC) storage(on “INDEX”);
–函数索引:
CREATE INDEX UP_MAIL_T1 ON T1(upper(‘MAIL’)) storage(on “INDEX”);
–复合索引:
create index t2_d1_d2_indx on “DM”.“T2”(“D1”,“D2”) storage(on “INDEX”);
–位图索引:
create bitmap index “DM”.“inx_b1” on “DM”.“TABLE_B”(“SEX”) storage(initial 1,next 1,minextents 1,on “INDEX”);
–索引在线重建:
alter index “DM”.“t1_c1_idx” rebuild ONLINE;
–分区索引:
create index “DM”.“table1_idx_id” on “DM”.“TABLE_1”(“id”) storage(initial 1,next 1,minextents 1,on “INDEX”);
–全文索引:
create context index inx_texton “DM”.“TABLE_TEXT”(“ADDRESS”) tablespace "INDEX"lexer DEFAULT_LEXER;
–查询辅助表
select * from dm.cti$inx_text$i;
select * from dm.cti$inx_text$p;
select * from dm.cti$inx_text$n;
select * from dm.cti$inx_text$d;
–更新全文索引
ALTER CONTEXT INDEX inx_text ON dm.TABLE_TEXT REBUILD;
–更新增加全文索引信息
ALTER CONTEXT INDEX inx_text ON dm.TABLE_TEXT INCREMENT;
–删除全文索引
drop context INDEX inx_text ON dm.TABLE_TEXT;
–查询全文索引
select * from ctisys.syscontextindexes;
–创建用户
create user “DM” identified by “Dameng123456” password_policy 15
default tablespace “DM”
default index tablespace “DM”;
–创建角色
create role “r1”;
grant “RESOURCE” to “r1” with admin option;
alter user “DM” limit FAILED_LOGIN_ATTEMPS 5 PASSWORD_LIFE_TIME 365;
–设置最大会话数为5
alter user “TEST” limit SESSION_PER_USER 5;
–设置会话空闲期(1-1440分钟)
alter user “TEST” limit SESSION_PER_USER UNLIMITED CONNECT_IDLE_TIME 30;
–设置会话持续期(1-1440分钟)
alter user “TEST” limit SESSION_PER_USER UNLIMITED getConnectTime 30;
–设置登录失败次数
alter user “TEST” limit FAILED_LOGIN_ATTEMPS 4;
–设置口令有效期180天(1-365天)
alter user “TEST” limit FAILED_LOGIN_ATTEMPS 4 PASSWORD_LIFE_TIME 180;
-设置IP白名单
alter user “TEST” allow_ip “127.0.0.1”;
–赋权
grant “r1” to “DM”;
grant SELECT on “SYSDBA”.“T1” to “DM” with grant option;
grant INSERT on “SYSDBA”.“T1” to “DM” with grant option;
–解锁
alter user dm account unlock;
–权限回收
revoke SELECT on “SYSDBA”.“T1” from “DM” cascade;
revoke INSERT on “SYSDBA”.“T1” from “DM” cascade;
–角色赋权
grant SELECT on “SYSDBA”.“T1” to “r1”;
grant INSERT on “SYSDBA”.“T1” to “r1”;
grant DELETE on “SYSDBA”.“T1” to “r1”;
grant UPDATE on “SYSDBA”.“T1” to “r1”;
DM8:SP_SET_ENABLE_AUDIT(PARAM INT);
过程执行完成后,立即生效,param 有三种取值
0 :关闭审计
1:打开普通审计
2:打开普通审计和实时审计,缺省值为 0.
disql SYSAUDITOR/SYSAUDITOR
SP_SET_ENABLE_AUDIT(2);
–语句级别的审计 :粗粒度
SP_audit_stmt(type,username,whenever)
sp_audit_stmt(‘TABLE’,‘DM’,‘ALL’);
TYPE:审计对象(表,视图,存储过程)
Username:用户,null 表示不限制
Whenever:审计时机
ALL: 不管成功或是失败都审计
SUCCESSFUL:操作成功的时候审计
FAIL:操作失败的时候审计
–关闭表审计:
SP_noaudit_stmt(‘TABLE’,‘DM’,‘ALL’);
–对象审计:
sp_audit_object(type,username,schema_name,object_name,colmun_name,whenever);
SP_AUDIT_OBJECT(‘DELETE’,‘DM’,‘DM’,‘T1’,‘NAME’,‘ALL’);
SP_AUDIT_OBJECT(‘INSERT’,‘DM’,‘DM’,‘T1’,‘NAME’,‘ALL’);
—审计SYSDBA用户对表数据的插入、更新、删除等操作,操作不管成功与否都审计
SP_AUDIT_STMT(‘INSERT TABLE’, ‘DM’, ‘ALL’);
SP_AUDIT_STMT(‘UPDATE TABLE’, ‘DM’, ‘ALL’);
SP_AUDIT_STMT(‘DELETE TABLE’, ‘DM’, ‘ALL’);
–审计查询
SELECT username,rolename,ip,objname,operation,sql_text,OPTIME FROM SYSAUDITOR.V$AUDITRECORDS order by OPTIME desc;
–命令行工具使用
./dmaudtool USERID=sysauditor/SYSAUDITOR AFIL_PATH=/dm8/DAMENG OUT_PATH=/home/dmdba/audit.log
–检查DBMS_WORKLOAD_REPOSTORY 系统包,为 1 的时候表示创建0表示删除该系统包
select SF_CHECK_AWR_SYS;
–生成AWR包
1、启用AWR包:
call SP_INIT_AWR_SYS(1);
2、查询AWR快照:
SELECT * FROM SYS.WRM$_SNAPSHOT;
3、设置快照间隔,如果不设置快照间隔,手动执行快照后SYS.WRM$_SNAPSHOT视图中没有记录
–该间隔为60分钟生成一次
CALL DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL(60);
–修改快照60分钟一次,保留8天
CALL DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(1440*8,60);
4、在两个时间点分别手动创建快照,或者等待系统自动生成:
10:00时创建第一快照:
call DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
30分钟后再创建一个,10:30,
call DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
5、查询AWR快照:
SELECT * FROM SYS.WRM$_SNAPSHOT;
6、创建AWR报告,SYS.AWR_REPORT_HTML(快照ID1,快照ID2,‘AWR报告存放路径’,‘AWR报告名称.HTLM’);:
SYS.AWR_REPORT_HTML(1,2,‘C:’,‘AWR1.HTML’);
7、关闭AWR包:
call SP_INIT_AWR_SYS(0);
–由于AWR报告主要用于分析一定周期内的数据库运行情况,在使用完后建议选择关闭;
搭建配置建议提前文档编辑记录:
主库:192.168.1.223
备库:192.168.1.224
监视:192.168.1.225
数据库名 :DAMENG/ DAMENG
实例名 :GRP1_RT_01/ GRP1_RT_02
PORT_NUM : 5236/5236
MAL_INST_DW_PORT : 45101/45121
MAL_HOST : 10.0.0.223/10.0.0.224
MAL_PORT : 55101/55121
MAL_DW_PORT : 65101/65121
脱机备份需要停止主库或在线联机备份DISQL,下面使用的是脱机:
./dmrman CTLSTMT=“BACKUP DATABASE ‘/dm8/DAMENG/dm.ini’ FULL TO BACKUP_FILE1 BACKUPSET ‘/home/dmdba/backup’”
备库还原操作:
./dmrman CTLSTMT=“RESTORE DATABASE ‘/home/dmdba/dmdbms/dmdata/DAMENG/dm.ini’ FROM BACKUPSET ‘/home/dmdba/backup’”
./dmrman CTLSTMT=“RECOVER DATABASE ‘/home/dmdba/dmdbms/dmdata/DAMENG/dm.ini’ FROM BACKUPSET ‘/home/dmdba/backup’”
./dmrman CTLSTMT=“RECOVER DATABASE ‘/home/dmdba/dmdbms/dmdata/DAMENG/dm.ini’ UPDATE DB_MAGIC”
启动监视器后,数据库主备会自动拉起到OPEN,如下:
这里省略搭建过程,具体可以参考DM8的数据守护与读写分离手册或培训老师的文档即可完成搭建。
跟各位分享的一个小细节,就是配置文件的名称,例如dmmonitor.ini文件建议严格按照达梦手册要求来,不要随意改名,考试中我修改成了mon.ini就一直报错提示格式错误信息,修改成dmmonitor_mon.ini就没有问题,为了避免这种无畏的时间和排错消耗,建议各位无论是考试还是生产不要任性。。。。
以上就是练习,也是老师每天培训完毕后部署的作业,考试不是所有考点都可以考到的,多练习多准备总是没有坏处。考试遇到一题要求导出某个用户的统计信息,达梦没有针对用户、模式的统计信息支持,大家需要针对用户下的所有表分别执行。好了就分享这些了,作为国产数据库中,还是建议大家考达梦的认证毕竟也是对自己掌握数据库技能的一个认可嘛!
文章
阅读量
获赞