达梦DCA培训练习中踩过的坑

 培训三天,分上下午,共6节课,有录屏,没有时间现场听的话可以听录屏,很方便。如果直接听直播最好,有什么事情方便直接请教培训老师。当然事后也可以在群里请教老师,老师都会很细心地回答。

因为自己对达梦数据库有些基础,在听老师讲的时候,觉得很简单,结果根据老师提供的案例试着做的时候,竟然没全对,对照老师给的答案,发现有些细节没注意。哎,所以说,一定要多练习啊,不能太自大!

培训完老师会分享她在培训的时候整理的文档,内容非常详细,可以参考老师整理的文档去复习,因为文档整理的太完美了,有什么问题可以自己去查看,所以现在就只把我出错的地方整理一下,与大家共勉。

用达梦manager管理工具比较方便,反正我是能用管理工具就不用disql。

一、表空间和重做日志

表空间可以在manager管理工具中做新增、修改、删除、调整大小、重命名等操作,但是重做日志我一开始没找到在哪修改,还以为只能通过sql修改呢。

在管理工具中修改重做日志方式如下:

 

二、用户管理

案例 1:

建立用户 test3 ,用户可以建立自己的表,有属于自己的表空间,用户密码要求每 60 天变更一次。

这道题需要我们先给test3用户创建个表空间,这个我注意到了,但是在设置60天变更一次密码的时候选错了。

 

宽限期指密码过期后宽限多少天。口令有效期=60表示60天要变更一次密码。

案例 2:

规划一个用户 test5,用户每 60 天变更一次密码,密码的宽限期为 3 天,密码尝试连接 2 次失败,账号锁定 5 分钟,用户能查询 dmhr.eployee 表。

这道题我错在给用户赋权,“用户能查询 dmhr.eployee 表”指的是用户只有对这张表的查询权限,我勾了个ALL,把对这张表的所有权限都给test5了。

 

如果想只给test5用户dmhr.eployee表的部分列的权限,应该先收回原先授予该用户的select权限,然后再去授予查看某几个列的权限。收回权限可以在管理工具中直接把勾去掉。

这次我注意到了只勾select权限。

我之前还真没遇到过用户锁定的情况,要不是老师讲到,也没想到自己去试一下,说明我经验不够,遇到的场景太少了,这次培训真的学到了很多。

用户解锁:alter user test5 account unlock;

用户锁定:alter user test5 account lock;

案例 3:

企业招聘一批录入人员,权限固定,只能录入 dmhr.city 表的

权限,请做一个权限赋予的方案。

这题考的是角色创建,需要注意的是,录入功能指的是insert。

三、调出图形化界面

因为我本地磁盘空间比较小,虚拟机都是最小安装,无图形化,一直无法模拟linux下调出图形化,所以在这里把老师演示的截图保留一下,以防考试的时候调不出图形化界面。

在虚拟机外面(第三方工具)的调用方法:

 

在虚拟机里面(本机)的调用方法:

 

四、DMSQL

--别名

select employee_id,employee_name,salary,salary+2000 railSalary from "DMHR"."EMPLOYEE";

--连接符

select employee_id,employee_name||'工资是'||salary sal from "DMHR"."EMPLOYEE";

--排序

select employee_id,employee_name,salary from "DMHR"."EMPLOYEE" order by salary desc,employee_id asc;

--可以配置CALC_AS_DECIMAL来设置系统是整数类型的除法还是把整数类型的除法全部转换为 DEC(0,0)处理

select 1/2  --结果是0

select 1/2.0

--金额加人民币符号

select employee_name,to_char(salary,'L999,999.0') from dmhr.employee;

--to_char

select employee_name,hire_date,to_date(hire_date,'yyyy-mm-dd') from dmhr.employee;

--having

select employee_id,max(salary) maxSalary,min(salary) minSalary,avg(salary) avgSalary

from dmhr.employee group by employee_id having avg(salary)>5000;

--查比103部门所有人工资都高的人

select employee_name,salary from dmhr.employee where salary>all(

select salary from dmhr.employee where department_id=103);

--merger

drop table test.t1;

drop table test.t2;

create table TEST.T1( C1 INT, C2 VARCHAR(20));

create table TEST.T2(C3 INT, C4 VARCHAR(20));

INSERT INTO TEST.T1 VALUES(1,'T1_1');

INSERT INTO TEST.T1 VALUES(2,'T1_2');

INSERT INTO TEST.T1 VALUES(3,'T1_3');

INSERT INTO TEST.T2 VALUES(2,'T2_2');

INSERT INTO TEST.T2 VALUES(4,'T2_4');

MERGE INTO T1 USING T2 ON (T1.C1=T2.C3)

WHEN MATCHED THEN UPDATE SET T1.C2=T2.C4

WHEN NOT MATCHED THEN INSERT (C1,C2) VALUES(T2.C3,T2.C4);

五、表的管理

案例1:

规划一张学员信息表

表名:STU

学号:ID char(10)

姓名:sname varchar(20) not null

性别: sex char(1)

年龄:age int

电话:tel varchar(15) not null

家庭住址:address varchar(50)

表空间:STU

约束:主键列----学号,非空----姓名和电话

备注:studentinfo

 

这一题我一开始竟然没有找到非空约束,我也是服了我自己了。

 

还把表空间给漏掉了,哎。

案例2:

用脚本导入数据。

在disql中执行方式如下:

 

在windows下脚本执行方式如下:

 

 

 

最后别忘了commit,或者把commit写在脚本里。

六、约束

1、主键约束

 

主键的特点是,非空,值唯一,还可以设置自增值。我试了下,int系列的可以设置自增值,char之类的字符型不行,float之类的数值型也不行。

