達夢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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM