培訓三天,分上下午,共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