2、唯一约束

 

这里我发现一个问题,如果建表的时候不加好唯一约束,用管理工具修改表的时候,无法给列加唯一约束。

3、非空约束

 

4、外键约束

 

在这一步我犯了三个错误,第一个是,我在新建表的时候,没有找到建外键的地方,后来发现建好表后,可以点开表进行创建外键和约束。

第二个错误是,我想test2表的test1_id列和test1表的id列创建外键,但是参照列却没有匹配的,检查了下发现如果把test1的id设置为主键,就可以和test2设置外键关系了。

第三个错误,test2表的test1_id列和test1表的id列数据类型不同,导致建立外键失败。这都是些小细节,仔细研究下也能解决,但是考试的时间有限,如果能提前多练习,熟练后会节约考试时间,提高通过率。

5、检查约束

 

我发现,不用指定到特定的列,直接添加约束即可,约束名不能为空,不然会报错。

七、备份还原

听一个同事说,他在DCA考试的时候,第八题要求执行一个脚本,因为没有执行权限,所以他先放着了,把其他题目完成后,用root修改脚本权限,执行脚本,数据库就被破坏了,还好他比较冷静,用归档恢复了,最后成功考过DCA,所以我在这里模仿破坏表空间,用归档恢复。

1、数据准备

注意:最好都用dmdba用户来操作。

1)dmdba用户创建GRC表空间和GRC用户

SQL> create tablespace GRC datafile 'GRC.DBF' size 100;

SQL> create user GRC identified by "888888888" default tablespace GRC;

SQL> grant create table to GRC;

SQL> grant insert table to GRC;

SQL> grant select table to GRC;

创建用户后会自动创建和用户同名的模式。

2)在GRC模式下创建表test1

[dmdba@dameng1 bin]$ ./disql GRC/888888888

SQL> create table test1(id int,name varchar);

SQL> insert into test1 values(1,'test');

SQL> commit;

SQL> select * from test1;

3)先开启归档

SQL> ALTER DATABASE MOUNT;

SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST = /dm8/data/DAMENG/arch, TYPE = local,FILE_SIZE = 1024, SPACE_LIMIT = 2048';

SQL> ALTER DATABASE ARCHIVELOG;

SQL> alter system set 'ARCH_INI'=1 both;

SQL> select arch_mode from v$database;

SQL> ALTER DATABASE OPEN;

4)切换回GRC用户在GRC模式下创建表test2

[dmdba@dameng1 bin]$ ./disql GRC/888888888

SQL> create table test2(id int,name varchar,type int);

SQL> insert into test2 values(1,'test',1);

SQL> commit;

SQL> checkpoint(100);

5)切换到dmdba用户备份

SQL> backup database backupset '/dm8/data/DAMENG/BAK/bak1';

6)切换回GRC用户在GRC模式下创建表test3

[dmdba@dameng1 bin]$ ./disql GRC/888888888

SQL> create table test3(id int,name varchar,type int,sex char);

SQL> insert into test3 values(1,'test',1,'1');

SQL> commit;

SQL> checkpoint(100);

在这里我做了个checkpoint操作,因为担心数据还没进归档日志。

2、破坏表空间

mv GRC.DBF GRC2.DBF

 

3、再查询刚刚在GRC表空间新建的表

 

发现还能查到

4、重启实例  

systemctl restart DmServiceDMSERVER

5、再查询测试表

 

重启后再用disql连接,发现数据库是mount状态,也查不到test3表了。

6、恢复

可以直接恢复被破坏的表空间,也可以恢复整个数据库,效果是一样的。

我是直接恢复的整个数据库,只能用dmrman恢复。

‘bak1'这个备份集,是在创建test3表之前做的备份,如果直接从备份集恢复,test3数据就不存在了,所以需要从归档恢复。

 

1)root用户关闭实例

[root@dameng1 DAMENG]# systemctl stop DmServiceDMSERVER

2)dmdba用户做还原

[dmdba@dameng1 bin]$ ./dmrman

RMAN> restore  database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/data/DAMENG/BAK/bak1';

RMAN> recover  database '/dm8/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/dm8/data/DAMENG/arch';

RMAN> recover  database '/dm8/data/DAMENG/dm.ini' update db_magic;

3)root用户启动实例

[root@dameng1 DAMENG]# systemctl start DmServiceDMSERVER

4)dmdba用户验证表空间是否恢复

 

恢复成功。

7、测试直接还原表空间

接着上面的数据,模拟直接从表空间还原,这里踩了个坑。我之前做了个备份,备份集是bak1,然后模拟破坏表空间,全库恢复后,更新了magic,我再次破坏表空间,就无法用原来的备份集恢复直接恢复表空间了,也没有做新的备份,这种情况下,还是只能做全库恢复。全库恢复后,再做个备份,备份集是bak2。

1)切换到dmdba用户备份

SQL>backup database backupset '/dm8/data/DAMENG/BAK/bak2';

2)root用户破坏表空间

mv GRC.DBF GRC3.DBF

root用户关闭实例

[root@dameng1 DAMENG]# systemctl stop DmServiceDMSERVER

3)dmdba用户还原表空间

restore database '/dm8/data/DAMENG/dm.ini' tablespace GRC from backupset '/dm8/data/DAMENG/BAK/bak2';

recover database '/dm8/data/DAMENG/dm.ini' tablespace GRC;

4)root用户启动实例

[root@dameng1 DAMENG]# systemctl start DmServiceDMSERVER

5)GRC用户测试是否还原成功

 

 

 

 

 

 

 更多资讯请上达梦技术社区了解: https://eco.dameng.com

posted @ 2021-08-23 15:01  xiaowu222  阅读(1077)  评论(0编辑  收藏  举报