达梦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