背景
國產數據庫:達夢
操作
1、登錄
安裝路徑在:/dm8/bin
登錄腳本:./disql username/'"pwd"'@127.0.0.1:5236 (密碼要用雙引號給圈起來,因為如果密碼也有一個 @ 符號的話,容易串
傳輸腳本到服務器:scp sys_*.sql username@10.12.2.21:/home/dmdba/dbscript/grey_init_script
執行腳本:start /home/dmdba/script/grey_test/sys_area_.sql ( 對,就在窗口,這樣執行一個語句,它會讀取文件,然后一行一行執行。。。總感覺效率是很低的樣子)
有一個很崩潰的點:它執行報錯,還是會繼續往下跑,根本不會停下來。你都不知道從什么時候,就開始錯了。很崩潰。
知識點
1、達夢腳本不支持 '' (esc 下面那個鍵的標點), 需要改成雙引號, 即: user_name` 要改成 "user_name"
2、它對腳本是大小寫敏感的。(至少就現在觀察而言,如果字段是大寫,Insert語句寫了小寫,就會報錯,識別不了字段)
3、自增列
4、查看建表語句
5、start xxx.sql (這個語句后面不能加 “;”)
6、把查詢的結果,輸出到文本上
將查詢結果輸出到指定文件。
語法如下:
SPOOL /data/files/test.txt
select * from user;
SPOOL OFF
7、id自增的表,要導入數據:Only if specified in the column list and SET IDENTITY_INSERT is ON, then identity column could be as
兩個步驟:
(1)SET IDENTITY_INSERT 表名 on;
(2)insert into 表名(id, 列1,列2,... 列n) select * from 另一個表 limit 10; (意思是, 目標表必須要把列給標明,否則還是會報錯的)
8、關於鎖表
(注:執行這個語句,要dba權限)
(1)查詢被鎖表的信息:
select distinct b.NAME,c.SESS_ID from v$lock a
left join sysobjects b on b.ID=a.TABLE_ID
left join v$sessions c on a.TRX_ID=c.TRX_ID where b.name = 'xxx';
(建議做一下表的過濾,數據可能很多)
(2)關閉被鎖會話:
sp_close_session(sess_id) //sess_id為上面語句執行后查詢出來的數據
(3)但是會發現步驟1執行后,結合會很多,就是一個表會有很多會話,都是阻塞等待,鎖表狀態,所以,一個一個去復制粘貼明顯是不太行的;同時,在達夢的cli窗口上,是沒有比較好的辦法查看全量記錄的,拿不到全量的 sess_id, 所以也關不掉全量的。
so,需要把步驟1的結果,輸出到文本上,再在文本上編輯,就容易多了。——見下一個話題
9、把語句的執行結果輸出到文本中
有一些時候,需要把語句的執行結果存儲起來,並且也去導庫導表又太麻煩,可以把結果輸入到文本中。
語法如下:
SPOOL /data/files/test.txt
select * from "user";
SPOOL OFF
即可。
其中 /data/files/test.txt 為要存放結果的文本。
中間一行或多行,為要執行的語句。
10、創建用戶
create tablespace tbs_xxxdb DATAFILE '/dmdata/dmdb/tbs_xxxdb.dbf' SIZE 200 AUTOEXTEND ON NEXT 10;
CREATE USER tbs_xxxdb IDENTIFIED BY "tbs_xxxdb@abc" default tablespace tbs_xxxdb default INDEX TABLESPACE tbs_xxxdb;
grant resource,public to tbs_xxxdb;
用戶:tbs_xxxdb
密碼:tbs_xxxdb@abc
11、連賬號帶表都清掉(清庫)
drop user 用戶名 cascade;
12、查看實例名
創建了多個實例,雖然有賬號密碼,也可以登錄了,但代碼連接數據庫的時候,還是需要拿到實例名才可以連接。那實例名要怎樣查看呢:
進入達夢安裝的服務器,
使用 ps 查看進程啟動詳情, ps -ef | grep dm

拿到實例名,就可以在代碼里面創建連接了。
也就是這個:
jdbc:dm://192.168.1.100:5236/dbmbutf8?useUnicode=true&characterEncoding=UTF-8
或者
jdbc:dm://192.168.1.100:5236/dmdb?useUnicode=true&characterEncoding=UTF-8
然后連接不同實例名,和對應的賬號密碼進行連接。
13、達夢保留關鍵詞的配置
默認情況下,有一些關鍵詞會被保留,比如 domain,
但原來的庫表里面已經用了 domain 作為字段名,代碼也寫了這么一個sql 。執行的時候,會報錯。怎么辦呢,這個時候,要把這個關鍵詞在 dm.ini 文件中標記,讓它不要對這個詞進行檢測,
首先, ps -ef | grep dm,
找到 :
/home/dmdba/dmdbms/bin/dmserver path=/dmdata/dbmbutf8/dbmbutf8/dm.ini -noconsole
發現現在這個進程修改這個路徑下的dm.ini
vim /dmdata/dbmbutf8/dbmbutf8/dm.ini

把要排隊掉的保留字,添加進去即可。
然后再重啟dm
systemctl stop DmService
systemctl start DmService
(附: ls -l /usr/lib/systemd/system/Dm* 這個語句,可以看一下達夢注冊的服務叫什么名字)。
14、查看表結構
desc table_name;
15、查看版本號:
select id_code;
版本號:1-2-98-21.12.30-154539-10040-SEC Pack1
16、設置 mysql 兼容
出現 只能select 限於 group by 的字段。
比如 select a from user group by a; 這種可以; 但 select b from user group by a; 這種執行的情況。
select para_name,para_value,file_value from v$dm_ini where para_name='COMPATIBLE_MODE';
行號 para_name para_value file_value
---------- --------------- ---------- ----------
1 COMPATIBLE_MODE 0 0
sp_set_para_value(2,'COMPATIBLE_MODE',4);
行號 para_name para_value file_value
---------- --------------- ---------- ----------
1 COMPATIBLE_MODE 0 4
17、創建表空間時,報錯:[-3410]:表空間上有事務未提交.
解決步驟:
-
找到了個有一點挨近的可能性:https://blog.csdn.net/weixin_42447367/article/details/107910837
-
找到未提交的事務
活動事務數量 SELECT COUNT(1) FROM V$TRX WHERE STATUS='ACTIVE';
這個有4條數據,顯示是活動中的事務 -
停掉,或刪除掉未提交的事務,是不是就可以了
-
好吧,其實找了很多,都沒有特別好的解決方法(應該是我的搜索能力一直不太夠,想找的問題,一直都沒有匹配度較高的)
最后,想了一下,既然它說,表空間上有事務未提交,那找到全部的事務(會話),全部close掉,是不是就好了。。 -
嗯,事實證明,這個辦法,可行。
select sess_id from v$sessions; --這個語句,找到所有的會話,然后放到一個 文本上,
sp_close_session(sess_id); -- 殺掉這些會話。嗯
再創建表空間,嗯。。。就好了。(無了個大語。。。)
18、特殊字符處理
方法有兩種,
-
方法1:
簡單的方法就是:在執行語句之前,先執行一下: set define off; -
方法2:
相關麻煩一點,
每個特殊字符前后都用 '||' 包起來

19、輸入單引號
在達夢里面,單引號代表字符串,如果想輸入一個單引號,需要用 '''' 代表一個單引號(即用 4個 " ' '" 來輸出一個)

20、達夢 fail to cast string
這個是類型錯誤的問題,比如想做一個非空判斷,
在 DEPARTMENT 這張表里面 dept_type 這個字段是 Int 類型, 把一個 Int 類型和一個字符串做比較,就會報錯
-- 可以
select case when dept_type = '' then NULL else dept_type end as dept_type from DEPARTMENT limit 1;
-- 不可以
select case when dept_type = '' or DEPT_TYPE = 'null' then NULL else dept_type end as dept_type from DEPARTMENT limit 1;
這個語句會報: [22000][-6111]Fail to cast string (意為類型轉換錯誤)
21、導出的腳本,再導入,報錯 [-7021]:無效的索引名.
奇怪啊。這個真的很奇葩
如果一個表在創建的時候,定義的唯一主鍵
再把這個表導出的時候,它就會自動創建一個唯一索引
並且這個唯一索引,再執行的時候,還報錯!
大概是長這個樣子的:CREATE UNIQUE INDEX INDEX33559118 ON INSTANCE (INSTANCE_ID,PORT);
這個 INDEX33559118 索引名是非法的。看樣子是達夢它自己維護的一個唯一索引(也是唯一主鍵)
嗯,怎么辦呢,
現在使用的辦法就是曲線救國,把這個索引名給改掉,
把 INDEX33559118 改成 INDEX_33559118 就好了。(對,只要不是 INDEX + 數字就行)
服了。
二、一些常用指令:
達夢常用的指令
--、查看關鍵字:
SELECT * FROM V$RESERVED_WORDS;
達夢 查詢全部表
select table_name from user_tables; //當前用戶擁有的表
select table_name from all_tables; //所有用戶的表
select table_name from dba_tables; //包括系統表
select table_name from dba_tables where owner='用戶名'
user_tables:table_name,tablespace_name,last_analyzed等
dba_tables: ower,table_name,tablespace_name,last_analyzed等
all_tables: ower,table_name,tablespace_name,last_analyzed等
all_objects ower,object_name,subobject_name,object_id,created,last_ddl_time,timestamp,status等
-- 獲取表字段:
select * from user_tab_columns where Table_Name='用戶表';
select * from all_tab_columns where Table_Name='用戶表';
select * from dba_tab_columns where Table_Name='用戶表';
user_tab_columns:
table_name,column_name,data_type,data_length,data_precision,data_scale,nullable,column_id等
all_tab_columns :
ower,table_name,column_name,data_type,data_length,data_precision,data_scale,nullable,column_id等
dba_tab_columns:
ower,table_name,column_name,data_type,data_length,data_precision,data_scale,nullable,column_id等
-- 獲取表注釋:
select * from user_tab_comments
user_tab_comments:table_name,table_type,comments
相應的還有dba_tab_comments,all_tab_comments,這兩個比user_tab_comments多了ower列。
-- 獲取字段注釋:
select * from user_col_comments
user_col_comments:table_name,column_name,comments
-- 修改表字段類型
alter table "user" modify("name" VARCHAR(36) NOT NULL);
-- (char 類型會自動填充空格,varchar不會。如果原來用了 char 類型,填充了空格,再使用 alter table 改為 varchar類型后,會自動把空格去掉的)
